0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何在Openharmony中实现USB复合设备

Rice嵌入式开发技术分享 来源:Rice嵌入式开发技术分享 作者:Rice嵌入式开发技术 2024-06-13 15:03 次阅读

背景

如何让Openharmony设备HDC接口(OTG接口)作为一个复合设备,实现HDC(HDC:鸿蒙设备连接器) + CDC ACM(USB 虚拟串口),而设备本身支持HDC。所以需要增加CDC ACM(USB 虚拟串口)。

本文主要讲解OpenHarmony中,板卡上的OTG接口如何支持复合设备,环境说明如下:

描述项 说明
OpenHarmony版本 release-4.0
内核版本 5.10
板卡 风火轮youyeetoo R1开发板(RK3588S)

f0f1b5e0-220a-11ef-8eb4-92fbcf53809c.png

通过configfs配置Linux USB gadget

Linux内核5.10,是采用configfs来配置USB的功能,即配置USB gadget。实现USB复合设备之前,需要了解一些概念。

什么是USB gadget

在OpenHarmony如何配置

configfs配置USB gadget流程

什么是USB gadget

USB设备驱动,按照设备端关联的USB控制器是工作在主模式还是从模式,分为USB设备主机侧驱动(主模式),或者USB设备从机侧驱动(从模式)。同时,工作在主模式的USB控制器,称为USB主机控制器(UHC:USB Host Controller),工作在从模式的USB控制器,称为USB设备控制器(UDC: USB Device Controller)。有的USB控制器,只能工作在主模式或从模式中的某一种;而有的则既可以工作在主模式,也可以工作在从模式,模式通过OTG切换。当然,在同一时刻,USB控制器要么工作在主模式,要么工作在从模式。

本文的重点是USB设备从机侧驱动(从模式),Linux下将USB设备从机侧驱动,称为USB Gadget驱动。USB Gadget驱动 是通过USB来模拟其它类型的设备,如USB Gadget UAC驱动 用来模拟声卡外设;USB Gadget Serial驱动用来模拟串口外设,等等等等。这里所谓模拟,是指通过USB来模拟这些设备的行为,而这些对于连接对端的USB主机是透明的。对于USB Gadget驱动 ,类似于譬如像U盘设备的固件,但它们并不完全等同,因为毕竟只是通过USB模拟设备行为。

f11f7db8-220a-11ef-8eb4-92fbcf53809c.png

USB Gadget驱动,包括USB设备控制器(UDC)驱动和Gadget功能(function)驱动两大部分。其中USB设备控制器(UDC)驱动负责USB设备控制器(UDC)和主机侧USB控制器(UHC)之间的数据传输;而Gadget功能驱动(function)负责实现功能协议(如UDC等)。USB设备控制器(UDC)驱动和Gadget功能驱动(function)彼此之间也会进行数据交互。

在OpenHarmony如何配置

在OpenHarmony中,USB这一块依旧采用内核驱动,所以整体套路都是一样。也是通过configfs配置USB功能。

以风火轮youyeetooR1开发板(RK3588S)为例,configfs配置路径:device/board/youyeetoo/R1/cfg/init.R1.usb.cfg。

init.R1.usb.cfg默认已经配置好了HDC的功能,如果需要功能,只需在此文件上增加对应功能即可。

configfs配置USB gadget流程

挂载configfs,挂载完成之后在/config 目录下就会生成usb_gadget/目录。

"mountconfigfsnone/config"

建立gadgets, 创建g1/目录之后,该目录下会生成很多配置目录,这里的g1表示 gadget 1,一个 UDC 对应一个 gadget,如果你的 SOC 上有多个 gadget,可以创建多个gx目录。

"mkdir/config/usb_gadget/g10770shellshell"

写入gadget的PID、VID、序列号等信息

"write/config/usb_gadget/g1/idVendor0x2207",
"write/config/usb_gadget/g1/idProduct0x0018",
"write/config/usb_gadget/g1/os_desc/use1",
"write/config/usb_gadget/g1/bcdDevice0x0223",
"write/config/usb_gadget/g1/bcdUSB0x0200",
"mkdir/config/usb_gadget/g1/strings/0x4090770",
"copy/sys/block/mmcblk0/device/cid/config/usb_gadget/g1/strings/0x409/serialnumber",
"chmod0640/config/usb_gadget/g1/strings/0x409/serialnumber",
"write/config/usb_gadget/g1/strings/0x409/manufacturerRockchip",
"write/config/usb_gadget/g1/strings/0x409/product"HDCDevice"",

建立gadget相关配置configurations。

"mkdir/config/usb_gadget/g1/configs/b.10770shellshell",
"mkdir/config/usb_gadget/g1/configs/b.1/strings/0x4090770shellshell",
"write/config/usb_gadget/g1/os_desc/b_vendor_code0x1",
"write/config/usb_gadget/g1/os_desc/qw_signMSFT100",
"write/config/usb_gadget/g1/configs/b.1/MaxPower500",

建立功能functions

增加功能模版,function name :任意字符串

mkdir/config/usb_gadget/g1/functions/.

以HDC为例:

mkdir/config/usb_gadget/g1/functions/ffs.hdc

建立功能和配置的链接。

增加功能和配置的链接模版

"ln-s/config/usb_gadget/g1/functions/./config/usb_gadget/g1/configs/c.1"

以HDC为例:

