[精选]嵌入式LINUX设备驱动程序课件.pptx
《[精选]嵌入式LINUX设备驱动程序课件.pptx》由会员分享,可在线阅读,更多相关《[精选]嵌入式LINUX设备驱动程序课件.pptx(54页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、嵌入式嵌入式LINUXLINUX设备驱动设备驱动程序程序 本讲主要内容1.1.1.1.嵌入式嵌入式linuxlinux设备驱动的基本框架与实现设备驱动的基本框架与实现2.2.2.2.数码管显示驱动程序分析数码管显示驱动程序分析3.3.3.3.帧缓冲显示驱动实现方法。帧缓冲显示驱动实现方法。Linux系统中的设备文件系统中的设备文件LinuxLinux将所有外部设备看成是一类特殊文件,将所有外部设备看成是一类特殊文件,称之为称之为“设备文件。设备文件。如果说系统调用是如果说系统调用是LinuxLinux内核和应用程序之间内核和应用程序之间的接口,那么设备驱动程序则可以看成是的接口,那么设备驱动程
2、序则可以看成是LinuxLinux内核与外部设备之间的接口。内核与外部设备之间的接口。设备驱动程序向应用程序屏蔽了硬件在实现设备驱动程序向应用程序屏蔽了硬件在实现上的细节,使得应用程序可以像操作普通文上的细节,使得应用程序可以像操作普通文件一样来操作外部设备件一样来操作外部设备LinuxLinux设备驱动在系统中的层次设备驱动在系统中的层次设备驱动的作用设备驱动的作用设设备备驱驱动动是是位位于于应应用用和和物物理理设设备备之之间间的的软软件层,负责完成二者间的件层,负责完成二者间的I/O操作;操作;在在LINUX系系统统里里,对对用用户户程程序序,设设备备驱驱动动隐隐藏藏了了设设备备的的具具体
3、体细细节节,为为不不同同设设备备提提供供了一致的接口;了一致的接口;设设备备驱驱动动是是嵌嵌入入式式系系统统开开发发的的重重要要内内容容之之一一设备驱动完成的主要功能设备驱动完成的主要功能n对设备的初始化和的初始化和释放;放;n将数据从内核将数据从内核传递到硬件到硬件设备,以及从硬件,以及从硬件读取数据;取数据;n读取取应用程序用程序传送送给设备文件的数据,并回文件的数据,并回送送应用程序用程序请求的数据。求的数据。n这需要在用需要在用户空空间、内核空、内核空间、总线以及以及外外设之之间传输数据;数据;n检查和和处理理设备出出现的的错误。设备驱动的分类设备驱动的分类n nLinux支持支持3种
4、种不同不同类型的型的设备n n字符字符设备n n块设备n n网网络接口接口n n字符字符设备vv能能够像字像字节流一流一样被被访问的的设备,一般不,一般不需要需要缓存技存技术,也不支持随机,也不支持随机访问。vv典型的字符典型的字符设备有:鼠有:鼠标、键盘、I/O设备等。等。设备驱动的分类设备驱动的分类n块设备支持面向支持面向块访问的的设备,每,每块包含包含2的的N次次幂字字节数据,典型的数据,典型的块大小大小为512或或1024B;大多数大多数块设备允允许随机随机访问,而且常常采用,而且常常采用buffer、cache等等缓存技存技术;块设备的的访问常常通常常通过文件系文件系统来来进行行;典
5、型的典型的块设备有:如磁有:如磁盘、硬、硬盘、光、光盘驱动器等。器等。设备驱动的分类设备驱动的分类n网网络接口接口能能够和其他主机交和其他主机交换数据的数据的设备接口。接口。网网络接口只是面向数据包而不是数据流,接口只是面向数据包而不是数据流,它没有被映射它没有被映射为任何任何设备文件,其文件,其访问要通要通过BSD套接口套接口进行。行。设备驱动的分类设备驱动的分类主设备号与次设备号主设备号与次设备号LINUX系统中,设备由一个系统中,设备由一个主设备号主设备号和一个和一个次设备号次设备号来来唯一唯一标识;标识;主设备号主设备号唯一标识了设备类型,即设备驱动程序类型,它唯一标识了设备类型,即设
6、备驱动程序类型,它是块设备表或字符设备表中设备表项的索引。是块设备表或字符设备表中设备表项的索引。一些典型设备的主设备号已经基本固定下来,例一些典型设备的主设备号已经基本固定下来,例如,软驱的主设备号为如,软驱的主设备号为2,IDE硬盘的主设备号为硬盘的主设备号为3等等。等等。设备宏操作设备宏操作MAJOR可以获取主设备号。可以获取主设备号。主设备号与次设备号主设备号与次设备号次设备号次设备号用于标识使用同一设备驱动程序的不同硬用于标识使用同一设备驱动程序的不同硬件,并仅由设备驱动程序解释件,并仅由设备驱动程序解释 当应用程序操作某个设备文件时,当应用程序操作某个设备文件时,Linux内核根据
7、其主设备号调用相应的驱动程序,内核根据其主设备号调用相应的驱动程序,并从用户态进入内核态并从用户态进入内核态驱动程序判断次设备号,并完成相应的硬驱动程序判断次设备号,并完成相应的硬件操作。件操作。用户空间和内核空间用户空间和内核空间Linux运行在运行在2种模式下种模式下内核模式内核模式用户模式用户模式内核模式对应内核空间,而用户模式对应用内核模式对应内核空间,而用户模式对应用户空间。户空间。驱动程序作为内核的一局部,它对应内核空驱动程序作为内核的一局部,它对应内核空间,应用程序不能直接访问其数据,间,应用程序不能直接访问其数据,用户空间和内核空间用户空间和内核空间用户空间和内核空间的数据传递
8、:用户空间和内核空间的数据传递:copy_to_uservoid*to,const void*from,unsigned long count;copy_from_uservoid*to,const void*from,unsigned long count;_copy_to_user_copy_from_user第一种方法在复制数据的同时,会进行地址空第一种方法在复制数据的同时,会进行地址空间的有效性检查。间的有效性检查。内核设备驱动模块内核设备驱动模块n设备驱动程序以两种方式添加到内核:设备驱动程序以两种方式添加到内核:nBuild inn直接把驱动程序编译到内核代码中直接把驱动程序编译到
9、内核代码中nModulen以模块的方式加载驱动程序以模块的方式加载驱动程序n加载:加载:insmod driver.on卸载:卸载:rmmod drivern查看:查看:lsmodLinux设备节点的添加设备节点的添加n设备节点位于设备节点位于/dev路径下路径下n可用如下命令添加可用如下命令添加dev节点节点,b 代表块设备,代表块设备,C表示字符设备表示字符设备nmknod /dev/hda1 b/c 127 1块设备,主设备号块设备,主设备号127,次设备号,次设备号1Linux设备驱动代码的分布设备驱动代码的分布n/char:字符:字符设备驱动源码源码;n/block:块设备驱动源码源
10、码;n/cdrom:Linux CDROM驱动源码驱动源码。n这里可以找到某些特殊的里可以找到某些特殊的CDROM设备如如SoundblasterCDROM。IDE接口的接口的CD驱动位于位于drivers/ide/ide-cd.c中而中而SCSICD驱动位位于于drivers/scsi/scsi.c中。中。n/pci:它包含了:它包含了PCI伪设备驱动源源码。这里可里可以找到关于以找到关于PCI子系子系统映射与初始化的代映射与初始化的代码。Linux设备驱动代码的分布设备驱动代码的分布n/scsi:所有的:所有的SCSI代代码以及以及Linux支持的支持的SCSI设备的的设备驱动。n/net
11、:包含网:包含网络驱动源源码。n/sound:所有的声卡:所有的声卡驱动源源码。n/video:所有的:所有的视频卡卡驱动源源码。Linux设备驱动的代码结构设备驱动的代码结构驱动程序的注册与注销驱动程序的注册与注销设备的翻开与释放设备的翻开与释放设备的读写操作设备的读写操作设备的控制操作设备的控制操作设备的中断和轮询处理等设备的中断和轮询处理等 19设备驱动的注册设备驱动的注册方法方法1 1result=devfs_register_chrdevresult=devfs_register_chrdev0,MOD_NAME,&keypad_fops0,MOD_NAME,&keypad_fops
12、 if if result 0 result 0 return-ENODEV;return-ENODEV;devfs_handle=devfs_registerdevfs_handle=devfs_registerNULL,MOD_NAME,NULL,MOD_NAME,result,0,&keypad_fops,NULL,result,0,&keypad_fops,NULL;MOD_NAME:MOD_NAME:设备驱动的名称;设备驱动的名称;keypad_fopskeypad_fops:文件操作:文件操作指针。指针。优点:无需手动创立设备节点,由系统自动完成。优点:无需手动创立设备节点,由系统
13、自动完成。对于块设备的注册,具有类似函数对于块设备的注册,具有类似函数:devfs_register_blkdev:devfs_register_blkdev以及操作过程。以及操作过程。设备驱动的注册设备驱动的注册方法方法2 2result=register_chrdevresult=register_chrdev0,MOD_NAME,0,MOD_NAME,&keypad_fops&keypad_fops;或者或者result=register_blkdevresult=register_blkdev0,0,MOD_NAME,&keypad_fopsMOD_NAME,&keypad_fops;
14、if if result 0 result 0 return-ENODEV;return-ENODEV;mknod/dev/MOD_NAME C MAJOR MINORmknod/dev/MOD_NAME C MAJOR MINOR设备驱动的注销设备驱动的注销方法方法1 1devfs_unregister_chrdevdevfs_unregister_chrdevMAJOR,MAJOR,MOD_NAMEMOD_NAME;或或 者者 devfs_unregister_blkdevdevfs_unregister_blkdev MAJOR,MAJOR,MOD_NAMEMOD_NAME;devfs_
15、unregisterdevfs_unregisterdevfs_handledevfs_handle;方法方法2 2unregister_chrdevunregister_chrdevMajor,MOD_NAMEMajor,MOD_NAME;或或者者unregister_blkdevunregister_blkdevMajor,Major,MOD_NAMEMOD_NAME;rm/dev/MOD_NAME rm/dev/MOD_NAME 设备的翻开与释放设备的翻开与释放设备的翻开与释放要通过文件操作结构体中设备的翻开与释放要通过文件操作结构体中定义的相关函数定义的相关函数openopen和和re
16、leaserelease来完来完成;成;主要完成设备的初始化工作以及设备的释放。主要完成设备的初始化工作以及设备的释放。文件操作结构体的定义文件操作结构体的定义struct file_operationsstruct file_operations struct module*owner;struct module*owner;ssize_t ssize_t*read*read struct file*,char struct file*,char*,size_t,loff_t*,size_t,loff_t*;ssize_t ssize_t*write*write struct file*,s
17、truct file*,const char*,size_t,loff_t*const char*,size_t,loff_t*;unsigned int unsigned int*poll*poll struct file*,struct file*,struct poll_table_struct*struct poll_table_struct*;int int*ioctl*ioctl struct inode*,struct struct inode*,struct file*,unsigned int,unsigned longfile*,unsigned int,unsigned
18、long;int int*mmap*mmap struct file*,struct struct file*,struct vm_area_struct*vm_area_struct*;文件操作结构体的定义文件操作结构体的定义int int*open*open struct inode*,struct struct inode*,struct file*file*;int int*release*release struct inode*,struct inode*,struct file*struct file*;int int*fsync*fsync struct file*,struc
19、t struct file*,struct dentry*,int datasyncdentry*,int datasync;文件操作结构体的主要函数文件操作结构体的主要函数open:open:用于翻开文件设备用于翻开文件设备release:release:在关闭文件的调用在关闭文件的调用read:read:用于从设备中读取数据用于从设备中读取数据write:write:向设备发送数据向设备发送数据poll:poll:查询设备是否可读或可写查询设备是否可读或可写ioctl:ioctl:提供执行设备特定命令的方法提供执行设备特定命令的方法fasync:fasync:用于设备的异步通知操作用于设备
20、的异步通知操作设备的读写设备的读写字符设备的读写操作可以直接使用字符设备的读写操作可以直接使用readread和和writewrite函数来完成,函数来完成,块设备的读写,需要调用块设备的读写,需要调用block_readblock_read和和block_writeblock_write函数,这函数,这2 2个函数向设备请个函数向设备请求表中增加读写请求;求表中增加读写请求;块设备的读写是对内存缓冲区进行操作,如块设备的读写是对内存缓冲区进行操作,如果内存缓冲区中没有要读入的数据,或者缓果内存缓冲区中没有要读入的数据,或者缓冲区中的数据需要写入设备,可以通过调用冲区中的数据需要写入设备,可以
21、通过调用数据结构数据结构blk_dev_structblk_dev_struct中的函数中的函数request_fnrequest_fn完成。完成。设备的控制操作设备的控制操作对设备的控制操作可通过文件操作数据结构对设备的控制操作可通过文件操作数据结构中的中的ioctlioctl函数来完成。函数来完成。控制操作与具体的设备有密切关系,需要根控制操作与具体的设备有密切关系,需要根据设备实际情况进行具体分析。据设备实际情况进行具体分析。设备的轮询和中断处理设备的轮询和中断处理轮询方式轮询方式对于不支持中断的硬件设备,读写时需要对于不支持中断的硬件设备,读写时需要轮流查询设备的状态,以便决定随后的数
22、轮流查询设备的状态,以便决定随后的数据操作。据操作。如果轮询处理方式的驱动程序被链接到内如果轮询处理方式的驱动程序被链接到内核,则意味着查询过程中,内核一直处于核,则意味着查询过程中,内核一直处于闲置状态。闲置状态。解决方法是使用内核定时器,进行定期查解决方法是使用内核定时器,进行定期查询。询。设备的轮询和中断处理设备的轮询和中断处理中断处理方式中断处理方式硬件在需要的时候,向内核发出中断请求信号,硬件在需要的时候,向内核发出中断请求信号,而内核则负责把中断信号传递给相应的设备驱动。而内核则负责把中断信号传递给相应的设备驱动。驱动程序必须在设备驱动的初始化时申请中断资驱动程序必须在设备驱动的初
23、始化时申请中断资源,并注册中断处理函数:源,并注册中断处理函数:申请:申请:request_irqrequest_irqirq,irq_handler,irq,irq_handler,flag,dev_name,dev_idflag,dev_name,dev_id;释放:释放:free_irqfree_irqirq,dev_idirq,dev_id;其中其中irqirq为申请的中断线号,为申请的中断线号,irq_handlerirq_handler为注册为注册的中断处理函数,的中断处理函数,dev_id dev_id 用于共享中断信号线。用于共享中断信号线。典型字符驱动程序框架典型字符驱动程序
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 精选 嵌入式 LINUX 设备 驱动程序 课件
限制150内