转自:http://blog.csdn.net/ppp2006/article/details/25654733

https://www.rfc1149.net/blog/2013/03/05/what-is-the-difference-between-devttyusbx-and-devttyacmx/

理解为何有的USB串口叫ttyUSB而有的叫ttyACM

对于转换桥,功能较单一,归类为ttyUSB。驱动在drivers/usb/serial/usb-serial.c。 比如FDTI转换芯片虚拟出的串口,在ubuntu上都识别为ttyUSB*.

对于带通信规约的接口,实现复杂,归类为ttyACM。驱动在drivers/usb/class/cdc_acm.c。比如arduino uno rev3板子的usb串口是由atmega16u2芯片完成的。本身芯片可以运行usb协议代码。

What is the difference between /dev/ttyUSB and /dev/ttyACM?

Samuel Tardieu, 2013-03-05

Have you ever wondered why some USB devices used/dev/ttyUSB0 (or 1, or n) and others/dev/ttyACM0 (or 1, or n) when they are plugged into the host computer, while they seem to be acting as UART devices (RS-232-like) over USB in both cases? Have you wondered why example USB firmwares for microcontrollers always end up with names such as/dev/ttyACM0 and never as /dev/ttyUSB0?

Warning: this is a Linux specific post, although it also contains genuine pieces of USB culture.

What does ttyACM mean?

The USB implementors forum organization has described how devices conforming to the Communications Device Class (CDC) should present themselves to the USB host. The USB implementors forum also specified how CDC subclasses should act, including for those devices intended to talk with each other over the public switched telephone network (PSTN). Those are known as modems because the data goes through a modulation operation on the sending side, which transforms the bits into analog signals that can be carried over phone wires, and then through a demodulation operation on the receiving side to convert the analog signal back into the original bits.

To discuss with the modem, the host USB driver must use one of the existing control models. For example, thedirect line control model controls how data is exchanged between the host and the modem through an audio class interface, with the host taking charge of the modulation, demodulation, data compression (such as V.42bis) and error correction (such as V.42). This model is used by some USB soft modems, which are very cheap because they mostly contain a DSP chip and some amplification and line adaptation layers.

Another control model, aptly named abstract control model or ACM, lets the modem hardware perform the analog functions, and require that it supports the ITU V.250 (also known as Hayes in its former life) command set, either in the data stream or as a separate control stream through the communication class interface. When the commands are multiplexed with the data in the data stream, an escape sequence such as Hayes 302 (also known as “1 sec +++ 1 sec”) or TIES (that nobody remembers) must allow the host to put the modem into command mode.

When developping on a USB-enabled embedded microcontroller that needs to exchange data with a computer over USB, it is tempting to use a standardized way of communication which is well supported by virtually every operating system. This is why most people choose to implement CDC/PSTN with ACM (did you notice that the Linux kernel driver for /dev/ttyACM0 is named cdc_acm?) because it is the simplest way to exchange raw data.

But what about the mandatory V.250 command set? It is almost never implemented in such devices, but since the host has no reason to spontaneously generate V.250 commands by itself, the device will never have to answer them. Pretending the embedded device is a modem is the simplest way to communicate with it, even though it will probably never perform any modulation or demodulation task. Linux will not know that the device is lying, and will have it show up as /dev/ttyS0.

What does ttyUSB mean?

Sometimes, the embedded microcontroller does not come with a hardware USB interface. While it is possible to use a software-only USB stack, the additional constraints put onto the CPU and the usually small storage size often lead board designers to include a dedicated UART to USB bridge. Several vendors, such as FTDIor Prolific sell dedicated chips for a few euros.

Those vendors opted not to lie to the host computer in having the chips announce themselves as USB modems when they were not. Each vendor defined its own (usually proprietary) protocols, with commands allowing to control functions of the chips such as setting the baud rate or controlling additional signals used to implement hardware flow control.

When it is practical to do so, Linux groups devices with similar functionalities under the same default device or interface names. For example, the UARTs present on your computer (if any) will be named /dev/ttyS0 and/dev/ttyS1 even if one of them is a legacy 16550 chip and the other one is a MAX3100 SPI-controlled UART. Similarly, the devices offering UART-over-USB functionalities are named /dev/ttyUSB0,/dev/ttyUSB1, and so on, even though they are in fact using distinct device drivers.

Conclusion

So, when you see a /dev/ttyACM0 popping up, you can try to send it the escape sequence followed by AT commands, but there is a good chance that the device only pretends to be a modem and will happily send those characters to the core application without even considering intercepting them. If it is a /dev/ttyS0, do not try, unless the device behind the USB-UART bridge understands those command by itself (this is the case for the XBee chip).

If you like this post, you can send some bitcoin dust to 1Bo78aNzJvkmeLTw8aptaFipvRWyNQP2WF (or click here).

Samuel Tardieu

2013-03-05 | LinuxProgramming | Comments | CC BY-NC-SA

walker • 3 years ago

