转自:http://blog.chinaunix.net/uid-9185047-id-3404684.html

DTE提供或接收数据,连接到网络中的用户端机器,主要是计算机和终端设备。与此相对地,在网络端的连接设备称为 DCE ( Date Circuit - terminating Equipment )。DTE与进行信令处理的DCE相连。 它是用户—网络接口的用户端设备,可作为数据源、目的地或两者兼而有之。

数据终端设备

DTE通过DCE设备(例如,调制解调器)连接到数据网络,且一般使用DCE产生的时钟信号。DTE包括像计算机、协议转换器多路复用器这样的设备。

Module_init中会注册tty_driver,tty_device会在acm usb_driver的probe中注册。

每个ACM设备都由2个Interface组成,第一个interface有一个interrupt endpoint主要负责控制,第二个interface主要负责数据传输,有2个endpoint,有可能是两个int,也有可能是2个bulk。他们都是成对出现的。

比如:

这个是第一个interface,其中CDC Union中,bMasterInterface就是设备的第0号interface,它就是ACM中的第一个interface,作为主interface,它所对应的从interface的号是1,也就是负责数据传输的那个interface。他们两个是成对出现的。

Interface Descriptor:

bLength                 9

bDescriptorType         4

bInterfaceNumber        0

bAlternateSetting       0

bNumEndpoints           1

bInterfaceClass         2 Communications

bInterfaceSubClass      2 Abstract (modem)

bInterfaceProtocol      1 AT-commands (v.25ter)

iInterface              4 CDC Communication Interface

CDC Header:

bcdCDC               1.10

CDC Union:

bMasterInterface        0

bSlaveInterface         1

CDC Call Management:

bmCapabilities       0x00

bDataInterface          1

CDC ACM:

bmCapabilities       0x07

sends break

line coding and serial state

get/set/clear comm features

Endpoint Descriptor:

bLength                 7

bDescriptorType         5

bEndpointAddress     0x81  EP 1 IN

bmAttributes            3

Transfer Type            Interrupt

Synch Type               None

Usage Type               Data

wMaxPacketSize     0x0040  1x 64 bytes

bInterval               4

第二个

Interface Descriptor:

bLength                 9

bDescriptorType         4

bInterfaceNumber        1

bAlternateSetting       0

bNumEndpoints           2

bInterfaceClass        10 CDC Data

bInterfaceSubClass      0 Unused

bInterfaceProtocol      0

iInterface              5 CDC Data Interface

Endpoint Descriptor:

bLength                 7

bDescriptorType         5

bEndpointAddress     0x82  EP 2 IN

bmAttributes            2

Transfer Type            Bulk

Synch Type               None

Usage Type               Data

wMaxPacketSize     0x0200  1x 512 bytes

bInterval               0

Endpoint Descriptor:

bLength                 7

bDescriptorType         5

bEndpointAddress     0x02  EP 2 OUT

bmAttributes            2

Transfer Type            Bulk

Synch Type               None

Usage Type               Data

wMaxPacketSize     0x0200  1x 512 bytes

bInterval               0

Interface Association:

bLength                 8

bDescriptorType        11

bFirstInterface         2

bInterfaceCount         2

bFunctionClass          2 Communications

bFunctionSubClass       2 Abstract (modem)

bFunctionProtocol       1 AT-commands (v.25ter)

iFunction               0

在第一个interaface被匹配后,它对应的probe函数中,会找到它所对应的slave interface,并用

usb_driver_claim_interface(&acm_driver, data_interface, acm);来对其声明,让这两个interface device匹配同一个usb_driver。

虽然在module_init中注册了tty_driver,但是此时它是不工作的,在probe的结尾会调用

tty_register_device(acm_tty_driver, minor, &control_interface->dev);

这句话是注册tty_driver所对应的tty_device,此时他们俩会匹配,并创建相应的字符设备。这个时候user space才可以对其进行访问!

其中在probe中,会有三个ep

Epcontrol

Epread

Epwrite

其中control是interrupt ep,在tty_open的时候会注册到系统中,监听control event.

Epread对应一个urb,也是在tty_open时被submit,每次接收到数据后,urb的callback了都会调用tty_flip_buffer_push将数据提交给tty子系统的flip buffer中。

Epwrite则是在tty_write中调用。

acm_tty_throttle会在最后一次read urb处理的callback中进行判断是否继续提交,因为tty子系统的flip buffer已经满了,直到acm_tty_unthrottle中会再次提交read urb。

acm_tty_break_ctl是用来发送break信号的,RS232规定,收到break信号后,要output一段时间的logic zero。

acm_tty_tiocmset和acm_tty_tiocmget主要是来设置和查询当前的CS232的硬件信号的支持。比如RTS信号

而acm_tty_set_termios主要就是设置什么奇偶校验,波特率等串口传输特性。

