树莓派开发(七)

usb的otg配置以及adb使用

Posted by 婷 on May 10, 2025 本文总阅读量

简介

记录使用adb协议跟树莓派4B通信的过程。adb可以用网络,也可以用USB,这里使用USB

硬件通路

硬件上,只有USB2.0支持做OTG,且做OTG的口就是电源的那个typec口,属于是非常坑爹了

软件配置

Buildroot

打开下列配置

img

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

image-20250422225449497

raspi_sdk/raspi_linux/arch/arm/boot/dts/broadcom/bcm2711-rpi-ds.dtsi

image-20250422225514441

raspi_sdk/raspi_linux/arch/arm/boot/dts/broadcom/bcm270x.dtsi

image-20250422225357917

官方镜像配置方式

config.txt文件加上一行即可

dtoverlay=dwc2,dr_mode=otg

官方dtboverlay是在bootrom的时候apply上去的,这个以后有空可以研究下

img

windows安装adb工具

下载链接如下

https://dl.google.com/android/repository/platform-tools-latest-windows.zip

下载后获取到这个zip

img

解压后路径如下

img

接下来将adb.exe添加到环境变量中,CMD输入sysdm.cpl

img

点击高级->环境变量

img

点击Path->编辑

img

按照图中所示

img

然后一路确定,退出来。设置好了后,命令行直接查看,说明配置生效

img

运行

g_ncm测试

g_ncm驱动的测试只是为了看UDC驱动是否正常,首先查看是否有UDC

image-20250427230803400

debugfs查看也能看到dwc2_hsotg

image-20250427230854796

加载驱动,可以看到生成了随机mac地址

image-20250427231042460

ifconfig也能查看到usb0网卡

image-20250427231055249

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

image-20250504232702933

image-20250427232431746

windows下可以检测到adb devices,说明配置成功了

image-20250427232342806

设备管理器可以看到显示4B的通用串行总线设备

image-20250427232252488

image-20250427232539141

还可以用adb shell命令验证一下

image-20250427232406356

adb push传输文件到树莓派上

image-20250510163547317

image-20250510163610291

adb pull获取文件到PC

image-20250510163750028

image-20250510163820123

image-20250510163922861

原理

下面的参考链接把原理包括内核的驱动代码讲的挺好的,这里就看原文吧

https://www.cnblogs.com/arnoldlu/p/17726081.html
https://www.cnblogs.com/-Donge/p/18151999

遇到的问题

之前在测试UDC功能的时候,碰到如下的问题

couldn't find an available UDC

img

一个原因是设备树中usb相关节点配置没配好,还有一个原因是比较奇怪的内核模块用成M就不行。第一个问题可以通过路径/sys/firmware/fdt获取设备中使用的dtb

img

然后再使用fdtdump命令反汇编出设备树原件

img

参考链接