Linux设备驱动程序设计.ppt
《Linux设备驱动程序设计.ppt》由会员分享,可在线阅读,更多相关《Linux设备驱动程序设计.ppt(34页珍藏版)》请在三一办公上搜索。
1、Linux 设备驱动程序设计,Linux设备驱动程序设计,郗闽军牛建伟,实验目的,学习Linux下进行驱动程序设计的原理掌握Linux设备驱动程序开发的基本过程和设计方法,实验内容,内核驱动设计入门模块方式驱动程序(5.1)内核驱动设计实验触摸屏驱动(5.2)写一个简单的应用程序,显示触摸位置的坐标(x,y)开发一个LED(数码管)驱动程序,并编写一个应用程序对所开发的驱动程序进行测试(大作业)实验实现的功能是上电复位后,数码管显示数字0-7,然后每一个数字依次闪烁一次,小数点也要点亮,即:0.1.2.3.4.5.6.7.,Linux的设备驱动程序,硬件设备与应用程序之间的一个中间软件层它使得
2、某个特定硬件能够响应一个定义良好的内部编程接口,同时完全隐蔽了设备的工作细节用户通过一组与具体设备无关的标准化的调用来完成相应的操作驱动程序的任务就是把这些标准化的系统调用映射到具体设备对于实际硬件的特定操作上驱动程序是内核的一部分,可以使用中断、DMA等操作驱动程序在用户态和内核态之间传递数据,设备驱动程序的分类,字符设备所有能够象字节流一样访问的设备都通过字符设备来实现它们被映射为文件系统中的节点,通常在/dev/目录下面一般要包含open read write close等系统调用的实现块设备通常是指诸如磁盘、内存、Flash等可以容纳文件系统的存储设备。块设备也是通过文件系统来访问,与
3、字符设备的区别是:内核管理数据的方式不同它允许象字符设备一样以字节流的方式来访问,也可一次传递任意多的字节。网络接口设备通常它指的是硬件设备,但有时也可能是一个软件设备(如回环接口loopback),它们由内核中网络子系统驱动,负责发送和接收数据包。它们的数据传送往往不是面向流的,因此很难将它们映射到一个文件系统的节点上。,基本概念,主设备号和次设备号主设备号和次设备号能够唯一地标识一个设备128(V2.0以前),256(V2.0以后)主设备号相同的设备使用相同的驱动程序,次设备号用于区分具体设备的实例动态获取主设备号Linux下对设备号的分配请参考Documentation/devices.
4、txt设备文件 Linux使用设备文件来统一对设备的访问接口,将设备文件放在/dev/目录下设备的命名一般为设备文件名+数字或者字母表示的子类,例如/dev/hda1,/dev/hda2等Linux 2.4以后引入了设备文件系统(devfs)的概念,所有的设备文件作为一个可以挂装的文件系统,这样就可以被文件系统统一管理,从而设备文件就可以挂装到任何需要的地方。一般将主设备建立一个目录,再将具体的子设备文件建立在此目录下。例如,/dev/mtdblock0,基本概念,驱动程序使用的2个重要结构struct filestruct file_operations,基本概念,struct file,基
5、本概念,struct file数据结构定义位于include/fs.hstruct file结构与驱动相关的成员mode_t f_mode标识文件的读写权限loff_t f_pos当前读写位置unsigned int_f_flag文件标志,主要进行阻塞/非阻塞型操作时检查struct file_operation*f_op 文件操作的结构指针void*private_data驱动程序一般将它指向已经分配的数据struct dentry*f_dentry 文件对应的目录项结构,基本概念,设备驱动程序接口(struct file_operations),标记化方法:static struct fi
6、le_operations demo_fops=owner:THIS_MODULE,write:demo_write,read:demo_read,ioctl:demo_ioctl,open:demo_open,release:demo_release,;,基本概念,设备驱动程序接口(struct file_operations)通常所说的设备驱动程序接口是指struct file_operations,它的定义位于include/linux/fs.h中。在嵌入式系统的开发中,通常只要实现如下几个接口函数就能完成系统所需要的功能init加载驱动程序时,内核自动调用read从设备中读取数据wri
7、te向字符设备中写数据ioctl控制设备,实现除读写操作以外的其他控制命令open打开设备并进行初始化release关闭设备并释放资源exit 卸载驱动程序时,内核自动调用,基本概念,驱动程序注册过程(动态分配主设备号)insmod module_name;加载驱动程序,运行init函数(register_chrdev(dev_Major,“module_name”,*fs)查看/proc/devicesmknod/dev/module_name c/b 主设备号 次设备号rmmod module_name;卸载驱动,运行 exit函数(unregister_chrdev(dev_Major,
8、“module_name”,*fs))用户程序调用Open(“/dev/module_name”,mode);O_RDWRIoctl()Write()Read()Close(),开发驱动程序时须注意的事项,中断处理中断是现代微处理器的一个重要功能Linux驱动程序中的中断处理函数extern int request_irq(unsigned int irq,void(*handler)(int,void*,struct pt_regs*),unsigned long flag,const char*dev_name,void*dev_id);/请求为中断号irq分配中断处理函数extern v
9、oid free_irq(unsigned int,void*);/释放中断 注意事项不能向用户空间发送或者接收数据不能执行有睡眠操作的函数不能调用调度函数谨慎使用全局变量(可重入)自旋锁的使用,基本概念,字符设备的管理驱动程序模块通过函数int register_chrdev(unsigned int major,const char*name,struct file_operations*fops)完成向内核的注册,其中major是主设备号,name是设备名,fops是针对该设备的驱动程序的接口。在系统中为驱动程序模块建立一个设备节点minjunRedHatAS$mknod/dev/dem
10、o c 254 0其中/dev/demo标识设备名为demo,“c”说明是字符设备,254是指定的主设备号,0是次设备号,基本概念,驱动程序的编译以demo.c为例Makefile的形式参考实验指导书命令行的形式minjunRedHatAS$armv4l-unknown-linux-gcc-Wall-c-O-D_KERNEL_-I/home/minjun/embedded/kernel-2410s/include demo.c-o demo.o加载驱动minjunRedHatAS$insmod demo.o卸载驱动minjunRedHatAS$rmmod demo.o,基本概念,测试程序实例/
11、test.c#include#include#includeint main()int fd;fd=open(/dev/demo,O_RDWR);if(fd 0)exit(fd);/your code hereread(fd,buffer,size);write(fd,buffer,size);.close(fd);return 0;,驱动程序的实现驱动程序框架,#include#include#include#include/*printk()*/#include/*everything.*/#include/*error codes*/#include/*size_t*/#include#
12、include/*O_ACCMODE*/#include/*COPY_TO_USER*/#include/*cli(),*_flags*/#define DEVICE_NAMEdemo#define demo_MAJOR 250#define demo_MINOR 0static ssize_t demo_write(struct file*filp,const char*buffer,size_t count)copy_from_user(drv_buf,buffer,count);WRI_LENGTH=count;printk(user write data to drivern);/yo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 设备 驱动程序 设计
链接地址:https://www.31ppt.com/p-5438156.html