本帖最后由 lcdi 于 2013-6-1 20:40 编辑
我想把U盘(SD卡)和串口做成一个复合设备。
参考了一些资料,ConfigDescriptor里用IAD复合描述符,现在的问题是只能枚举出一个设备,DeviceDescriptor里的idProduct如果是mass storage demo里的设置,枚举出的就是mass storage,如果用demo里的虚拟串口里的设置,枚举出的就是虚拟串口。
那么,在复合设备里这个idProduct应该如何设置呢?
——————————————————————————————————————————————————————————————————————————————
在4.0库里的composite例子,把里面的HID部分去掉,换成virtual comport部分。
搞了好几天,遇到一些问题,也算加深了了解。把一些关键点写下来给大家参考:
1:主要修改usb_desc.c里的Composite_ConfigDescriptor,
bNumInterfaces要改成总共的interface数目,我这里串口用了2个,u盘用了1个。然后是具体的描述,因为串口有2个interface,所以需要IAD描述,如果只有一个,就可以像例程那样直接描述。
// IAD
0x08, //描述符大小
0x0B, //IAD描述符类型
0x00, // bFirstInterface
0x02, // bInterfaceCount
0x02, // bFunctionClass: CDC Class
0x02, // bFunctionSubClass
0x01, // bFunctionProtocol
0x00, // iFunction
下面接串口本来的描述符,IAD里很简单
原串口用了IN2,是中断传输,一直没找到和搞清楚具体的服务函数在哪儿?!有知道的说一声吧。
因为u盘也用IN2和OUT2,所以把这里改成IN4。
描述完串口接着描述u盘
// IAD
0x08, //描述符大小
0x0B, //IAD描述符类型
0x02, // bFirstInterface
0x01, // bInterfaceCount
0x08, // bFunctionClass: MASS STORAGE Class
0x06, // bFunctionSubClass
0x50, // bFunctionProtocol
0x01, // iFunction
下来照搬u盘描述即可。
Composite_ConfigDescriptor 修改完了,别忘了修改一下usb_desc.h里的Composite_SIZ_CONFIG_DESC,因为增加了描述内容嘛。
这时候就能枚举出符合设备了。
2:整合,增加了端点,需要修改usb_prop.c里端点初始化部分。usb_endp.c里callback函数要修改。按照callback函数的增减修改usb_conf.h。
这里有很重要的定义,改不好的话设备还是用不了。
EP_NUM 是使用的端点数,我使用到ep4,那这里就是5。
下来是BTABLE_ADDRESS
各端点的缓冲区地址设置。BTABLE_ADDRESS是0,第一个缓冲区地址我这里要设为0x28。因为BTABLE_ADDRESS到第一个缓冲区之间是各缓冲区的偏移地址存放处,我用了5个端点,每个端点8个字节,所以我要把第一个缓冲区放在0x28才行。
这个问题搞了好久才明白,参考https://bbs.21ic.com/icview-208240-1-1.html ,很详细。
至此,修改完成,两种设备共存都正常工作了!
只是驱动不容易装,如果我安装ST的串口驱动(修改过PID),那么就只有这个设备,u盘没有,如果直接自动装驱动,有u盘没串口。这时候手动更新有惊叹号的设备,指定串口的驱动,装好后测试也就正常了。
——————————————————————————————————————————————————————————————————————————
U盘部分不需要驱动,串口部分不能自动安装驱动(即使系统安装过也不行),变惊叹号设备。如果再安装一次倒是可以用了,但是U盘却没了。对这个惊叹号设备手动选择驱动类型,强制使用以前安装的驱动则可以正常使用。这样搞总是不正常的样子。
其实,要修改驱动包里的INF, %DESCRIPTION%=DriverInstall,USB\VID_0483&PID_5750改成
%DESCRIPTION%=DriverInstall,USB\VID_0483&PID_5750&MI_00就可以一切正常了。
因为我这里设置串口为interface 0 开始的,惊叹号设备里也能看到 VID_0483&PID_5750&MI_00这样的信息,所以这样设置驱动就知道是要匹配0号interface的。
至此,全部正常! |