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


设置完成后,重新生成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的更多相关文章
- Linux下使用USB模拟ACM串口设备
这个想法之前就在脑袋里有过,最近公司产品要用到,所以多做了些了解. 1. USB 简介 USB 是 Universal Serial Bus 的缩写,从字面上看,就是通用串行总线的意思.从物理上看,其 ...
- Linux下使用USB模拟ACM串口设备【转】
本文转载自:https://www.cnblogs.com/pied/p/4549614.html 这个想法之前就在脑袋里有过,最近公司产品要用到,所以多做了些了解. 1. USB 简介 USB 是 ...
- android的USB MTP && USB CDC/USBnet(ECM, NCM, ACM) && USB gardget
MTP的全称是Media Transfer Protocol(媒体传输协议),它是微软公司提出的一套媒体文件传输协议.早在智能手机普及前,数码相机和MP3播放器等都使用了MTP的前身PTP(Pictu ...
- 〖Linux〗通过USB连接,共享Linux上的网络,使用Android手机上网。
1. Android手机上打开USB共享 2. Linux上修改USB0的ip地址并启用 sudo ifconfig usb0 192.168.42.127 up 3. Android手机上修改路由表 ...
- TL-WDN5200H无线usb网卡在Linux上的使用
买了个TL-WDN5200H无线usb网卡,但是发现它居然不支持Linux,但是我有时需要在Linux上使用,这就尴尬了.于是到网上搜索资料,终于解决了这个问题. 首先编译安装:https://git ...
- kali Linux 上编译并使用RFID核弹——proxmark3
你还在在Windows下使用proxmark3?弱爆了! 本文作者:i春秋签约作家——冰尘 作为一个标准的日天日地日空气的(单身贵族泰迪)物理黑客Proxmark3这么高大上的东西应该是在键盘敲打声中 ...
- USB CDC类
现代嵌入式系统中,异步串行通信接口往往作为标准外设出现在单片机和嵌入式系统中.但是随着个人计算机通用外围设备越来越少地使用串口,串口正在逐渐从个人计算机特别是便携式电脑上消失.于是嵌入式开发人员常常发 ...
- ATMEL处理器自带USB CDC的Win7驱动问题
[背景] 很久以前使用ATMEL的处理器开发了一款设备,通过处理器本身的功能,借助USB在PC端虚拟一个串口出来,实现和上位机软件的通信,和基本的参数设置和数据读取功能. 这个功能就是ATMEL官网上 ...
- linux自带有usb驱动,为什么还需要libusb呢
linux里的软件分为用户层和内核层两种.比如内核里编译了温度传感器的驱动,还得有lm-sensors在用户层负责解释处理内核递交出的数据.usb驱动是硬件驱动方面的东西,libusb是给应用软件开发 ...
- 第5章 Linux上管理文件系统
5.1 机械硬盘 机械硬盘由多块盘片组成,它们都绕着主轴旋转.每块盘片上下方都有读写磁头悬浮在盘片上下方,它们与盘片的距离极小.在每次读写数据时盘片旋转,读写磁头被磁臂控制着不断的移动来读取其中的数据 ...
随机推荐
- RabbitMQ学习笔记【长更】
文章发表在了我的博客上:https://blog.ysboke.cn/archives/64.html 一.MQ作用 就仨:异步.削峰.解耦 1.任务异步处理 将不需要同步处理的并且耗时长的操作由消息 ...
- XXL-MQ v1.4.0 | 轻量级分布式消息队列
Release Notes 1.[重构]XXL-MQ 核心代码重构,基于"存算分离"与"分区机制"设计思想.在轻量级.分布式的基础上,强化高吞吐.海量消息及水平 ...
- Ocelot和Consul 实现网关API 服务注册 负载均衡
Ocelot是一个用.NET Core实现并且开源的API网关,它功能强大,包括了:路由.请求聚合.服务发现.认证.鉴权.限流熔断.并内置了负载均衡器与Service Fabric.Butterfly ...
- 从传统搜索到智能问答:自研 RAG 系统的技术实践与工程落地
一.引言 在数字化转型浪潮下,企业知识服务体系正经历着深刻变革.如何让用户高效获取所需信息,成为提升产品竞争力和用户满意度的关键.葡萄城作为企业级开发工具与解决方案提供商,长期致力于知识服务体系的建设 ...
- HashMap之装载因子
装载因子:load fator,散列表中关键字个数和散列表长度之比.她用于度量所有关键字填充哈希表后饱和的程度. 重哈希:rehash,亦或再散列,当装载因子达到指定阈值时,散 ...
- update注入之我理解
1.基本语法 update test.test_table set username='admin123',password=000 where id=1; update test.test_tabl ...
- Keil watch中数据不更新解决办法
watch数据不更新解决办法 在使用keil的watch窗口观察寄存器里面的值进行调试时,有时候里面的值就是不会更新,经测试打开View中最下面的那个按键即可
- es常用命令
删除索引某个字段时间范围的数据 curl -XPOST "http://127.0.0.1:9200/event_log_hulianwang_v3/event_log_hulianwang ...
- ChatMoney让我重新找到创作灵感
本文由 ChatMoney团队出品 今天是 2024 年 6月 19 日,星期三,哈喽大家好,我是一名乡野自媒体创作者小麦,基本上每天都会在自媒体的海洋中创作.重复着创作.创新.写稿.改稿.学习.复盘 ...
- 继ChatGPT的热潮AI的新产物-智能体元器Agent平台
前言 2 年前, OpenAI发布了他们划时代的产品 <ChatGPT> 那时整个世界都为之疯狂,当然我也不例外! 自此 AI 就正式的完完整整的出现在大众面前,但是它限制了很多国家当然也 ...