文章目录
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说明