下面的表显示了每个接口是如何被设置的调用流程。调用流程只显示了串行接口是如何被使能的,但是所有的一些功能
驱动都是以一种相似的方式被使能的。这一连串的操作序列是在一个1被写入到使能系统文件中后被唤醒的。
USB接口调用流程
8.1 安卓USB composition 框架
从Linux内核3.0开始,主要的变化包括USB composition 是如何被定义的和使能的。在更早些时候,USB composition 信息,例如, PID/VID ,功能列表,等被定义在内核空间。在Linux内核3.0以后,这些都是通过执行用户空间的命令来完成的。因此,定义是在用户空间的文件中被处理的。
下面是一个从
on
property:sys.usb.config=diag,serial_smd,serial_tty,rmnet_bam,mass_storage,adb
write /sys/class/android_usb/android0/enable 0
write /sys/class/android_usb/android0/idVendor 05C6
write /sys/class/android_usb/android0/idProduct 9025
write /sys/class/android_usb/android0/f_diag/clients diag
write /sys/class/android_usb/android0/f_serial/transports smd,tty
write /sys/class/android_usb/android0/f_rmnet/transports smd,bam
write /sys/class/android_usb/android0/functions diag,adb,serial,rmnet,mass_storage
write /sys/class/android_usb/android0/enable 1
start adbd
setprop sys.usb.state $sys.usb.config
Init.qcom.usb.rc 包含每个USB composition 的声明。当setprop 命令被传递时,这一套顺序命令被执行。安卓用户现在通过adb shell可以轻易的执行setprop命令来改变composition;例如:
>adb shell
# setprop persist.sys.usb.config “diag,serial_smd,serial_tty,rmnet_bam,mass_storage,adb”
注意:System.setProperty()不能被从Java应用那里唤醒来改变USB composition。System.setProperty() 只会影响正在运行的进程并且不能修改实际的系统属性。
为了设置默认的启动时间USB配置,参考
设置默认的启动composition取决于socinfo和基带。如果persist.sys.usb.config已经被设置了,socinfo和基带过滤器不会被执行。
Persist.sys.usb.config 在电源 电量周期/重启后仍然是之前设置的值。如果你修改了sys.usb.config,这个只是暂时的修改,它会在下一次电源重启或者电量周期cycle后丢失。
8.2 LE composition 框架
LE 编译有一个可执行的二进制文件来帮助管理可以得到的在系统里的USB compositions
/usr/bin/usb_composition
通过这个可执行的文件用户可以设置默认的composition 例如:
boot hsusb composition: 9025
boot hsic composition: empty
Choose Composition by Pid:
901D - DIAG + ADB
9021 - DIAG + QMI_RMNET (Android)
9022 - DIAG + ADB + QMI_RMNET (Android)
9024 - RNDIS + ADB [Android]
9025 - DIAG + ADB + MODEM + NMEA + QMI_RMNET + Mass Storage (Android)
902B - RNDIS + ADB + Mass Storage
902D - RNDIS + DIAG + ADB [Android]
9049 - DIAG + ADB + DUN + RMNET + Mass Storage + QDSS [Android]
904A - DIAG + QDSS [Android]
9056 - DIAG + ADB + SERIAL + RMNET + Mass Storage + Audio [Android]
9057 - RNDIS : ECM
9059 - DIAG+ADB+RNDIS : ECM
905B - MBIM
9060 - DIAG + QDSS + ADB
9063 - RNDIS : ECM : MBIM
9064 - DIAG + ADB + MODEM + QMI_RMNET : ECM : MBIM
9067 - Mass storage + QMI_RMNET : Mass Storage + MBIM
9084 - DIAG + QDSS + ADB + RMNET
9085 - DIAG+ADB+MBIM+GNSS
9091 - DIAG + MODEM + QMI_RMNET + ADB
90A1 - DIAG + ADB + (multiplexed) QMI_RMNET (Android)
90A9 - DIAG + ADB + MODEM + NMEA + QDSS (bulk in) + RMNET : ECM : MBIM
90AD - DIAG + ADB + MODEM + NMEA + QMI_RMNET + Mass Storage + DPL
90B1 - ECM
F000 - Mass Storage
empty -这个被用来允许hsic 和hsusb 都完全没有composition(必须重启后才能生效).
hsic_next -
hsusb_next -
Pid number : 901D
Choose core: y - hsic , n - hsusb ?(y/n)n
Would you like it to be the default composition ? (y/n)y
Would you like the composition to change immediately? (y/n)y
Are you performing the composition switch from adbd? (y/n)n
Switching to composition number 0x901D
这个可执行的二进制文件从一个目录里读出系统里所有可得到的compositions并列出来。这些位于目录里的文件都是一些bash脚本,这些脚本执行文件系统写操作到安卓USB文件以设置composition,PID,VID,等。
Composition 目录
在编译目录 ----
在设备这边 ---- /usr/bin/usb/compositions
9025:
Run_9x25( ){
if [ $from_adb = "n" ]
then
pkill -x `which adbd`
fi
echo 0 > /sys/class/android_usb/android$num/enable
echo 9024 > /sys/class/android_usb/android$num/idProduct
echo 05C6 > /sys/class/android_usb/android$num/idVendor
echo rndis,adb > /sys/class/android_usb/android$num/functions
echo 1 > /sys/class/android_usb/android$num/remote_wakeup
echo 1 > /sys/class/android_usb/android0/f_rndis/wceis
sleep $delay
echo 1 > /sys/class/android_usb/android$num/enable
if [ $from_adb = "n" ]
then
/etc/init.d/adbd start
fi
}
用户能够通过创建一个bash脚本使用之前存在的composition作为一个框架或者指南来创建他们自己的compositions。在定义了composition后,用户能够添加这个composition到
compositions/ 来编译包含最新添加的composition的系统镜像。
8.3 USB composition 系统文件
8-1 系统文件和可能的值
8.4 默认的USB compositions
默认的USB composition被用于每个平台。看8-2,8-3,8-4来获得详细的信息。
8-2 接口字符串到transport的变换表(只对MSM)
8.4.1基于MSM的产品
8.4.2 基于MDM LE 的产品
Rmnet_gsi是一个完全不同的USB功能驱动。在这个case中没有要求 Echo’ing 到transports文件