1 / 18
文档名称:

海思SDK驱动部分.docx

格式:docx   大小:115KB   页数:18页
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

海思SDK驱动部分.docx

上传人:gyzhluyin 2019/8/14 文件大小:115 KB

下载得到文件列表

海思SDK驱动部分.docx

相关文档

文档介绍

文档介绍:海思SDK驱动部分1,,一般应用程序是在用户态执行,他们通过一系列的系统调用同内核态进行交互。驱动程序是内核与硬件的接口,它把系统调用映射到具体设备对于实际硬件的特定操作上,关系如下图所通过这种方法,应用程序就可以像操作普通文件一样操作硬件设备,用户程序只需要关心这个抽象出来的文件,而一切同硬件打交道的工作都交给了驱动程序。:字符设备、块设备、网络设备,摄像机常用的外围设备(如I2C,串口,SPI,GPIO,PWM等)均属于字符设备,tf卡驱动属于块设备,网卡相关驱动属于网络设备。字符设备与块设备的区别:1、字符设备是面向流的,最小访问单位是字节;而块设备是面向块的,最小访问单位是512字节或2的更高次幂。2、字符设备只能顺序按字节访问,而块设备可随机访问。3、块设备上可容纳文件系统,访问形式上,字符设备通过设备节点访问,而块设备虽然也可通过设备节点访问,但一般是通过文件系统来访问数据的。而网络设备没有设备节点,是因为网络设备是面向报文的,很难实现相关read、write等文件读写函数。所以驱动的实现也与字符设备和块设备不同。,为了管理这些设备,系统为它们各自都编了号,而每个设备号又分为主设备号和次设备号。主设备号用来区分不同类型的设备,而次设备号用来区分同一类型内的多个设备(及其设备分区)。在建立字符驱动时需要做的第一件事是获取设备号。设备号的分配方式一般有2种,静态分配和动态分配,静态分配设备号,就是驱动程序开发者,静态地指定一个设备号。对于一部分常用的设备,linux内核开发者已经为其分配了设备号。这些设备号可以在内核源码documentation/。如果只有开发者自己使用这些设备驱动程序,那么其可以选择一个尚未使用的设备号。当添加新硬件时,很可能造成设备号冲突,影响设备的使用。为了解决手动分配设备号存在冲突的问题,内核开发者提出动态分配设备号的方法。使用该方法驱动程序在加载的时候,通过linux内核提供的专门的函数动态获取设备号。intalloc_chrdev_region(dev_t*dev, unsignedbaseminor, unsignedcount, constchar*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内存操作。以端口方式访问硬件——使用