打印

看看USB库应该怎么玩的

[复制链接]
2151|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Simon21ic|  楼主 | 2011-5-26 00:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
USB, ST, MSC, ce, des
本帖最后由 Simon21ic 于 2011-5-26 00:34 编辑

直接上代码:
// 描述符
static const struct vsfusbd_desc_filter_t descriptors[] =
{
    VSFUSBD_DESC_DEVICE(0, MSCBOT_DeviceDescriptor, sizeof(MSCBOT_DeviceDescriptor), NULL),
    VSFUSBD_DESC_CONFIG(0, 0, MSCBOT_ConfigDescriptor, sizeof(MSCBOT_ConfigDescriptor), NULL),
    VSFUSBD_DESC_STRING(0, 0, MSCBOT_StringLangID, sizeof(MSCBOT_StringLangID), NULL),
    VSFUSBD_DESC_STRING(0x0409, 1, MSCBOT_StringVendor, sizeof(MSCBOT_StringVendor), NULL),
    VSFUSBD_DESC_STRING(0x0409, 2, MSCBOT_StringProduct, sizeof(MSCBOT_StringProduct), NULL),
    VSFUSBD_DESC_STRING(0x0409, 3, MSCBOT_StringSerial, sizeof(MSCBOT_StringSerial), NULL),
    VSFUSBD_DESC_NULL
};
// 接口数组
static const struct vsfusbd_iface_t ifaces[] =
{
    // {AlternateSetting, class_protocol}
    // 指定接口的类,可以是VSF_USBD已经支持的,比如:
    // vsfusbd_MSCBOT_class(MassStorageClass Bulk-Only transfer)
    // vsfusbd_CDCMaster_class/vsfusbd_CDCData_class(CDC类)
    // vsfusbd_HID_class(HID类)
    // 也可以是用户自己定义的用户协议
    {0, (struct vsfusbd_class_protocol_t *)&vsfusbd_MSCBOT_class},
};
// 配置数组,可支持多配置
static const struct vsfusbd_config_t config0[] =
{
    {
        // 配置初始化以及终止化
        // 接口数量以及接口数组
        NULL, NULL, 1, (struct vsfusbd_iface_t *)ifaces,
        // OUT端点和Interface对应表
        // -1表示不存在,或者端点0
        // 其他表示该端点对应的接口号
        {-1, -1, -1, -1, 0},
        // IN端点和Interface对应表
        {-1, -1, -1, -1, 0},
    }
};
struct vsfusbd_device_t usb_device =
{
    // 一个配置,配置值为0,设备feature为0,配置数组
    1, 0, 0, (struct vsfusbd_config_t *)config0,
    // 描述符
    (struct vsfusbd_desc_filter_t *)descriptors,
    // USBDevice底层驱动
    (struct interface_usbd_t *)&core_interfaces.usbd
};

// 磁盘信息
struct SCSI_LUN_info_t MSCBOT_LunInfo =
{
    {
        // removable
        true,
        // Vendor
        {'S', 'i', 'm', 'o', 'n', ' ', ' ', ' '},
        // Product
        {'S', 'i', 'm', 'o', 'n', ' ', ' ', ' ',
        'S', 'i', 'm', 'o', 'n', ' ', ' ', ' '},
        // Rivision
        {'1', '.', '0', '0'},
        // MSC类型
        // SCSI_PDT_DIRECT_ACCESS_BLOCK为一般磁盘
        // SCSI_PDT_CD_DVD为光盘
        SCSI_PDT_DIRECT_ACCESS_BLOCK
    }
};

// U盘对应的mal(存储器抽象层)中的驱动序号
uint8_t MSCBOT_MalIndexes[] = {0};
// 双缓冲
uint8_t MSCBOT_Buffer0[512], MSCBOT_Buffer1[512];

struct vsfusbd_MSCBOT_param_t MSCBOT_param =
{
    // U盘的接口号
    0,                            // uint8_t iface;
    // OUT端点号
    4,                            // uint8_t ep_out;
    // IN端点号
    4,                            // uint8_t ep_in;
    // MaxLun
    0,                            // uint8_t max_lun;
    // U盘的Lun信息
    &MSCBOT_LunInfo,            // struct SCSI_LUN_info_t *lun_info;
    // 用户自定义的SCSI命令的处理器
    NULL,                         // struct SCSI_handler_t *user_handlers;
    // 存储器抽象层中的驱动序号
    MSCBOT_MalIndexes,            // uint8_t *mal_indexes;
   
    // 双缓冲
    {
        {MSCBOT_Buffer0, sizeof(MSCBOT_Buffer0)},
        {MSCBOT_Buffer1, sizeof(MSCBOT_Buffer1)}
    },                            // struct vsf_buffer_t page_buffer[2];
};

RESULT usb_protocol_init()
{
    // 设置MSC参数
    vsfusbd_MSCBOT_set_param(&MSCBOT_param);
    // 初始化USB,自动根据描述符初始化所有端点,并且自动分配USB缓冲区
    return vsfusbd_device_init(&usb_device);
}



猜猜看,在这个设备上再增加一个CDC串口需要增加多少行(描述符除外)?
沙发
hsbjb| | 2011-5-26 16:37 | 只看该作者
猜不出来:lol

使用特权

评论回复
板凳
火箭球迷| | 2011-5-26 21:18 | 只看该作者
楼主貌似玩的很有成就感:lol

使用特权

评论回复
地板
Simon21ic|  楼主 | 2011-5-27 01:17 | 只看该作者
本帖最后由 Simon21ic 于 2011-5-27 01:18 编辑

我这里的一个产品会用到,大大简化了USB开发,不过最终芯片估计不用ST的了。单纯玩的话,估计没有这个时间了。国内能够非常了解USB的人太少,这个库估计都不一定会有多少人用的来。

使用特权

评论回复
5
lxyppc| | 2011-5-27 08:55 | 只看该作者
呵呵,每个芯片厂家都有自己的USB库,用起来还算顺手,所以很少有人想着再去做一个USB库
楼主你这是曲高和寡啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:www.versaloon.com --- under construction

266

主题

2597

帖子

104

粉丝