Linux USB HOST EXTERNAL VIRTUAL COM PORT

目录

目录

前言

DTS配置的参考

内核配置的参考

[USB Subsystem内核配置](#USB Subsystem内核配置)

[USB Phy内核配置](#USB Phy内核配置)

[USB Host Core驱动内核配置](#USB Host Core驱动内核配置)

[USB EHCI驱动内核配置](#USB EHCI驱动内核配置)

[芯片平台USB Host Controller驱动内核配置](#芯片平台USB Host Controller驱动内核配置)

[USB HOST CDC ACM内核配置](#USB HOST CDC ACM内核配置)

验证测试的参考

总结


前言

USB虚拟串口(简称VCP,Virtual COM Port的缩写),它是利用USB的CDC(Communication Device Class)类来实现的一种通信接口,在物理层通过USB总线,采用虚拟串口的方式为主机提供一个物理串口。

在系统内部,USB控制器提供了一个批量传输IN端口和一个批量传输的OUT端点,用于数据的接收和发送,模拟串口的RX和TX线。另外USB控制器还提供中断IN端点,发送当前串口的状态,实现对串口传输的控制。

串口设备的数据,由系统的串口采集,在芯片内完成USB包的封装,通过USB总线上传到主机,再由相应的串口应用程序进行处理。对于用户来说,看到的是基于串口的数据采集和传输,而实际上实现的是基于USB协议包的数据传输。

在这里主要实现的是串口通信主机的功能,使用的是USB HOST CDC ACM(Abstract Control Model)驱动来实现。


DTS配置的参考

bash 复制代码
/* usb20 host controller */
   usb_1: usb1@YYYYYYYY {
        compatible = "xxx,xxx-usb";
        reg = <0xYYYYYYYY 0xYYY>;
        interrupts = <GIC_SPI INT_USB20_HOST IRQ_TYPE_LEVEL_HIGH>;

        clocks = <&ahbX_gate 9>, <&ahbX_reset 9>;
        clock-names = "usb_gate", "usb_reset";

        xxx,usbphy = <&usbphy_1>;

        dr_mode = "host"; /* 配置成了USB host模式 */
   ...

内核配置的参考

USB Subsystem内核配置

bash 复制代码
CONFIG_USB_SUPPORT=y
CONFIG_USB_ARCH_HAS_HCD=y

USB Phy内核配置

bash 复制代码
CONFIG_USB_PHY=y
CONFIG_USB_NX_PHY=y

USB Host Core驱动内核配置

bash 复制代码
CONFIG_USB_COMMON=y
CONFIG_USB=y
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
CONFIG_USB_DEFAULT_PERSIST=y

USB EHCI驱动内核配置

bash 复制代码
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_EHCI_ROOT_HUB_TT=y
CONFIG_USB_EHCI_TT_NEWSCHED=y
CONFIG_USB_EHCI_HCD_PLATFORM=y

芯片平台USB Host Controller驱动内核配置

bash 复制代码
CONFIG_USB_XXX=y
CONFIG_USB_XXX_HOST=y
CONFIG_USB_XXX_DEBUG=y

USB HOST CDC ACM内核配置

bash 复制代码
CONFIG_USB_ACM=y

验证测试的参考

  1. 使用两个主控设备,例如使用两个开发板,其中一个配置成USB HOST CDC ACM,另外一个配置成USB Gadget CDC ACM(配置成工厂测试模式)。

  2. 把USB Gadget CDC ACM的主控设备通过USB线接到USB HOST CDC ACM的主控设备上,此时查看USB HOST CDC ACM的主控设备是否产生`/dev/ttyACM*`的设备节点,例如:

bash 复制代码
# find / -name "*ACM*"
  /dev/ttyACM0
  /sys/devices/platform/xxxxxxxx.usb1/xxx_hdc.1/usb2/2-1/2-1.2/2-1.2:1.0/tty/ttyACM0
  /sys/class/tty/ttyACM0
  1. USB HOST CDC ACM的主控设备向USB Gadget CDC ACM的主控设备发起请求,例如:
bash 复制代码
# echo "date set 2024-11-22 15:10:50" > /dev/ttyACM0
# date set ok
  1. 观察USB Gadget CDC ACM的主控设备的日期时间是否被修改。

总结

USB虚拟串口HOST CDC ACM的作用,简单来说,就是‌让USB设备在主机上模拟出传统串口,实现高速、即插即用的串行通信‌。它属于USB通信设备类(CDC)的一个子类,通过抽象控制模型(ACM)在操作系统中创建虚拟串口,支持跨平台数据传输。

  • 核心作用
  1. 虚拟串口模拟‌:将USB设备映射为系统识别的串行端口(如/dev/ttyACM*),兼容传统串口应用。
  2. 高速数据传输‌:理论速率可达12Mbps,远超传统串口(如RS-232的115.2Kbps)。
  3. 即插即用‌:主流操作系统(Windows 7+、Linux和macOS)原生支持,无需额外驱动。
  4. 控制信号支持‌:管理RTS/CTS、DTR/DSR等硬件流控信号。
  • 技术实现
  1. 接口分离‌:通过控制接口(端点0)管理设备状态,数据接口(端点1/2)传输数据,支持双向通信。
  2. 跨平台兼容‌:遵循USB-IF标准,可在嵌入式系统、物联网设备等场景灵活应用。
  • 典型应用
  1. 嵌入式开发‌:如ARM板卡通过USB Gadget框架实现CDC ACM。
  2. 工业通信‌:替代传统串口,提升设备间通信效率。

总之,CDC ACM通过标准化和高效性,可成为现代串行通信的重要解决方案之一。

相关推荐
不像程序员的程序媛21 分钟前
linux常见文本操作命令
linux·运维·服务器
wangbing112544 分钟前
开发指南149-IotDB-常用命令
linux·运维·iotdb
看着博客敲代码1 小时前
WorkBuddy 接上 Kali MCP 做自动化渗透:信息收集到初步验证的落地记录
linux·人工智能·安全·网络安全·自动化
小HANN2 小时前
华为云企业网站上云实战|从零搭建高可用WordPress全站架构(ECS+RDS+ELB+弹性伸缩+云监控闭环)
linux·运维·服务器·经验分享
wuyk5553 小时前
嵌入式驱动开发:量产级工程化实战(第9篇)——低功耗下的通信可靠性
c语言·驱动开发·stm32·单片机·嵌入式硬件
星恒随风3 小时前
Linux库的底层原理:ELF文件格式、静态链接、程序加载、虚拟地址空间与GOT/PLT详解
linux·运维·笔记·学习·状态模式
GeW3 小时前
2026新质生产力路线图:Linux、数据库与智能算力融合报告
linux
AR-26710-3 小时前
Linux Day19——日志轮转
linux·运维
祖力554 小时前
驱动工程搭建与字符设备驱动框架
linux·运维·服务器·内核·arm·imx6ull·驱动
Escalating_xu5 小时前
【Linux 网络编程】网络基础概念(下):IP、端口、Socket 与网络字节序,写代码前先打好基础
linux·网络·tcp/ip