ImageVerifierCode 换一换
格式:DOCX , 页数:10 ,大小:88.24KB ,
资源ID:855871      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/855871.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(海思SDK驱动部分.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

海思SDK驱动部分.docx

1、海思SDK驱动部分海思SD驱动部分 作者:日期: 1,linx驱动程序介绍11 inux驱动程序在系统中的角色Lnx分为用户态和内核态,一般应用程序是在用户态执行,他们通过一系列的系统调用同内核态进行交互。驱动程序是内核与硬件的接口,它把系统调用映射到具体设备对于实际硬件的特定操作上,关系如下图所通过这种方法,应用程序就可以像操作普通文件一样操作硬件设备,用户程序只需要关心这个抽象出来的文件,而一切同硬件打交道的工作都交给了驱动程序。.2linx驱动的类型liux系统将设备分为3类:字符设备、块设备、网络设备,摄像机常用的外围设备(如I2C,串口,SPI,PIO,PWM等)均属于字符设备,tf

2、卡驱动属于块设备,网卡相关驱动属于网络设备。字符设备与块设备的区别:1、字符设备是面向流的,最小访问单位是字节;而块设备是面向块的,最小访问单位是512字节或的更高次幂。、字符设备只能顺序按字节访问,而块设备可随机访问。3、块设备上可容纳文件系统,访问形式上,字符设备通过设备节点访问,而块设备虽然也可通过设备节点访问,但一般是通过文件系统来访问数据的。而网络设备没有设备节点,是因为网络设备是面向报文的,很难实现相关read、te等文件读写函数。所以驱动的实现也与字符设备和块设备不同。13 inx驱动的一些重要概念设备号Lin把所有设备都当作文件,为了管理这些设备,系统为它们各自都编了号,而每个

3、设备号又分为主设备号和次设备号。主设备号用来区分不同类型的设备,而次设备号用来区分同一类型内的多个设备(及其设备分区)。 在建立字符驱动时需要做的第一件事是获取设备号。设备号的分配方式一般有种,静态分配和动态分配,静态分配设备号,就是驱动程序开发者,静态地指定一个设备号。对于一部分常用的设备,n内核开发者已经为其分配了设备号。这些设备号可以在内核源码documenatn/dvcestxt文件中找到。如果只有开发者自己使用这些设备驱动程序,那么其可以选择一个尚未使用的设备号。当添加新硬件时,很可能造成设备号冲突,影响设备的使用。为了解决手动分配设备号存在冲突的问题,内核开发者提出动态分配设备号的

4、方法。使用该方法驱动程序在加载的时候,通过ux内核提供的专门的函数动态获取设备号。nt allochrvregn(ev_t *ev, nsigne basemor, unsignedcun, const char*ame)设备节点in系统中对所有设备的访问都是基于文件的形式。对于每一种设备,在加载驱动程序的时候都会在de目录下创建一个文件,这个文件就是设备节点。对于每一个设备节点,在实际运行时, linu系统通过FS(虚拟文件系统)来完成将文件的各种系统调用与具体的驱动程序函数之间的映射。 设备节点可以通过mkn命令在系统启动的时候手动创建,也可以通过udv自动创建。在驱动用加入对dev的支持

5、主要做的就是:在驱动初始化的代码里调用内核提供的API向内核注册驱动信息clscreat:创建clas class_ece_crea :创建dvie驱动加载时会在/sys/lass目录下生成与该模块相关的信息,同时用户空间中的udev会自动响应dice_crea()函数,去ssf下寻找对应的类从而创建设备节点。驱动初始化时,需要完成以下工作:1,通过allo_chrde_regio()及相关函数分配主/次设备号。 2,使用evccrete()创建/dev和/sys节点。 ,使用cde_n()和dv_a()将自身注册为字符驱动程序。混杂设备考虑到有的系统包含很多简单字符设备驱动,单独为这些设备分

6、配设备号比较浪费资源,同时工作量也很大,linu系统针对这些情况推出了一种叫混杂设备模型的驱动框架(iscellaneus)。混杂设备主要有2个特征:)所有的mic设备被分配同一个主设备号MSC_AJO(10),但是可以选择一个单独的次设备号。如果一个字符设备驱动要驱动多个设备,那么它就不应该用isc设备来实现;2)混杂设备驱动初始化时,只需要执行简单的一个注册函数,即可自动完成设备号分配,设备节点创建,向内核注册等工作,极大的简化了驱动初始化流程。硬件IO操作IO端口与O内存x6体系和ARM体系的寻址方式是有差别的:在x86下,为了能够满足CPU高速地运行,内存与CP之间通过北桥相连并通过地

7、址方式访问,而外设通过南桥与C相连并通过端口访问。因为这两种访问方式的不同,linux分出了两种不同的访问操作:以地址方式访问硬件使用IO内存操作。以端口方式访问硬件使用IO端口操作。在ARM下也实现了类似的操作,通过两条不同的总线(HBUS和APB BS)来连接不同访问速度的外设。但是它与6不同,无论是内存还是外设,ARM都是通过地址访问。在AM下,访问寄存器就像访问内存一样从指定的寄存器地址获取数据,修改。所以,ARM下一般是使用O内存的操作。但这并不是说I端口的操作在ARM下不能用,它们的代码差不多,只是没有使用的必要,下面也将介绍O内存操作。如何使用IO内存获得硬件的地址我们不能在ln