"symlink/config/usb_gadget/g1/configs/b.1/config/usb_gadget/g1/os_desc/b.1",

使能USB gadget

"setparamsys.usb.configfs1",
"setparamsys.usb.controllerfc000000.usb"

增加CDC ACM支持

内核配置需要使能CONFIGFS的ACM的支持:

CONFIG_USB_CONFIGFS_ACM=y

通过configfs配置USB gadget,使其支持CDC ACM

"mkdir/config/usb_gadget/g1/functions/acm.usb",
"symlink/config/usb_gadget/g1/functions/acm.usb/config/usb_gadget/g1/configs/b.1/f2",
f1363396-220a-11ef-8eb4-92fbcf53809c.png

验证

新增加的USB CDC ACM功能之后,就会在/dev下生成设备节点,虚拟串口节点一般为:ttyGSx(即:Gadget Serial)

f141fb40-220a-11ef-8eb4-92fbcf53809c.png

数据验证:

f15e953e-220a-11ef-8eb4-92fbcf53809c.png

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • usb
    usb
    +关注

    关注

    60

    文章

    7867

    浏览量

    263612
  • hdc
    hdc
    +关注

    关注

    1

    文章

    43

    浏览量

    3566
  • OpenHarmony
    +关注

    关注

    25

    文章

    3629

    浏览量

    16031
收藏 人收藏

    评论

    相关推荐

    stm32 usb复合设备支持键盘鼠标和hid串口通信可以实现吗?

    stm32 usb复合设备支持键盘鼠标和hid串口通信可以实现
    发表于 05-24 08:20

    何在一个USB设备同时实现USBHID和USB读卡器

    原子大哥,如何在一个USB设备同时实现USBHID和USB读卡器 ?我把HID的各描述符都放到
    发表于 07-24 04:35

    灵动微课堂(第109讲) | MM32 USB功能学习笔记 —— USB复合设备

    、类别描述元和端点描述元,而HID类别则会有特定的类别描述元,此描述元会交代报告(report)描述元和实体(physical)描述元; 本节我们来讲解如何在MM32 MCU实现USB复合
    发表于 03-04 17:23

    怎样去编写STM32 USB复合设备

    本实验是基于野火霸道开发板STM32F103ZET6目的完成一个CDC + MSC的复合USB设备可以方便在CDC,MSC,复合设备三者间切
    发表于 08-20 07:28

    STM32 USB复合设备编写的目的是什么

    STM32 USB复合设备编写目的完成一个CDC + MSC的复合USB设备可以方便在CDC,M
    发表于 08-20 07:10

    如何利用OpenHarmony实现智能设备面板的设计

    。如何实现多种家庭设备的集中管理和远程控制,是智能家居功能的体现。基于以上背景,本文提出了一种基于OpenHarmony设计实现智能
    发表于 03-21 09:20

    OpenHarmony标准设备应用开发笔记汇总

    何在标准设备上运行一个最简单的 OpenHarmony 程序。2、如何在OpenHarmony
    发表于 03-28 14:19

    USB复合设备工作不正常是因为端点太多了吗?

    我在H7芯片上成功运行了ThreadX+USBX程序。使用的是USB复合设备(CDC ACM+HID),所以我尝试在F105RBT6上实现同样的功能,但是遇到了麻烦,在F105上运行
    发表于 12-27 06:58

    无法将工作USB复合设备应用程序从LPC54114移植到LPC11U68怎么解决?

    我无法将工作USB 复合设备应用程序从 LPC54114 移植到 LPC11U68。问题背景:在此应用程序
    发表于 04-14 06:34

    USB复合设备的概念及CDC MSC的讲解

    购买Hub的费用,而对于开发者则希望可以既不占用多接口,又可以实现多功能,来赢得消费者的关注。USB复合设备就在这样的市场需求下应运而生。
    发表于 09-07 06:11

    WinCE系统USB设备自动检测实现

    英创公司ARM9系列工控主板预装正版 WinCE 操作系统,提供标准USB接口,本文介绍如何在应用程序判断USB存储设备的插入和移出操作。
    发表于 06-09 15:48 51次下载

    实现stm32 usb复合设备开发

    cube的stm32 usb代码分析以及复合设备开发
    的头像 发表于 07-05 00:11 9256次阅读
    <b class='flag-5'>实现</b>stm32 <b class='flag-5'>usb</b><b class='flag-5'>复合</b><b class='flag-5'>设备</b>开发

    MM32 USB功能学习笔记 —— USB复合设备

    在上一节我们介绍了MM32 MCU的USB模拟U盘功能,通过四个章节把常用的USB设备功能编程一一做了介绍,通常来说,往往希望我们USB设备
    发表于 02-09 11:27 2次下载
    MM32 <b class='flag-5'>USB</b>功能学习笔记 —— <b class='flag-5'>USB</b><b class='flag-5'>复合</b><b class='flag-5'>设备</b>

    何在OpenHarmony上开发服务卡片

    本篇文章我们将分享如何在 OpenHarmony 上开发服务卡片。
    的头像 发表于 04-10 11:12 989次阅读

    USB复合设备介绍

    电子发烧友网站提供《USB复合设备介绍.pdf》资料免费下载
    发表于 08-01 10:37 0次下载
    <b class='flag-5'>USB</b><b class='flag-5'>复合</b><b class='flag-5'>设备</b>介绍