资源描述:
《嵌入式linux设备驱动课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、嵌入式设备驱动1提纲1、Linux下设备驱动程序简介2、设备驱动程序结构3、设备驱动实验实验一:编写一个简单的驱动程序实验二:设计和实现一个KED&LED驱动程序实验三:静态编译驱动程序,连接到内核实验四:使用中断方式的驱动程序设计21、Linux下设备驱动程序简介系统调用是操作系统内核和应用程序之间的接口设备驱动程序是操作系统内核和机器硬件之间的接口Linux设备驱动的特点是可以以模块的形式加载各种设备类型因为嵌入式设备往往具有大量的独有外设,开发人员需要把很多精力放在设备驱动方面31.1Linux设备的分类字符设备以字节为单位逐个进行I/O操作字符设备中的缓存是可有可无不支持随机
2、访问如串口设备/dev/cua0和/dev/cua1块设备块设备的存取是通过buffer、cache来进行可以进行随机访问例如IDE硬盘设备/dev/hda可以支持可安装文件系统网络设备通过BSD套接口访问41.2Linux设备文件Linux抽象了对硬件的处理,所有的硬件设备都可以作为普通文件一样来看待可以使用和操作文件相同的、标准的系统调用接口来完成打开、关闭、读写和I/O控制操作对用户来说,设备文件与普通文件并无区别51.3主设备号和次设备号主设备号:标识该设备的种类,也标识了该设备所使用的驱动程序次设备号:标识使用同一设备驱动程序的不同硬件设备所有已经注册(即已经加载了驱动程序
3、)的硬件设备的主设备号可以从/proc/devices文件中得到[root@wzchent]#mknod/dev/lp0c6061.4Linux设备驱动代码的分布~/block~/char~/cdrom~/pci~/scsi~/net~/sound注:IDE接口的CD驱动位于drivers/block/ide-cd.c中,而SCSICD驱动位于drivers/scsi/scsi.c中71.5Linux设备驱动程序的特点设备驱动是内核的一部分,影响内核稳定为内核或其从属子系统提供一个标准接口使用标准的内核服务如内存分配、中断和等待队列等大多数Linux设备驱动可以动态可加载Linux设
4、备驱动程序可配置驱动程序维护其控制的设备,该设备即使不存在也不影响系统的运行,此时设备驱动只是占用少量系统内存,不会对系统造成什么危害82、设备驱动程序结构Linux的设备驱动程序与外界的接口可以分成三部分:与操作系统内核的接口与系统引导的接口与设备的接口Linux设备驱动程序的代码结构大致可以分为如下几个部分:驱动程序的注册与注销、设备的打开与释放、设备的读写操作、设备的控制操作、设备的中断和轮询处理。92.1驱动程序的注册与注销注册register_chrdev();//在~fs/devices.cregister_blkdev();//在~fs/block_dev.c注销unr
5、egister_chrdev()unregister_blkdev()102.2打开、释放、读、写、控制等structfile_operations{structmodule*owner;loff_t(*llseek)(structfile*,loff_t,int);ssize_t(*read)(structfile*,char*,size_t,loff_t*);ssize_t(*write)(structfile*,constchar*,size_t,loff_t*);int(*readdir)(structfile*,void*,filldir_t);unsignedint(*p
6、oll)(structfile*,structpoll_table_struct*);int(*ioctl)(structinode*,structfile*,unsignedint,unsignedlong);int(*mmap)(structfile*,structvm_area_struct*);int(*open)(structinode*,structfile*);int(*flush)(structfile*);int(*release)(structinode*,structfile*);int(*fsync)(structfile*,structdentry*,int
7、datasync);int(*fasync)(int,structfile*,int);int(*lock)(structfile*,int,structfile_lock*);ssize_t(*readv)(structfile*,conststructiovec*,unsignedlong,loff_t*);ssize_t(*writev)(structfile*,conststructiovec*,unsignedlong,loff_t*);ssiz