thanks for the post.. i'm using an avr32 bit chip with USB embedded in it. When i connect to linux (ubuntu 12.10 64bit), the device shows up as ttyACM0 and the PC tries sending AT+ commands for about a minute after my device connects. quite annoying because i'm doing development work and the device is unavailable during this routine. do you know if it is possible to disable this mount routine from the PC? or better yet is it possible to change my device configuration so it shows up as ttyUSB?

  • 1
  • Share ›
  •  
     
    •  
       
      Samuel Tardieu Mod walker • 3 years ago

      The article explains precisely why this would not be possible for it to show as ttyUSB. Check the Ubuntu help center and forums if Ubuntu insists on talking to your device.

    • Share ›
    •  
       
      •  
         
        walker Samuel Tardieu • 3 years ago

        I'm not sure why you are saying that it is not possible for the device to announce itself as ttyUSB? I can set how the usb announces itself using various registers on the device. there is example code that changes my microcontroller from cdc to HID or mass storage etc.. Unfortunately nothing that seems to conform to the ttyUSB spec. When i force this driver my device enumerates successfully as ttyUSB one time, but not again until i reboot. i get the following error message:

        [878887.203226] usbserial_generic 5-2:1.0: Generic device with no bulk out, not allowed.

        i'm going to spend some more time looking for usbserial documentation but any constructive advice would be welcome! thanks again

    usb驱动---What is the difference between /dev/ttyUSB and /dev/ttyACM【转】的更多相关文章

    1. Linux内核USB驱动【转】

      本文转载自:http://www.360doc.com/content/12/0321/14/8363527_196286673.shtml 注意,该文件是2.4的内核的驱动源文件,并不保证在2.6内 ...

    2. USB驱动开发大全【转】

      本文转载自:http://www.360doc.com/content/12/0504/19/8363527_208666082.shtml 编写USB驱动程序步骤:1所有usb驱动都必须创建主要结构 ...

    3. usb驱动开发22之驱动生命线

      我们总是很喜欢高潮,不是吗?那就好好对待她哦.我们来看一下linux中的高潮部分设备是怎么从Address进入Configured的. usb_set_configuration函数的代码就不贴了,可 ...

    4. usb驱动开发21之驱动生命线

      现在开始就沿着usb_generic_driver的生命线继续往下走.设备的生命线你可以为是从你的usb设备连接到hub的某个端口时开始,而驱动的生命线就必须得回溯到usb子系统的初始化函数usb_i ...

    5. usb驱动开发14之设备生命线

      直接看代码吧. /*-------------------------------------------------------------------*/ /** * usb_submit_urb ...

    6. usb驱动开发12之设备生命线

      函数usb_control_msg完成一些初始化后调用了usb_internal_control_msg之后就free urb.剩下的活,全部留给usb_internal_control_msg去做了 ...

    7. usb驱动开发11之设备生命线

      暂时先告别媒人,我们去分析各自的生命旅程,最后还会回到usb_device_match函数. 首先当你将usb设备连接在hub的某个端口上,hub检测到有设备连接了进来,它会为设备分配一个struct ...

    8. usb驱动开发10之usb_device_match

      在第五节我们说过会专门分析函数usb_device_match,以体现模型的重要性.同时,我们还是要守信用的. 再贴一遍代码,看代码就要不厌其烦. static int usb_device_matc ...

    9. usb驱动开发5之总线设备与接口

      Linux设备模型中的总线落实在USB子系统里就是usb_bus_type,它在usb_init的函数bus_register(&usb_bus_type)里注册.usb_bus_type定义 ...

    随机推荐

    1. python基础之函数参数、嵌套、返回值、对象、命名空间和作用域

      函数的使用原则 函数的使用必须遵循:先定义后使用的原则 函数的定义,与变量的定义是相似的,如果没有事先定义函数而直接引用就相当于在引用一个不存在变量名 定义阶段:只检测语法,不执行代码,当出现语法错误 ...

    2. PHP.16-PDO

      PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口.实现 PDO 接口的每个数据库驱动可以公开具体数据库的特性作为标准扩展功能. 注意利用 PDO 扩展自身并不能实现任何数 ...

    3. vue理解$nextTick

      首先要明确: Vue 实现响应式并不是数据发生变化之后 DOM 立即变化,而是按一定的策略进行 DOM 的更新. $nextTick 是在下次 DOM 更新循环结束之后执行延迟回调,在修改数据之后使用 ...

    4. 大中型 UGC 平台的反垃圾(anti-spam)工作

      本文来自网易云社区 随着互联网技术的日渐发展,相继诞生了垂直社区.社交平台.短视频应用.网络直播等越来越多样的产品.但在内容爆炸式增长的同时,海量UGC中也夹杂着各种违规垃圾信息,包括垃圾广告.诈骗信 ...

    5. python tarfile模块打压缩包,arcname的用法

      D:\szh\noses文件夹下有子文件夹和文件   with tarfile.open('E:\\szh.tar', "w") as tar:     tar.add('D:\\ ...

    6. ADB连接手机遇到的问题:list of devices attached

      今天工作时想尝试一下使用ADB无线连接手机,结果遇到了下面这样的问题,浪费了几十分钟的时间,挺闹心的,因此想分享出来... 首先 第一步:使用USB数据线连接手机,手机弹出选项时,选择仅充电,然后wi ...

    7. PHP 比较运算符 var_dump("a" == 0) 为 true

      这篇文章主要讲解一下 PHP 使用比较运算符容易出错的地方 $a == $b 等于 TRUE,如果类型转换后 $a 等于 $b.$a === $b 全等 TRUE,如果 $a 全等于 $b,并且它们的 ...

    8. OpenCV实现张正友相机标定源代码

      本源代码基于VC++和opencv Opencv2.4.13.6版本开发,实现张正友相机标定源代码,资源包括完整源代码和12张棋盘图片,完美运行.Opencv2.4.13.6安装包下载地址:http: ...

    9. Java面试准备十六:数据库——MySQL性能优化

      2017年04月20日 13:09:43 阅读数:6837 这里只是为了记录,由于自身水平实在不怎么样,难免错误百出,有错的地方还望大家多多指出,谢谢. 来自MySQL性能优化的最佳20+经验 为查询 ...

    10. php session访问限制

      登录 <?php // 启动会话 session_start(); // 注册登陆成功的 admin 变量,并赋值 true $_SESSION["admin"] = tru ...