Android usb accessory
参考: 安卓的配件:https://source.android.com/devices/accessories/custom 配件中的AOA模式:https://source.android.com/devices/accessories/protocol
难点主要在device端移植,host端只需要用Libusb操作bulk端点即可。
device端实现¶
-
- 提取android中的usb_accessory驱动,编译成内核模块
- 挂上驱动,配置gadgets设备
脚本:
# load kernel module
modprobe usb_f_accessory
# 1. Creating the gadgets
mkdir $CONFIGFS_HOME/usb_gadget/g1
cd $CONFIGFS_HOME/usb_gadget/g1
echo 0x18D1 > idVendor
echo 0x2D00 > idProduct
# 2. Creating the configurations
mkdir configs/c.1
# 3. Creating the functions
mkdir functions/accessory.usb0
# 4. Associating the functions with their configurations
ln -s functions/accessory.usb0 configs/c.1
# 5. Enabling the gadget
# $ echo <udc name> > UDC
# /sys/class/udc/<udc name>
UDC_NAME=`ls /sys/class/udc/ | awk "{print $1}"`
echo $UDC_NAME > UDC
# 6. Set Permission
chmod 666 /dev/usb_accessory
启动后,应用可通过读写/dev/usb_accessory与host通讯了
用host端例程来测试¶
https://github.com/gibsson/linux-adk
device端接收:
$ cat /dev/usb_accessory
device端发送:
$ echo "12345" > /dev/usb_accessory
速度测试¶
测试结果: 双向通讯均能超过10Mbyte/s
应用tips¶
- 驱动没实现pull方法,所以select、poll、epoll均无法使用,只能开个线程阻塞读
- 驱动中没有缓存,read时得给根据高速/全速设备,给512/128bytes的缓冲区来读,否则可能漏收、阻塞着不返回