- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
1,linux驱动程序介绍1.1 linux驱动程序在系统中的角色Linux分为用户态和内核态,一般应用程序是在用户态执行,他们通过一系列的系统调用同内核态进行交互。驱动程序是内核与硬件的接口,它把系统调用映射到具体设备对于实际硬件的特定操作上,关系如下图所通过这种方法,应用程序就可以像操作普通文件一样操作硬件设备,用户程序只需要关心这个抽象出来的文件,而一切同硬件打交道的工作都交给了驱动程序。1.2 linux驱动的类型linux系统将设备分为3类:字符设备、块设备、网络设备,摄像机常用的外围设备(如I2C,串口,SPI,GPIO,PWM等)均属于字符设备,tf卡驱动属于块设备,网卡相关驱动属于网络设备。字符设备与块设备的区别:1、字符设备是面向流的,最小访问单位是字节;而块设备是面向块的,最小访问单位是512字节或2的更高次幂。2、字符设备只能顺序按字节访问,而块设备可随机访问。3、块设备上可容纳文件系统,访问形式上,字符设备通过设备节点访问,而块设备虽然也可通过设备节点访问,但一般是通过文件系统来访问数据的。而网络设备没有设备节点,是因为网络设备是面向报文的,很难实现相关read、write等文件读写函数。所以驱动的实现也与字符设备和块设备不同。1.3 linux驱动的一些重要概念设备号Linux把所有设备都当作文件,为了管理这些设备,系统为它们各自都编了号,而每个设备号又分为主设备号和次设备号。主设备号用来区分不同类型的设备,而次设备号用来区分同一类型内的多个设备(及其设备分区)。在建立字符驱动时需要做的第一件事是获取设备号。设备号的分配方式一般有2种,静态分配和动态分配,静态分配设备号,就是驱动程序开发者,静态地指定一个设备号。对于一部分常用的设备,linux内核开发者已经为其分配了设备号。这些设备号可以在内核源码documentation/devices.txt文件中找到。如果只有开发者自己使用这些设备驱动程序,那么其可以选择一个尚未使用的设备号。当添加新硬件时,很可能造成设备号冲突,影响设备的使用。为了解决手动分配设备号存在冲突的问题,内核开发者提出动态分配设备号的方法。使用该方法驱动程序在加载的时候,通过linux内核提供的专门的函数动态获取设备号。intalloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name)设备节点linux系统中对所有设备的访问都是基于文件的形式。对于每一种设备,在加载驱动程序的时候都会在/dev目录下创建一个文件,这个文件就是设备节点。对于每一个设备节点,在实际运行时,linux系统通过VFS(虚拟文件系统)来完成将文件的各种系统调用与具体的驱动程序函数之间的映射。设备节点可以通过mknod命令在系统启动的时候手动创建,也可以通过udev自动创建。在驱动用加入对udev的支持主要做的就是:在驱动初始化的代码里调用内核提供的API向内核注册驱动信息class_create???????:????创建class???? class_device_create??? :????创建device驱动加载时会在/sys/class目录下生成与该模块相关的信息,同时用户空间中的udev会自动响应device_create(…)函数,去/sysfs下寻找对应的类从而创建设备节点。驱动初始化时,需要完成以下工作:? 1,通过alloc_chrdev_region()及相关函数分配主/次设备号。? 2,使用device_create()创建/dev和/sys节点。? 3,使用cdev_init()和cdev_add()将自身注册为字符驱动程序。混杂设备考虑到有的系统包含很多简单字符设备驱动,单独为这些设备分配设备号比较浪费资源,同时工作量也很大,linux系统针对这些情况推出了一种叫混杂设备模型的驱动框架(miscellaneous)。混杂设备主要有2个特征:1)所有的misc设备被分配同一个主设备号MISC_MAJOR(10),但是可以选择一个单独的次设备号。如果一个字符设备驱动要驱动多个设备,那么它就不应该用misc设备来实现;2)混杂设备驱动初始化时,只需要执行简单的一个注册函数,即可自动完成设备号分配,设备节点创建,向内核注册等工作,极大的简化了驱动初始化流程。硬件IO操作IO端口与IO内存x86体系和ARM体系的寻址方式是有差别的:在x86下,为了能够满足CPU高速地运行,内存与CPU之间通过北桥相连并通过地址方式访问,而外设通过南桥与CPU相连并通过端口访问。因为这两种访问方式的不同,linux分出了两种不同的访问操作:以地址方式访问硬件——使用IO内存操作。以端口方式访问硬
您可能关注的文档
最近下载
- 2025年深圳市育才二中小升初入学分班考试数学模拟试卷附答案解析.pdf
- 2025年深圳市育才二中小升初入学分班考试数学模拟试卷附答案解析.docx
- 4_1永合集团_流程体系建设项目_架构设计总结汇报v1.3.pptx VIP
- 面部表情疼痛量表FPS-R.docx VIP
- 4_1永团_流程体系建设项目_架构设计总结汇报v1.pptx VIP
- 金赛质量运营转型变革研讨会V1.0@2021110.pptx VIP
- 2024-2025学年重庆一中九年级(上)期中数学试卷.pdf VIP
- 人工智能赋能新质生产力:逻辑、模式及路径.pptx VIP
- 呼吸衰竭的表现及护理.pptx
- 重庆一中2024-2025学年九年级上学期周末消化作业数学试卷(解析版).docx VIP
文档评论(0)