本帖最后由 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串口需要增加多少行(描述符除外)? |
|