1. ADB 框架
ADB 全稱為"Android Debug Bridge",Android 調(diào)試橋。在純 Linux 系統(tǒng)中也可以使用。它是 client-server 架構(gòu),由三部分組成:
- adbclient:我們運(yùn)行的 adb 命令就屬于 adbclient,比如我們運(yùn)行以下命令
adb push d:1.txt /root
時(shí),它就是一個(gè) adbclient,它通過 adbserver 把windows 下的文件 "d:1.txt" 推送到開發(fā)板的 /root 目錄 - adbserver:作為一個(gè)后臺(tái)程序運(yùn)行運(yùn)行于 PC,它負(fù)責(zé)管理 PC 和開發(fā)板之間的通信,完成 adbclient 的請(qǐng)求
- adbd:運(yùn)行于開發(fā)板的守護(hù)進(jìn)程,它通過底下的 Gadget 跟 adbserver 通信
實(shí)際上,adbclient 和 adbserver 都是同一個(gè)應(yīng)用程序:比如 Windows 下的 adb.exe,使用不同的參數(shù)來啟動(dòng)時(shí)就可以作為 adbclient 或者 adbserver。我們第 1 次執(zhí)行 adb 命令時(shí),它會(huì)幫我們啟動(dòng)一個(gè) adb 程序作為 adbserver。
2. 體驗(yàn)ADB
2.1 在 Windows 安裝軟件
解壓 GIT 倉庫如下文件:
確認(rèn)里面的 adb.exe 所在目錄,把這個(gè)目錄添加進(jìn) Windows 的 Path 環(huán)境變量里。
2.2 在 STM32MP157 上實(shí)驗(yàn)
STM32MP157 的出廠系統(tǒng)已經(jīng)安裝好了 adbd,可以直接連接 USB 線進(jìn)行測試。
比如在 Windows 上執(zhí)行命令:
adb devices # 列出adb設(shè)備
adb push d:1.txt /root # 上傳文件到開發(fā)板/root目錄
adb shell # 啟動(dòng)adb命令行
IMX6ULL 的出廠系統(tǒng)還沒安裝 adbd,等移植 ADB 時(shí)再進(jìn)行實(shí)驗(yàn)。
3. functionfs
我們關(guān)注的是 Gadget 部分:
使用 legacy 的方法時(shí),我們需要在驅(qū)動(dòng)程序里指定設(shè)備信息(比如設(shè)備描述符、配置描述符等等),還需要在驅(qū)動(dòng)程序里實(shí)現(xiàn)數(shù)據(jù)的傳輸功能,這都在驅(qū)動(dòng)程序里限定死了。
使用 configfs 時(shí),我們可以靈活地指定設(shè)備信息、靈活地選擇各種 function。但是,還不夠靈活:你必須選擇某個(gè) function,這個(gè) function 里已經(jīng)實(shí)現(xiàn)實(shí)現(xiàn)了數(shù)據(jù)的傳輸功能,你無法更改。
我們能否把 Gadget 設(shè)備的端點(diǎn)暴露給用戶程序?讓用戶程序自己操作端點(diǎn)來傳輸數(shù)據(jù)?可以!這就是 functionfs。
functionfs 是一種文件系統(tǒng),它的使用分為兩步:
- 內(nèi)核態(tài):注冊(cè) functionfs
- 用戶態(tài):掛載 functionfs
抓住這兩點(diǎn)來分析代碼。
3.1 注冊(cè) functionfs
以 legacy 的方式來分析,只要安裝 g_ffs.ko 驅(qū)動(dòng)程序:
insmod g_ffs.ko
就會(huì)觸發(fā)以下調(diào)用過程:
# driversusbgadgetlegacyg_ffs.c
gfs_init
usb_get_function_instance("ffs");
try_get_usb_function_instance
fi = fd- >alloc_inst();
# driversusbgadgetfunctionf_fs.c
ffs_alloc_inst
dev = _ffs_alloc_dev();
ret = functionfs_init();
ret = register_filesystem(&ffs_fs_type);
使用 configfs 方式的話,需要執(zhí)行以下命令:
modprobe libcomposite
mount -t configfs none /sys/kernel/config
mkdir -p /sys/kernel/config/usb_gadget/g1
mkdir -p /sys/kernel/config/usb_gadget/g1/functions/ffs.adb
可以看到提示信息:
執(zhí)行命令cat /proc/filesystems
可以看到 functionfs。
3.2 掛載 functionfs
這時(shí)就可以掛載 functionfs 了,執(zhí)行如下命令:
# mkdir -p /dev/usb-ffs/adb
# mount -t functionfs adb /dev/usb-ffs/adb # 上面創(chuàng)建了 functions/ffs.adb, 掛載時(shí) dev 就要指定為 adb
# ls /dev/usb-ffs/adb/
ep0
有了 ep0 端點(diǎn)后,用戶態(tài)程序就可以通過它跟主機(jī)通信了。
3.3 ep0 的驅(qū)動(dòng)程序
ep0 對(duì)應(yīng)的驅(qū)動(dòng)程序,分析如下:
- 掛載 functionfs 時(shí),會(huì)導(dǎo)致一個(gè)函數(shù)被調(diào)用:
- ffs_sb_fill 中,會(huì)在 functionfs 的根目錄下創(chuàng)建名為 ep0 的文件,并給它提供file_operations 結(jié)構(gòu)體:
-
嵌入式
+關(guān)注
關(guān)注
5082文章
19123瀏覽量
305147 -
Linux
+關(guān)注
關(guān)注
87文章
11304瀏覽量
209476 -
adb
+關(guān)注
關(guān)注
1文章
35瀏覽量
10424
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論