概览嵌入式系统的各种周边设备

概览嵌入式系统的各种周边设备

译自:《 Essential Linux Device Drivers 》作者: Venkateswaran
刘建文略译( http://blog.csdn.net/keminlau )

KEY:嵌入式系统 驱动程序

Embedded Drivers

Linux 在嵌入式领域如此流行的一个重要原因是它有很好的移植性和扩展性;得益于Linux的强大的抽象机制,(基于Linux编写的)大量应用软件可以无缝地运行在不同的硬件平台。如下图所示,为你的嵌入式系统添加有特色的功能(硬件),你只需要为其编写夹在内核抽象层( kernel abstraction layers)和硬件层之的底层设备驱动即可。一般你有三种选择:概览嵌入式系统的各种周边设备_第1张图片

  • 第一,测试已有相似硬件的驱动,看是否能工作;
  • 第二,改写已有相似硬件的驱动;
  • 第三,编写一个新的硬件驱动。

概览嵌入式系统的各种周边设备_第2张图片

假如一位内核工程师也参与嵌入式系统的组件选择,那么你比较容易找到相似的驱动。寻找相似的驱动主要是找设备的芯片,驱动设备的控制器。

为了熟悉嵌入式系统,为其编写驱动,我们顺时针方向的走一遍下图中一些常见的嵌入式设备(控制器),我们从NOR闪存开始。

 

概览嵌入式系统的各种周边设备_第3张图片

Flash Memory

嵌入式设备一般是从闪存中引导,并且配备一个基于闪存的外存(访问基于文件系统和保存大文件数据)。前者一般使用NOR闪存,后者使用NAND闪存。NOR闪存保存 bootloader 和基本内核,而NAND闪存则保存根文件系统和驱动模块。

KEMIN:严格上说,PC也是从闪存引导,闪存可受内存控制器控制,映射入CPU的地址空间。

 

由于成本的原因,现在的嵌入式设备只配备NAND闪存变得很常见。使用NAND启动的代价当然是为处理器配备NAND 控制器了。

 

闪存驱动由内核的MTD子系统所支持(MTD是Memory Technology Devices),如果你的设备配备了MTD支持芯片,那么你只需要编写MTD映射驱动(map driver),划分闪存区域给bootloader、内核和文件系统即可。本书第十七章详细介绍。

UART

UART(Universal Asynchronous Receiver/Transmitter 通用异步接收/发送装置,UART是一个并行输入成为串行输出的芯片,通常集成在主板上)负责实现嵌入式设备的串行通信。UART被认为是系统的基本设备,有如PC的键盘和显示屏。在嵌入式设备上, UARTs一般用来把处理器连接到调试串口(debug serial ports)、modems、触摸控制器、GPRS 芯片、蓝牙芯片、GPS 设备、遥测装置(telemetry electronics)等。

本书第六章“串行驱动”详细介绍Linux串行子系统。

UART是一个并行输入成为串行输出的芯片,通常集成在主板上,多数是16550AFN芯片。因为计算机内部采用并行数据,不能直接把数据发到Modem,必须经过UART整理才能进行异步传输,其过程为:CPU先把准备写入串行设备的数据放到UART的寄存器(临时内存块)中,再通过FIFO(First Input First Output,先入先出队列)传送到串行设备,若是没有FIFO,信息将变得杂乱无章,不可能传送到Modem。
   它是用于控制计算机与串行设备的芯片。有一点要注意的是,它提供了RS-232C数据终端设备接口,这样计算机就可以和调制解调器或其它使用RS-232C接口的串行设备通信了。作为接口的一部分,UART还提供以下功能:将由计算机内部传送过来的并行数据转换为输出的串行数据流。将计算机外部来的串行数据转换为字节,供计算机内部使用并行数据的器件使用。在输出的串行数据流中加入奇偶校验位,并对从外部接收的数据流进行奇偶校验。在输出数据流中加入启停标记,并从接收数据流中删除启停标记。处理由键盘或鼠标发出的中断信号(键盘和鼠标也是串行设备)。可以处理计算机与外部串行设备的同步管理问题。有一些比较高档的UART还提供输入输出数据的缓冲区,现在比较新的UART是16550,它可以在计算机需要处理数据前在其缓冲区内存储16字节数据,而通常的UART是8250。现在如果您购买一个内置的调制解调器,此调制解调器内部通常就会有 16550 UART。

 

 

Buttons and Wheels

你的嵌入式设备可能配备一些混杂的外设,比如小键盘、LED灯、滚轮和小按钮。这些I/O通过GPIO线或CPLD和CPU通信。设备驱动一般是比较简单的字符驱动。有一些驱动甚至是通过procfs 或 sysfs 访问,而不是/dev节点。

PCMCIA/CF

PCMCIA 插槽或CF插槽是嵌入式设备常见的扩展槽(add-on)。扩展槽的优点很明显,比如把板载的WiFi控制器转移进CF卡,那WiFi更新换代的时候换掉 CF卡行了,不必整板换掉。还有,现在有很多技术都做成PCMCIA/CF形式,如果需要,你可以很方便的将嵌入式设备的网络互连模式从无线 WiFi改为蓝牙技术。扩展槽的缺点是其天生的不可靠性,震动或抖动都有可能造成设备断开,或使连接断断续续。

PCMCIA 和CF设备驱动在第九章介绍。

 

SD/MMC

现在有很多的嵌入式处理器(嵌入式设备吧)集成了与SD/MMC存储介质通信的控制器。SD/MMC是NAND闪存。与CF卡一样,SD/MMC可以为你的设备添加数G的存储空间,并且这个存储容量还在和技术一起增长。

第十四章“块设备驱动”介绍内核的SD/MMC子系统。

 

USB

台式计算机支持所谓的USB主机模式(host mode),各种USB设备通过主机模式与主机通信。而嵌入式设备除了支持主机模式,还要支持USB设备模式,以USB设备的形式连接入主机计算机。

在第十一章的Universal Serial Bus,我们知道很多嵌入式控制器支持USB OTG技术,被控制的设备既可作为USB主机也可作为USB设备。例如,你可以把U盘和嵌入式设备连接;你也可把嵌入式设备本身当U盘使用。Linux的 USB子系统为USB OTG提供了驱动支持。对于那些与OTG不兼容的硬件,USB Gadget项目(现在已经是内核开发主线的一部分了)为它们提供了解决方案。

 

RTC

很多嵌入式片上系统(SoCs )集成了实时时钟电路(RTC),而有一些则使用外部的实时时钟电路。与X86系统把RTC集成在南桥芯片不同,嵌入式控制器一般通过低速串行总线I2C或SPI连接一个外部的RTC。从系统角度看,RTC是I2C总线上的一个字符设备,你可以为这个设备编写相应的驱动程序。在第八章,我们介绍了内核对编写串行总线I2C或SPI驱动提供的服务;第二和第五章介绍了X86系统对RTC的支持。

I²C( The Inter-Integrated Circuit )是一种串行通讯总线,使用多主从架构,由飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备而开发。I²C的正确读法为"I-squared-C" ,而"I-two-C"则是另一种错误但被广泛使用的读法,在大陆地区则多以"I方C"称之。截至2006年11月1日为止,使用I²C协定不需要为其专利付费,但制造商仍然需要付费以获得I²C从属设备地址。

 

Audio

在第十三章的“音频驱动”里,我们知道[音频解码器]负责将[数字音频数据]转换成模拟声音信号(通过喇叭回放)和反之(通过麦克风输入模拟声音信号)的。音频解码器不是直接与处理器通信的,而是通过中间的数字音频控制器(比如AC'97)。音频控制器与音频解码器之间通过专用总线连接,比如AC'97 或I2S。

 

I²S 或I2S(Inter-IC Sound或Integrated Interchip Sound)是互联两数字音频设备的一种串行接口标准,采用串行的方式传输两组(左右声道)数据。I2S常被使用在传送CD的PCM音频数据到CD播放器的DAC中。由于I2S将数据信号和时钟信号分开传送,它的jitter失真十分地小。

 

I²S至少由3条传输线组成:
1. 位元时脉线(BCLK: bit clock line)
2. 字时钟线(word clock line)或字选择线(word select line)(LRCK)
3. 至少一条复合数据线(SDATA:multiplexed data)
也有可能找到以下这些线:
1. 主时脉:256个典型的位元时钟(MCLK:bitclk)
2. 上传资料的复合讯息(multiplex)线

 

Touch Screen

触摸方式是一些嵌入式设备的主要输入方式。在第六章,我们为串行触摸控制器开发了驱动;在第七章“输入驱动”,我们介绍了触摸控制器通过SPI总线与CPU连接的方式。

如果你的驱动符合“输入驱动框架”的API,那么你可以很容易的把驱动绑定到GUI。不过,你可能还需要一些额外的校准你的触摸设备才能工作。

 

在计算机中,串行外围接口(SPI)是一种允许在两种设备(一个称master另一个称slave)之间进行串行(每次一位)数据交换的接口。 SPI以全双工模式工作,这意味着,数据可同时双向传输。SPI最常用于中央处理单元(CPU)跟外围设备之间的通信系统,也可能使用SPI连接两个微处理。

 

相比并行接口,串行接口具有某些优势,最大的优势在于其简单布线,另外,串行接口电缆可长于并行接口电缆,因为电缆中导体之间的串绕小得多。  

许多种设备可通过SPI控制,包括移位寄存器、存储芯片、扩展器、显示驱动器、数据转换器、打印机、数据存储设备、感应器以及微处理器。数据在电缆上串行传输,输入到移位寄存器,并通过并行处理传输到各个子系统。

 

Video

一部分嵌入式系统是“无头”,而有一些则是有头的——配置了显示屏。这些系统集成了视频控制器(LCD控制器),可连接适度大小的LCD屏。现在很多LCD屏集成了触摸输入功能。

在第十二章“视频驱动”,我们学习到[帧缓冲](frame buffers)分隔了应用程序与显示硬件,这样应用可独立于硬件开发,只要你的显示驱动实现了帧缓冲接口(frame buffer interface),为你的设备移植GUI应用变得很容易。

CPLD/FPGA

复杂可编程逻辑设备(Complex Programmable Logic Devices)或其后续发展的场可编程门阵列(Field Programmable Gate Arrays)技术为了你嵌入式系统添加一层独立于操作系统的可编程逻辑。你可使用VHDL硬件描述语言对CPLDs/FPGAs芯片进行编程,这有什么用呢?

在处理器与具体外设之间搁一层CPLD的优点在于,通过对CPLD的适当的编程后,操作系统(比如驱动程序)可使用一个优雅的寄存器接口(elegant register interfaces)实现复杂的I/O操作。

Consider, for example, an external serial LCD controller that has to be driven by shifting in each pixel bit. The Linux driver for this device will have a tough time toggling the clock and wiggling(踌躇, 摆动 ) I/O pins several times for sending each pixel or command byte to the serial LCD controller. If this LCD controller is routed to the processor via a CPLD, however, the VHDL code can perform the necessary serial shifting by clocking each bit in and present a parallel register interface to the OS for command and data. With these virtual LCD command and data registers, the LCD driver implementation is rendered simple. Essentially, the CPLD converts the cumbersome serial LCD controller to a convenient, parallel one.

If the CPLD engineer and the Linux driver developer collaborate, they can arrive at an optimum partitioning between the VHDL code and the Linux driver that'll save time and cost.

复杂可编程逻辑器件(Complex Programmable Logic Device,缩写:CPLD),CPLD适合用来实现各种计算和组合逻辑(combinational logic)。一颗CPLD内等于包含了数颗的PAL(Programmable Array Logic),各PAL(逻辑区块)间的互接连接也可以进行程序性的规划、刻录,CPLD运用这种多合一(All-In-One)的集成作法,使其一颗就能实现数千个逻辑门,甚至数十万个逻辑门才能构成的电路。

 

Connectivity

网络连接为设备注入智能,因此,很少有嵌入式设备不配置网络通信功能的。现在应用于嵌入式设备的流行网络技术有无线网络WIFI、蓝牙、cellular modems, Ethernet, and radio communication。

第十五章的“网络接口卡”介绍有线网络设备及其驱动;第十六章则介绍无线网络技术。

Domain-Specific Electronics

你的设备很可能需要配备一些领域特定的电子装置,比如医疗设备的遥测装置接口(telemetry interface)、自动机械的传感器(sensor)、窝蜂式电话的GPRS装置、导航系统的GPS等。这些外设通常通过一些标准的I/O接口,如 UART, USB, I2C, SPI,或控制器区域网络CAN,与嵌入式控制器通信。

对于那些通过UART连接系统的设备,你一般在驱动内完成很少量的工作就行了,因为UART接口硬件本身接管所有的通信细节。对于通过USB连接入系统的设备,比如指纹感应器,你得缩写USB客户驱动(也就是非主机的设备驱动)。你也有可能要为使用专用总线(接口)的外设编写驱动,比如连接网络处理器的交换结构(switching fabric),在这种情况下,你得为其编写全功能的(full-fledged )驱动程序。

我们举一个数字媒体的例子。Cable 或 Direct-to-home (DTH 卫星电视广播直播系统)接口系统通常内建于机顶盒芯片组。这些芯片支持“个人视频录制”(录制多个频道到硬件,或者边录制边观看等)功能和节目定制(服务提供方可根据用户的选择参数对节目内容过虑)功能。为了实现以上的功能,机顶盒必需集成强大的图形处理引擎,比如要集成MPEG编码器硬件。MPEG编码器硬件可对经压缩数字媒体标准(如MPEG2 和MPEG4)的编码的数据进行解码。

如果你在STB内嵌入Linux系统,那么你得编写驱动程序来驱动MPEG编码器硬件。

 

机顶盒 —— 英文名全称是Set Top Box,简称STB

机顶盒(英文名全称是Set Top Box,简称STB)是指用来增强或扩展电视机功能的一种信息设备,由于人们通常将它放在电视机的上面,所以又被称为机顶盒或顶置盒。目前的机顶盒有模拟和数字之分,因为电视的模拟制式即将淘汰,所以现在人们所说的机顶盒一般是指数字机顶盒。数字电视机顶盒是将数字电视信号转换成模拟信号的变换设备,可以给电视用户提供高质量的电视节目。数字机顶盒可以支持几乎所有的广播和交互式多媒体应用,包括收看普通电视节目、数字加密电视节目、点播多媒体节目和信息、电子节目指南(EPG)、收发电子邮件、因特网浏览、网上购物、远程教育等,需要的条件是双向CATV网。

More Drivers

如果你的设备应用于生命攸关(利害攸关)的工业领域,比如安全或卫生,那么系统内存必须具有ECC功能。第二十章的“更多设备和驱动”介绍ECC。

如果你的设备使用电池供电,你可能希望配备一个CPU频率监视器,负责动态调整处理的频率,从而节省电能。第十二章讨论CPU频率驱动和电源管理。

大多数的嵌入式处理器都内建了硬件看门狗(watchdog ),负责在系统冻结时恢复系统。在第五章,你可找到看门狗的驱动。以drivers/char/watchdog/内的现有驱动为起点,实现适合自已的系统看门狗。

你可能感兴趣的:(linux,网络,command,嵌入式,interface,asynchronous)