chapter8嵌入式Linux设备驱动程序开发PPT格式课件下载.ppt
- 文档编号:14281805
- 上传时间:2022-10-21
- 格式:PPT
- 页数:50
- 大小:1.19MB
chapter8嵌入式Linux设备驱动程序开发PPT格式课件下载.ppt
《chapter8嵌入式Linux设备驱动程序开发PPT格式课件下载.ppt》由会员分享,可在线阅读,更多相关《chapter8嵌入式Linux设备驱动程序开发PPT格式课件下载.ppt(50页珍藏版)》请在冰豆网上搜索。
,这些设备中,有些设备是实际存在的物理硬件的抽象,而有些设备则是内核自身提供的功能。
设备文件与设备文件系统,下面列出部分设备文件以及相应的含义,主设备号设备类型次设备号=文件名,0未命名设备1char内存设备1=/dev/mem2=/dev/kmem3=/dev/null4=/dev/port5=/dev/zero7=/dev/full8=/dev/random9=/dev/urandom,过去的Linux系统中提供了一个抽象化的设备目录,叫做/dev。
在该目录中用户可以找到设备节点,这些特殊的文件直接指向了系统中的硬件设备例如,/dev/hda指向了系统中的第一个IDE设备。
利用这些提供给用户的设备文件,他们可以编写应用程序像访问普通文件一样来访问硬件,而不需要通过特殊的API,查看设备树,EmbestUbuntu:
/dev#ls-l,Linux模块,Linux是单内核结构,单核结构在添加新模块时,重新调整设置,非常费时,1,Linux允许动态装载和卸掉模块,2,可以使用insmod和rmmod命令来装载和卸掉Linux模块,内核自己也可以调用内核驻留程序(Kerneld)来按需要装载和卸掉模块,当卸掉一模块时,内核先确定该模块不会再被调用,然后通过某种方式通知它,Linux模块载入模块,Linux模块是一段可以在机器起动后任意时间被动态连接的代码。
在不需要时,它们可以被从内核中卸掉。
大多数Linux模块是设备驱动程序或伪设备驱动程序。
载入模块,载入模块时,INSMODE命令必须先找到要被载入的模块。
当INSMOD重设完内核输出符号的地址后,它将调用一个系统函数,要求内核分配足够的空间,Linux模块?
Linux模块卸载模块,用RMMOD命令可以卸掉一个指定模块,但按需载入模块没用时,它会被内核自动卸掉当还在被其他模块调用时,模块是不能被卸掉的当一个模块可以被卸掉时,系统会调用它的清理函数来释放它所占用的所有系统资源,大部分的基础性的驱动操作包括3个重要的内核数据结构,称为file_operations,file,和inode,file_operationgs,file,inode,file_operations结构,举个例子,每个字符设备需要定义一个用来读取设备数据的函数。
结构体file_operations中存储着内核模块中执行这项操作的函数的地址,驱动内核模块是不需要实现每个函数的。
像视频卡的驱动就不需要从目录的结构中读取数据。
那么,相对应的file_operations中的项就为NULL。
结构体file_operations在头文件Linux/fs.h中定义,用来存储驱动内核模块提供的对设备进行各种操作的函数的指针。
该结构体的每个域都对应着驱动内核模块用来处理某个被请求的事务的函数的地址,structmodule*owner;
int(*flush)(structfile*);
int(*fasync)(int,structfile*,int);
inode结构,inode在Linux里算是一个很大的结构,基本上跟super_block结构一样。
我们一样可以把inode结构分成几部分来看。
链表管理域,inode结构前三个域就是用来帮助将inode串起来的域,基本资料,inode的基本资料很多,如序号,referencecount等,结构体对映,在Linux里,我们可以利用mmap()将文件或device的某个区块对应到结构体里使用。
inode同步,Quota相关域,操作inode的函数,每一个inode都有一个i_op的域用来记录一组操做inode的函数,quota管理的资料放在inode,当修改某个inode结构时,先确定没有人在使用这个inode才行。
这件事是使用信号量和等待队列来完成的,file结构,在Linux里,每一个文件都有一个file结构和inode结构,inode结构是用来让Kernel做管理的,而file结构则是我们平常对文件读写或开启,关闭所使用的。
structfilestructfile*f_next,*f_pprev;
structdentry*f_dentry;
structfile_operations*f_op;
mode_tf_mode;
loff_tf_pos;
unsignedintf_count,f_flags;
unsignedlongf_reada,f_ramax,f_raend,f_ralen,f_rawin;
structfown_structf_owner;
unsignedlongf_version;
void*private_data;
8.2字符设备驱动,scull的设计和内存使用字符设备注册open和release读写操作ioctl接口模块实例,8.2字符设备驱动,字符设备驱动是嵌入式Linux最基本、也是最常用的驱动程序。
它的功能非常强大,几乎可以描述不涉及挂载文件系统的所有设备。
图所示为驱动程序在应用程序和硬件设备之间接口功能的流程图,字符设备驱动,最基本,最常用,驱动程序,几乎可以描述不涉及挂载文件系统的所有设备,scull的设计和内存使用,为使scull作为一个模板来编写真实设备的真实驱动,我们将展示给你如何在计算机内存上实现几个设备抽象,scull驱动引入2个核心函数来管理Linux内核中的内存void*kmalloc(size_tsize,intflags);
voidkfree(void*ptr);
编写驱动的第一步是定义驱动将要提供给用户程序的能力,它可以是一个顺序的或者随机存取的设备,一个或多个设备,scull0到scull3这4个设备,scullpipe0到scullpipe3这4个FIFO设备,scullsingle、scullpriv、sculluid、scullwuid这些设备与scull0相似,字符设备注册,内核在内部使用类型structcdev的结构来代表字符设备。
在内核调用你的设备操作前,你编写分配并注册一个或几个这些结构.,如果你想在运行时获得一个独立的cdev结构,你可以使用这样的代码:
structcdev*my_cdev=cdev_alloc();
my_cdev-ops=&
my_fops,偶尔你会想将cdev结构嵌入一个你自己的设备特定的结构,voidcdev_init(structcdev*cdev,structfile_operations*fops);
有2种方法可用来分配和初始化这些结构,open和release,open应当进行下面的工作:
检查设备特定的错误如果它第一次打开,初始化设备;
如果需要,更新f_op指针;
分配并填充要放进filp-private_data的任何数据结构。
int(*open)(structinode*inode,structfile*filp);
open方法的原型是:
设备方法应当进行下面的任务:
释放open分配在filp-private_data中的任何东西;
在最后的close关闭设备。
release方法的角色是open的反面,open方法提供给驱动来做任何的初始化,filp-private_data,释放,读写操作,读和写方法都进行类似的任务,就是从内核的应用程序代码拷贝数据。
sizeread(structfile*filp,char_user*buff,size_tcount,loff_t*offp);
ssize_twrite(structfile*filp,constchar_user*buff,size_tcount,loff_t*offp);
文件指针,参数指向持有被写入数据的缓存,或者放入新数据的空缓存,请求的传输数据大小,是一个指针指向一个“longoffsettype”对象,它指出用户正在存取的文件位置,read和write方法的buff参数是用户空间指针,ioctl接口,大部分设备可进行超出简单的数据传输之外的操作,用户空间必须常常能够请求,例如,设备锁上它的门。
这些操作常常通过ioctl方法来支持,它通过相同名字的系统调用来实现。
intioctl(intfd,unsignedlongcmd,);
ioctl驱动方法有和用户空间版本不同的原型,int(*ioctl)(structinode*inode,structfile*filp,unsignedintcmd,unsignedlongarg);
用户空间,驱动方法,在用户空间,ioctl系统调用有下面的原型:
HelloWorld模块,#include#includeMODULE_LICENSE(DualBSD/GPL);
staticinthello_init(void)printk(KERN_ALERTHello,worldn);
return0;
staticvoidhello_exit(void)printk(KERN_ALERT“Goodbye,cruelworldn);
module_init(hello_init);
module_exit(hello_exit);
内核模块,这个模块定义了两个函数,一个在模块加载到内核时被调用(hello_init)以及一个在模块被去除时被调用(hello_exit),驱动开发实例,CAN总线驱动开发实例LCD显示驱动开发实例TSP触摸屏驱动实例IIS音频驱动实例,CAN总线,CAN总线的定义,CAN总线的优越性,CAN是控制局域网络(ControlAreaNetwork)的简称最早由德国BOSCH
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- chapter8 嵌入式 Linux 设备 驱动程序 开发