【教学课件】第10课设备驱动开发.ppt
《【教学课件】第10课设备驱动开发.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第10课设备驱动开发.ppt(40页珍藏版)》请在三一办公上搜索。
1、1,嵌入式系统An Introduction to Embedded System浙江大学计算机学院2012年4月,第10课 设备驱动开发,提纲,1、Linux设备驱动简介2、设备驱动结构3、内核设备模型4、同步机制5、工作队列6、异步I/O,1、Linux设备驱动简介,1.1 驱动的功能1.2 设备分类1.3 设备文件和设备号1.4 代码分布,1.1 驱动的功能,设备驱动程序的主要功能对设备的初始化和释放。把数据从内核传送到硬件和从硬件读取数据到内核。检测和处理设备出现的错误。,1.2 设备分类,Linux支持三类主要硬件设备字符设备(character device):每次读写一个字符;无
2、需缓冲直接读写的设备。块设备(block device):每次读写一个块;存取是通过buffer来进行并且可以随机访问,即不管块位于设备中的地址都可以对其进行读写。网络设备(network device):通过网络socket接口与TCP/IP协议访问,1.3 设备文件和设备号,设备文件:Linux抽象了对硬件的处理,所有的硬件设备都可以通过文件系统API来操作,包括打开、关闭、读写和I/O控制。每个设备文件有两个设备号:一个是主(major)设备号,标识该设备的种类,也标识了该设备所使用的驱动程序;另一个是次(minor)设备号,标识使用同一设备驱动程序的不同硬件设备。,1.4 Linux设
3、备驱动代码的分布,在drivers目录下:blockcharcdrompciscsinetsound,2.2 驱动程序的注册与注销,注册fs/devices.c的register_chrdev()函数fs/block_dev.c的register_blkdev()函数注销unregister_chrdev()函数unregister_blkdev()函数,2.3 设备的操作,设备的打开与释放设备的读写操作设备的控制操作,struct file_operations struct module*owner;loff_t(*llseek)(struct file*,loff_t,int);ssiz
4、e_t(*read)(struct file*,char _user*,size_t,loff_t*);ssize_t(*write)(struct file*,const char _user*,size_t,loff_t*);ssize_t(*aio_read)(struct kiocb*,const struct iovec*,unsigned long,loff_t);ssize_t(*aio_write)(struct kiocb*,const struct iovec*,unsigned long,loff_t);int(*readdir)(struct file*,void*,f
5、illdir_t);unsigned int(*poll)(struct file*,struct poll_table_struct*);int(*ioctl)(struct inode*,struct file*,unsigned int,unsigned long);long(*unlocked_ioctl)(struct file*,unsigned int,unsigned long);long(*compat_ioctl)(struct file*,unsigned int,unsigned long);int(*mmap)(struct file*,struct vm_area_
6、struct*);int(*open)(struct inode*,struct file*);int(*flush)(struct file*,fl_owner_t id);int(*release)(struct inode*,struct file*);int(*fsync)(struct file*,struct dentry*,int datasync);int(*aio_fsync)(struct kiocb*,int datasync);int(*fasync)(int,struct file*,int);int(*lock)(struct file*,int,struct fi
7、le_lock*);ssize_t(*sendpage)(struct file*,struct page*,int,size_t,loff_t*,int);unsigned long(*get_unmapped_area)(struct file*,unsigned long,unsigned long,unsigned long,unsigned long);int(*check_flags)(int);int(*flock)(struct file*,int,struct file_lock*);ssize_t(*splice_write)(struct pipe_inode_info*
8、,struct file*,loff_t*,size_t,unsigned int);ssize_t(*splice_read)(struct file*,loff_t*,struct pipe_inode_info*,size_t,unsigned int);int(*setlease)(struct file*,long,struct file_lock*);,3、内核设备模型,3.1 设备模型概述3.2 sysfs3.3 驱动模型3.4 kobject3.5 platform总线,3.1 设备模型概述,设备模型提供独立的机制表示设备,并表示其在系统中的拓扑结构。将设备按类型分类将设备和对
9、应驱动联系起来最小化代码重复列举系统中所有设备,观察其状态,查看其连接总线用树的形式将全部设备结构完整、有效地展现,包括所有总线和内部连接从树的叶子向根的方向依次遍历,确保以正确顺序关闭各个设备的电源。,3.2 sysfs(1),sysfs是代表设备的虚拟文件系统block:每个子目录分别对应一个块设备,每个目录又都包含该块设备的所有分区bus:内核设备按总线类型分层放置的目录结构,devices中的所有设备都是连接于某种总线之下,可以找到每一个具体设备的符号链接class:包含以高层功能逻辑组织起来的系统设备视图dev:维护一个按字符设备和块设备的主次号码(major.minor)链接到真实
10、的设备(device)下的符号链接,sysfs(2),devices:系统设备拓扑结构视图,直接映射出内核中设备结构体的组织层次firmware:包含一些如ACPI,EDD,EFI等底层子系统的特殊树fs:存放的已挂载点,但目前只有fuse,gfs2等少数文件系统支持sysfs接口,传统的虚拟文件系统(VFS)层次控制参数仍然在sysctl(/proc/sys/fs)接口中kernel:新式的slab分配器等几项较新的设计在使用它,其它内核可调整参数仍然位于sysctl(/proc/sys/kernel)接口中module:系统中所有模块的信息,不管这些模块是以内联(inlined)方式编译到
11、内核映像文件(vmlinuz)还是编译到外部模块(ko文件),3.3 驱动模型,驱动模型的基本元素设备类结构classes总线结构bus设备结构devices驱动结构drivers,Linux统一设备模型的基本结构,3.5 Platform机制,从 Linux 2.6 起引入了一套新的驱动管理和注册机制:Platform_device 和 Platform_driver。通过 Platform 机制开发发底层驱动的大致流程为:定义 platform_device-注册 platform_device-定义 platform_driver-注册 platform_driver。Platform_
12、bus是一个虚拟总线,使设备的管理更加简单化。各个Platform device 和 Platform driver挂载在虚拟总线platform_bus上接口定义在中。,4、同步机制,4.1 同步锁4.2 信号量4.3 读写信号量4.4 原子操作4.5 完成事件(completion),4.1 同步锁,自旋锁(spinlock)读写锁(rwlock)RCU锁(Read-Copy Update)Seqlock,自旋锁(1),如果一个自旋锁被别的任务保持,调用者就一直循环,不停检测该自旋锁的保持者是否已经释放了锁。自旋锁不会引起调用者睡眠。自旋锁使用者一般保持锁事件非常短,所以选择自旋而不是睡眠
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 教学课件 教学 课件 10 设备 驱动 开发
链接地址:https://www.31ppt.com/p-5657696.html