简介
记录使用adb
协议跟树莓派4B
通信的过程。adb
可以用网络,也可以用USB
,这里使用USB
硬件通路
硬件上,只有USB2.0
支持做OTG
,且做OTG
的口就是电源的那个typec
口,属于是非常坑爹了
软件配置
Buildroot
打开下列配置
Kernel
打开下列配置,建议不要将UDC
相关的配置选成M
,很坑爹,这个我也没想清楚,估计是树莓派自己的代码哪里有什么特殊处理,选成M
完全没法用OTG
,永远也无法ls -l /sys/class/udc
获取到信息
CONFIG_USB_DWC2=y
#反正全配置了问题也不大
CONFIG_USB_LIBCOMPOSITE=y
CONFIG_USB_F_ACM=y
CONFIG_USB_F_SS_LB=y
CONFIG_USB_U_SERIAL=y
CONFIG_USB_U_ETHER=y
CONFIG_USB_F_SERIAL=y
CONFIG_USB_F_OBEX=y
CONFIG_USB_F_NCM=y
CONFIG_USB_F_ECM=y
CONFIG_USB_F_EEM=y
CONFIG_USB_F_SUBSET=y
CONFIG_USB_F_RNDIS=y
CONFIG_USB_F_MASS_STORAGE=y
CONFIG_USB_F_FS=y
#configfs
CONFIG_USB_CONFIGFS=y
#g_ncm驱动,做测试使用
CONFIG_USB_G_NCM=m
设备树改动如下(官方的dtsoverlay手动起来有点坑,根本就不生效)
raspi_sdk/raspi_linux/arch/arm/boot/dts/broadcom/bcm283x.dtsi
raspi_sdk/raspi_linux/arch/arm/boot/dts/broadcom/bcm2711-rpi-ds.dtsi
raspi_sdk/raspi_linux/arch/arm/boot/dts/broadcom/bcm270x.dtsi
官方镜像配置方式
在config.txt
文件加上一行即可
dtoverlay=dwc2,dr_mode=otg
官方dtboverlay
是在bootrom
的时候apply
上去的,这个以后有空可以研究下
windows安装adb工具
下载链接如下
https://dl.google.com/android/repository/platform-tools-latest-windows.zip
下载后获取到这个zip
包
解压后路径如下
接下来将adb.exe
添加到环境变量中,CMD
输入sysdm.cpl
点击高级->环境变量
点击Path->编辑
按照图中所示
然后一路确定,退出来。设置好了后,命令行直接查看,说明配置生效
运行
g_ncm测试
g_ncm
驱动的测试只是为了看UDC
驱动是否正常,首先查看是否有UDC
debugfs
查看也能看到dwc2_hsotg
加载驱动,可以看到生成了随机mac
地址
ifconfig
也能查看到usb0
网卡
adb devices配置
主要是通过configfs
来配置,这里已经整理成了脚本了,使用前先记得卸载g_ncm驱动,保证UDC没有被占用
#!/bin/sh
case "$1" in
start)
test -d /sys/kernel/config || mkdir /sys/kernel/config
mount -t configfs none /sys/kernel/config
mkdir /sys/kernel/config/usb_gadget/g1
cd /sys/kernel/config/usb_gadget/g1
echo 0x0525 > idVendor
echo 0xa4a5 > idProduct
mkdir strings/0x409
echo 123456789 > strings/0x409/serialnumber
echo "Raspi" > strings/0x409/manufacturer
echo "4B" > strings/0x409/product
mkdir configs/b.1
mkdir configs/b.1/strings/0x409
echo "adb" > configs/b.1/strings/0x409/configuration
cur_path=`pwd`
mkdir -p $cur_path'/functions/ffs.adb'
ln -s /sys/kernel/config/usb_gadget/g1/functions/ffs.adb /sys/kernel/config/usb_gadget/g1/configs/b.1/ffs.adb
mkdir -p /dev/usb-ffs/adb
mount -o uid=2000,gid=2000 -t functionfs adb /dev/usb-ffs/adb
cd /
adbd &
UDC=`ls /sys/class/udc/| awk '{print $1}'`
sleep 1 && echo $UDC > /sys/kernel/config/usb_gadget/g1/UDC &
;;
stop)
echo none > /sys/kernel/config/usb_gadget/g1/UDC
;;
restart|reload|force-reload)
echo "Error: argument '$1' not supported" >&2
exit 3
;;
*)
echo "Usage: adbd start|stop" >&2
exit 3
;;
esac
运行脚本./adbusb.sh start
windows
下可以检测到adb devices
,说明配置成功了
设备管理器可以看到显示4B
的通用串行总线设备
还可以用adb shell
命令验证一下
用adb push
传输文件到树莓派上
用adb pull
获取文件到PC
上
原理
下面的参考链接把原理包括内核的驱动代码讲的挺好的,这里就看原文吧
https://www.cnblogs.com/arnoldlu/p/17726081.html
https://www.cnblogs.com/-Donge/p/18151999
遇到的问题
之前在测试UDC
功能的时候,碰到如下的问题
couldn't find an available UDC
一个原因是设备树中usb
相关节点配置没配好,还有一个原因是比较奇怪的内核模块用成M就不行。第一个问题可以通过路径/sys/firmware/fdt
获取设备中使用的dtb
然后再使用fdtdump
命令反汇编出设备树原件