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配置的更多相关文章

  1. STC8H开发(九): STC8H8K64U模拟USB HID外设

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  2. 在Mac系统上配置Android真机调试环境

    在Mac系统上配置Android真机调试环境 mac上配置安卓环境还说挺方便的,真机调试也比win上要好一些.win上被各种软件强行安装了xxx助手. 在mac上就了一个干净的感觉. 下载Androi ...

  3. STM32F4_RCC系统时钟配置及描述

    Ⅰ.概述 对于系统时钟应该都知道它的作用,就是驱动整个芯片工作的心脏,如果没有了它,就等于人没有了心跳. 对于使用开发板学习的朋友来说,RCC系统时钟这一块知识估计没怎么去配置过,原因在于开发板提供的 ...

  4. Linux系统安全配置基线

    一:共享账号检查 配置名称:用户账号分配检查,避免共享账号存在 配置要求:1.系统需按照实际用户分配账号: 2.避免不同用户间共享账号,避免用户账号和服务器间通信使用的账号共享. 操作指南:参考配置操 ...

  5. linux系统usb挂载

    本次例程的环境是在FC6下,通过终端操作的. 注意要挂载U盘需要有管理员的权限. 切换成管理员,输入: su root 然后输入管理员密码,进行密码认证: 成功后,先在 /mnt 下建立一个名叫USB ...

  6. Windows环境双系统安装环境配置

    (最惊喜的事情莫过于...在安装系统完成重新试图安装Docker时解决了关于HyperV的问题,结果提示Docker只能在Win10 Pro或者Enterprise环境下运行...我很坚强...可以按 ...

  7. .NET Core采用的全新配置系统[10]: 配置的同步机制是如何实现的?

    配置的同步涉及到两个方面:第一,对原始的配置文件实施监控并在其发生变化之后从新加载配置:第二,配置重新加载之后及时通知应用程序进而使后者能够使用最新的配置.要了解配置同步机制的实现原理,先得从认识一个 ...

  8. Linux 桌面系统字体配置要略

    字体显示效果测试 这一段是为了测试宋体字的显示效果,包括宋体里面自带的英文字体,“This is english,how does it look like?”.这一行是小字.后面几个字是加粗的宋体. ...

  9. solr与.net系列课程(九)solr5.1的配置

    solr与.net系列课程(九)solr5.1的配置 最近一些园友来咨询solr5.1的配置方式,然后我就去官网下载了个最新版本的solr,发现solr5.0以后solr的下载包里的内容发生的变化,移 ...

  10. 全新重装win8.1系统后 配置开发及办公环境步骤

    全新重装win8.1系统后 配置开发及办公环境步骤 这两天,系统因配置开发环境出错,重装了一下,为日后方便,故此记录系统配置流程,防日后重装系统计划不周. 安装前,对照步骤,准备好下列安装文件. 0. ...

随机推荐

  1. SQL Server 中的异常处理

    为什么我们需要 SQL Server 中的异常处理? 让我们通过一个示例来了解 SQL Server 中异常处理的必要性.因此,创建一个 SQL Server 存储过程,通过执行以下查询来除以两个数字 ...

  2. CMake简单学习

    CMake 说明 cmake的定义是什么 ?-----高级编译配置工具 当多个人用不同的语言或者编译器开发一个项目,最终要输出一个可执行文件或者共享库(dll,so等等)这时候神器就出现了-----C ...

  3. Zotero 设置坚果云同步(使用 WebDAV 的方法)

    1.坚果云设置 登录坚果云:官网,注册账号 1.建立个人文件夹:zotero 2.在网页打开右上角的 账户信息,并选择 安全选项 在页面下方选择 添加应用 并输入与前面文件夹对应的名称 zotero ...

  4. AI可解释性 I | 对抗样本(Adversarial Sample)论文导读(持续更新)

    AI可解释性 I | 对抗样本(Adversarial Sample)论文导读(持续更新) 导言 本文作为AI可解释性系列的第一部分,旨在以汉语整理并阅读对抗攻击(Adversarial Attack ...

  5. [设计模式/Java] 设计模式之工厂方法模式【11】

    概述:工厂方法模式 := Factory Method Pattern 工厂模式的3种细分模式: 简单工厂模式 / 工厂方法模式 / 抽象工厂模式 工厂模式(Factory Pattern)是 Jav ...

  6. Codeforces Round 970 (Div. 3)

    A. Sakurako's Exam 分类讨论即可,当a为奇数,无法消去1,或者a==0且b为奇数时,无法消去2 #include <bits/stdc++.h> using namesp ...

  7. java基础之File、流

    一.File类 我们可以使用File类的方法 创建一个文件/文件夹 删除文件/文件夹 获取文件/文件夹 判断文件/文件夹是否存在 对文件夹进行遍历 获取文件的大小 构造方法: 1.public Fil ...

  8. Vue3 中的5种常见的组件传值方式,Vue3事件总线(无需插件)

    Vue3 中常见的组件传值方式: Props:这是 Vue 中最常见的组件传值方式,即在父组件中定义 prop 并将数据传递给子组件. Event Bus:可以通过事件总线在两个组件之间进行通信,即定 ...

  9. python相关函数

    1.pow()函数 pow()函数解释 pow(x,y):表示x的y次幂. >>> pow(2,4) 16 >>> pow(x,y,z):表示x的y次幂后除以z的余 ...

  10. heapdump敏感信息提取工具-heapdump_tool(二),附下载链接。

    ​ heapdump敏感信息查询工具,例如查找 spring heapdump中的密码明文,AK,SK等 下载链接: heapdump_tool下载链接:heapdump_tool下载 声明: 此工具 ...