首页 理论教育 嵌入式Linux字符设备驱动编程示例

嵌入式Linux字符设备驱动编程示例

时间:2023-10-31 理论教育 版权反馈
【摘要】:字符设备驱动程序是Linux系统最基本、最常用的驱动程序之一。概括地说,字符设备驱动主要包括:1)定义一个结构体staticstructfile_operations变量,并在其内定义一些设备的打开、关闭、读、写和控制函数。字符设备驱动程序的框架的核心是数据结构structfile_operation,它是一系列指针的集合。对于大多数的字符设备,只要其中的部分操作即可。可以编写程序对test字符设备进行访问。

嵌入式Linux字符设备驱动编程示例

字符设备是指所有能像字节流一样访问的设备,其接口支持面向字符的I/O操作,它不经过系统的快速缓存,而是负责管理自己的缓冲区结构。字符设备接口只支持顺序存储的功能,一般不能进行任意长度的I/O请求,而是限制I/O请求的长度必须是设备要求的基本块长的倍数。

字符设备是指在I/O传输过程中以字符为单位进行传输的设备,如鼠标、键盘,打印机等最基本、最常用的设备。字符设备驱动程序是Linux系统最基本、最常用的驱动程序之一。只要不挂载文件系统的设备,都可以用字符设备来描述。可以使用与普通文件相同的文件操作命令对字符设备文件进行操作,如打开、关闭、读和写等。

概括地说,字符设备驱动主要包括:

1)定义一个结构体staticstructfile_operations变量,并在其内定义一些设备的打开、关闭、读、写和控制函数。

2)在结构体外分别实现结构体中定义的这些函数。

3)向内核中注册或删除驱动模块。

字符设备驱动程序的框架的核心是数据结构structfile_operation,它是一系列指针的集合。每个被打开的文件都对应于一系列的操作,需要在驱动程序中加以实现。其定义如下(在/include/linux/fs.h中定义):

978-7-111-33316-6-Chapter08-6.jpg

这个结构的每个成员的名字都对应一个系统调用。用户进程利用系统调用在对设备文件进行诸如read/write操作时,系统调用通过设备文件的主设备号找到相应的设备驱动程序,然后读取这个数据结构相应的函数指针,接着把控制权交给该函数。

对于每个进程,都包含一个files_struct结构,用来记录文件描述符的使用情况,定义在include/linux/sched.h中。Linux中的一个进程最多只能同时打开NR_OPEN_DEFAULT个文件。

978-7-111-33316-6-Chapter08-7.jpg

structinode定义文件在/includelinux/fs.h中,用来代表一个文件。structinode包括很重要的两个成员:一个代表设备文件的设备号,另一个代表字符设备的数据结构。同一个文件可以被打开多次,所以可以对应很多structfile,但是只对应一个structinode。

978-7-111-33316-6-Chapter08-8.jpg

978-7-111-33316-6-Chapter08-9.jpg

978-7-111-33316-6-Chapter08-10.jpg(www.xing528.com)

对于大多数的字符设备,只要其中的部分操作即可。

【例8-1】字符设备驱动。

这是字符设备驱动程序的例子。

设计步骤

1)在Vim中创建一个新工程文件,命名为“test.c”。

2)在“test.c”中创建如下代码。

978-7-111-33316-6-Chapter08-11.jpg

978-7-111-33316-6-Chapter08-12.jpg

在Vim中创建一个新工程文件,命名为“Makefile”。在“Makefile”中创建如下代码。

978-7-111-33316-6-Chapter08-13.jpg

例8-1程序的运行结果如图8-3所示。

978-7-111-33316-6-Chapter08-14.jpg

图8-3 例8-1程序的运行结果

在图8-3中,test设备已经加入到Linux内核中。可以编写程序对test字符设备进行访问。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