如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
1.1前言1.2Linux设备驱动程序的框架1.2.1设备驱动程序的注册与注销1.2.2设备的打开与释放1.2.3设备读写操作1.2.4设备的控制操作1.2.5设备中断与循环查询处理2.1实验目的及内容2.2设备的功能2.3.1数据结构每个实际的FIFO设备都对应于一个Vfifo_Dev{}结构体。vfifo.ctypedefstructVfifo_Dev{wait_queue_headrdq,wrq;/*rdq:阻塞读的等待队列;wrq:阻塞写的等待队列*/char*base;/*所分配缓冲区的起始地址*/unsignedintbuffersize;/*缓冲区的大小*/unsignedintlen;/*已有数据块的长度*/unsignedintstart;/*缓冲区起始数据的偏移量*/unsignedintreaders,writers;/*VFIFO设备当前的读者个数和写者个数*/structsemaphoresem;/*互斥访问的信号量*/devfs_handle_tr_handle,w_handle;/*保存设备文件系统的注册句柄*/}Vfifo_Dev;2.3.2设备操作接口(2)打开与释放打开设备主要是完成一些初始化工作,以及增加引用计数,防止模块在设备关闭前被注销。我们知道内核用主设备号区分不同类型的设备,而驱动程序用次设备号识别具体的设备。利用这一特性,我们可以用不同的方式打开同一个设备。(3)读写操作就实际的设备操作而言,读的任务是把数据从设备复制到用户空间(用copy_to_user()),而写操作则必须把数据从用户空间复制到设备(用copy_from_user())。每一个read或write系统调用都会要求传输一定字节数的数据,但驱动程序可以随意传输其中一部分数据。如果有错误发生,read和write都会返回一个负值。一个大于等于零的返回值会告诉调用程序成功传输了多少字节的数据。(4)poll方法在Linux2.0版本的内核中只支持select,从2.1.23版本的内核开始,系统提供了对两种调用的支持。我们的驱动程序是基于poll系统调用,因为poll提供了比select更详细的支持。poll的实现可以执行poll和select两种系统调用,它的原型如下:unsignedint(*poll)(structfile*,poll_table*)2.4设备的安装2.5设备的使用3.设备驱动程序中的一些具体问题(3)中断处理同处理I/O端口一样,要使用一个中断,必须先向系统登记。intrequest_irq(unsignedintirq,void(*handle)(int,void*,structpt_regs*),unsignedintlongflags,constchar*device);(4)一些常见的问题对硬件操作,有时时序很重要。但是如果用C语言写的硬件操作,gcc往往会对其进行优化,除非你用volatile关键字修饰。最保险的办法是禁止优化。这当然只能对一部分你自己编写的代码。如果对所有的代码都不优化,你会发现驱动程序根本无法装载。这是因为在编译驱动程序时要用到gcc的一些扩展特性,而这些扩展特性必须在加了优化选项之后才能体现出来。4.工作总结与心得谢谢观赏!