Linux设备驱动开发详解(第2版)
上QQ阅读APP看书,第一时间看更新

第2章 驱动设计的硬件基础

本章导读

2.3节分析了常见的外设接口与总线的工作方式,包括串口、I2C、USB、以太网接口、ISA、PCI和cPCI等。

本章讲述一个底层驱动工程师必备的硬件基础,给出了嵌入式系统硬件原理及分析方法的一个完整而简洁的全景视图。

2.1节描述了微控制器、微处理器、数字信号处理器以及应用于特定领域的处理器各自的特点,分析了处理器的体系架构和指令集。

2.2节对嵌入式系统中所使用的各类存储器与CPU的接口、应用领域及特点进行了归纳整理。

嵌入式系统硬件电路中经常会使用CPLD和FPGA,作为驱动工程师,我们不需要掌握CPLD和FPGA的开发方法,但是需要知道它们在电路中能完成什么工作,2.4节讲解了这项内容。

2.5~2.7节给出了在实际项目开发过程中硬件分析的方法,包括如何进行原理图分析、时序分析及如何快速地从芯片手册获取有效信息。

2.8节讲解了调试过程中常用仪器仪表的使用方法,涉及万用表、示波器和逻辑分析仪。

2.1 处理器

2.1.1 通用处理器

通用处理器(GPP)并不针对特定的应用领域进行体系结构和指令集的优化,它们具有一般化的通用体系结构和指令集,以求支持复杂的运算并易于添加新开发的功能。一般而言,在嵌入式微控制器(MCU)和微处理器(MPU)中会包含一个通用处理器核。

MPU通常代表一个CPU(中央处理器),而MCU则强调把中央处理器、存储器和外围电路集成在一个芯片中。早期,微控制器被称为单片机,指把计算机集成在一个芯片内。嵌入式微控制器也常被称作片上系统(SoC),含义是在一个芯片上设计了整个系统。芯片厂商在推出 MCU时,往往会有明确的市场定位,如定位于PDA、MP3、ADSL等。定位不同的产品可能包含共同的CPU核,但是集成的扩展电路则不一样。图2.1所示给出了一个典型的集成了外围电路的MCU的结构。

图2.1 典型的MCU内部结构

举个例子,Intel的80386属于微处理器,而内部集成了80386处理器、片选单元、中断控制、定时器、看门狗定时器、串行I/O、DMA和总线仲裁、DRAM控制器等的386EX则是80386微处理器的微控制器版本。但是,要说明的是,GPP、MCU和MPU等概念其实非常含糊,许多地方并不加以区分,而明确区分这些概念在技术上本身也没有太大的意义。

嵌入式微控制器一般由一个CPU核和多个外围电路集成,目前主流的嵌入式CPU核有如下几种。

● Advanced RISC Machines公司的ARM。

ARM内核的设计技术被授权给数百家半导体厂商,做成不同的SoC芯片。ARM的功耗很低,在当今最活跃的无线局域网、3G、手机终端、手持设备、有线网络通信设备等中应用非常广泛。本书所基于的LDD6410开发板上采用的就是S3C6410这个ARM SoC芯片。

● MIPS技术公司的MIPS。

两个最重要的MIPS芯片厂商为PMC和IDT,PMC-Sierra公司的MIPS处理器被CISCO公司大量采用在高端路由器上。IDT公司在MIPS核上集成PCI接口,广泛用于以太网交换,另外也尝试增加了HDLC、Ethernet、串口、SDRAM控制器、片选、DMA控制器等外设接口,以用于低端通信产品。

● IBM和Motorola的PowerPC。

PowerPC处理器是通信和工控领域应用最广泛的处理器,国内包括华为、中兴在内的通信公司都大量使用PowerPC,MPC860和MPC8260是其最经典的两款。

● Motorola公司独有的内核68K/COLDFIRE。

68K内核是最早在嵌入式领域广泛应用的内核,其最著名的代表芯片是68360。Coldfire则继承了68K的特点并对其保持了兼容。Coldfire内核被用于DSP模块、CAN总线模块以及一般嵌入式处理器所集成的外设模块,在工业控制、机器人研究、家电控制等领域被广泛采用。

Motorola的半导体部已经独立为飞思卡尔半导体公司(Freescale Semiconductor Inc.),因为历史原因,上文仍然使用Motorola。

中央处理器的体系架构可以分为两类,一类为冯·诺伊曼结构,一类为哈佛结构。

冯·诺伊曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的宽度相同。而哈佛结构将程序指令和数据分开存储,指令和数据可以有不同的数据宽度。此外,哈佛结构还采用了独立的程序总线和数据总线,分别作为CPU与每个存储器之间的专用通信路径,具有较高的执行效率。图2.2描述了冯·诺伊曼结构和哈佛结构的区别。

图2.2 冯·诺伊曼结构与哈佛结构

从指令集的角度来讲,中央处理器也可以分为两类,即RISC(精简指令集计算机)和CISC (复杂指令集计算机)。CSIC强调增强指令的能力、减少目标代码的数量,但是指令复杂,指令周期长;而RISC强调尽可能减少指令集、指令单周期执行,但是目标代码会更大。ARM、MIPS、PowerPC等CPU内核都采用了RISC指令集。目前,RISC和CSIC二者的融合非常明显。

2.1.2 数字信号处理器

