九、buildroot系统 usb配置
3.3、usb配置
源码中kernel默认已经打开了相关的usb配置,只需要在buildroot中打开相关配置。
1、基本功能类别
简称 | 功能描述 |
---|---|
ADB (Android Debug Bridge) | ADB是一种功能多样的命令行调试工具,可以实现文件传输,Unix Shell登录等功能。 |
UAC (USB Audio Class) | UAC通过USB虚拟标准PCM接口给Host设备,实现Device和Host之间音频互传功能。 |
RNDIS(Remote Network Driver Interface Specification) | RNDIS提供基于USB的网络接口规范,可以使用网络命令(SSH等)实现Device和Host的数据交互。 |
MTP (Media Transfer Protocol) | MTP是由Microsoft提出的一套媒体文件传输协议,可以方便的在Device和Host之间共享媒体文件。MTP支持多用户操作。 |
UMS (USB Mass Storage) | UMS 给Host设备提供大容量外挂存储。目标Block为独占工作,多用户操作同一Block将会出现错误。 |
ACM (CDC - ACM: Communication Device Class - Abstract Control Model) | USB虚拟串口,在Device/Host两端生成TTY设备。 |
UVC (USB Video Class) | USB视频设备类描述了能够流式传输视频的设备,如网络摄像机、数码摄像机、转码器、模拟视频转换器 和 静态图像相机。 |
2、启用配置
sudo make menuconfig
# Target packages → Hardware Platforms → Rockchip Platform → Rockchip BSP packages
# 开启相关配置
Target packages --->
Hardware Platforms --->
Rockchip Platform --->
Rockchip BSP packages --->
[*] rockchip script --->
[*] rkscript iodomain notice script
[*] kscript mountall
[*] rkscript usbdevice --->
[*] adbd
[*] acm
3、自定义接口信息
1、修改vid以及pid
-
修改文件usbdevice
external/rkscript/usbdevice
usb_pid() { case "$(echo $USB_FUNCS | xargs -n 1 | sort | xargs | tr ' ' '-')" in ums) echo 0x0000;; mtp) echo 0x0001;; uvc) echo 0x0005;; adb) echo 0x0006;; adb-mtp) echo 0x0011;; adb-ums) echo 0x0018;; adb-uvc) echo 0x0015;; ntb-uvc) echo 0x0017;; acm) echo 0x1005;; *) echo 0xAAAA;; esac } usb_init() { usb_msg "Initializing" echo 0xAAAA> idVendor # echo 0x2207 > idVendor echo 0xAAAA > bcdDevice
-
修改文件 usb_config.sh
./common/images/oem/uvcc/usb_config.sh
/etc/init.d/S10udev stop umount /sys/kernel/config mkdir /dev/usb-ffs mount -t configfs none /sys/kernel/config mkdir -p /sys/kernel/config/usb_gadget/rockchip mkdir -p /sys/kernel/config/usb_gadget/rockchip/strings/0x409 mkdir -p ${USB_CONFIGS_DIR}/strings/0x409 echo 0xAAAA > /sys/kernel/config/usb_gadget/rockchip/idVendor echo 0xAAAA > /sys/kernel/config/usb_gadget/rockchip/bcdDevice echo 0xAAAA > /sys/kernel/config/usb_gadget/rockchip/bcdUSB echo 239 > /sys/kernel/config/usb_gadget/rockchip/bDeviceClass echo 2 > /sys/kernel/config/usb_gadget/rockchip/bDeviceSubClass echo 1 > /sys/kernel/config/usb_gadget/rockchip/bDeviceProtocol SERIAL_NUM=`cat /proc/cpuinfo |grep Serial | awk -F ":" '{print $2}'`
-
编译
必须先清空后重新编译
sudo ./build.sh cleanall && sudo ./build.sh
-
验证
# 设备端 cat /sys/kernel/config/usb_gadget/rockchip/idVendor # window # 设备管理器 -> 通用串行总线设备 -> adb interface -> 详细信息 -> 硬件id
2、修改设备SN
-
修改方式
-
打开工具RKDevInfoWriteTool
-
设备进入 loader状态
reboot loader
-
写入SN
-
-
验证
cat /proc/device-tree/serial-number
4、新建自定义usb端口
# 将configfs文件系统挂载到指定目录 config,configfs 是一个内核文件系统,允许用户空间配置各种内核对象,比如 USB gadget、设备树等。
mount -t configfs none config
# 创建 gadget g1目录
mkdir config/usb_gadget/g1
# 设置 USB 设备的 Vendor ID 和 Product ID。0x1d6b 是一个常用的 USB 设备供应商 ID,0x0105 是 USB 产品 ID
echo 0x1d6b > config/usb_gadget/g1/idVendor
echo 0x0105 > config/usb_gadget/g1/idProduct
# bcdDevice 设置设备的版本信息,0x0310 表示设备版本为 3.1.0
# bcdUSB 设置 USB 协议版本,0x0200 表示 USB 2.0
echo 0x0310 > config/usb_gadget/g1/bcdDevice
echo 0x0200 > config/usb_gadget/g1/bcdUSB
# 配置字符串(英文)
# 创建一个存放字符串的目录 strings/0x409,表示该设备支持英语(0x409 是英语的语言代码)。
# 设置设备的 serialnumber、manufacturer 和 product 字符串:
# serialnumber 是设备的序列号。
# manufacturer 设置制造商名称为 "rockchip"。
# product 设置产品名称为 "rkusbtest"
mkdir config/usb_gadget/g1/strings/0x409
echo 0123459876 > config/usb_gadget/g1/strings/0x409/serialnumber
echo "rockchip" > config/usb_gadget/g1/strings/0x409/manufacturer
echo "rkusbtest" > config/usb_gadget/g1/strings/0x409/product
# 创建配置项
# 创建配置 b.1,它是 USB 设备的一个配置文件,用来描述设备的具体工作模式
mkdir config/usb_gadget/g1/configs/b.1
# 在配置 b.1 下创建字符串目录,用于描述配置的字符串信息
mkdir config/usb_gadget/g1/configs/b.1/strings/0x409
echo "test" > config/usb_gadget/g1/configs/b.1/strings/0x409/configuration
# 设置 MaxPower 为 500 毫安
echo 500 > config/usb_gadget/g1/configs/b.1/MaxPower
# 设置 Windows OS descriptor(如果需要)
# 设置 Windows OS descriptor 的供应商代码(0x1 是 Microsoft 的代码)。
echo 0x1 > config/usb_gadget/g1/os_desc/b_vendor_code
# 设置 Windows 操作系统签名(MSFT100 是标识 Microsoft 操作系统的签名)
echo "MSFT100" > config/usb_gadget/g1/os_desc/qw_sign
ln -s config/usb_gadget/g1/configs/b.1 config/usb_gadget/g1/os_desc/b.1
# 创建 FunctionFS function 并连接到配置中
mkdir config/usb_gadget/g1/functions/ffs.test
# 将 ffs.test 函数与配置 b.1 进行关联。
ln -s config/usb_gadget/g1/functions/ffs.test config/usb_gadget/g1/configs/b.1/f1
# 挂载 FunctionFS,创建设备端点目录(确保目录 /dev/usb-ffs/test 存在)
mkdir -p /dev/usb-ffs/test
# 将 functionfs 类型的文件系统挂载到 /dev/usb-ffs/test,这表示将功能 ffs.test 挂载到设备节点上。rmode=0770,fmode=0660,uid=1024,gid=1024 是挂载选项,指定了读取和写入的权限及文件所有者
mount -o rmode=0770,fmode=0660,uid=1024,gid=1024 -t functionfs test /dev/usb-ffs/test
5、问题记录
1、虚拟串口无法接收数据,且数据回显
-
问题描述
PC端串口调试助手发送数据直接回显,使用以下命令设备端无法接收数据,但是设备可以发送数据,且PC端串口调试助手收到返回
cat /dev/ttyS0
-
解决方式
检查串口设备的配置: 使用
stty
命令来查看当前串口的设置stty -F /dev/ttyS0 -a speed 9600 baud; rows 0; columns 0; line = 0; intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0; -parenb -parodd -cmspar cs8 hupcl -cstopb cread clocal -crtscts -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8 opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho -extproc
禁用流控制: 目前的配置中没有启用硬件流控制(
-crtscts
),但是在输入和输出流控制方面有一些配置需要注意,特别是xon
(软件流控制)。你可以尝试禁用所有流控制,确保数据传输不受干扰:stty -F /dev/ttyGS0 -ixon -ixoff
禁用回显: 通过
stty
禁用回显(echo
)设置,可以避免通过串口发送的数据被回显回终端:stty -F /dev/ttyGS0 -echo
原始模式: 为了确保串口数据不被修改(例如自动转换换行符等),你可以将串口设置为原始模式(
raw
)。这将禁用终端的所有输入输出处理:stty -F /dev/ttyGS0 raw
清除回车符处理: 如果在发送数据时看到多余的回车符(
\r
)或换行符(\n
)被多次打印,可以尝试调整回车符处理:stty -F /dev/ttyGS0 icrnl
这会将输入的回车符 (
\r
) 转换为换行符 (\n
),避免打印多余的换行符。 -
测试
设备端执行
cat /dev/ttyS0
PC端串口调试助手发送任意测试数据,观察设备端数据。