8、ux使用实际的物理地址,要对指定的物理地址进行操作,必须要先将物理地址与虚拟地址对应,通过虚拟地址访问。于是有了以下的物理地址映射函数:#incudevo*orema(unsged logphy_add,uiged lng ze);函数传入两个参数,需要访问的物理内存(寄存器)的首地址py_addr和这段内存区域的大小ize,返回与该段物理地址对应的虚拟地址。这段地址可以多次被映射,当然,每次映射的虚拟地址也不一样。ps =0x20f000; /、指定物理地址vir = (sined lg)iormap(ph,x0c);/2、通过iormp获得对应的虚拟地址/0c表示只要1字节的大小 GPEC

9、ON = (unsigned log*)(virt + 0x40);/3、指定需要操作的寄存器的地址*GECON &=(3 4); /配置GP1为输出端口为了实现更好的移植性,上面的程序就有缺陷了。内核建议,尽量使用内核提供的内存访问接口:#include/从内存读取数据,返回值是指定内存地址中的值usign int ioed(vid *adr)usigd nt ored16(oid *dd)unsigint orad32(oi *ddr)/往指定内存地址写入数据idowrite8( vaue,i *add)oidiowrt(16 vale, void *addr) owite32(u2 vl

10、, void *ad)参照硬件说明,通过对寄存器的控制实现操作硬件硬件说明文档驱动的调试Linux设备模型lnu系统作为开源的下系统,支持世界上大部分的硬件,导致iux内核看上去非常臃肿、杂乱、不易维护。为了优化,linu系统从26版本开始提出了全新的设备模型(也称作Dier el)概念。设备模型将硬件设备归纳、分类,然后抽象出一套标准的数据结构和接口。驱动的开发,就简化为对内核所规定的数据结构的填充和实现。1)Linux设备模型中包含四个重要概念:Bs、ls、Dvic、 Devicerive。us(总线):s(总线)是一类特殊的设备,它是连接处理器和其它设备之间的通道(chnnel)。在设备

11、模型中,所有的设备都通过总线相连,甚至是那些内部的虚拟平台总线(pltform bus).las(类):在Linux设备模型中,ass的概念非常类似面向对象程序设计中的Class(类),它主要是集合具有相似功能或属性的设备,这样就可以抽象出一套可以在多个设备之间共用的数据结构和接口函数。因而从属于相同lss的设备的驱动程序,就不再需要重复定义这些公共资源,直接从Clas中继承即可。Deice(设备):抽象系统中所有的硬件设备,描述它的名字、属性、从属的Bu、从属的Clss等信息。evie Drivr(驱动):Lnu设备模型用Drer抽象硬件设备的驱动程序,它包含设备初始化、电源管理相关的接口实

12、现。而Lin内核中的驱动开发,基本都围绕该抽象进行(实现所规定的接口函数)。2)Ln设备模型的运行机制配对(Math):当总线上添加了新设备或者新驱动函数的时候,内核会调用一次或者多次这个函数。举例,如果我现在添加了一个新的驱动函数,内核就会调用所属总线的match函数,配对总线上所有的设备,如果驱动能够处理其中一个设备,函数返回0,告诉内核配对成功。探测(pobe)当配对(mtch)成功后,内核就会执行device_drivr中的pro回调函数,而该函数就是所有ier的入口,可以执行诸如硬件设备初始化、字符设备注册、设备文件操作op注册等动作。所以说,真正的驱动函数入口是在prbe函数中。卸

13、载(emoe) 当该驱动函数或者驱动函数正在操作的设备被移除时,内核会调用驱动函数中的remoe函数调用,进行一些设备卸载相应的操作。atfrm设备针对一些可以通过CPU直接寻址的设备(比如集成在嵌入式SO芯片上的控制器,CPU可以直接访问其寄存器),liux内核在设备模型的基础上(eice和dece_driver),对这些设备进行了更进一步的封装,抽象出pltfm 、aform device和patrm dv,以便驱动开发人员可以方便的开发这类设备的驱动。paltfm设备对嵌入式Linu驱动开发是非常重要的,因为我们编写的大多数设备驱动,都是为了驱动pftm设备。由图片可知,Pltform设

14、备在内核中的实现主要包括三个部分:Paform Bus,基于底层bus模块,抽象出一个虚拟的Platfrm bus,用于挂载Platorm设备;ltormDice,基于底层deie模块,抽象出aor Devc,用于表示Pafrm设备;ltform Dier,基于底层devcerivr模块,抽象出Platfor Drie,用于驱动Patform设备。Linux platform_dive机制和传统的eiceriver 机制(通过deregiter函数进行注册)相比,最大的区别在于pltform机制将设备本身的资源注册进内核,由内核统一管理,在驱动程序中使用这些资源时通过ltfo_dice提供的标准接口进行申请并使用。这样提高了驱动和资源管理的独立性,并且拥有较好的可移植性和安全性(这些标准接口是安全的)。latfor机制的本身使用并不复杂,由两部分组成:platorm_dvic和latfromdive。通过lator机

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1