usb驱动---linux ACM驱动详解ACA【转】的更多相关文章

  1. Linux驱动开发必看详解神秘内核(完全转载)

    Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html   IT168 技术文档]在开始步入L ...

  2. ALSA声卡驱动中的DAPM详解之四:在驱动程序中初始化并注册widget和route

    前几篇文章我们从dapm的数据结构入手,了解了代表音频控件的widget,代表连接路径的route以及用于连接两个widget的path.之前都是一些概念的讲解以及对数据结构中各个字段的说明,从本章开 ...

  3. ALSA声卡驱动中的DAPM详解之三:如何定义各种widget

    上一节中,介绍了DAPM框架中几个重要的数据结构:snd_soc_dapm_widget,snd_soc_dapm_path,snd_soc_dapm_route.其中snd_soc_dapm_pat ...

  4. ALSA声卡驱动中的DAPM详解之七:dapm事件机制(dapm event)

    前面的六篇文章,我们已经讨论了dapm关于动态电源管理的有关知识,包括widget的创建和初始化,widget之间的连接以及widget的上下电顺序等等.本章我们准备讨论dapm框架中的另一个机制:事 ...

  5. ALSA声卡驱动中的DAPM详解之六:精髓所在,牵一发而动全身

    设计dapm的主要目的之一,就是希望声卡上的各种部件的电源按需分配,需要的就上电,不需要的就下电,使得整个音频系统总是处于最小的耗电状态,最主要的就是,这一切对用户空间的应用程序是透明的,也就是说,用 ...

  6. Linux /dev目录详解和Linux系统各个目录的作用

    Linux /dev目录详解(转http://blog.csdn.net/maopig/article/details/7195048) 在linux下,/dev目录是很重要的,各种设备都在下面.下面 ...

  7. Linux串口编程详解(转)

    串口本身,标准和硬件 † 串口是计算机上的串行通讯的物理接口.计算机历史上,串口曾经被广泛用于连接计算机和终端设备和各种外部设备.虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接 ...

  8. Linux 设备树详解【转】

    转自:http://www.pianshen.com/article/428276673/;jsessionid=D90FC6B215155680E0B89A6D060892D4 本文基于天嵌E9V3 ...

  9. linux awk命令详解

    linux awk命令详解 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分 ...

随机推荐

  1. HyperLedger Fabric 1.4 比特币历史(1.1)

    比特币是一种数字货币,也是一种创新思维,把人们带入到一个无中心化.完全可信任.安全可靠的全新思维领域:一个叫“中本聪”的人或组织,使我们思维产生化学反应,他在2008年10月31日发表了比特币白皮书& ...

  2. 单源次短路径:poj:3255-Roadblocks

    Roadblocks Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 17521 Accepted: 6167 Descripti ...

  3. poj 3111 卖珠宝问题 最大化平均值

    题意:有N件分别价值v重量w的珠宝,希望保留k件使得 s=v的和/w的和最大 思路:找到贡献最大的 设当前的s为mid(x) 那么贡献就是 v-w*x 排序 ,取前k个 bool operator&l ...

  4. <s:submit> 指定的method方法不执行

    很多文章在讲一个表单多个提交方法的时候都是在<s:submit>中通过method来指定,但是我在试验中怎么也不对,jsp页面代码如下 <%@page import="or ...

  5. 【转帖】LoadRunner系统架构简介

    LoadRunner系统架构简介: LoadRunner是通过创建虚拟用户来代替真实实际用户来操作客户端软件比如Internet Explorer,来向IIS.Apache等Web服务器发送HTTP协 ...

  6. ThinkPad 触控板双指不可以滑动

    我一直在想为什么,今天我想禁用触摸板的时候,我找到原因了. 是因为没有装驱动. http://think.lenovo.com.cn/support/driver/newdriversdownlist ...

  7. MySQL之查询性能优化(四)

    优化特定类型的查询 COUNT()的作用 COUNT()是一个特殊函数,有两个非常不同的作用:它可以统计某个列值的数量,也可以统计行数.在统计列值时要求列值是非空的(不统计NULL). 如果在COUN ...

  8. Python语法之com[1][:-7]

    strCom = com[0] + ": " + com[1][:-7] 如上应该是一个字符串合成,最后的[1][:-7],我理解是去除com[1]的最后7个字符. 比如com[0 ...

  9. 《Cracking the Coding Interview》——第2章:链表——题目6

    2014-03-18 02:41 题目:给定一个带有环的单链表,找出环的入口节点. 解法1:用hash来检测重复节点肯定是容易想而且效率也高的好办法. 代码: // 2.6 You have a ci ...

  10. 【Linear Support Vector Machine】林轩田机器学习技法

    首先从介绍了Large_margin Separating Hyperplane的概念. (在linear separable的前提下)找到largest-margin的分界面,即最胖的那条分界线.下 ...