Linux设备驱动开发详解-Note(4)---驱动设计的硬件基础(2)

驱动设计的硬件基础(2)

成于坚持,败于止步

接口与总线 

串口 

RS-232、RS-422 与 RS-485 都是串行数据接口标准,最初都是由电子工业协会(EIA)制定并发布的。 RS-232 在 1962 年发布,命名为 EIA-232-E。之后发布的 RS-422 定义了一种平衡通信接口,它是一种单机发送、多机接收的单向、平衡传输规范,被命名为TIA/EIA-422-A 标准。RS-422 改进了 RS-232 通信距离短、速率低的缺点。为进一步扩展应用范围,EIA 又于 1983 年在 RS-422 的基础上制定了 RS-485 标准,增加了多点、双向通信能力,即允许多个发送器连接到同一条总线上,同时增加了发送器的驱动能力和冲突保护特性,并扩展了总线共模范围,被命名为 TIA/EIA-485-A 标准。

1969 年发布的 RS-232 修改版 RS-232C 是嵌入式系统应用最广泛的串行接口,它为连接 DTE(数据终端设备)与 DCE(数据通信设备)而制定。RS-232C 规标准接口有 25 条线(4 条数据线、11 条控制线、3 条定时线、7 条备用和未定义线),常用的只有 9 根,它们是:

RTS/CTS(请求发送/清除发送流控制)

RxD/TxD(数据收发)

DSR/DTR(数据终端就绪/数据设置就绪流控制)

DCD(数据载波检测,也称 RLSD)

Ringing-RI(振铃指示)

SG(信号地)信号

RTS/CTS、TxD/RxD、DRS/DTR等信号的定义如下: 

RTS:用来表示 DTE 请求 DCE 发送数据,当终端要发送数据时,使该信号有效。 

CTS:用来表示 DCE 准备好接收 DTE 发来的数据,是对 RTS 的响应信号。 

TxD:DTE 通过 TxD 将串行数据发送到 DCE。 

RxD:DTE 通过 RxD 接收从 DCE 发来的串行数据。 

DSR:有效(ON 状态)则表明 DCE 可以使用。 

DTR:有效(ON 状态)则表明 DTE 可以使用。 

DCD:当本地 DCE 设备收到对方 DCE 设备送来的载波信号时,使 DCD有效,通知 DTE 准备接收,并且由 DCE 将接收到的载波信号解调为数字信号,经 RXD 线送给 DTE。 

Ringing-RI:当调制解调器收到交换台送来的振铃呼叫信号时,使该信号有效(ON 状态),通知终端,已被呼叫。 

在嵌入式系统中,并不太注重 DTE 和 DCE 的概念,而 RS-232C 也很少用来连接调制解调器,多使用 RS-232C 进行对等通信,如 Windows 超级终端、Linux minicom 用来连接电路板控制台等。最简单的 RS-232C 串口只需要连接 RxD、TxD、SG 这 3 个信号,使用 XON/XOFF 软件流控。 组成一个 RS-232C 串口的硬件原理如图 2.9 所示,从 CPU 到连接器依次为 CPU UART(通用异步接收器发送器,作用是完成并/串转换)、CMOS/TTL 电平与 RS-232C电平转换器、DB9/DB25 或自定义的连接器。

Linux设备驱动开发详解-Note(4)---驱动设计的硬件基础(2)_第1张图片

I2C 总线 

I2C(内置集成电路)总线是由 Philips 公司开发的两线式串行总线,产生于 20 世纪80 年代,用于连接微控制器及其外围设备。I2C 总线简单而有效,占用很少的 PCB(印刷电路板)空间,芯片管脚数量少,设计成本低。I2C 总线支持多主控(multi-mastering)模式,任何能够进行发送和接收的设备都可以成为主设备。主控能够控制数据的传输和时钟频率,在任意时刻只能有一个主控。 组成 I2C 总线的两个信号为数据线 SDA 和时钟线 SCL。为了避免总线信号的混乱,要求各设备连接到总线的输出端必须是开漏输出或集电极开路输出的结构。总线空闲时,上拉电阻使 SDA 和 SCL 线都保持高电平。根据开漏输出或集电极开路输出信号的“线与”逻辑,I2C 总线上任意器件输出低电平都会使相应总线上的信号线变低。

I2C 设备上的串行数据线 SDA 接口电路是双向的,输出电路用于向总线发送数据,输入电路用于接收总线上的数据。同样地,串行时钟线 SCL 也是双向的,作为控制总线数据传送的主机要通过 SCL 输出电路发送时钟信号,并检测总线上 SCL 上的电平以决定什么时候发下一个时钟脉冲电平;作为接收主机命令的从设备需按总线上 SCL的信号发送或接收 SDA 上的信号,它也可以向 SCL 线发出低电平信号以延长总线时钟信号周期。 

