前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在Openharmony中实现USB复合设备

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

作者头像
Rice加饭
发布2024-06-06 15:47:14
3000
发布2024-06-06 15:47:14
举报
文章被收录于专栏:Rice嵌入式

背景

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

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

描述项

说明

OpenHarmony版本

release-4.0

内核版本

5.10

板卡

风火轮youyeetoo R1开发板(RK3588S)

通过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模拟设备行为。
  • USB Gadget驱动,包括USB设备控制器(UDC)驱动和Gadget功能(function)驱动两大部分。其中USB设备控制器(UDC)驱动负责USB设备控制器(UDC)和主机侧USB控制器(UHC)之间的数据传输;而Gadget功能驱动(function)负责实现功能协议(如UDC等)。USB设备控制器(UDC)驱动和Gadget功能驱动(function)彼此之间也会进行数据交互。
在OpenHarmony如何配置
  • 在OpenHarmony中,USB这一块依旧采用内核驱动,所以整体套路都是一样。也是通过configfs配置USB功能。
  • 以风火轮youyeetoo R1开发板(RK3588S)为例,configfs配置路径:device/board/youyeetoo/R1/cfg/init.R1.usb.cfg。
  • init.R1.usb.cfg默认已经配置好了HDC的功能,如果需要功能,只需在此文件上增加对应功能即可。
configfs配置USB gadget流程
  1. 挂载configfs,挂载完成之后在/config 目录下就会生成usb_gadget/目录。
代码语言:javascript
复制
"mount configfs none /config"
  1. 建立gadgets, 创建g1/目录之后,该目录下会生成很多配置目录,这里的g1表示 gadget 1,一个 UDC 对应一个 gadget,如果你的 SOC 上有多个 gadget,可以创建多个gx目录。
代码语言:javascript
复制
"mkdir /config/usb_gadget/g1 0770 shell shell"
  1. 写入gadget的PID、VID、序列号等信息。
代码语言:javascript
复制
"write /config/usb_gadget/g1/idVendor 0x2207",
"write /config/usb_gadget/g1/idProduct 0x0018",
"write /config/usb_gadget/g1/os_desc/use 1",
"write /config/usb_gadget/g1/bcdDevice 0x0223",
"write /config/usb_gadget/g1/bcdUSB 0x0200",
"mkdir /config/usb_gadget/g1/strings/0x409 0770",
"copy /sys/block/mmcblk0/device/cid /config/usb_gadget/g1/strings/0x409/serialnumber",
"chmod 0640 /config/usb_gadget/g1/strings/0x409/serialnumber",
"write /config/usb_gadget/g1/strings/0x409/manufacturer Rockchip",
"write /config/usb_gadget/g1/strings/0x409/product \"HDC Device\"",
  1. 建立gadget相关配置configurations。
代码语言:javascript
复制
"mkdir /config/usb_gadget/g1/configs/b.1 0770 shell shell",
"mkdir /config/usb_gadget/g1/configs/b.1/strings/0x409 0770 shell shell",
"write /config/usb_gadget/g1/os_desc/b_vendor_code 0x1",
"write /config/usb_gadget/g1/os_desc/qw_sign MSFT100",
"write /config/usb_gadget/g1/configs/b.1/MaxPower 500",
  1. 建立功能functions
  • 增加功能模版,function name :任意字符串
代码语言:javascript
复制
mkdir /config/usb_gadget/g1/functions/<name>.<instance name>
  • 以HDC为例:
代码语言:javascript
复制
mkdir /config/usb_gadget/g1/functions/ffs.hdc
  1. 建立功能和配置的链接。
  • 增加功能和配置的链接模版
代码语言:javascript
复制
"ln -s /config/usb_gadget/g1/functions/<name>.<instance name> /config/usb_gadget/g1/configs/c.1"
  • 以HDC为例:
代码语言:javascript
复制
"symlink /config/usb_gadget/g1/configs/b.1 /config/usb_gadget/g1/os_desc/b.1",
  1. 使能USB gadget
代码语言:javascript
复制
"setparam sys.usb.configfs 1",
"setparam sys.usb.controller fc000000.usb"

增加CDC ACM支持

  1. 内核配置需要使能CONFIGFS的ACM的支持:
代码语言:javascript
复制
CONFIG_USB_CONFIGFS_ACM=y
  1. 通过configfs配置USB gadget,使其支持CDC ACM
代码语言:javascript
复制
"mkdir /config/usb_gadget/g1/functions/acm.usb",
"symlink /config/usb_gadget/g1/functions/acm.usb /config/usb_gadget/g1/configs/b.1/f2",

验证

  1. 新增加的USB CDC ACM功能之后,就会在/dev下生成设备节点,虚拟串口节点一般为:ttyGSx(即:Gadget Serial)
  1. 数据验证:
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Rice 嵌入式开发技术分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 通过configfs配置Linux USB gadget
  • 增加CDC ACM支持
  • 验证
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档