于开发板上添加adb功能

1 USB gadget

USB gadget 是一种在嵌入式系统中模拟 USB 设备的功能。它允许将嵌入式设备(例如单板计算机、嵌入式开发板或智能手机)配置为通过 USB 接口与主机进行通信,就像普通的 USB 设备一样。

通常情况下,USB gadget 可以模拟各种类型的 USB 设备,例如存储设备(Mass Storage)、串行设备(Serial)、网络设备(Ethernet)、音频设备(Audio)等。通过配置不同的 gadget 功能,嵌入式系统可以在 USB 总线上表现为不同类型的设备,从而与主机进行通信和交互。

使用 USB gadget,开发人员和制造商可以实现以下功能:

  • 调试和调试功能:通过配置 USB gadget 为 Android Debug Bridge (ADB) 功能,可以方便地进行嵌入式系统的调试和调试。

  • 数据传输:通过配置 USB gadget 为存储设备(Mass Storage),可以将嵌入式系统作为 USB 存储设备,实现数据的读取和写入。

  • 网络连接:通过配置 USB gadget 为网络设备(Ethernet),可以将嵌入式系统连接到主机以进行网络通信。

  • 外设控制:通过配置 USB gadget 为 HID(Human Interface Device)或其他外设类型,可以模拟键盘、鼠标或其他外设,使嵌入式系统能够与主机进行交互。

USB gadget 的配置通常通过在 Linux 内核中启用相应的选项,并通过 sysfs 或 configfs 进行动态配置。这使得嵌入式系统可以根据需求灵活地配置和切换不同的 USB gadget 功能。

总之,USB gadget 允许嵌入式系统通过 USB 接口模拟各种类型的 USB 设备,从而实现与主机的通信和交互。它在嵌入式系统开发、调试和数据传输等方面具有广泛的应用。

2 configfs

Configfs 是 Linux 内核提供的一种文件系统,用于动态配置内核的功能和设备。在 USB gadget 的上下文中,configfs 用于配置 USB gadget 的功能和属性。

Configfs 提供了一种以文件和目录的形式表示和配置内核对象的方式。在 USB gadget 中,configfs 允许用户在运行时创建和配置 gadget 功能和配置,而无需重新编译或重新加载内核模块。

在 configfs 中,USB gadget 的配置位于 /sys/kernel/config/usb_gadget/ 目录下。通过在该目录下创建和配置文件和目录,可以定义 USB gadget 的功能、属性和配置

以下是 configfs 中 USB gadget 配置的一些重要子目录和文件:

g1:表示 USB gadget 的一个实例,可以根据需要创建多个实例。

g1/functions/:包含 USB gadget 可用的功能目录。例如,可以在此目录下创建 ffs 目录来配置 FunctionFS 功能。

当功能目录下无法建立你想要的功能目录,是因为你没有打开内核这部分功能

eg:mkdir: can't create directory 'ffs.adb': No such file or directory 代表内核未打开function filesystem功能

内核路径:.../drivers/usb/gadget/function 修改makefile及配置文件启动

g1/configs/:包含 USB gadget 可用的配置目录。可以在此目录下创建多个配置,每个配置可以关联一个或多个功能。

g1/UDC:包含 USB Device Controller(UDC)的名称(例如 udc-x.y)。将 UDC 变量设置为适当的 UDC 驱动程序,以将 USB gadget 与 UDC 关联起来。

需要注意的是,configfs 是一种高级的内核功能,使用它需要一定的了解和熟悉。具体的配置和操作细节可能会因系统环境和内核版本的不同而有所变化。相关的文档和资源可以提供更详细的使用指南和示例。

3 添加adb功能于开发板

3.1 移植adb程序

请参考:移植adbd

3.2 gadget相关功能

打开以下内核配置选项,启动ffs功能

CONFIG_USB_F_FS=y
CONFIG_USB_CONFIGFS_SERIAL=y
CONFIG_USB_CONFIGFS_F_FS=y

3.3 配置脚本

更多设备及具体原因可参考:usb gadget configfs

#!/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 0x2207 > idVendor
    echo 0x0006 > idProduct

    mkdir strings/0x409
    echo 0123456789ABCDEF > strings/0x409/serialnumber

    echo "rockchip" > strings/0x409/manufacturer
    echo "rk30xx" > strings/0x409/product

    mkdir configs/b.1
    mkdir configs/b.1/strings/0x409
    echo "adb" > configs/b.1/strings/0x409/configuration
    #echo "Conf 1" > configs/b.1/strings/0x409/configuration
    #echo 120 > configs/b.1/MaxPower

    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

4 验证使用

4.1 启动adb功能及验证是否启动成功

串口连接后,执行以下命令

. S30adbd start

脚本运行成功会有以下打印

[   70.427528] file system registered
# install_listener('tcp:5037','*smartsocket*')
[   70.484788] read descriptors
[   70.484840] read strings
[   71.467810] dwc2 ff400000.usb: bound driver configfs-gadget
[   71.673140] dwc2 ff400000.usb: new device is high-speed
[   71.809231] dwc2 ff400000.usb: new device is high-speed
[   71.882259] dwc2 ff400000.usb: new address 6
[   71.906431] android_work: sent uevent USB_STATE=CONNECTED
[   71.907887] configfs-gadget gadget: high-speed config #1: b
[   71.908134] android_work: sent uevent USB_STATE=CONFIGURED

同时pc端可以用lsusb观测到新的usb设备,而adb devices则可以看到

List of devices attached
0123456789ABCDEF    device

4.2 其他命令

连接终端 adb shell

发送文件 adb push [local] [remote]

拉取文件 adb pull [remote] [local]

pc安装adb以及更多可用命令可参考rk-adb说明

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
为了在Linux开发板上启用adb,你可以按照以下步骤进行操作: 1. 首先,打开终端并输入`lsusb`命令来查看USB设备列表。你可以确保开发板的USB设备被正确识别。 2. 确认你的开发板上是否已经安装了adb工具。通常情况下,adb工具已经预装在Android开发环境中。你可以通过在终端输入`adb version`命令来验证adb是否已安装并正常工作。 3. 如果adb未正确识别你的开发板,你可以尝试以下解决方法: - 确保你的开发板已正确连接到计算机的USB端口。你可以尝试更换USB端口或使用其他数据线来排除硬件问题。 - 检查你的开发板是否已正确配置为允许USB调试模式。你可以在开发板的设置中找到该选项,并确保其已启用。 - 如果你的开发板使用的是自定义的Linux发行版,你可能需要根据具体的操作系统版本和配置来调整相关设置。你可以参考Linux开发社区的文档和讨论来获取更多帮助。 4. 如果以上步骤仍无法解决问题,你可以考虑使用第三方的adb替代方案,如adbd-linux或Android Debug Bridge daemon implementation in RT-Thread。这些工具提供了更多的定制选项和支持,可以适应不同的开发板和环境需求。你可以参考相关文档和讨论来获取更多关于这些工具的信息和使用方法。 请注意,具体的解决方法可能因开发板和操作系统的不同而有所差异。建议你查阅开发板和操作系统的官方文档,并参考开发社区的讨论来获取更准确和详细的指导。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Linux(Ubuntu) adb 无法识别的问题解决方法](https://download.csdn.net/download/weixin_38689477/14091282)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Linux usb 7. Linux 配置 ADBD](https://blog.csdn.net/kunkliu/article/details/122814710)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值