当 SCL 稳定在高电平时,SDA 由高到低的变化将产生一个开始位,而由低到高的变化则产生一个停止位,如图 2.10 所示。
Linux设备驱动开发详解-Note(4)---驱动设计的硬件基础(2)_第2张图片
开始位和停止位都由 I2C 主设备产生。在选择从设备时,如果从设备采用 7 位地址,则主设备在发起传输过程前,需先发送 1 字节的地址信息,前 7 位为设备地址,最后 1 位为读写标志。之后,每次传输的数据也是 1 个字节,从 MSB 位开始传输。每个字节传完后,在 SCL 的第 9 个上升沿到来之前,接收方应该发出 1 个 ACK 位。SCL 上的时钟脉冲由 I2C 主控方发出,在第 8 个时钟周期之后,主控方应该释放 SDA,I2C 总线的时序如图 2.11 所示。

Linux设备驱动开发详解-Note(4)---驱动设计的硬件基础(2)_第3张图片

USB 

USB(通用串行总线)是 Intel、Microsoft 等厂商为解决计算机外设种类的日益增加与有限的主板插槽和端口之间的矛盾而于 1995 年提出的,它具有数据传输率高、易扩展、支持即插即用和热插拔的优点,目前已得到广泛的应用。 USB1.1 包含全速和低速两种模式,低速方式的速率为 1.5Mbit/s,支持一些不需要很大数据吞吐量和很高实时性的设备,如鼠标等。全速模式为 12Mbit/s,可以外接速率更高的外设。在 USB 2.0 中,增加了一种高速方式,数据传输率达到 480Mbit/s,可以满足更高速外设的需要。 

USB 的物理拓扑结构如图 2.12 所示,在 USB 2.0 中,高速方式下 Hub 使全速和低速方式的信令环境独立出来,图 2.13 所示为高速方式下 Hub 的作用。 

在嵌入式系统中,电路板若需要挂接 USB 设备(device),则需提供 USB 主机(host)控制器和连接器;若电路板需要作为 USB 设备,则需提供 USB 设备适配器和连接器。
有的 MCU 集成了 USB 主机控制器和设备适配器。
Linux设备驱动开发详解-Note(4)---驱动设计的硬件基础(2)_第4张图片

Linux设备驱动开发详解-Note(4)---驱动设计的硬件基础(2)_第5张图片
USB 总线的机械连接非常简单,采用 4 芯的屏蔽线,一对差分线(D+,D−)传送信号,另一对(VBUS,电源地)传送+5V 的直流电。一个 USB 主控制器端口最多可连接 127 个器件,各器件之间的距离不超过 5 米。 USB 提供了 4 种传输方式以适应各种设备的需要,说明如下。
(1)控制(Control)传输方式。
控制传输是双向传输,数据量通常较小,主要用来进行查询、配置和给 USB 设备发送通用的命令。
(2)同步(Synchronization)传输方式。
同步传输提供了确定的带宽和间隔时间,它被用于时间严格并具有较强容错性的流数据传输,或者用于要求恒定的数据传送率的即时应用。例如进行语音业务传输时,使用同步传输方式是很好的选择。
(3)中断(Interrupt)传输方式。
中断方式传送是单向的,对于 USB 主机而言,只有输入。中断传输方式主要用于定时查询设备是否有中断数据要传送,该传输方式应用在少量的、分散的、不可预测的数据传输场合,键盘、游戏杆和鼠标属于这一类型。
(4)批量(Bulk)传输方式。
批量传输主要应用在没有带宽和间隔时间要求的大量数据的传送和接收,它进行
有保证的传输。打印机和扫描仪均采用这种传输类型。

ISA 总线 

ISA(工业标准结构总线)总线起源于 1981 年 IBM 公司生产的以 Intel 8088 为CPU 的 IBM-PC 微计算机,开始时总线宽度为 8 位。1984 年推出的 IBM-PC/AT 系统将 ISA 总线扩充为16 位数据总线宽度,同时地址总线宽度也由 20 位扩充到了 24 位。其后推出的 EISA(扩展的 ISA)采用 32 位地址线,数据总线也扩展为 32 位,但仍保持了与 ISA 的兼容。
图 2.15 所示为 ISA 总线的信号,这些信号可分为 3 组。 

总线基本信号:ISA 总线工作所需要的最基本信号,含复位、时钟、电源、地等。 

总线访问信号:用于访问 ISA 总线设备的地址线、数据线以及相应的应答信号。 

总线控制信号:中断和 DMA 请求。 

图 2.15 中各信号的详细定义如下。 

RESET、BCLK:复位及总线基本时钟,BLCK 为 8MHz。 

SA19~SA0:存储器及 I/O 空间 20 位地址,带锁存。 

