复合USB CDC小工具不适用于Windows主机 [英] Composite USB CDC Gadget doesn't work with Windows hosts

查看:29
本文介绍了复合USB CDC小工具不适用于Windows主机的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个带USB设备接口的嵌入式Linux 3.19系统。设备需要向主机公开三个USB接口:一个虚拟网络接口(RNDIS或CDC ECM)和两个虚拟串行端口(CDC ACM)。该设备需要与现代Windows(7+)和Linux(3.16+)主机协作。

鉴于Windows本身不支持CDC ECM,我们决定实现两种USB配置(这是一种流行的方法):

  • 配置1,接口如下:
    • RNDIS
    • CDC ACM 0
    • CDC ACM 1
  • 配置2,接口如下:
    • CDC ECM
    • CDC ACM 0
    • CDC ACM 1

目的是让Windows将本机支持的第一个配置与RNDIS一起使用(Windows始终选择第一个USB配置);并让非Windows主机将第二个配置与CDC ECM一起使用。

我编写了一个脚本(基于David Lechner的类似脚本):http://pastebin.com/VtAusEmf。下面提供了脚本的相关部分(请点击链接查看完整的脚本,比较大):

mkdir -p ${g}
echo "${usb_ver}" > ${g}/bcdUSB
echo "${dev_class}" > ${g}/bDeviceClass
echo "${vid}" > ${g}/idVendor
echo "${pid}" > ${g}/idProduct
mkdir ${g}/strings/0x409
echo "${mfg}" > ${g}/strings/0x409/manufacturer
echo "${prod}" > ${g}/strings/0x409/product
echo "${serial}" > ${g}/strings/0x409/serialnumber

mkdir ${g}/configs/c.1
echo "${attr}" > ${g}/configs/c.1/bmAttributes
echo "${pwr}" > ${g}/configs/c.1/MaxPower
mkdir ${g}/configs/c.1/strings/0x409
echo "${cfg1}" > ${g}/configs/c.1/strings/0x409/configuration

echo "1" > ${g}/os_desc/use
echo "${ms_vendor_code}" > ${g}/os_desc/b_vendor_code
echo "${ms_qw_sign}" > ${g}/os_desc/qw_sign

mkdir ${g}/functions/rndis.usb0
echo "${dev_mac}" > ${g}/functions/rndis.usb0/dev_addr
echo "${host_mac}" > ${g}/functions/rndis.usb0/host_addr
echo "${ms_compat_id}" > ${g}/functions/rndis.usb0/os_desc/interface.rndis/compatible_id
echo "${ms_subcompat_id}" > ${g}/functions/rndis.usb0/os_desc/interface.rndis/sub_compatible_id

mkdir ${g}/configs/c.2
echo "${attr}" > ${g}/configs/c.2/bmAttributes
echo "${pwr}" > ${g}/configs/c.2/MaxPower
mkdir ${g}/configs/c.2/strings/0x409
echo "${cfg2}" > ${g}/configs/c.2/strings/0x409/configuration

mkdir ${g}/functions/ecm.usb0
echo "${dev_mac}" > ${g}/functions/ecm.usb0/dev_addr
echo "${host_mac}" > ${g}/functions/ecm.usb0/host_addr

mkdir ${g}/functions/acm.GS0
mkdir ${g}/functions/acm.GS1

ln -s ${g}/configs/c.1          ${g}/os_desc
ln -s ${g}/functions/rndis.usb0 ${g}/configs/c.1
ln -s ${g}/functions/acm.GS0    ${g}/configs/c.1
ln -s ${g}/functions/acm.GS1    ${g}/configs/c.1
ln -s ${g}/functions/ecm.usb0   ${g}/configs/c.2
ln -s ${g}/functions/acm.GS0    ${g}/configs/c.2
ln -s ${g}/functions/acm.GS1    ${g}/configs/c.2

echo "${device}" > ${g}/UDC
生成的Gadget配置在Linux主机上运行良好(选择第二个配置,所有三个接口均可用并正常工作),但Windows主机(使用8和10进行测试)仅检测RNDIS接口,而忽略ACM接口。不过,RNDIS运行良好。

如果禁用RNDIS接口,Windows主机将仅检测第一个ACM接口,忽略第二个。

我怀疑Windows无法正确处理复合USB设备。是这样,还是我做错了什么?如果是,我是否必须编写自己的.inf文件,指定需要加载哪些类驱动程序?

推荐答案

rtfm有帮助。有关复合USB设备的要求,请参阅以下文章:

解决方案:

echo "0xEF" > ${g}/bDeviceClass
echo "0x02" > ${g}/bDeviceSubClass
echo "0x01" > ${g}/bDeviceProtocol

这篇关于复合USB CDC小工具不适用于Windows主机的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