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. 体验adb2.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.cgfs_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 libcompositemount -t configfs none /sys/kernel/configmkdir -p /sys/kernel/config/usb_gadget/g1mkdir -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 结构体:
常用的几种矢量化字符串方法的异同点分析
尼康D5相机拥有2082万有效像素最高连拍速度14fps可以高速捕捉运动画面
自行车发电机改成稳压供电照明
硅基氮化镓芯片 具有哪些特点
HTTP的Keep-Alive和TCP的Keepalive有什么区别?
ADB框架介绍与体验
综合能源服务的定义是什么
生物识别在门禁领域有哪些应用?射频识别门禁和生物识别门禁有何区别?
RTX 3090装机后导致电源显卡同时炸毁,厂家回应
云知声助力小镜科技打造4G超清云记录仪
2023年将成中国机器人最大应用场景
指针万用表测量电阻的方法
排水渠监控系统解决方案
气密性检测仪设备哪个品牌好?
ABT链网将重新定义新一代区块链基础架构
极大规模集成电路高纯度含氟电子气体实现国产化
智能监控连接设计需要满足哪些要素
金脉电子MADC2.5通过Matrix5认证
安全用电智能监控系统的详细说明
Banana Pi [BPi-R3-Mini] 产品和主线 ImmortalWrt 固件支持