基于嵌入式基于嵌入式Linux的字符设备驱动程序的设计的字符设备驱动程序的设计
摘 要:随着嵌入式技术的广泛应用,驱动程序的开发己成为嵌入式系统开发的关键。本文结合嵌入式数据采集系统中的
ADS8364的驱动程序设计,简述了基于嵌入式Linux的字符设备驱动程序的开发过程。
关键词:嵌入式Linux 字符设备 ADS8364 设备驱动程序
1 引言引言
数据采集系统的工作原理就是将被测对象(外部世界或现场)的各种参量(可以是物理量,也可以是化学量,生物量)通过各
种传感元件做适当转换后,再经信号调理、采样、量化、编码、传输等步骤,最后送到服务器进行数据处理和存储记录的过
程。用于数据采集的成套设备称为数据采集系统(Data Acquisition System,DAS)。
数据采集系统一般包括传感器、放大器、滤波器、A/D采样转换电路、微处理器等元件。数据采集系统基本组成示意图如图1
所示。A/D转换电路在数据采集系统中起着至关重要的作用,它的转换精度和工作可靠度直接关系着整个采集系统的工作性
能。由于篇幅有限,本文仅就该数据采集系统中的A/D转换芯片ADS8364的驱动开发过程加以概述。
图1 数据采集系统组成示意图
2 ADS8364的功能简介的功能简介
ADS8364是美国TI公司生产的一种高速、低能耗、6通道同步采样转换、单+5V供电、16位高速并行接口的高性能模数转换芯
片。并带有6个80dB共模抑制的全差分输入通道以及6个4μs连续近似的模数转换器、6个差分采样/保持放大器
[1]
。ADS8364
的6个模拟输入分为3组(A,B和C),每个输入端都有一个ADCs保持信号以用来保证几个输入通道能同时进行采样和转换,
因此不同模拟输入通道信号之间的相位差异得以保存。当3个保持信号同时被选通时,6个ADCs同步转换,其转换结果将保存
在6个寄存器中。采样频率最高为250 KHz,抗噪性能好。
3 设备驱动程序开发的基本原理设备驱动程序开发的基本原理
设备驱动程序是操作系统内核和机器硬件之间的接口,它为应用程序屏蔽了硬件的细节,将应用程序对设备的操作转化为对相
应的设备文件的操作,使应用程序可以象操作普通文件一样,用处理普通文件的标准系统调用来打开、关闭和读写设备。设备
驱动程序作为内核的一部分,主要完成如下功能:对设备进行初始化和释放;完成硬件与内核的数据交互;完成内核与应用层
的数据交互;对可能出现的错误进行检测和处理。
在Linux系统中,打开的设备在内核内部由设备文件结构标识,内核使用file_operations(文件操作)结构访问驱动程序的函
数。每个文件都与自己的函数集相关联(通过包含在设备中指向file_operations结构的指针实现),这些操作主要负责系统调
用的实现。用户进程利用系统调用对设备文件进行操作时,系统调用通过设备的主设备号找到相应的设备驱动程序,然后读取
这个数据结构相应的函数指针,接着把控制权交给该函数,这就是Linux的设备驱动程序工作的基本原理。由此可见,编写设
备驱动程序的主要工作就是编写file_operations中的子函数,完成对设备的操作。
为了实现设备的独立性,Linux把设备分成三种类型:字符设备(character device),块设备(block device)和网络设备
(network device)
[2]
。每类设备都有独特的管理控制方式和不同的驱动程序,这样就可以把控制不同设备的驱动程序与操作
系统的其它部分分离开来,不但便于对不同设备的管理,而且为系统中增加和撤销某种设备提供了很多方便。在此,我们是把
ADS8364看作字符设备来驱动的,其驱动程序就是字符设备驱动程序。
4 ADS8364的驱动程序设计概述的驱动程序设计概述
4.1 驱动程序的驱动程序的LKM实现机制实现机制
Linux内核提供了两种机制来开发设备驱动程序,一种是直接把驱动程序编译进内核,成为Linux内核的一部分。另一种是通过
LKM(Loadable Kernel Module,即可加载模块化机制)来开发可动态加载和卸载的驱动模块
[3]
。驱动程序如果编译进内核的
话,会增加内核的大小,还要改动内核的源文件,而且不能动态的卸载,不利于调试,所以本系统把ADS8364的驱动程序编
写成了LKM型驱动程序(就是把ADS8364的驱动程序作为一个独立的单元模块,在使用时可以使用insmod命令加载到核心
中,用完后使用rmmod命令卸载的那种)。
4.2 驱动程序的注册与注销驱动程序的注册与注销