数字信号处理器(DSP)针对通信、图像、语音和视频处理等领域的算法而设计。它包含独立的硬件乘法器。DSP 的乘法指令一般在单周期内完成,且优化了卷积、数字滤波、FFT(快速傅立叶变换)、相关、矩阵运算等算法中的大量重复乘法。

DSP一般采用如图2.3所示的改进的哈佛架构,它具有独立的地址总线和数据总线,两条总线由程序存储器和数据存储器分时共用。

图2.3 改进的哈佛结构

DSP分为两类,一类是定点DSP,一类是浮点DSP。浮点DSP的浮点运算用硬件来实现,可以在单周期内完成,因而其浮点运算处理速度高于定点 DSP。而定点 DSP 只能用定点运算模拟浮点运算。

德州仪器(TI)、美国模拟器件公司(ADI)是全球DSP的两大主要厂商。

TI的TMS320™DSP平台包含了功能不同的多个系列如2000系列、3000系列、4000系列、5000系列、6000系列,工程师也习惯称其为2X、3X、4X、5X、6X。2010年5月,TI已经宣布为其 C64x 系列数字信号处理器与多核片上系统提供 Linux 内核支持,以充分满足通信与关键任务基础设施、医疗诊断以及高性能测量测试等应用需求。TI 对 C64x Linux 内核的产品支持TMS320C6474、TMS320C6455和TMS320C6457,将于2010年第3季度开始提供。

ADI主要有16位定点的21xx系列、32位浮点的SHARC系列、从SHARC系列发展而来的TigerSHARC系列及高性能16位DSP信号处理能力与通用微控制器方便性相结合的blackfin系列等。ADI的blackfin不含MMU,完整支持Linux,是MMU-less情况下Linux的典型案例,其官方网站为http://blackfin.uclinux.org/gf/,目前blackfin的Linux开发保持了Linux mainline的同步。

通用处理器和数字信号处理器也有相互融合以取长补短的趋势,如数字信号控制器(DSC)即为MCU+DSP,ADI的blackfin系列就属于DSC。目前,芯片厂商也推出了许多ARM+DSP的双核以及多核的处理器,如TI公司的OMAP4平台就包括4个主要处理引擎:ARM Cortex-A9 MPCore、PowerVR SGX 540 GPU(Graphic Processing Unit)、C64x DSP 和ISP(Image Signal Processor)。

除了上面讲述的通用微控制器和数字信号处理器外,还有一些针对特定领域而设计的专用处理器(ASP),它们都是针对一些特定应用而设计的,如用于HDTV、ADSL、Cable Modem等的专用处理器。

网络处理器是一种可编程器件,它应用于电信领域的各种任务,如包处理、协议分析、路由查找、声音/数据的汇聚、防火墙、QoS等。网络处理器器件内部通常由若干个微码处理器和若干硬件协处理器组成,多个微码处理器在网络处理器内部并行处理,通过预先编制的微码来控制处理流程。而对于一些复杂的标准操作(如内存操作、路由表查找算法、QoS的拥塞控制算法、流量调度算法等)则采用硬件协处理器来进一步提高处理性能,从而实现了业务灵活性和高性能的有机结合。

对于某些应用场合,使用ASIC(专用集成电路)往往是低成本且高性能的方案。ASIC专门针对特定应用而设计,不具备也不需要灵活的编程能力。使用 ASIC 完成同样的功能往往比直接使用CPU资源或CPLD(复杂可编程逻辑器件)/FPGA(现场可编程门阵列)来得更廉价且高效。

在实际项目的硬件方案中,往往会根据应用的需求选择通用处理器、数字信号处理器、特定领域处理器、CPLD/FPGA或ASIC之一的解决方案,在复杂的系统中,这些芯片可能会同时存在,协同合作,各自发挥自己的长处。如在一款智能手机中,可使用 MCU 处理图形用户界面和用户的按键输入并运行多任务操作系统,使用DSP进行音视频编解码,而在射频方面则采用ASIC。

综合2.1节的内容,我们可得出如图2.4所示的处理器分类。

图2.4 处理器分类

2.2 存储器

存储器主要可分类为只读储存器(ROM)、闪存(Flash)、随机存取存储器(RAM)、光、磁介质储存器。

ROM还可再细分为不可编程ROM、可编程ROM(PROM)、可擦除可编程ROM(EPROM)和电可擦除可编程ROM(EEPROM),EEPROM完全可以用软件来擦写,已经非常方便了。

目前ROM有被Flash替代的趋势,NOR(或非)和NAND(与非)是市场上两种主要的Flash闪存技术。Intel于1988年首先开发出NOR Flash技术,彻底改变了原先由EPROM和EEPROM一统天下的局面。紧接着,1989年,东芝公司发表了NAND Flash结构,每比特的成本被大大降低。

NOR Flash和CPU的接口属于典型的类SRAM接口(如图2.5所示),不需要增加额外的控制电路。NOR Flash的特点是可芯片内执行(XIP,eXecute In Place),程序可以直接在NOR内运行。而NAND Flash和CPU的接口必须由相应的控制电路进行转换,当然也可以通过地址线或GPIO产生NAND Flash接口的信号。NAND FLASH以块方式进行访问,不支持芯片内执行。

图2.5 典型的类SRAM接口

公共闪存接口(Common Flash Interface,简称CFI)是一个公开的、标准的从NOR Flash器件中读取数据的接口。它可以使系统软件查询已安装的Flash 器件的各种参数,包括器件阵列结构参数、电气和时间参数以及器件支持的功能等。利用 CFI,在不修改系统软件的情况下,就可以用新型的和改进的产品代替旧版本的产品。

