怎样配置android configfs gadgets

怎样配置android configfs gadgets

                                             目录
1.简介
2.内核配置
3.从安卓界面使能USB gadgets
  3.1 针对AOSP的主分支
      修改init.${ro.hardware}.rc
  3.2 针对android-L(5.1.1)
      修改init.rc
      修改init.usb.rc
4.基于目前的android-L的手动命令行模式
  4.1 ADB模式配置
  4.2 MTP模式配置
  4.3 MTP+ADB模式配置
  4.4 PTP模式配置
  4.5 PTP+ADB模式配置
5.注意事项


一.简介
  android在新的kerenl(3.14)版本上,把USB gadgets移到了基于ConfigFs。
  如下的配置是在IFC6410(android5.1.1)以及AOSP的主分支(2016.1.20号版本)上面基于3.18的kerenl软件验证。


二.内核配置
  确保你的内核配置至少包含了如下USB gadget和android配置
  CONFIG_USB_CONFIGFS=y
  CONFIG_USB_CONFIGFS_F_FS=y
  CONFIG_USB_CONFIGFS_F_MTP=y
  CONFIG_USB_CONFIGFS_F_PTP=y
  CONFIG_USB_CONFIGFS_UEVENT=y


三. 从安卓界面使能USB gadgets
3.1针对AOSP的主分支
  AOSP版本已经在system/core里面的ConfigFs初始化脚本中增加了检查,并且不仅仅是盒子上面。所以我们仅仅只需要在init.{ro.hardware}.rc中增加少数的ConfigFs初始化步骤去配置ConfigFs和UDC驱动相关的属性然后挂载ConfigFs usb gadgets即可。

修改init.{ro.hardware}.rc修改:

on init
+ # Create mount-point for ConfigFS USB gadgets
+ # Add standard gadget entries
+ mount configfs none /config
+ mkdir /config/usb_gadget/g1 0770 shell shell
+ write /config/usb_gadget/g1/idVendor 0x18D1
+ write /config/usb_gadget/g1/idProduct 0x4E26
+ mkdir /config/usb_gadget/g1/strings/0x409 0770 shell shell
+ write /config/usb_gadget/g1/strings/0x409/serialnumber 0123459876
+ write /config/usb_gadget/g1/strings/0x409/manufacturer Qcom
+ write /config/usb_gadget/g1/strings/0x409/product IFC6410
+ mkdir /config/usb_gadget/g1/configs/b.1 0770 shell shell
+ mkdir /config/usb_gadget/g1/configs/b.1/strings/0x409 0770 shell shell
+ write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "Conf 1"
+ write /config/usb_gadget/g1/configs/b.1/MaxPower 120
+
+ # Create adb+ffs gadget function
+ mkdir /config/usb_gadget/g1/functions/ffs.adb 0770 shell shell
+ mkdir /dev/usb-ffs 0770 shell shell
+ mkdir /dev/usb-ffs/adb 0770 shell shell
+ mount functionfs adb /dev/usb-ffs/adb uid=2000,gid=2000
+
+ # Create MTP and PTP functions
+ mkdir /config/usb_gadget/g1/functions/mtp.gs0 0770 shell shell
+ mkdir /config/usb_gadget/g1/functions/ptp.gs1 0770 shell shell

on boot
+ setprop sys.usb.configfs 1
+ #Replace "ci_hdrc.0" with your platform UDC driver as found in /sys/class/udc/
+ setprop sys.usb.controller ci_hdrc.0

3.2针对android-L (5.1.1)
  在目前的android-L,通过设置选项,只能使能ADB及MTP的功能, PTP功能还无法在界面打开,但是可以通过命令行使能。所以后面暂时不对它讨论。

修改init.rc
  我们来介绍下这个init.rc里面的ConfigFs的修改,我们把直接启动adbd进程替换为了设置属性"persist.sys.usb.config"为adb来触发,这个属性将会在init.usb.rc里面实现gadgets的配置。

# adbd on at boot in emulator
on property:ro.kernel.qemu=1
- start adbd
+ setprop persist.sys.usb.config adb
service lmkd /system/bin/lmkd
class core
  如果我们使用的是模拟器或者图像绘制软件,我们reboot之后,很显然在init.rc设置的USB属性就没有了,也就意味着只有在adb使能,并且通过设置应用手动选择了MTP/PTP/RNDIS选择使能后才会启动。

修改init.usb.rc
  这就是当时我的init.usb.rc的样子,支持配置单独ADB,单独MTP,ADB+MTP组合模式。
  你如果根据AOSP版本init.usb.configfs.rc脚本,可能会设计出一个更好的版本,只是有可能。

