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. .net 跨域 config中配置

    <system.webServer> <validation validateIntegratedModeConfiguration="false" /> ...

  2. EntityFrameworkCore 中实体的几种配置方法

    使用数据注解 实体类通常是在Models目录下,直接在实体类上添加属性注解,比如[Required]/[Key]等. using System.ComponentModel.DataAnnotatio ...

  3. unity prefab

    1.修改prefab原始资源某组件为enabled或disabled,实例如果起初和原始资源是一样的状态那么修改原始资源会作用到实例上,如果发现不一样那么原始资源的修改不会作用到实例上,而且以后都不会 ...

  4. Avalnoia跨平台实战记录(一),Avalonia初始化

    前言: 记录一下小菜鸟程序员从WPF一知半解转向Avalonia跨平台桌面端开发的一点记录和感想,我个人是比较喜欢用.NET来开发的,当然,这也和我的技术栈有很大关系,本人只是从大专出来的,在学校里学 ...

  5. 一条 SQL 语句在 MySQL 中的执行过程

    一条 SQL 语句在 MySQL 中的执行过程 当一条 SQL 语句被提交到 MySQL 时,它会经历多个步骤,包括解析.优化.执行等.以下以 SELECT 语句为例,详细描述整个执行流程. 1. 客 ...

  6. 最小生成树 & 严格次小生成树

    最小生成树 何为最小生成树? 有一类问题:给定一张图,可以删除若干条边,在不改变连通性(一般是全联通)的情况下,权值和最小的方案是什么?没错,这就是最小生成树问题(MST问题).那么基本性质其实连聪明 ...

  7. 【经验】VScode 远程 SSH 连接 Ubuntu 或 TrueNas 出错,Could not establish connection

    用VScode常常会碰到以下情况,Could not establish connection. 先介绍一下VScode远程连接和终端SSH连接的区别:终端直接用SSH连接时,只需要开启SSH服务,并 ...

  8. 工具使用之“contains包含的使用总结”

    一.集合之间的包含 1.判断listOne是否全部包含listTow中的值 格式:CollectionUtils.containsAll(listOne, listTow) 或 listTow.con ...

  9. 【网站推荐】推荐几个MCP(Model Context Protocol,模型上下文协议)的网站

    MCP网站一:MCP 快速入门 介绍 MCP 快速入门.开发工具.核心架构等内容. https://mcp-docs.cn/introduction MCP网站二:GitHub 官方仓库 由MCP协议 ...

  10. B1028 人口普查

    某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人.这里确保每个输入的日期都是合法的,但不一定是合理的--假设已知镇上没有超过200岁的老人,而今天是2014年9月6 ...