一个NAND Flash的接口主要包含如下信号。

● I/O总线:地址、指令和数据通过这组总线传输,一般为8位或16位。

● 芯片启动(Chip Enable,CE#):如果没有检测到CE信号,那么,NAND器件就保持待机模式,不对任何控制信号做出响应。

● 写使能(Write Enable,WE#):WE#负责将数据、地址或指令写入NAND之中。

● 读使能(Read Enable,RE#):RE#允许数据输出。

● 指令锁存使能(Command Latch Enable,CLE):当CLE为高时,在WE#信号的上升沿,指令将被锁存到NAND指令寄存器中。

● 地址锁存使能(Address Latch Enable,ALE):当ALE为高时,在WE#信号的上升沿,地址将被锁存到NAND地址寄存器中。

● 就绪/忙(Ready/Busy,R/B#):如果NAND器件忙,R/B#信号将变低。该信号是漏极开路,需要采用上拉电阻。

NAND Flash较NOR Flash容量大,价格低;NAND Flash中每个块的最大擦写次数是一百万次,而NOR的擦写次数是十万次;NAND Flash的擦除、编程速度远超过NOR Flash。

由于Flash固有的电器特性,在读写数据过程中,偶然会产生1位或几位数据错误,即位反转,NAND Flash发生位反转的几率要远大于NOR Flash。位反转无法避免,因此,使用NAND Flash的同时,应采用错误探测/错误更正(EDC/ECC)算法。

Flash的编程原理都是只能将1写为0,而不能将0写为1。所以在Flash编程之前,必须将对应的块擦除,而擦除的过程就是把所有位都写为1的过程,块内的所有字节变为0xFF。

许多嵌入式系统都提供了IDE(Integrated Drive Electronics)接口,以供连接硬盘控制器或光驱,IDE 接口的信号与 SRAM 类似。人们通常也把 IDE 接口称为 ATA(Advanced Technology Attachment)接口,技术角度而言并不准确。其实,ATA接口发展至今,已经经历了ATA-1(IDE)、ATA-2(EIDE Enhanced IDE/Fast ATA)、ATA-3(FastATA-2)、Ultra ATA、Ultra ATA/33、Ultra ATA/66、Ultra ATA/100及Serial ATA的发展过程。

以上所述的各种ROM、Flash和磁介质存储器都属于非易失性存储器(NVM)的范畴,掉电信息不会丢失,而RAM则与此相反。

RAM也可再分为静态RAM(SRAM)和动态RAM(DRAM)。DRAM以电荷形式进行存储,数据存储在电容器中。由于电容器会由于漏电而导致电荷丢失,因而DRAM器件需要定期被刷新。SRAM是静态的,只要供电它就会保持一个值,SRAM没有刷新周期。每个SRAM存储单元由6个晶体管组成,而DRAM存储单元由1个晶体管和1个电容器组成。

通常所说的SDRAM、DDR SDRAM皆属于DRAM的范畴,它们采用与CPU外存控制器同步的时钟工作(注意不是与CPU的工作频率一致)。与SDRAM相比,DDR SDRAM同时利用了时钟脉冲的上升沿和下降沿传输数据,因此在时钟频率不变的情况下,数据传输频率被加倍。此外,还存在使用RSL(Rambus发信电平)技术的RDRAM(Rambus DRAM)和Direct RDRAM。

针对许多特定场合的应用,嵌入式系统中往往还使用了一些特定类型的RAM。

1.NVRAM:非易失性RAM

既然是RAM,就是易失性的,为什么会有一类非易失性的RAM呢?

实际上,NVRAM借助带有备用电源的SRAM或借助NVM(如EEPROM)存储SRAM的信息并恢复来实现。NVRAM的特点是完全像 SRAM一样读写,而且写入的信息掉电不丢失,不需要 EEPROM和Flash 的特定擦除和编程操作。NVRAM 多用于存放系统中的参数信息。

2.DPRAM:双端口RAM

DPRAM的特点是可以通过2个端口同时访问,具有2套完全独立的数据总线、地址总线线和读写控制线,通常用于2个处理器之间交互数据,如图2.6所示。当一端被写入数据后,另一端可以通过轮询或中断获知,并读取其写入的数据。由于双CPU同时访问DPRAM时的仲裁逻辑电路集成在DPRAM内部,因而硬件工程师设计电路的原理比较简单。

图2.6 双端口RAM

DPRAM的优点是通信速度快、实时性强、接口简单,而且两边CPU都可主动进行数据传输。除了双端口RAM以外,目前IDT等芯片厂商还推出了多端口RAM,可以供3个以上的CPU互通数据。

3.CAM:内容寻址RAM

CAM是以内容进行寻址的存储器,是一种特殊的存储阵列RAM,它的主要工作机制就是将一个输入数据项与存储在CAM中的所有数据项自动同时进行比较,判别该输入数据项与CAM中存储的数据项是否相匹配,并输出该数据项对应的匹配信息。

如图2.7所示,在 CAM 中,输入的是所要查询的数据,输出的是数据地址和匹配标志。若匹配(即搜寻到数据),则输出数据地址。CAM用于数据检索的优势是软件无法比拟的,可以极大地提高系统性能。

图2.7 CAM的输入与输出

● FIFO:先进先出队列

FIFO存储器的特点是先进先出,进出有序,FIFO多用于数据缓冲。FIFO和DPRAM类似,具有两个访问端口,但是 FIFO 两边的端口并不对等,某一时刻只能被设置为一边作为输入,一边作为输出。

如果FIFO的区域共为n个字节,我们只能通过循环n次读取同一个地址才能将该片区域读出,不能指定偏移地址。对于有n个数据的FIFO,当循环读取m次,下一次读会自动读取到第m +1个数据,这是由FIFO本身的特性决定的。

总结2.2节的内容,我们可得出如图2.8所示的存储器分类。

图2.8 存储器分类

2.3 接口与总线

2.3.1 串口

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:当MODEM收到交换台送来的振铃呼叫信号时,使该信号有效(ON状态),通知终端,已被呼叫。

在嵌入式系统中,并不太注重DTE和DCE的概念,而RS-232C也很少用来连接modem,多使用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或自定义连接器。

图2.9 RS-232C串口电路原理

2.3.2 I2C

I2C(内置集成电路)总线是由Philips公司开发的两线式串行总线,产生于20世纪80年代,用于连接微控制器及其外围设备。I2C总线简单而有效,占用很少的PCB(印刷电路板)空间,芯片管脚数量少,设计成本低。I2C总线支持多主控(multi-mastering)模式,任何能够进行发送和接收的设备都可以成为主设备。主控能够控制数据的传输和时钟频率,在任意时刻只能有一个主控。

组成I2C总线的两个信号为数据线SDA和时钟SCL。为了避免总线信号的混乱,要求各设备连接到总线的输出端必须是开漏输出或集电极开路输出的结构。总线空闲时,上拉电阻使 SDA和SCL线都保持高电平。根据开漏输出或集电极开路输出信号的“线与”逻辑,I2C总线上任意器件输出低电平都会使相应总线上的信号线变低。

“线与”逻辑指的是两个或两个以上的输出直接互连就可以实现“AND”的逻辑功能,只有输出端是开漏(对于CMOS器件)输出或集电极开路(对于TTL器件)输出时才满足此条件。工程师一般以“OC门”简称开漏或集电极开路。

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

当 SCL 稳定在高电平时,SDA 由高到低的变化将产生一个开始位,而由低到高的变化则产生一个停止位,如图2.10所示。

图2.10 I2C总线开始位和停止位

开始位和停止位都由I2C主设备产生。在选择从设备时,如果从设备采用7位地址,则主设备在发起传输过程前,需先发送1字节的地址信息,前7位为设备地址,最后1位为读写标志。之后,每次传输的数据也是1个字节,从MSB位开始传输。每个字节传完后,在SCL的第9个上升沿到来之前,接收方应该发出1个ACK位。SCL上的时钟脉冲由I2C主控方发出,在第8个时钟周期之后,主控方应该释放SDA,I2C总线的时序如图2.11所示。

图2.11 I2C总线时序

2.3.3 USB

USB(通用串行总线)是Intel、Microsoft等厂商为解决计算机外设种类的日益增加与有限的主板插槽和端口之间的矛盾而于1995年提出的,它具有数据传输率高、易扩展、支持即插即用和热插拔的优点,目前已得到广泛应用。

USB1.1包含全速和低速两种模式,低速方式的速率为1.5Mbit/s,支持一些不需要很大数据吞吐量和很高实时性的设备,如鼠标等。全速模式为12Mbit/s,可以外接速率更高的外设。在USB2.0中,增加了一种高速方式,数据传输率达到480Mbit/s,可以满足更高速外设的需要。

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

图2.12 USB的物理拓扑

图2.13 USB 2.0连接高速、全/低速设备

在嵌入式系统中,电路板若需要挂接USB设备(device),则需提供USB主机(host)控制器和连接器;若电路板需要作为USB设备,则需提供USB设备适配器和连接器。有的MCU集成了USB主机控制器和设备适配器。

USB 总线的机械连接非常简单,采用4 芯的屏蔽线,一对差分线(D+,D-)传送信号,另一对(VBUS,电源地)传送+5V的直流电。一个USB主控制器端口最多可连接127个器件,各器件之间的距离不超过5米。

USB提供了4种传输方式以适应各种设备的需要,说明如下。

(1)控制(Control)传输方式。

控制传输是双向传输,数据量通常较小,主要用来进行查询、配置和给USB设备发送通用的命令。

(2)同步(Synchronization)传输方式。

同步传输提供了确定的带宽和间隔时间,它被用于时间严格并具有较强容错性的流数据传输,或者用于要求恒定的数据传送率的即时应用。例如进行语音业务传输时,使用同步传输方式是很好的选择。

(3)中断(Interrupt)传输方式。

中断方式传送是单向的,对于USB主机而言,只有输入。中断传输方式主要用于定时查询设备是否有中断数据要传送,该传输方式应用在少量的、分散的、不可预测的数据传输场合,键盘、游戏杆和鼠标属于这一类型。

(4)批量(Bulk)传输方式。

批量传输主要应用在没有带宽和间隔时间要求的批量数据的传送和接收,它要求保证传输。打印机和扫描仪属于这种类型。

2.3.4 以太网接口

以太网接口由MAC(以太网媒体接入控制器)和PHY(物理接口收发器)组成。以太网MAC由IEEE-802.3以太网标准定义,实现了数据链路层。常用的MAC支持10Mbit/s或100Mbit/s两种速率。PHY则实现物理层功能,IEEE-802.3标准定义了以太网PHY,它符合IEEE-802.3k中用于10BaseT(第14条)和100BaseTX(第24条和第25条)的规范。10BaseT和100BaseTX PHY两种实现的帧格式是一样的,但信令机制不同,而且10BaseT采用曼彻斯特编码,100BaseTX采用4B/5B编码。

MAC和PHY之间采用MII(媒体独立接口)连接,它是IEEE-802.3定义的以太网行业标准,包括1个数据接口和1个MAC和PHY之间的管理接口。数据接口包括分别用于发送和接收的两条独立信道,每条信道都有自己的数据、时钟和控制信号,MII数据接口总共需要16个信号。MII管理接口包含两个信号,一个是时钟信号,另一个是数据信号。通过管理接口,上层能监视和控制PHY。

组成一个以太网接口的硬件原理如图2.14所示,从CPU到最终接口依次为:CPU、MAC、PHY、以太网隔离变压器、RJ45插座。以太网隔离变压器是以太网收发芯片与连接器之间的磁性组件,在其两者之间起着信号传输、阻抗匹配、波形修复、信号杂波抑制和高电压隔离作用。

图2.14 以太网接口电路原理

许多处理器内部集成了MAC或同时集成了MAC和PHY,另有许多以太网控制芯片也集成了MAC和PHY。

2.3.5 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 ISA总线信号

图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卡成为主模块。

2.3.6 PCI和cPCI

PCI(外围部件互连)是由Intel于1991年推出的一种局部总线,作为一种通用的总线接口标准,它在目前的计算机系统中得到了非常广泛的应用。PCI 提供了一组完整的总线接口规范,其目的是描述如何将计算机系统中的外围设备以一种结构化和可控化的方式连接在一起,给出了外围设备在连接时的电气特性和行为规约,并且详细定义了计算机系统中的各个不同部件之间应该如何正确地进行交互。PCI总线具有如下特点。

● 数据总线32位,可扩充到64位。

● 可进行突发(burst)模式传输。

突发方式传输是指取得总线控制权后连续进行多个数据的传输。突发传输时,只需要给出目的地的首地址,访问第1个数据后,第2~n个数据会在首地址基础上按一定规则自动被寻址和传输。与突发方式对应的是单周期方式,它在1个总线周期只传送1个数据。

● 总线操作与处理器-存储器子系统操作并行。

● 总线时钟频率为33MHz或66MHz,最高传输率可达528MB/s。

● 采用中央集中式总线仲裁。

● 支持全自动配置、资源分配,PCI 卡内有设备信息寄存器组为系统提供卡的信息,可实现即插即用。

● PCI总线规范独立于微处理器,通用性好。

● PCI设备可以完全作为主控设备控制总线。

图2.16给出了一个典型的基于PCI总线的计算机系统逻辑示意图,系统的各个部分通过PCI总线和PCI-PCI桥连接在一起。CPU和RAM通过PCI桥连接到PCI总线0(即主PCI总线),而具有PCI接口的显卡则可以直接连接到主PCI总线上。PCI-PCI桥是一个特殊的PCI设备,它负责将PCI总线0和PCI总线1(即从PCI主线)连接在一起,通常PCI总线1称为PCI-PCI桥的下游(downstream),而PCI总线0则称为PCI-PCI桥的上游(upstream)。为了兼容旧的ISA总线标准,PCI总线还可以通过PCI-ISA桥来连接ISA总线,从而支持以前的ISA设备。

图2.16 基于PCI总线的计算机系统

当PCI卡刚加电时,卡上只有配置空间是可被访问的,因而PCI卡开始不能由驱动或用户程序访问,这与ISA卡有本质的区别(CPU可直接读取ISA卡在存储空间或I/O空间映射的地址)。PCI 配置空间保存着该卡工作所需的所有信息,如厂家、卡功能、资源要求、处理能力、功能模块数量、主控卡能力等。通过对这个空间信息的读取与编程,可完成对 PCI 卡的配置。如图2.17所示,PCI配置空间共为256字节,主要包括如下信息。

● 制造商标识(Vendor ID):由PCI组织分配给厂家。

● 设备标识(Device ID):按产品分类给本卡的编号。

● 分类码(Class Code):本卡功能的分类码,如图卡、显示卡、解压卡等。

● 申请存储器空间:PCI 卡内有存储器或以存储器编址的寄存器和 I/O 空间,为使驱动程序和应用程序能访问它们,需申请CPU的一段存储区域以进行定位。配置空间的基地址寄存器用于此目的。

● 申请I/O空间:配置空间的基地址寄存器也用来进行系统I/O空间的申请。

● 中断资源申请:配置空间中的中断引脚和中断线用来向系统申请中断资源。中断资源的申请通过中断引脚(interrupt pin)和中断线(interrupt line)来完成的。偏移3Dh处为中断引脚寄存器,其值表明 PCI 设备使用了哪一个中断引脚,对应关系为:1-INTA#、2-INTB#、3-INTC#、4-INTD#。

PCI总线上的信号大体可分为如下几组。

● 系统接口信号。

● 地址与数据接口信号。

● 接口控制信号。

● 仲裁信号。

● 错误报告信号。

● 中断接口信号。

● 其他接口信号。

图2.17 PCI配置空间

如图2.18所示,这些信号的详细定义如下。

● CLK:系统时钟。

● AD31~AD0:地址和数据复用信号线信号。

● C/BE3~C/BE:总线命令和地址使能信号。

● PAR:奇偶校验信号。

● FRAM E#:帧周期信号,指示总线操作起始和终止。

● IRDY#:主设备准备好信号。

● TRDY#:目标设备准备好信号。

● STOP#:目标设备要求终止当前数据传输信号。

● DEVSEL #:目标设备选中信号。

● IDSEL:配置空间读写时的片选信号。

● LOCK#:总线锁定信号。

● RST#:复位信号。

● INTA#、INTB#、INTC#和INTD#:中断请求。

● REQ#、GNT#:PCI总线请求与仲裁后的授权。

● AD63-AD32、C/BE7-4等:作用于64位扩展的PCI总线。

图2.18 PCI总线信号

cPCI(Compact PCI,紧凑型 PCI)是以 PCI 电气规范为标准的高性能工业用总线,结合了VME(Visa Module Eurocard,维萨信用卡模块欧洲卡)的高性能、可扩展性和可靠性与PCI标准的经济有效和灵活性。cPCI的CPU及外设与标准PCI是相同的,使用与传统PCI相同的芯片和软件,操作系统、驱动和应用程序都感觉不到两者的区别。图2.19展示了与cPCI总线相关的板卡、背板和机箱,基本上都是“大块头”,应用于工业控制和大型通信设备。

图2.19 cPCI板卡、背板与机箱

2.4 CPLD和FPGA

CPLD(复杂可编程逻辑器件)由完全可编程的与或门阵列以及宏单元构成。

CPLD中基本逻辑单元是宏单元,宏单元由一些“与或”阵列加上触发器构成,其中“与或”阵列完成组合逻辑功能,触发器完成时序逻辑。宏单元中与阵列的输出称为乘积项,其数量标志了CPLD的容量。乘积项阵列实际上就是一个“与或”阵列,每一个交叉点都是一个可编程熔丝,如果导通就是实现“与”逻辑。在“与”阵列后一般还有一个“或”阵列,用以完成最小逻辑表达式中的“或”关系。图2.20所示为非常典型的CPLD的单个宏单元的结构。

图2.20 典型的CPLD宏单元

图2.21给出了一个典型CPLD的整体结构。这个CPLD由LAB(逻辑阵列模块,由多个宏单元组成)通过 PIA(可编程互连阵列)互连组成,而CPLD与外部的接口则由I/O控制模块提供。

图2.21 典型CPLD的结构

图中宏单元的输出会经 I/O 控制块送至I/O引脚,I/O控制块控制每一个I/O引脚的工作模式,决定其为输入、输出还是双向引脚,并决定其三态输出的使能端控制。

与 CPLD 不同,FPGA(现场可编程门阵列)基于LUT(查找表)工艺。查找表本质上是一片RAM,当用户通过原理图或HDL(硬件描述语言)语言描述了一个逻辑电路以后, FPGA 开发软件会自动计算逻辑电路的所有可能的结果,并把结果事先写入 RAM。这样,输入一组信号进行逻辑运算就等于输入一个地址进行查表输出对应地址的内容。

图2.22所示为一个典型的FPGA的内部结构。这个FPGA由IOC(输入/输出控制模块)、EAB (嵌入式阵列块)、LAB和FAST TRACK(快速通道互连)构成。

图2.22 典型FPGA的结构

IOC是内部信号到I/O引脚的接口,它位于FAST TRACK的行和列的末端,每个IOC包含一个双向I/O缓冲器和一个既可做输入寄存器也可做输出寄存器的触发器。

EAB(嵌入式存储块)是一种输入输出端带有寄存器的非常灵活的RAM。EAB 不仅可以用作存储器,也可以事先被写入查表值来以用来构成如乘法器、纠错逻辑等电路。当用于RAM时, EAB可配制成8位、4位、2位和1位长度的数据格式。

LAB主要用于逻辑电路设计,一个LAB包括多个LE(逻辑单元),每个LE包括组合逻辑及一个可编程触发器。一系列LAB构成的逻辑阵列用来实现普通逻辑功能,如计数器、加法器、状态机等。

器件内部信号的互连和器件引出端之间的信号互连由FAST TRACK连线提供,FAST TRACK遍布于整个FPGA器件,是一系列水平和垂直走向的连续式布线通道。

表2.1所示为一个4输入LUT的实际逻辑电路与LUT实现方式的对应关系。

表2.1 实际逻辑电路与查找表的实现

续表

CPLD和FPGA的主要厂商有Altera、Xilinx和Lattice等,采用专门的开发流程,在设计阶段使用HDL语言(如VHDL、Verilog HDL)编程。它们可以实现许多复杂的功能,如实现UART、I2C等I/O控制芯片、通信算法、音视频编解码算法等,甚至还可以直接集成ARM等CPU核和外围电路。

对于驱动工程师而言,我们只需要这样看待 CPLD和FPGA:如果它完成的是特定的接口和控制功能,我们就直接把它当成由很多逻辑门(与、非、或、D触发器)组成的完成一系列时序逻辑和组合逻辑的ASIC;如果它完成的是CPU的功能,我们就直接把它当成CPU。驱动工程师眼里的硬件比IC设计师要宏观。

2.5 原理图分析

2.5.1 原理图分析的内容

原理图分析的含义是指通过阅读电路板的原理图获得各种存储器、外设所使用的硬件资源,主要包括存储器和外设控制芯片所使用的片选、中断和DMA资源。通过分析片选得出芯片的内存、I/O基地址,通过分析中断、DMA信号获得芯片使用的中断号和DMA 通道,并归纳出如表2.2所示的表格。

表2.2 存储器、外设控制器资源占用表

上述表格对驱动开发的意义很重大,实际上,在大多数情况下,硬件工程师已经给驱动工程师提供了这个表格。

2.5.2 原理图的分析方法

原理图的分析方法是以CPU为中心向存储器和外设辐射,步骤如下。

(1)阅读CPU部分,获知CPU的哪些片选、中断和集成的外设控制器被使用,列出这些元素a、b、c…。

CPU引脚比较多的时候,芯片可能会被分成几个模块单独被画在原理图的不同页上,这时候应该把相应的部分都分析到位。

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

硬件原理图中包含如下元素。

● 符号(symbol)。

symbol描述芯片的外围引脚以及引脚的信号,对于复杂的芯片,可能被分割为几个symbol。在symbol中,一般把属于同一个信号群的引脚排列在一起。图2.23所示为NOR Flash AM29LV160DB和NAND Flash K9F2G08的symbol。

图2.23 原理图中的symbol

● 网络(net)。

描述芯片、接插件和分离元器件引脚之间的互连关系,每个网络需要根据信号的定义赋予一个合适的名字,如果没有给网络取名字,EDA 软件会自动添加一个默认的网络名。添加网络后的AM29LV160DB如图2.24所示。

图2.24 原理图中的net

● 描述

原理图中会添加一些文字来辅助描述原理图(类似源代码中的注释),如每页页脚会有该页的功能描述,对重要的信号,在原理图的相应symbol和net也会附带文字说明。图2.25中给出了原理图中描述的例子。

LDD6410 Evaluation Board Schematics

图2.25 原理图中的描述

2.6 硬件时序分析

2.6.1 时序分析的概念

驱动工程师一般不需要分析硬件的时序,但是鉴于许多企业内驱动工程师还需要承担电路板调试的任务,因此,掌握时序分析的方法也就比较必要了。

对驱动工程师或硬件工程师而言,时序分析的意思是让芯片之间的访问满足芯片手册中时序图信号有效的先后顺序、采样建立时间(setup time)和保持时间(hold time)的要求,在电路板工作不正常的时候,准确地定位时序方面的问题。

建立时间是指在触发器的时钟信号边沿到来以前,数据已经保持稳定不变的时间,如果建立时间不够,数据将不能在这个时钟边沿被打入触发器;保持时间是指在触发器的时钟信号边沿到来以后,数据还需稳定不变的时间,如果保持时间不够,数据同样不能被打入触发器。如图2.26所示,数据稳定传输必须满足建立和保持时间的要求,当然在一些情况下,建立时间和保持时间的值可以为零。

图2.26 建立时间和保持时间

在工具方面,SynaptiCAD公司的Timing Diagrammer Pro是一种非常好的数字/模拟时序图编辑器及分析引擎。

2.6.2 典型硬件时序

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

图2.27给出了 SRAM的一个读时序,写时序与此相似。首先是地址总线上输出要读写的地址,然后SRAM片选被发出,接着读/写信号被输出,之后读写信号要经历数个等待周期。当SRAM读写速度比较慢时,等待周期可以由MCU的相应寄存器设置,也可以通过设备就绪/忙(如图2.27中的nWait)向CPU报告,这样,读写过程中会自动添加等待周期。

图2.27 SRAM读时序图

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

2.7 芯片手册阅读方法

芯片手册往往长达数百页甚至上千页,而且全部是英文,从头到尾不加区分地阅读需要花费非常长的时间,而且不一定能获取对设计设备驱动有帮助的信息。芯片手册的正确阅读方法是快速而准确地定位有用信息,重点阅读这些信息,忽略无关内容。下面以 S3C6410A的datasheet为例来分析阅读方法,为了直观地反映阅读过程,本节的图都直接从手册中抓屏而得。

打开S3C6410 A的datasheet,发现页数为1378页,阅读这样的数据手册所花费的时间足够完成整个驱动的设计工作了。

S3C6410A datasheet的第1章“PRODUCT OVERVIEW”即“产品综述”是必读的,通过阅读这一部分可以获知整个芯片的组成。这一章往往会给出一个芯片的整体结构图,并对芯片内的主要模块进行一个简洁的描述。如图2.28所示,S3C6410A的整体结构图在第61页出现。

图2.28 S3C6410A datasheet中芯片结构图

第2~43章每一章都对应S3C6410A整体结构图中的一个模块,图2.29为从Adobe Acrobat中直接抓出的S3C6410A datasheet目录结构图。

图2.29 S3C6410A datasheet目录结构

第2章“MemoryMap”即“内存映射”比较关键,对于定位存储器和外设所对应的基地址有直接指导意义,这一部分应该细看。

第3~34章对应于CPU内部集成的外设或总线控制器,当具体编写某一接口的驱动时,应该详细阅读,主要是要分析数据、控制、地址寄存器(datasheet 中一般会以表格列出)的访问控制和具体设备的操作流程(datasheet 中会给出步骤,有的还会给出流程图)。譬如为了编写S3C6410A的I2C控制器驱动,我们需要详细阅读类似图2.30的寄存器定义表格和图2.31的操作流程图。

图2.30 芯片手册中以表格形式列出寄存器定义

第44章“ELECTRICAL DATA”即“电气数据”,描述芯片的电气特性,如电压、电流和各种工作模式下的时序及建立时间和保持时间的要求。所有的datasheet都会包含类似章节,这一章对于硬件工程师比较关键,但是,一般来说,驱动工程师并不需阅读。

第45章“MECHANICAL DATA”即“机械数据”,描述芯片的物理特性、尺寸和封装,硬件工程师会依据这一章绘制芯片的封装(footprint),但是,驱动工程师无需阅读。

图2.31 芯片手册中给出外设控制器的操作流程

2.8 仪器仪表使用

2.8.1 万用表

在电路板调试过程中我们主要使用万用表的两个功能。

● 测量电平。

● 使用二极管 测量电路板上网络的连通性,当示波器被设置在二极管 ,测量连通的网络会发出“ ”的叫,否则,没有连通。

2.8.2 示波器

示波器是利用电子示波管的特性,将人眼无法直接观测的交变电信号转换成图像,显示在

光屏上以便测量的电子仪器。它是观察数字电路实验现象、分析实验中的问题、测量实验结果必不可少的重要仪器。

使用示波器主要应注意调节垂直偏转因数选择(VOLTS/DIV)和微调、时基选择(TIME/DIV)和微调以及触发方式。

如果VOLTS/DIV设置不合理,则可能造成电压幅度超出整个屏幕或在屏幕上变动太过微小无法观测的现象。图2.32所示为同一个波形在 VOLTS/DIV 设置由大到小变化过程中的示意图。

如果TIME/DIV设置不合适,则可能造成波形混迭。混迭意味着屏幕上显示的波形频率低于信号的实际频率。这时候,可以通过慢慢改变扫速TIME/DIV到较快的时基 ,如果波形的频率参数急 改变或者 动的波形在某个较快的时基 稳定下来,说明之前发生了波形混迭。根据

斯特定理,采样速率至少高于信号高频成分的2倍才不会发生混迭,如一个500MHz的信号,至少需要1GS/s的采样速率。图2.33所示为同一个波形在TIME/DIV设置由小到大变化过程中的示意图。

图2.32 示波器的VOLTS/DIV设置与波形

奈奎斯特定理即为采样定理,指当采样频率fsmax大于信号中最高频率fmax的2倍时,即fsmax≥2fmax时,采样之后的数字信号可完整地保留了原始信息。这条定理在信号处理领域的地位相当之高,大致相当于物理学领域的牛顿定律。

示波器的触发能使信号在正确的位置点同步水平扫描,使信号特性清晰。触发控制按钮可以稳定重复的波形并捕获单次波形。大多数用示波器的用户只采用边沿触发方式,如果拥有其他触发能力在某些应用上是非常有用的,特别是对新设计产品的故障查询,先进的触发方式可将所关心的事件分离出来,找出用户关心的非正常问题,从而最有效地利用采样速率和存储深度。触发能力的提高可以较大提高测试过程的灵活性。

图2.33 示波器的TIME/DIV设置与波形

2.8.3 逻辑分析仪

逻辑分析仪是利用时钟从测试设备上采集数字信号并进行显示的仪器,其最主要的作用是用于时序的判定。与示波器不同,逻辑分析仪并不具备许多电压等级,通常只显示两个电压(逻辑1和0)。在设定了参考电压之后,逻辑分析仪对待测试信号通过比较器来进行判定,高于参考电压者为High,低于参考电压者为Low。

例如,如果以n MHz采样率测量一个信号,逻辑分析仪会以1000/n ns为周期采样信号,当参考电压设定为1.5V时,超过1.5V则判定为1,低于1.5V则为0,将逻辑1和0连接成连续的波形,工程师依据此连续波形可寻找时序问题。

高端的逻辑分析仪会安装有Windows XP操作系统并提供非常友善的逻辑分析应用软件,在其中可方便地编辑探针、信号并察看波形,如图2.34所示。

逻辑分析仪的波形可以显示地址、数据、控制信号及任意外部探 信号的变化轨 ,在使用之前应先编辑每个探钩的信号名。

图2.34 逻辑分析仪及配套软件

逻辑分析仪具有超强的逻辑跟踪分析功能,它可以捕获并记录嵌入式处理器的总线周期,也可以捕获如实时跟踪用的ETM 接口的程序执行信息,并对这些记录进行分析、译码并还原出应用程序的执行过程。因此,可使用逻辑分析仪通过触发接口与ICD(在线调试器)协调工作以补充ICD在跟踪功能方面的不足。逻辑分析仪与ICD协作可为工程师提供断点、触发和跟踪调试手段,如图2.35所示。

ICD是一个容易与ICE(在线仿真器)混淆的概念,ICE本身需要完全仿真CPU的行为,可以从物理上完全替代CPU,而ICD则只是与芯片内部提供的嵌入式ICE单元通过JTAG等接口互通。因此,对ICD的硬件性能要求远低于ICE。目前市面上出现的很多号称为ICE的产品实际上是ICD,如ARM公司的Multi-ICE、WindRiver公司的visionICE和visionProbe等。

图2.35 逻辑分析仪与ICD协作

2.9 总结

本章简单地讲解了驱动软件工程师必备的硬件基础知识,描述了处理器、存储器的分类以及各种处理器、存储器的原理与用途,并分析了常见的外围设备接口与总线的工作方式。

此外,本章还讲述了对驱动工程师进行实际项目开发有帮助作用的原理图、硬件时序分析方法,数据手册阅读方法以及万用表、示波器和逻辑分析仪的使用方法。