本文關(guān)注的不是 adb 本身的實(shí)現(xiàn),而是數(shù)據(jù)如何傳輸。
分析文件:adbd-masteradbusb_linux_client.cpp
4.1 初始化接口描述符
4.2 申請(qǐng)更多端點(diǎn)
在接口描述符里,定義了多個(gè)接口描述符,這是 APP 提出的請(qǐng)求。如果 Gadget 設(shè)備有足夠的端點(diǎn),那么就會(huì)在在 functionfs 跟目錄下創(chuàng)建出這些端點(diǎn),比如 ep1、ep2。
ADB 程序的調(diào)用關(guān)系如下:
init_functionfs
// 設(shè)置功能描述符(接口描述符)
v2_descriptor.fs_count = 3;
v2_descriptor.hs_count = 3;
v2_descriptor.ss_count = 5;
v2_descriptor.os_count = 1;
v2_descriptor.fs_descs = fs_descriptors;
v2_descriptor.hs_descs = hs_descriptors;
v2_descriptor.ss_descs = ss_descriptors;
v2_descriptor.os_header = os_desc_header;
v2_descriptor.os_desc = os_desc_compat;
h- >control = adb_open(USB_FFS_ADB_EP0, O_RDWR); // 打開(kāi)端點(diǎn) 0
// 把接口描述符發(fā)給驅(qū)動(dòng)程序
ret = adb_write(h- >control, &v2_descriptor, sizeof(v2_descriptor));
// 發(fā)送字符串描述符, 這會(huì)觸發(fā)驅(qū)動(dòng)程序根據(jù)接口描述符創(chuàng)建更多的 endpoint
ret = adb_write(h- >control, &strings, sizeof(strings));
上面的函數(shù)操作的都是 ep0,對(duì)應(yīng)的驅(qū)動(dòng)程序如下:
函數(shù) ffs_epfiles_create 會(huì)根據(jù)接口描述符申請(qǐng)更多的 endpoint,并且在 functionfs 里創(chuàng)建對(duì)應(yīng)的節(jié)點(diǎn):
5. 移植 ADB
5.1 交叉編譯 adb
如果不想自己編譯,可以使用 GIT 倉(cāng)庫(kù)里的可執(zhí)行程序:
以 IMX6ULL 為例,打開(kāi)《嵌入式 Linux 應(yīng)用開(kāi)發(fā)完全手冊(cè) V5_IMX6ULL_Pro開(kāi)發(fā)板.pdf》,找到《6.5 構(gòu)建 IMX6ULL Pro 版的根文件系統(tǒng)》章節(jié),執(zhí)行以下命令:
make clean
make 100ask_imx6ull_pro_ddr512m_systemV_qt5_defconfig
make menuconfig
配置 ADB:-> Target packages -> System tools
然后執(zhí)行:
make android-tools-rebuild
期間會(huì)自動(dòng)下載源碼、編譯。
成功后,可在如下目錄查看到可執(zhí)行程序 adb、adbd:
/home/book/100ask_imx6ull-sdk/Buildroot_2020.02.x/output/target/usr/bin
把可執(zhí)行程序放到開(kāi)發(fā)板的 /usr/bin 目錄。
5.2 腳本
IMX6ULL 上使用的簡(jiǎn)化腳本:
modprobe libcomposite
mount -t configfs none /sys/kernel/config
mkdir -p /dev/usb-ffs/adb
mkdir -p /sys/kernel/config/usb_gadget/g1
mkdir -p /sys/kernel/config/usb_gadget/g1/functions/ffs.adb
mkdir -p /sys/kernel/config/usb_gadget/g1/configs/b.1
ln -s /sys/kernel/config/usb_gadget/g1/functions/ffs.adb /sys/kernel/config/usb_gadget/g1/configs/b.1
mount -t functionfs adb /dev/usb-ffs/adb
start-stop-daemon --start --oknodo --pidfile /var/run/adbd.pid --startas /usr/bin/adbd --background
sleep 1
echo ci_hdrc.0 > /sys/kernel/config/usb_gadget/g1/UDC
可以在 /etc/init.d/ 目錄下創(chuàng)建一個(gè) S99adbd 文件,就可以自動(dòng)使能 ADB 功能。這個(gè)文件在 GIT 倉(cāng)庫(kù)里:
來(lái)自 STM32MP157 的供參考的腳本:
#!/bin/bash -e
### BEGIN INIT INFO
# Provides: adbd
# Required-Start:
# Required-Stop:
# Default-Start:
# Default-Stop:
# Short-Description:
# Description: Linux ADB
### END INIT INFO
VENDOR_ID="0x1d6b"
PRODUCT_ID="0x0104"
UDC=`ls /sys/class/udc/ | awk '{print $1}'`
start() {
mkdir -p /dev/usb-ffs/adb -m 0770
mkdir -p /sys/kernel/config/usb_gadget/g1 -m 0770
echo ${VENDOR_ID} > /sys/kernel/config/usb_gadget/g1//idVendor
echo ${PRODUCT_ID} > /sys/kernel/config/usb_gadget/g1//idProduct
mkdir -p /sys/kernel/config/usb_gadget/g1/strings/0x409 -m 0770
echo "0123456789ABCDEF" > /sys/kernel/config/usb_gadget/g1/strings/0x409/serialnumber
echo "STMicroelectronics" > /sys/kernel/config/usb_gadget/g1/strings/0x409/manufacturer
echo "STM32MP1" > /sys/kernel/config/usb_gadget/g1/strings/0x409/product
mkdir -p /sys/kernel/config/usb_gadget/g1/functions/ffs.adb
mkdir -p /sys/kernel/config/usb_gadget/g1/configs/b.1 -m 0770
mkdir -p /sys/kernel/config/usb_gadget/g1/configs/b.1/strings/0x409 -m 0770
ln -s /sys/kernel/config/usb_gadget/g1/functions/ffs.adb /sys/kernel/config/usb_gadget/g1/configs/b.1
echo "adb" > /sys/kernel/config/usb_gadget/g1/configs/b.1/strings/0x409/configuration
mount -t functionfs adb /dev/usb-ffs/adb
start-stop-daemon --start --oknodo --pidfile /var/run/adbd.pid --startas /bin/adbd --background
sleep 1
echo $UDC > /sys/kernel/config/usb_gadget/g1/UDC
}
stop() {
start-stop-daemon --stop --oknodo --pidfile /var/run/adbd.pid --retry 5
umount /dev/usb-ffs/adb
}
restart() {
echo $UDC > /sys/kernel/config/usb_gadget/g1/UDC
}
if [ "$UDC" != "" ]; then
case $1 in
start|stop|restart) "$1" ;;
esac
fi
exit $?
-
嵌入式
+關(guān)注
關(guān)注
5089文章
19169瀏覽量
306769 -
usb
+關(guān)注
關(guān)注
60文章
7974瀏覽量
265490 -
Linux
+關(guān)注
關(guān)注
87文章
11335瀏覽量
210094 -
adb
+關(guān)注
關(guān)注
1文章
36瀏覽量
10453
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論