由于产品需要,需将设备枚举为CDC + MASS STORAGE 或 + ETHER 等设备,linux已经提供了一些常用的复合设备驱动,例如cdc + mass storage + ether,但是如何使用,并未做详细的说明,会出现加载驱动识别的情况,failed to start g_acm_ms -22。
下面说说问题原因和解决办法:
驱动路径kernel\drivers\usb\gadget\legacy
kernel配置
CONFIG_TTY=y
CONFIG_USB_CONFIGFS_ACM=y
#CONFIG_GADGET_UAC1=y
#CONFIG_USB_AUDIO=y
#CONFIG_USB_ETH=y
#CONFIG_USB_G_SERIAL=y
#CONFIG_USB_G_NOKIA=y
#CONFIG_USB_CDC_COMPOSITE=y
CONFIG_BLOCK=y
CONFIG_USB_G_ACM_MS=y
#CONFIG_USB_G_MULTI=y
注意:修改kernel\drivers\usb\gadget\legacy\Makefile
#obj-$(CONFIG_USB_G_ACM_MS) += g_acm_ms.o
obj-m += g_acm_ms.o
编译为模块
否则必现failed to start g_acm_ms -22。
因为枚举mass storage gadget 需要加载一个lun 文件,所以必须采用模块形式加载
开机后insmod /etc/g_acm_ms.ko file=/dev/mmcblk1p1 即可加载枚举成功