微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 嵌入式数据采集系统中的ADS8364驱动程序设计

嵌入式数据采集系统中的ADS8364驱动程序设计

时间:03-23 来源:互联网 点击:

数二是设备文件名,这个名字必须插入到/dev目录中,并与驱动程序的主设备号和次设备号相连。参数三用来登记驱动程序实际执行操作的函数的指针。如果登记成功,返回设备的主设备号,不成功,返回一个负值。在此,我们选用当前不用的设备号11作为ADS8364的主设备号,设备名为 ADS8364。

在关闭字符设备或块设备时,还需要通过unregister_chrdev( )从内核中注销设备,并释放主设备号。在用rmmod卸载该驱动模块时,cleanup_module函数被调用,它释放字符设备ADS8364在系统字符设备表中占有的表项。

void ads8364_cleanup_module(void)

{ unregister_chrdev(11, ADS8364); info("ADS8364 cleanup module ok!"); }

4.3 file_operations结构体的设计

在Linux中,字符设备向内核提供的接口函数集就是文件操作集file_operations结构体。在Linux系统中,打开的设备在内核内部由设备文件file结构标识,内核使用file_operations(文件操作)结构访问驱动程序的函数。每个文件都与自己的函数集相关联(通过包含指向file_operations结构的f_ops指针段实现),这些操作主要负责系统调用的实现[4]。为了使驱动程序在结构的定义发生变化时更具可移植性,并且使得代码更加紧凑且易读,我们首先采用标记化格式声明ADS8364的file_operations结构:

static struct file_operations ad_fops = {全功能版J-LINK ARM仿真器V6.0

owner: THIS_MODULE,/* ad_fops所属的设备模块 */

read:ads8364_read,/*从设备中读数据*/

poll:ads8364_poll, /*查询设备状态*/

ioctl:ads8364_ioctl,/*设备I/O控制*/全功能版J-LINK ARM仿真器V6.0

open:ads 8364_open,/*打开设备操作*/

release:ads 8364_release,/*释放操作*/

};

file_operations结构体把系统调用和驱动程序关联起来。这个结构的每一个成员的名字都对应着一个系统调用。用户进程利用系统调用在对设备文件进行诸如read、write、open等操作时,系统调用通过设备文件的主设备号找到相应的设备驱动程序,然后读取这个数据结构相应的函数指针,接着把控制权交给该函数。这就是ADS8364驱动程序工作的基本原理。既然是这样,则编写设备驱动程序的主要工作就是编写子函数,并填充 file_operations的各个域。下面我们就把file_operations的各个域的功能和主要调用函数加以介绍。

1)设备I/O控制操作函数

与普通文件相比,设备文件的操作要复杂得多,不可能简单地通过 read、write 和llseek 等来实现。所有其它类型的操作都可以通过VFS的ioctl调用来执行,函数定义如下:

static int ads8364_ioctl(struct inode * inode, struct file *filp, unsigned int cmd, unsigned long arg)

ads8364_ioctl是ADS8364驱动程序中对设备的I/O通道进行管理的函数。其中参数inode就是用户程序打开ADS8364时使用open函数返回的文件标示符,cmd就是用户程序对ADS8364的控制命令,它是唯一联系用户程序命令和驱动程序支持的途径,该函数通过cmd区分操作,通过arg传递参数和结果。在驱动程序中实现的ads8364_ioctl函数体内,有一个switch{case}结构,每一个case对应一个命令码,做出一些相应的操作。 ads8364_ioctl的设计的关键就是,如何将cmd命令码在用户程序里生成以及在驱动程序里的解析,所以switch{case}结构在 ads8364_ioctl中至关重要,因为对设备的I/O控制都是通过这一部分的代码实现的。

cmd参数的内容主要有以下:通过调用copy_from_user( )内核函数将应用程序中由参数arg传来的数据结构传给内核的同类型结构;采样开始控制命令,通过调用采样开始函数,使能AD开始控制管脚来开始采样,该函数通过调用copy_from_user( )内核函数将应用程序中由参数arg传来的数据结构传给内核的同类型结构;获得采样频率,控制ADS8364按照用户要求的采样频率进行采样。

2)查询设备状态操作

static unsigned int ads8364_poll(struct file * filp, poll_table * wait)

该函数用于查询ADS8364的状态,以便用户程序获知是否能对设备进行非阻塞的访问。它的设计比较简单,它通过调用API函数poll_wait()把当前阻塞的进程添加到wait参数指定的等待列表(poll_table)中。

3)从设备中读数据操作

static ssize_t ads8364_read(struct file * filp, char * buf, size_t count, loff_t * l)全功能版J-LINK ARM仿真器V6.0

该函数由用户程序调用,它主要通过调用内核函数copy_to_user()把内核空间已经完成转换的数据读入到用户空间。这是内核与用户交换数据的接口函数。

4)打开设备操作

static int ad

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top