关注自由和开源软件
针对特定处理器平台,操作系统(OS)处理硬件操作的细节。利用内核(OS)内部硬件抽象层(HAL)和处理器专用外设驱动程序(例如I2C®SPI总线驱动程序),通常的设备驱动程序甚至也能独立处理器平台。这种方法允许一个设备驱动程序(例如触摸屏数字化仪AD7879的驱动程序)可以不加修改地用在任何运行Linux的处理器平台上,Linux内核之上运行任何图形用户界面(GUI)包和适当的应用程序。如果硬件设计人员决定转而使用触摸屏控制器AD7877,他(她)将无需软件团队提供信息。两款器件均可用驱动程序;虽然器件不同,连接方式可能不同(AD7877仅提供SPI,AD7879则有SPI或I2C),并且寄存器图也不相同,但相对于触摸屏用户代码的内核API完全相同。这样,对硬件的控制权便又回到硬件架构师手中。
Linux内核中的不同类型设备驱动程序提供不同的抽象层次,传统上一般将其分为以下三类。
字符设备:处理字节流。串行端口或输入设备驱动程序(键盘、鼠标、触摸屏、游戏操纵杆等)通常实现字符设备类型。
块数据设备:单次操作处理512字节或更多的二次幂块数据。存储设备驱动程序通常实现此类块设备。
网络接口:任何网络事务都通过接口完成,接口指能够与其他主机交换数据的设备。
在Linux内核中,各特殊类别都可能有多个独立的设备核心层,以帮助开发人员实现提供标准用途的驱动程序,如视频、音频、网络、输入设备或背光处理等。通常,每个子系统在Linux内核源代码树中都有其自己的目录。这种"设备驱动程序核心方法"消除了特定类别所有设备驱动程序的公共代码,为上层构建了一个标准接口。每类设备或总线设备核心驱动程序通常会将一个函数集导出至其子类。驱动程序利用这种核心驱动程序注册,并使用核心驱动程序所导出的API,而不是注册其自己的字符/块/网络驱动程序。这通常包括支持和处理多个实例以及在层间分配数据的方式。绝大部分系统无意了解设备如何连接,但需要知道何种设备可用。Linux设备模型也包括一种将设备指派给特定类别的机制,如input(输入)、RTC(实时时钟)、net(网络)或GPIO(通用输入/输出)等。这些类名在更高的功能层次描述设备,使之能在用户空间中被发现。
特定硬件可能有多个设备驱动程序子系统与之相关。多功能芯片,例如带I/O扩展器的背光驱动器ADP5520,会同时利用Linux背光、LED、GPIO和输入子系统来实现其键盘功能。
如前文所述,用户应用程序不能直接与硬件通信,因为那将要求拥有对处理器的管理员权限,例如执行特殊指令或处理中断。使用特定硬件设备的应用程序通常在通过/dev目录中的节点暴露的内核驱动程序上工作。
设备节点称为伪文件,因为它们看起来像文件;应用程序也可以打开或关闭它们(open()或close()),但在读取或写入这些文件时,数据来自或传递至设备节点相关的驱动程序。这个抽象层次由Linux内核中的虚拟文件系统(VFS)处理。除了read()、write()或poll()外,用户应用程序也可以利用ioctl()(输入/输出控制)与设备交互。
除设备节点外,应用程序也可以利用/sys目录中的文件条目;这是一个sysfs虚拟文件系统,可将有关设备和驱动程序的信息,包括父子关系或与特定类、总线的关联,从内核设备模型导出至用户空间。/sys也频繁用于设备配置,特别是当相关驱动程序以一个设备驱动程序核心注册时,此时它只将其标准功能集导出给用户。
设备驱动程序可以注册/sys"钩子"或"条目";读取或写入钩子或条目时,将执行设备驱动程序专门注册的回调函数。这些回调函数(在管理员模式下运行)可以接受参数、发起总线传输、调用某种处理、修改特定设备变量,并将整数值或字符串返回给用户。这就为实现其他功能创造了条件;例如,用户空间可以使用触摸屏数字化仪AD7877的温度传感器或辅助ADC。
设备驱动程序既可以静态地构建于内核中,也可以在以后作为可加载模块动态安装。Linux内核模块(LKM)是动态组件,可以在运行时插入和移除。这对于驱动程序开发人员特别有用,因为更快的编译速度可以节省时间,而且测试模块不必重启系统。让硬件驱动程序驻留在可以随时载入内核的模块中,便可以在特定硬件不用时节约RAM。
加载模块时,也可以赋予其配置参数。对于构建于内核中的模块,参数在内核启动时传送给该模块。例如:
root:~> insmod ./sample_module.ko argument=1
root:~> lsmod
Module Size Used by
sample_module 1396 0 - Live 0x00653000
root:~> rmmod sample_module
驱动程序也可以多次实例化,每次实例化都可以采用不同的设置,目标设备可以有不同的I2C从ID,连接
- 基于开源软件的嵌入式网络打印服务器(11-05)
- GCC-维基百科(04-13)
- Linux嵌入式系统开发平台选型探讨(11-09)
- 基于Winodws CE的嵌入式网络监控系统的设计与实现(03-05)
- 嵌入式系统实时性的问题(06-21)
- 嵌入式实时系统中的优先级反转问题(06-10)