当前位置: 首页 > news >正文

ZYNQ linux上使用 USB CDC ACM

一、USB CDC ACM介绍

USB CDC ACM 是 USB 通信设备类(CDC)中的一个子类,它提供了一种通过 USB 接口实现虚拟串行通信的标准方法。

1. 基本概念

CDC ACM 是 USB 规范中定义的一种设备类协议,它模拟传统的串行端口通信,提供双向数据传输通道,支持控制信号(如 RTS/CTS、DTR/DSR 等,是 USB 转串口设备的常用实现方式。

2. 主要特点

标准化:遵循 USB-IF 定义的 CDC 规范

兼容性:大多数操作系统内置驱动支持

灵活性:可以在不同硬件平台上实现

多功能:支持数据和控制通道分离

3. 技术架构

CDC ACM 包含两个主要接口:

3.1 通信接口(Communication Interface)

管理设备控制和状态

包含中断端点(Interrupt Endpoint)

处理线路编码、控制信号等

3.2 数据接口(Data Interface)

处理实际数据传输

包含批量输入和输出端点(Bulk In/Out Endpoints)

实现数据流传输

二、 Linux-USB Gadget驱动框架

在ZYNQ等ARM板卡上移植好linux内核后,就可以通过linux USB Gadget驱动框架实现USB CDC类。

USB Gadget 框架是 Linux 内核中实现 USB 设备功能的子系统,它允许嵌入式设备作为 USB 从设备(Peripheral)与主机通信。

在 ZYNQ 7000系列SOC上,存在两个USB2.0接口,支持USB HOST和USB OTG。

笔者板卡(正点原子 ZYNQ7035)上的 USB HOST 接口与 USB OTG 接口(也称 USB Slave 接口)共用了YNQ PS 端的 USB0 接口,所以在正常情况下,USB HOST 和 USB OTG 不能同时工作,所

以在 Z100 底板上有一组跳线帽端子 J15 用于控制 USB HOST 和 USB OTG 哪个接口工作。

对于USB OTG 接口工作:

需要通过两个跳线帽将 J15 端子的 DN 与 SN 相连、DP 与 SP 相连,注意先连接 DN 与SN。

三、vivado工程配置

在block design中,添加ZYNQ7 PS后使能USB0接口,并选择对应的MIO接口:
image
image
设置完成后,重新生成xsa文件。

四、设备树配置

在vivado中使能USB0配置后,在PCW.dtsi设备树文件中关于usb0的节点status 属性就被设置为"okay"了,

image

所以由此可以知道,其实 pcw.dtsi 文件中已经使能了 usb0,但是目前还是不能使用 usb0的,还需要为 usb0 节点添加一下属性内容,打开 arch/arm/boot/dts/system-user.dtsi 设备树文件,

添加相关内容。首先需要在 system-user.dtsi 设备树根节点下添加一个 usb_phy0 节点,用于描述 USB phy相关信息,如下所示:

image

其中,dr_mode可以是OTG,也可以为peripheral

system-user.dtsi 设备树文件修改完成之后,保存退出!然后在内核源码根文件目录下执行下面这条命令编译设备树文件:

make dtbs

将编译得到的 system-top.dtb 文件重命名为 system.dtb,将 system.dtb 文件拷贝到开发板SD 启动卡的第一个分区,替换掉就的设备树文件。

五、内核配置

USB 的HOST在linux内核中是默认配置的,但是CDC是没有默认开启的,因此需要配置内核相关配置。

在内核源码根文件夹下执行:

make menuconfig
配置路径为:
Device Drivers --->
[] USB support --->
<
> USB Gadget Support --->
<*> USB Gadget precomposed configurations --->
勾选以下配置:
20250807-145703

20250807-145717

配置好后, save 并退出,重新编译下内核:

make -j8
编译成功后会在arch/arm/boot下生成zImage内核镜像,将该文件拷贝至U盘的vfat分区(boot)。

同时会生成相关驱动,目录如下:
image
将以下驱动拷贝至vfat分区目录下:

g_serial.ko, libcomposite.ko, usb_f_acm.ko, usb_f_obex.ko, usb_f_serial.ko, u_serial.ko.

并启动Linux,按顺序加载前面生成的驱动模块:出现以下信息代表驱动挂载成功了:

image

此时打开设备文件发现多了/dev/ttyGS0设备,这个就是虚拟的串口设备。
image

六、读写测试

将板卡上的usb slave接口链接电脑,这时候在windows的设备管理器中发现这个USB设备:
image

6.1 终端写

在电脑上通过串口工具(如xcom)打开该设备,并在ZYNQ终端中输入发送测试命令:
echo hello,this is usb cdc acm device > /dev/ttyGS0`

在串口工具成功接收到该信息:
image

6.2 终端读

在ZYNQ终端通过cat监听该USB的接收信息,在串口工具,发送任意字符,并勾选发送新行(这里笔者猜测是终端的内核缓冲区机制,\n会让内核接收的信息刷新出来)。否则可能不会在终端打印出来
image

http://www.sczhlp.com/news/7413/

相关文章:

  • 数据库进阶-存储函数
  • 【算法分享】二进制枚举解决经典熄灯游戏问题
  • SFINAE + 模板特化用于判断类型T是否定义了非void的value_type成员类型
  • 【合作ACM出版、高录用、稳检索】2025年教育创新与信息技术国际学术会议 (EIIT 2025)
  • 强化学习中慢速网络学习更快
  • 更新证书
  • 怎样理解 Vue 的单向数据流?
  • 轻松上手!AI口播视频系统操作教程大揭秘
  • vscode开发51引入REGX52.H
  • yt-dlp 使用教程 - Leone
  • 口胡数论
  • Java中的算法优化与复杂度分析
  • 集训内容总结 day8:模拟赛 Round1
  • 模式识别,非监督聚类分析分类方法
  • 【新疆、IEEE列表会议、往届均已检索】第四届电力系统与电力工程国际学术会议(PSPE 2025)
  • C++结构体与JSON的相互转换
  • 感情
  • SM341700 填写操作工和班组输入码sql语句判定是否有回车换行;result函数 function参数必须要3个event, item, formatted
  • 全志T527/A527 Linux应用程序的开发与自启动-盈鹏飞嵌入式
  • 全志T527/A527 Linux系统的定制-盈鹏飞嵌入式
  • docker+drone+gogs自动化部署Java项目
  • Elasticsearch Enterprise 9.1.0 (macOS, Linux, Windows) - 分布式搜索和分析引擎
  • 高音质低延迟EWM104-BT3040蓝牙音频模块方案解析
  • 回溯算法——全排列问题
  • classpath和classpath*区别
  • MYSQL表的操作
  • 【IEEE出版、连续4届稳定EI检索】第五届能源、动力与电气工程国际学术会议(EPEE 2025)
  • ProfibusDP转DeviceNet欧姆龙 PLC 联合霍尼韦尔液位传感器实现食品生产线智能化升级案例
  • 一些一般不会被卡的模数和 base(持续更新)
  • juce - 自定义标题栏