一、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接口:





设置完成后,重新生成xsa文件。

四、设备树配置

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

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

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

其中,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 --->

勾选以下配置:

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

make -j8

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

同时会生成相关驱动,目录如下:



将以下驱动拷贝至vfat分区目录下:

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

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

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

六、读写测试

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

6.1 终端写

在电脑上通过串口工具(如xcom)打开该设备,并在ZYNQ终端中输入发送测试命令:

echo hello,this is usb cdc acm device > /dev/ttyGS0`

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

6.2 终端读

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

ZYNQ linux上使用 USB CDC ACM的更多相关文章

  1. Linux下使用USB模拟ACM串口设备

    这个想法之前就在脑袋里有过,最近公司产品要用到,所以多做了些了解. 1. USB 简介 USB 是 Universal Serial Bus 的缩写,从字面上看,就是通用串行总线的意思.从物理上看,其 ...

  2. Linux下使用USB模拟ACM串口设备【转】

    本文转载自:https://www.cnblogs.com/pied/p/4549614.html 这个想法之前就在脑袋里有过,最近公司产品要用到,所以多做了些了解. 1. USB 简介 USB 是 ...

  3. android的USB MTP && USB CDC/USBnet(ECM, NCM, ACM) && USB gardget

    MTP的全称是Media Transfer Protocol(媒体传输协议),它是微软公司提出的一套媒体文件传输协议.早在智能手机普及前,数码相机和MP3播放器等都使用了MTP的前身PTP(Pictu ...

  4. 〖Linux〗通过USB连接,共享Linux上的网络,使用Android手机上网。

    1. Android手机上打开USB共享 2. Linux上修改USB0的ip地址并启用 sudo ifconfig usb0 192.168.42.127 up 3. Android手机上修改路由表 ...

  5. TL-WDN5200H无线usb网卡在Linux上的使用

    买了个TL-WDN5200H无线usb网卡,但是发现它居然不支持Linux,但是我有时需要在Linux上使用,这就尴尬了.于是到网上搜索资料,终于解决了这个问题. 首先编译安装:https://git ...

  6. kali Linux 上编译并使用RFID核弹——proxmark3

    你还在在Windows下使用proxmark3?弱爆了! 本文作者:i春秋签约作家——冰尘 作为一个标准的日天日地日空气的(单身贵族泰迪)物理黑客Proxmark3这么高大上的东西应该是在键盘敲打声中 ...

  7. USB CDC类

    现代嵌入式系统中,异步串行通信接口往往作为标准外设出现在单片机和嵌入式系统中.但是随着个人计算机通用外围设备越来越少地使用串口,串口正在逐渐从个人计算机特别是便携式电脑上消失.于是嵌入式开发人员常常发 ...

  8. ATMEL处理器自带USB CDC的Win7驱动问题

    [背景] 很久以前使用ATMEL的处理器开发了一款设备,通过处理器本身的功能,借助USB在PC端虚拟一个串口出来,实现和上位机软件的通信,和基本的参数设置和数据读取功能. 这个功能就是ATMEL官网上 ...

  9. linux自带有usb驱动,为什么还需要libusb呢

    linux里的软件分为用户层和内核层两种.比如内核里编译了温度传感器的驱动,还得有lm-sensors在用户层负责解释处理内核递交出的数据.usb驱动是硬件驱动方面的东西,libusb是给应用软件开发 ...

  10. 第5章 Linux上管理文件系统

    5.1 机械硬盘 机械硬盘由多块盘片组成,它们都绕着主轴旋转.每块盘片上下方都有读写磁头悬浮在盘片上下方,它们与盘片的距离极小.在每次读写数据时盘片旋转,读写磁头被磁臂控制着不断的移动来读取其中的数据 ...

随机推荐

  1. git reset回滚未提交的更改和覆盖分支

    摘要:介绍git reset使用技巧:回滚本地所有未提交的更改,用一个分支覆盖另一个分支.   git回滚本地所有未提交的更改可以使用命令 git reset,它的功能是强制覆盖本地文件到指定分支.切 ...

  2. mysql的递归写法:部门层级

    前言 详细的可以参考:https://cloud.tencent.com/developer/article/2106748 这里用 WITH RECURSIVE 实现递归,需要 MySQL 8.0 ...

  3. 自签名证书工具cfssl详解

    概述 GitHub地址:https://github.com/cloudflare/cfssl 官方地址:https://pkg.cfssl.org CFSSL(CloudFlare's PKI an ...

  4. 关于Django项目集成Xadmin后,出现服务异常解决方案

    Django项目集成Xadmin后,偶尔出现页面不能访问,重启服务也不行,如果是Nginx部署直接报504等错误. 解决方案: 在项目中的静态文件中找到:bootstrap-clockpicker.j ...

  5. 告别图形界面:Windows系统OpenSSH服务部署

    前言 士别三日当刮目相待 没想到这么多年过去了,Windows 也不再是以前那个离开了图形界面啥也不是的系统 Windows 10/11 和 Server 2019+ 已内置 OpenSSH Serv ...

  6. 基于Spring AI服务,开发MCP服务

    大家好,好久没有写博客了,最近突然想写一些新的东西,如何开发mcp服务,本地如何调试. 一.项目概述 Spring AI MCP Demo 是一个基于 Spring 生态的多模块应用工程,主要围绕 A ...

  7. SM30里DEC数据显示0

    需求:DEC数据在维护的时候显示0 1,设置数据元素对于的域带转换历程. 2,写转换历程函数(注意两个历程的输入和输出类型,这个需要修改) FUNCTION conversion_exit_zdays ...

  8. 禁止后退Js 兼容各个浏览器

    <script src="${ctxPath}/media/lib/jquery.history.js"></script> <script> ...

  9. Labubu的风过了?无用的产品才是艺术

    正如标题所说,在风头过去之后,我们来理性客观地聊聊Labubu. "所有的消费行为都是在解决两件事情:一个是满足感,一个是存在感.满足感,就是人的物质需求和基本精神需求得到了满足.存在感,就 ...

  10. SQL Server 中的检查账号是否被锁定-用户登陆失败的原因与解决方案

    在使用 SQL Server 数据库时,用户可能会遇到"用户登陆失败"的问题.这种问题不仅会影响数据库的使用,也可能导致应用程序的中断.因此,了解这一问题的原因及其解决方案至关重要 ...