1、kernel config 参考如下修改
cd bsp
source build/envsetup.sh
lunch 34
kuconfig -> Device Drivers ---> USB support ---> USB Gadget Support ---> [*] Abstract Control Model (CDC ACM)
--- kernel/kernel4.14/arch/arm/configs/sprd_sharkle_defconfig (revision 226)
+++ kernel/kernel4.14/arch/arm/configs/sprd_sharkle_defconfig (working copy)
@@ -2987,6 +2996,7 @@
# CONFIG_USB_GADGET_XILINX is not set
# CONFIG_USB_DUMMY_HCD is not set
CONFIG_USB_LIBCOMPOSITE=y
+CONFIG_USB_F_ACM=y
CONFIG_USB_U_SERIAL=y
CONFIG_USB_U_ETHER=y
CONFIG_USB_F_SERIAL=y
@@ -3001,7 +3011,7 @@
CONFIG_USB_F_VSERIAL=y
CONFIG_USB_CONFIGFS=y
CONFIG_USB_CONFIGFS_SERIAL=y
-# CONFIG_USB_CONFIGFS_ACM is not set
+CONFIG_USB_CONFIGFS_ACM=y
# CONFIG_USB_CONFIGFS_OBEX is not set
# CONFIG_USB_CONFIGFS_NCM is not set
# CONFIG_USB_CONFIGFS_ECM is not set
2、为了不占用基线已有的USB串口,增大USB串口支持的最大数目
--- bsp/kernel/kernel4.14/drivers/usb/gadget/function/u_serial.h (revision 226)
+++ bsp/kernel/kernel4.14/drivers/usb/gadget/function/u_serial.h (working copy)
@@ -15,7 +15,7 @@
#include <linux/usb/composite.h>
#include <linux/usb/cdc.h>
-#define MAX_U_SERIAL_PORTS 8
+#define MAX_U_SERIAL_PORTS 10
struct f_serial_opts {
struct usb_function_instance func_inst;
3、init.common.usb.rc 参考如下修改(完整路径以sharkle为例:device/sprd/sharkle/common/rootdir/root/init.common.usb.rc)
on init
...
mkdir /config/usb_gadget/g1/functions/mass_storage.gs6 0770 shell shell
mkdir /config/usb_gadget/g1/functions/gser.gs0 0770 shell shell
mkdir /config/usb_gadget/g1/functions/gser.gs1 0770 shell shell
mkdir /config/usb_gadget/g1/functions/gser.gs2 0770 shell shell
mkdir /config/usb_gadget/g1/functions/gser.gs3 0770 shell shell
mkdir /config/usb_gadget/g1/functions/gser.gs4 0770 shell shell
mkdir /config/usb_gadget/g1/functions/gser.gs5 0770 shell shell
mkdir /config/usb_gadget/g1/functions/gser.gs6 0770 shell shell
mkdir /config/usb_gadget/g1/functions/gser.gs7 0770 shell shell
+ mkdir /config/usb_gadget/g1/functions/acm.gs0 0770 shell shell
+ mkdir /config/usb_gadget/g1/functions/acm.gs1 0770 shell shell
setprop sys.usb.mode normal
+ # 新增 sys.usb.config=acm
+on property:sys.usb.config=acm && property:sys.usb.configfs=1
+ # 注意不同的sys.usb.config,idProduct不同。
+ write /config/usb_gadget/g1/idVendor 0x18d1
+ write /config/usb_gadget/g1/idProduct 0x9999
+ write /config/usb_gadget/g1/bcdDevice 0x0404
+ write /config/usb_gadget/g1/bDeviceClass 0
+ write /config/usb_gadget/g1/os_desc/use 1
+ rm /config/usb_gadget/g1/configs/b.1/f1
+ rm /config/usb_gadget/g1/configs/b.1/f2
+ rm /config/usb_gadget/g1/configs/b.1/f3
+ rm /config/usb_gadget/g1/configs/b.1/f4
+ rm /config/usb_gadget/g1/configs/b.1/f5
+ rm /config/usb_gadget/g1/configs/b.1/f6
+ rm /config/usb_gadget/g1/configs/b.1/f7
+ rm /config/usb_gadget/g1/configs/b.1/f8
+ rm /config/usb_gadget/g1/configs/b.1/f9
+ rm /config/usb_gadget/g1/configs/b.1/f10
+ rm /config/usb_gadget/g1/configs/b.1/f11
+ symlink /config/usb_gadget/g1/functions/acm.gs0 /config/usb_gadget/g1/configs/b.1/f1
+ symlink /config/usb_gadget/g1/functions/acm.gs1 /config/usb_gadget/g1/configs/b.1/f2
+ write /config/usb_gadget/g1/UDC ${sys.usb.controller}
+ setprop sys.usb.state ${sys.usb.config}
3、验证方法:进设备shell,执行setprop sys.usb.config acm 可切换到新增的acm配置。
4、注意以上示例是新增了sys.usb.config=acm,Android上层默认并没有设置sys.usb.config为acm的逻辑。
实际项目中,如果是在特定业务场景下新增acm,可以考虑参考以上示例,然后修改Android上层代码,根据实际需要去设置sys.usb.config为acm。
=============================================================================================
5、如果要依附于Android已有的设置来新增acm端口,那么可以考虑在已有的sys.usb.config下新增acm端口。
如果这样做,那么就需要考虑新增的acm端口该加在哪些已有的sys.usb.config下,并且注意不要改变原有的端口次序。
比如在adb设置下(userdebug版本,连接USB后的缺省设置)新增acm端口:
on property:sys.usb.ffs.ready=1 && property:sys.usb.config=adb && property:sys.usb.mode=normal && property:persist.vendor.sys.modem.diag=none
write /config/usb_gadget/g1/idVendor 0x18d1
write /config/usb_gadget/g1/idProduct 0x4EE8
write /config/usb_gadget/g1/bcdDevice 0x0404
write /config/usb_gadget/g1/bDeviceClass 0
rm /config/usb_gadget/g1/configs/b.1/f1
rm /config/usb_gadget/g1/configs/b.1/f2
rm /config/usb_gadget/g1/configs/b.1/f3
rm /config/usb_gadget/g1/configs/b.1/f4
rm /config/usb_gadget/g1/configs/b.1/f5
rm /config/usb_gadget/g1/configs/b.1/f6
rm /config/usb_gadget/g1/configs/b.1/f7
rm /config/usb_gadget/g1/configs/b.1/f8
rm /config/usb_gadget/g1/configs/b.1/f9
rm /config/usb_gadget/g1/configs/b.1/f10
rm /config/usb_gadget/g1/configs/b.1/f11
symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f1
symlink /config/usb_gadget/g1/functions/gser.gs0 /config/usb_gadget/g1/configs/b.1/f2
symlink /config/usb_gadget/g1/functions/gser.gs1 /config/usb_gadget/g1/configs/b.1/f3
symlink /config/usb_gadget/g1/functions/gser.gs2 /config/usb_gadget/g1/configs/b.1/f4
+ # 为了不改变原有的端口次序,所以在尾部添加新的端口,f值要依次递增
+ symlink /config/usb_gadget/g1/functions/acm.gs0 /config/usb_gadget/g1/configs/b.1/f5
+ symlink /config/usb_gadget/g1/functions/acm.gs1 /config/usb_gadget/g1/configs/b.1/f6
write /config/usb_gadget/g1/UDC ${sys.usb.controller}
setprop sys.usb.state ${sys.usb.config}
6、切换USB配置是Android上层发起,通过设置一些property来触发Android init rc中对应的Action。比如切到MTP,切到USB网络共享等。
调试过程中如果不清楚具体场景下触发了哪个Action,可以通过kernel log观察;当然也可以用 getprop 来查看相应的property值,再去找满足条件的Action。
log示例:
init: processing action (sys.usb.config=mtp && sys.usb.configfs=1) from (/vendor/etc/init/hw/init.sl8541e_1h10_32b.usb.rc:156)
init: processing action (sys.usb.config=mtp && sys.usb.configfs=1) from (/init.usb.configfs.rc:26)
表示触发了init.sl8541e_1h10_32b.usb.rc 第156行的Action和init.usb.configfs.rc 第26行的Action。
7、源码中涉及USB配置的rc文件,除了 init.common.usb.rc,还有 system/core/rootdir/init.usb.configfs.rc。
所以如果在 init.common.usb.rc 没有发现对应的Action,或者发现某个Action的实现不全,可以到init.usb.configfs.rc去找。
如果两个文件中如果有相同的Action,那么都会被执行,见上述第6点的log。
注意 init.common.usb.rc 经过编译打包后,在镜像中的文件名是 init.{board}.usb.rc,{board}取决于编译时选择的工程,比如上述第6点的init.sl8541e_1h10_32b.usb.rc。
8、如果是参考第5点,在已有的USB配置下新增ACM串口,那么在Windows PC下有可能出现新增的ACM串口被命名为SPRD XXXX的情况,这是因为展锐发布的PC Driver匹配到了这个串口。
PC Driver是按照USB VID+PID+MI 来匹配串口的,如果不想被匹配到,或者想改串口名字,需要修改PC driver。详见unisupport文档:PC侧修改VID_PID流程V1.0.pdf
查看某个USB串口的VID+PID+MI的信息,可以通过Windows设备管理器 - 选择某个USB串口 - 右键“属性”- 详细信息,在“详细信息”这个选项卡中查看“设备实例路径”的值。
9、修改了USB配置后,必须要做全场景USB功能测试,包括但不限于下载、校准、写License、用LOGEL工具抓取log和sysdump、ADB等,确保不影响已有的功能。
附件端口
Index: device/sprd/sharkle/common/rootdir/root/init.common.usb.rc
===================================================================
--- device/sprd/sharkle/common/rootdir/root/init.common.usb.rc (revision 226)
+++ device/sprd/sharkle/common/rootdir/root/init.common.usb.rc (working copy)
@@ -38,6 +38,8 @@
mkdir /config/usb_gadget/g1/functions/gser.gs5 0770 shell shell
mkdir /config/usb_gadget/g1/functions/gser.gs6 0770 shell shell
mkdir /config/usb_gadget/g1/functions/gser.gs7 0770 shell shell
+ mkdir /config/usb_gadget/g1/functions/acm.gs0 0770 shell shell
+ mkdir /config/usb_gadget/g1/functions/acm.gs1 0770 shell shell
setprop sys.usb.mode normal
@@ -127,6 +129,9 @@
symlink /config/usb_gadget/g1/functions/gser.gs0 /config/usb_gadget/g1/configs/b.1/f2
symlink /config/usb_gadget/g1/functions/gser.gs1 /config/usb_gadget/g1/configs/b.1/f3
symlink /config/usb_gadget/g1/functions/gser.gs2 /config/usb_gadget/g1/configs/b.1/f4
+ # 为了不改变原有的端口次序,所以在尾部添加新的端口,f值要依次递增
+ symlink /config/usb_gadget/g1/functions/acm.gs0 /config/usb_gadget/g1/configs/b.1/f5
+ symlink /config/usb_gadget/g1/functions/acm.gs1 /config/usb_gadget/g1/configs/b.1/f6
write /config/usb_gadget/g1/UDC ${sys.usb.controller}
setprop sys.usb.state ${sys.usb.config}
新增端口
Index: device/sprd/sharkle/common/rootdir/root/init.common.usb.rc
===================================================================
--- device/sprd/sharkle/common/rootdir/root/init.common.usb.rc (revision 226)
+++ device/sprd/sharkle/common/rootdir/root/init.common.usb.rc (working copy)
@@ -38,6 +38,8 @@
mkdir /config/usb_gadget/g1/functions/gser.gs5 0770 shell shell
mkdir /config/usb_gadget/g1/functions/gser.gs6 0770 shell shell
mkdir /config/usb_gadget/g1/functions/gser.gs7 0770 shell shell
+ mkdir /config/usb_gadget/g1/functions/acm.gs0 0770 shell shell
+ mkdir /config/usb_gadget/g1/functions/acm.gs1 0770 shell shell
setprop sys.usb.mode normal
@@ -1064,3 +1066,27 @@
symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2
write /config/usb_gadget/g1/UDC ${sys.usb.controller}
setprop sys.usb.state ${sys.usb.config}
+
+# 新增 sys.usb.config=acm
+on property:sys.usb.config=acm && property:sys.usb.configfs=1
+ # 注意不同的sys.usb.config,idProduct不同。
+ write /config/usb_gadget/g1/idVendor 0x18d1
+ write /config/usb_gadget/g1/idProduct 0x9999
+ write /config/usb_gadget/g1/bcdDevice 0x0404
+ write /config/usb_gadget/g1/bDeviceClass 0
+ write /config/usb_gadget/g1/os_desc/use 1
+ rm /config/usb_gadget/g1/configs/b.1/f1
+ rm /config/usb_gadget/g1/configs/b.1/f2
+ rm /config/usb_gadget/g1/configs/b.1/f3
+ rm /config/usb_gadget/g1/configs/b.1/f4
+ rm /config/usb_gadget/g1/configs/b.1/f5
+ rm /config/usb_gadget/g1/configs/b.1/f6
+ rm /config/usb_gadget/g1/configs/b.1/f7
+ rm /config/usb_gadget/g1/configs/b.1/f8
+ rm /config/usb_gadget/g1/configs/b.1/f9
+ rm /config/usb_gadget/g1/configs/b.1/f10
+ rm /config/usb_gadget/g1/configs/b.1/f11
+ symlink /config/usb_gadget/g1/functions/acm.gs0 /config/usb_gadget/g1/configs/b.1/f1
+ symlink /config/usb_gadget/g1/functions/acm.gs1 /config/usb_gadget/g1/configs/b.1/f2
+ write /config/usb_gadget/g1/UDC ${sys.usb.controller}
+ setprop sys.usb.state ${sys.usb.config}