LA23~LA17:存储器及 I/O 空间 20 位地址,不带锁存。 

BALE:总线地址锁存,外部锁存器的选通。 

AEN:地址允许,表明 CPU 让出总线,DMA 开始。 

SMEMR#、SMEMW#:8 位 ISA 存储器读写控制。 

MEMR#、MEMW#:16 位 ISA 存储器读写控制。 

SD15~SD0:数据总线,访问 8 位 ISA 卡时高 8 位自动传送到 SD7~SD0。 

SBHE#:高字节允许,打开 SD15~SD8 数据通路。 

MEMCS16#、IOCS16#:ISA 卡发出此信号确认可以进行 16 位传送。 

I/OCHRDY:ISA 卡准备信号,可控制插入等待周期。 

NOWS#:有效则暗示不用插入等待周期。 

I/OCHCK#:ISA 卡奇偶校验错。 

IRQ15、IRQ14、IRQ12~IRQ9、IRQ7~IRQ3:中断请求。 

DRQ7~DRQ5、DRQ3~DRQ0:ISA 卡 DMA 请求信号。 

DACK7#~DACK5#、DACK3#~DACK0#:DMA 请求响应信号。 

MASTER#:ISA 主模块确立信号,ISA 发出此信号,与主机内 DMAC(DMA控制器)配合使 ISA 卡成为主模块。

Linux设备驱动开发详解-Note(4)---驱动设计的硬件基础(2)_第6张图片

有个PCI总线这里先不做过多说明,之后会再遇到

原理图分析

原理图分析的含义是指通过阅读电路板的原理图获得各种存储器、外设所使用的硬件资源,主要包括存储器和外设控制芯片所使用的片选、中断和 DMA 资源。通分析片选得出芯片的内存、I/O 基地址,通过分析中断、DMA 信号获得芯片使用的中断号和 DMA 通道,并归纳出如表 2.2 所示的表格。
Linux设备驱动开发详解-Note(4)---驱动设计的硬件基础(2)_第7张图片
上述表格对驱动开发的意义重大,在大多数情况下,硬件工程师已经给驱动工程师提供了这个表格。

原理图的分析方法 :

(1)阅读 CPU 部分,获知 CPU 的哪些片选、中断和集成的外设控制器被使用,列出这些元素 a、b、c…。 CPU 引脚比较多的时候,芯片可能会被分成几个模块单独被画在原理图的不同页上,这时候应该把相应的部分都分析到位。 

(2)对第一步中列出的元素从原理图中对应的外设和存储器电路中分析出实际的使用情况。

硬件时序分析 

时序分析的概念 

对驱动工程师或硬件工程师而言,时序分析的意思是让芯片之间的访问满足芯片手册中时序图信号有效的先后顺序、采样建立时间(setup time)和保持时间(hold time)的要求,在电路板工作不正常的时候,准确地定位时序方面的问题。
建立时间是指在触发器的时钟信号边沿到来以前,数据已经保持稳定不变的时间,如果建立时间不够,数据将不能在这个时钟边沿被正确采样;保持时间是指在触发器的时钟信号边沿到来以后,数据还需稳定不变的时间,如果保持时间不够,数据同样不能被正确采样。如图 2.26 所示,数据稳定传输必须满足建立和保持时间的要求,当然在一些情况下,建立时间和保持时间的值可以为 0。
Linux设备驱动开发详解-Note(4)---驱动设计的硬件基础(2)_第8张图片
典型硬件时序 

最典型的硬件时序是 SRAM 的读写时序,在读/写过程中涉及的信号包括地址、数据、片选、读/写、字节使能和就绪/忙。对于一个 16 位、32 位(甚至 64 位)的 SRAM,字节使能表明哪些字节被读写。 图 2.27 给出了 SRAM 的一个读时序,写时序与此相似.

Linux设备驱动开发详解-Note(4)---驱动设计的硬件基础(2)_第9张图片
首先是地址总线上输出要读写的地址,然后 SRAM 片选被发出,接着读/写信号被输出,之后读写信号要经历数个等待周期。当 SRAM 读写速度比较慢时,等待周期可以由 MCU 的相应寄存器设置,也可以通过设备就绪/忙(如图 2.27 中的 nWait)向 CPU 报告,这样,读写过程中会自动添加等待周期。 

NOR Flash 和许多外设控制芯片都使用了类似 SRAM 的访问时序,因此,牢固掌握这个时序意义重大。一般,在芯片数据手册给出的时序图中,会给出图中各段时间的含义和要求,真实的电路板必须满足芯片手册上描述的建立时间和保持时间的最小要求。 

就到这里了,O(∩_∩)O~

我的专栏地址:http://blog.csdn.net/column/details/linux-driver-note.html

待续。。。。

你可能感兴趣的