#
# USB configuration common for all android devices
#
on init
# Create ConfigFS mount point for USB gadgets
# Add standard gadget entries
mount configfs none /config
mkdir /config/usb_gadget/g1
write /config/usb_gadget/g1/idVendor 0x18D1
write /config/usb_gadget/g1/idProduct 0x4E26
mkdir /config/usb_gadget/g1/strings/0x409
write /config/usb_gadget/g1/strings/0x409/serialnumber 0123459876
write /config/usb_gadget/g1/strings/0x409/manufacturer Qcom
write /config/usb_gadget/g1/strings/0x409/product IFC6410
mkdir /config/usb_gadget/g1/configs/c.1
mkdir /config/usb_gadget/g1/configs/c.1/strings/0x409
write /config/usb_gadget/g1/configs/c.1/strings/0x409/configuration "Conf 1"
write /config/usb_gadget/g1/configs/c.1/MaxPower 120
# Create adb+ffs gadget function
mkdir /config/usb_gadget/g1/functions/ffs.adb
mkdir /dev/usb-ffs 0770 shell shell
mkdir /dev/usb-ffs/adb 0770 shell shell
mount functionfs adb /dev/usb-ffs/adb uid=2000,gid=2000
# Used to disable USB when switching states
on property:sys.usb.config=none
write /config/usb_gadget/g1/UDC ""
stop adbd
setprop sys.usb.state ${sys.usb.config}

# adb only gadget configuration
# This is the fallback configuration if the
# USB manager fails to set a standard configuration
on property:sys.usb.config=adb
stop adbd
symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/c.1/ffs.adb
start adbd
#Had to set this property early because userspace expect us to be done with state changes in 1 second.
setprop sys.usb.state ${sys.usb.config}
#Add this 2 second wait/delay to calm things down after adbd restart and before we enable UDC.
wait /dev/socket/waiting
#Replace "ci_hdrc.0" with your platform UDC driver as found in /sys/class/udc/
write /config/usb_gadget/g1/UDC ci_hdrc.0

# MTP
on property:sys.usb.config=mtp
rm /config/usb_gadget/g1/configs/c.1/ffs.adb
mkdir /config/usb_gadget/g1/functions/mtp.mtp
symlink /config/usb_gadget/g1/functions/mtp.mtp /config/usb_gadget/g1/configs/c.1/mtp.mtp
#Replace "ci_hdrc.0" with your platform UDC driver as found in /sys/class/udc/
write /config/usb_gadget/g1/UDC ci_hdrc.0
setprop sys.usb.state ${sys.usb.config}

# MTP + ADB
on property:sys.usb.config=mtp,adb
stop adbd
symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/c.1/ffs.adb
start adbd
mkdir /config/usb_gadget/g1/functions/mtp.mtp
symlink /config/usb_gadget/g1/functions/mtp.mtp /config/usb_gadget/g1/configs/c.1/mtp.mtp
#Had to set this property early because userspace expect us to be done with state changes in 1 second.
setprop sys.usb.state ${sys.usb.config}
#Add this 2 second wait/delay to calm things down after adbd restart and before we enable UDC.
wait /dev/socket/waiting
#Replace "ci_hdrc.0" with your platform UDC driver as found in /sys/class/udc/
write /config/usb_gadget/g1/UDC ci_hdrc.0

# Used to set USB configuration at boot and to switch the configuration
# when changing the default configuration
on property:persist.sys.usb.config=*
setprop sys.usb.config ${persist.sys.usb.config}

四.基于目前的android-L的手动命令行模式
4.1 adb配置。
android shell root权限执行

#Mount ConfigFS and create Gadget
mount -t configfs none /config
mkdir /config/usb_gadget/g1
cd /config/usb_gadget/g1
#Set default Vendor and Product IDs for now
echo 0x18d1 > idVendor
echo 0x4E26 > idProduct
#Create English strings and add random deviceID
mkdir strings/0x409
echo 0123459876 > strings/0x409/serialnumber
#Update following if you want to
echo "Test" > strings/0x409/manufacturer
echo "Test" > strings/0x409/product
#Create gadget configuration
mkdir configs/c.1
mkdir configs/c.1/strings/0x409
echo "Conf 1" > configs/c.1/strings/0x409/configuration
echo 120 > configs/c.1/MaxPower
#Create Adb FunctionFS function
#And link it to the gadget configuration
stop adbd
mkdir functions/ffs.adb
ln -s /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/c.1/ffs.adb
#Start adbd application
mkdir -p /dev/usb-ffs/adb
mount -o uid=2000,gid=2000 -t functionfs adb /dev/usb-ffs/adb
start adbd
#Enable the Gadget
#Replace "ci_hdrc.0" with your platform UDC driver as found in /sys/class/udc/
echo "ci_hdrc.0" > /config/usb_gadget/g1/UDC

