本帖最后由 Simon21ic 于 2011-5-13 22:47 编辑
代码:
http://code.google.com/p/vsprog/source/browse/#svn%2Ftrunk%2Fdongle%2Ffirmware%2Fvsf%2Fstack%2Fusb_device%253Fstate%253Dclosed
使用到的ST的USB库的文件:usb_mem.c和usb_regs.c
应用示例:
http://code.google.com/p/vsprog/source/browse/#svn%2Ftrunk%2Fdongle%2Ffirmware%2FUSB_TO_XXX%2FUSB
这个示例是Versaloon编程器的USB应用代码,使用ST的VID + 0xA038的PID是经过ST授权的。
简单的说明:
根据设备的信息,定义好usb_device结构后,调用vsfusbd_device_init(&usb_device);即可正常实现设备的枚举。不需要修改底层的USB端口设置以及USB缓存设置,VSF_USBD会自动根据设备的描述符进行设置(除了双缓冲设置,因为无法根据描述符判断出那些端口是需要双缓冲的,双缓冲功能可以在protocol初始化函数中设置)。
RESULT usb_protocol_init()
{
return vsfusbd_device_init(&usb_device);
}
底层SIE驱动:
目前只是实现了STM32的驱动,正在处理另一个芯片(目前一级保密)的SIE驱动,以后会增加更多的芯片的SIE驱动,并且保持驱动的接口一致,驱动层以上的所有代码不需要修改。
类协议以及用户协议:
vsfusbd_class_protocol_t结构用于实现类协议以及自定义协议,示例中只是使用了这个结构的初始化函数:
static RESULT versaloon_init(struct vsfusbd_device_t *device)
{
if ((ERROR_OK != device->drv->ep.set_IN_dbuffer(2)) ||
(ERROR_OK != device->drv->ep.set_OUT_dbuffer(3)) ||
(ERROR_OK != device->drv->ep.set_IN_handler(2, Versaloon_IN_hanlder)) ||
(ERROR_OK != device->drv->ep.set_OUT_handler(3, Versaloon_OUT_hanlder)))
{
return ERROR_FAIL;
}
return ERROR_OK;
}
还可以定义protocol相关的描述符以及request。
这个protocol初始化函数设置了数据口的双缓冲(实际底层还没有实现),并且,设置了数据端点的处理函数(以后系统会集成一些常规的处理函数,现在就先暂时这么用吧)。
USB描述符设置:
通过一个结构以及辅助宏简单搞定:
static const struct vsfusbd_desc_filter_t descriptors[] =
{
VSFUSBD_DESC_DEVICE(0, Versaloon_DeviceDescriptor, sizeof(Versaloon_DeviceDescriptor), NULL),
VSFUSBD_DESC_CONFIG(0, 0, Versaloon_ConfigDescriptor, sizeof(Versaloon_ConfigDescriptor), NULL),
VSFUSBD_DESC_STRING(0, 0, Versaloon_StringLangID, sizeof(Versaloon_StringLangID), NULL),
VSFUSBD_DESC_STRING(0x0409, 1, Versaloon_StringVendor, sizeof(Versaloon_StringVendor), NULL),
VSFUSBD_DESC_STRING(0x0409, 2, Versaloon_StringProduct, sizeof(Versaloon_StringProduct), NULL),
VSFUSBD_DESC_STRING(0x0409, 3, Versaloon_StringSerial, sizeof(Versaloon_StringSerial), NULL),
VSFUSBD_DESC_NULL
};
PS:
看的懂的来玩吧,欢迎提建议 |