首页 理论教育设备驱动程序功能接口函数

设备驱动程序功能接口函数

【摘要】:设备驱动程序通过功能接口函数完成对设备的各种操作。下面对功能接口函数进行具体介绍。设备的注册函数通常包含在设备驱动程序的初始化模块中。ioctl()接口函数所需要的头文件为:#include5.设备中断与设备循环查询处理在设备驱动程序的初始化模块中还定义了设备中断。

设备驱动程序通过功能接口函数完成对设备的各种操作。一个设备驱动程序模块包含有5个部分的功能接口函数:

(1)驱动程序的注册与释放;

(2)设备的打开与关闭;

(3)设备的读写操作;

(4)设备的控件操作;

(5)设备的中断或轮询处理。

下面对功能接口函数进行具体介绍。

1.设备驱动程序的注册与释放

设备要能使操作系统找到并正确识别,必须向内核注册。设备的注册函数通常包含在设备驱动程序的初始化模块中。

字符设备的注册函数为:

devfs_register_chrdev(Demo_ID,"demo_drv",&Test_ctl_ops);

其中:参数Demo_ID是设备驱动程序向系统申请的主设备号,Linux系统通过设备号来区分不同的设备,“demo_drv”是设备名。该设备名与在文件系中创建的设备进人点一致,&Test_ctL_ops为驱动程序中所定义的结构体struct file_options,在这个数据体中定义了设备的各种操作功能。如果设备注册成功,则设备名就会出现在proc/devices文件里。

一旦将设备注册到内核表中,对它的操作就与指定的主设备号相联系。无论何时对与主设备号相匹配的设备文件进行操作,内核都会从file_operations结构体中找出并调用相应的功能函数。

从本质上来说,设备注册的过程,其实就是将设备驱动程序与该设备的设备号及设备名(设备节点)相关联。

将不需要的资源及时释放是一个良好的设计习惯。释放设备资源只需要调用函数。

devfs_unregister_chrdev(Demo_ID,"demo drv");

块设备的注册函数为:

devfs_register_blkdev()

块设备的注销函数为:

devfs_unregister_blkdev()

2.设备的打开与关闭

(1)open()函数。在设备驱动程序中,设备的打开操作由功能接口函数open()完成。它主要提供驱动程序初始化的能力,为以后对设备进行I/O操作做准备。(www.chuimin.cn)

如果功能接口函数的返回值为O,表示打开设备成功;如果返回值为负数,则表示打开设备失败,比如设备尚未准备好。

如果设备驱动程序没有提供功能接口函数open()入口,则只要/dev目录下设备文件存在,就默认这个函数为NULL,那么,设备的打开操作永远成功,且系统不通知驱动程序,就默认为打开设备成功。

(2)release()函数。release()函数是释放设备的接口。需要指出的是,释放设备和关闭设备是完全不同的。当一个进程释放设备时,其他进程还可以继续使用该设备,只是暂时停止对该设备的使用。而当一个进程关闭设备时,其他进程必须重新打开此设备才能使用。

open()和release()这两个接口函数所需要的头文件为:

#include<linux/kernel.h>

3.设备的读写操作

在设备驱动程序中,由接口函数read()和write()完成字符设备的读写操作。函数read()和write()的主要任务就是把内核空间的数据复制到用户空间,或者从用户空间把数据复制到内核空间。

read()和write()这两个接口函数所需要的头文件为:

#include<linux/fs.h>

4.设备的控制操作

在设备驱动程序中,接口函数ioctl(),主要用于对设备进行读写之外的其他控制操作。函数ioct()的操作与设备密切相关。比如,串口的传输波特率、马达的转速等,这些操作一般无法通过read()和write()操作来完成。

在用户空间ioctl函数的定义为:

int ioctl(int fd,ind cmd,…);

其中,fd是用户程序打开设备时使用open丽数返回的文件标识符;cmd是用户程序对设备的控制命令;后面的省略号代表可选参数,一般最多一个,有或没有是和cmd的意义相关的。

在驱动程序中定义的ioctl函数是文件结构中的一个属性分量,就是说如果你的驱动程序提供了对ioctl()的支持,用户就可以在用户程序中使用ioctl函数控制设备的I/O通道。

ioctl()接口函数所需要的头文件为:

#include<linux/fs.h>

5.设备中断与设备循环查询处理

在设备驱动程序的初始化模块中还定义了设备中断。设备驱动程序通过调用request_irq()函数来申请中断,并通过中断信息将中断号和中断服务联系起来。中断使用结束。可以通过调用free_irq()函数来释放中断。

对于不支持中断处理的设备,在对其进行读写操作时驱动程序需要循环查询设备的状态,以便决定是否继续进行数据处理