4.2 mtp配置
  相对于adb配置的一步到位了,mtp就有点棘手,我们需要在init.rc的 on init 里面设置如下属性,在UsbDeviceManager服务之前去通知用户空间的usb的状态。

setprop persist.sys.usb.config mtp
setprop sys.usb.config mtp
setprop sys.usb.state mtp

  如果没有在on init里面设置,那么adb的配置将会设置为缺省的值,如下的设置将会不起作用。
android shell root权限设置:

#Mount ConfigFS and create Gadget
mount -t configfs none /config
mkdir /config/usb_gadget/g1
cd /config/usb_gadget/g1
#Set default Vendor and Product IDs for now
echo 0x18d1 > idVendor
echo 0x4E26 > idProduct
#Create English strings and add random deviceID
mkdir strings/0x409
echo 0123459876 > strings/0x409/serialnumber
#Update following if you want to
echo "Test" > strings/0x409/manufacturer
echo "Test" > strings/0x409/product
#Create gadget configuration
mkdir configs/c.1
mkdir configs/c.1/strings/0x409
echo "Conf 1" > configs/c.1/strings/0x409/configuration
echo 120 > configs/c.1/MaxPower

  确保在android启动完成之后,去执行如下配置,可以通过sys.boot_completed属性判断是否启动完成。然后执行如下命令:

#Create MTP function,
#And link it to the gadget configuration
mkdir /config/usb_gadget/g1/functions/mtp.mtp
ln -s /config/usb_gadget/g1/functions/mtp.mtp /config/usb_gadget/g1/configs/c.1/mtp.mtp
#Enable the Gadget
#Replace "ci_hdrc.0" with your platform UDC driver as found in /sys/class/udc/
echo "ci_hdrc.0" > /config/usb_gadget/g1/UDC

4.3 mtp + adb组合模式
如果把4.2的流程分为3个步骤,那么需要在步骤2与步骤3之间加上如下配置:

#Create Adb FunctionFS function
#And link it to the gadget configuration
stop adbd
mkdir functions/ffs.adb
ln -s /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/c.1/ffs.adb
#Start adbd application
mkdir -p /dev/usb-ffs/adb
mount -o uid=2000,gid=2000 -t functionfs adb /dev/usb-ffs/adb
start adbd

4.4 ptp模式
如果把4.2的流程分为3个步骤,那么前面两个步骤相同,第3个步骤如下:
确保在android启动完成之后,去执行如下配置
#Create MTP and PTP function,
#And link it to the gadget configuration
#Android's PTP implementation piggyback on MTP function so make sure we have MTP function created beforehand.
mkdir /config/usb_gadget/g1/functions/mtp.mtp
mkdir /config/usb_gadget/g1/functions/ptp.ptp
ln -s /config/usb_gadget/g1/functions/ptp.ptp /config/usb_gadget/g1/configs/c.1/ptp.ptp
#Enable the Gadget
#Replace "ci_hdrc.0" with your platform UDC driver as found in /sys/class/udc/
echo "ci_hdrc.0" > /config/usb_gadget/g1/UDC

4.5 ptp + adb 组合模式
如果把4.2的流程分为3个步骤,那么前面两个步骤相同,第3个步骤如下:
确保在android启动完成之后,去执行如下配置

#Create MTP and PTP function,
#And link it to the gadget configuration
#Android's PTP implementation piggyback on MTP function so make sure we have MTP function created beforehand.
mkdir /config/usb_gadget/g1/functions/mtp.mtp
mkdir /config/usb_gadget/g1/functions/ptp.ptp
ln -s /config/usb_gadget/g1/functions/ptp.ptp /config/usb_gadget/g1/configs/c.1/ptp.ptp
#Create Adb FunctionFS function
#And link it to the gadget configuration
stop adbd
mkdir functions/ffs.adb
ln -s /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/c.1/ffs.adb
#Start adbd application
mkdir -p /dev/usb-ffs/adb
mount -o uid=2000,gid=2000 -t functionfs adb /dev/usb-ffs/adb
start adbd
#Enable the Gadget
#Replace "ci_hdrc.0" with your platform UDC driver as found in /sys/class/udc/
echo "ci_hdrc.0" > /config/usb_gadget/g1/UDC


五.注意事项
5.1 android的mtp和ptp模式的实现是互斥,同一时间命令行只能实现一种配置,否则会引起其他问题。
5.2 当我们随机的设置mtp/ptp与adb的组合配置,只有很少的案例会导致内核挂掉。
5.3 在android L中我们,当usb状态改变的时候,我们logcat在waitForState()失败了,我们可以在 frameworks/base/services/usb/java/com/android/server/usb/UsbDeviceManager.java中的waitForState()增加超时时间来过渡。


猜你喜欢

转载自blog.csdn.net/csdn66_2016/article/details/79614807
今日推荐