九、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
  1. 修改文件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
    
  2. 修改文件 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}'`
    
    
  3. 编译

    必须先清空后重新编译

    sudo ./build.sh cleanall && sudo ./build.sh
    
  4. 验证

    # 设备端
    cat /sys/kernel/config/usb_gadget/rockchip/idVendor
    
    # window
    # 设备管理器 -> 通用串行总线设备 -> adb interface -> 详细信息 -> 硬件id
    
2、修改设备SN
  1. 修改方式

    1. 打开工具RKDevInfoWriteTool

    2. 设备进入 loader状态

      reboot loader
      
    3. 写入SN

  2. 验证

    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、虚拟串口无法接收数据,且数据回显
  1. 问题描述

    PC端串口调试助手发送数据直接回显,使用以下命令设备端无法接收数据,但是设备可以发送数据,且PC端串口调试助手收到返回

    cat /dev/ttyS0
    
  2. 解决方式

    检查串口设备的配置: 使用 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),避免打印多余的换行符。

  3. 测试

    设备端执行

    cat /dev/ttyS0
    

    PC端串口调试助手发送任意测试数据,观察设备端数据。

你可能感兴趣的:(九、buildroot系统 usb配置)