1. ADB 框架
ADB 全称为"Android Debug Bridge",Android 调试桥。在纯 Linux 系统中也可以使用。它是 client-server 架构,由三部分组成:
- adbclient:我们运行的 adb 命令就属于 adbclient,比如我们运行以下命令
adb push d:1.txt /root
时,它就是一个 adbclient,它通过 adbserver 把windows 下的文件 "d:1.txt" 推送到开发板的 /root 目录 - adbserver:作为一个后台程序运行运行于 PC,它负责管理 PC 和开发板之间的通信,完成 adbclient 的请求
- adbd:运行于开发板的守护进程,它通过底下的 Gadget 跟 adbserver 通信
实际上,adbclient 和 adbserver 都是同一个应用程序:比如 Windows 下的 adb.exe,使用不同的参数来启动时就可以作为 adbclient 或者 adbserver。我们第 1 次执行 adb 命令时,它会帮我们启动一个 adb 程序作为 adbserver。
2. 体验ADB
2.1 在 Windows 安装软件
解压 GIT 仓库如下文件:
确认里面的 adb.exe 所在目录,把这个目录添加进 Windows 的 Path 环境变量里。
2.2 在 STM32MP157 上实验
STM32MP157 的出厂系统已经安装好了 adbd,可以直接连接 USB 线进行测试。
比如在 Windows 上执行命令:
adb devices # 列出adb设备
adb push d:1.txt /root # 上传文件到开发板/root目录
adb shell # 启动adb命令行
IMX6ULL 的出厂系统还没安装 adbd,等移植 ADB 时再进行实验。
3. functionfs
我们关注的是 Gadget 部分:
使用 legacy 的方法时,我们需要在驱动程序里指定设备信息(比如设备描述符、配置描述符等等),还需要在驱动程序里实现数据的传输功能,这都在驱动程序里限定死了。
使用 configfs 时,我们可以灵活地指定设备信息、灵活地选择各种 function。但是,还不够灵活:你必须选择某个 function,这个 function 里已经实现实现了数据的传输功能,你无法更改。
我们能否把 Gadget 设备的端点暴露给用户程序?让用户程序自己操作端点来传输数据?可以!这就是 functionfs。
functionfs 是一种文件系统,它的使用分为两步:
- 内核态:注册 functionfs
- 用户态:挂载 functionfs
抓住这两点来分析代码。
3.1 注册 functionfs
以 legacy 的方式来分析,只要安装 g_ffs.ko 驱动程序:
insmod g_ffs.ko
就会触发以下调用过程:
# 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 方式的话,需要执行以下命令:
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
可以看到提示信息:
执行命令cat /proc/filesystems
可以看到 functionfs。
3.2 挂载 functionfs
这时就可以挂载 functionfs 了,执行如下命令:
# mkdir -p /dev/usb-ffs/adb
# mount -t functionfs adb /dev/usb-ffs/adb # 上面创建了 functions/ffs.adb, 挂载时 dev 就要指定为 adb
# ls /dev/usb-ffs/adb/
ep0
有了 ep0 端点后,用户态程序就可以通过它跟主机通信了。
3.3 ep0 的驱动程序
ep0 对应的驱动程序,分析如下:
- 挂载 functionfs 时,会导致一个函数被调用:
- ffs_sb_fill 中,会在 functionfs 的根目录下创建名为 ep0 的文件,并给它提供file_operations 结构体:
-
嵌入式
+关注
关注
5082文章
19111浏览量
304878 -
Linux
+关注
关注
87文章
11296浏览量
209364 -
adb
+关注
关注
1文章
35浏览量
10421
发布评论请先 登录
相关推荐
评论