导航:首页 > 器材知识 > 什么是设备驱动模型

什么是设备驱动模型

发布时间:2022-01-15 21:56:35

『壹』 总线设备驱动模型 match函数什么时候被调用

match函数是excel中众多函数之一,平时我们可能并不常用到,但是不常用不代表没有用,或许你下次使用excel的时候就会用到它,为了以后用到它的时候不至于手忙脚乱,我们可以先简单的来了解一下这个函数。

方法/步骤
我们打开excel,点击“插入”菜单,找到函数选项,然后在类别中选择全部,一直拉到M开头的函数列表,找到match函数。有的朋友可能会说何必怎么麻烦呢,直接在搜索函数中输入match不就可以了,小编起初也是这么做的,但是好像达不到预期的效果,所以还是老老实实的使用这种笨方法了。
首先我们来看看match函数的定义,“返回符合特定值特定顺序的项在数组中的相对位置”,这是excel给出的关于match函数的定义,如果只看这些文字的话恐怕很难理解,我们可以暂时不用深究它,知道即可,运用过这个函数之后再来细细品味它。
知道了它的定义之后我们来看一下它的参数,match函数一共有三个参数,首先我们来看第一个参数lookup_value,含义:需要在数据表(lookup_array)中查找的值。接着我们来看第二个参数lookup_array,含义:可能包含有所要查找数值的连续的单元格区域。第三个参数match_type,含义:排列顺序,一共有三个值,1代表升序排列,0代表任意顺序排列,-1代表降序排列。其中第一个和第二个必选参数,第三个为可选参数,默认为1。
光说不练假把式,下面小编就通过一个实例来应用一下这个函数。首先新建一个工作表,输入测试的数据(新的数据表和数据比较方便大家的理解),小编建立的是一个六行五列的数据,而且每行或者每列数据之间都存在递增的关系。
然后我们找一个空白的单元格,用来输入我们今天的主角函数match函数。首先自然是等号了,然后就是match(),接着我们填写参数,首先是第一个参数,也就是需要查找的值,选择45,然后填写第二个参数范围,也就是连续的单元格(只能是一行或者一列),我们填写A1:E1,这样数据是递增的,所以我们第三个参数填写1,默认的就是1,不填也可以.
然后我们点击回车,我们惊奇的发现,经过match函数运算过后这个单元格的数值变为了3,按照整个数据范围递增的顺序,45的确是在第三位,可见函数计算的并没有错。那么我们把它第三个参数改为-1会发生什么状况呢。
当我们改为-1再次点击回车的时候居然出错了,为什么呢?其实我们读读三个数值的含义并不难理解,其中-1代表的是降序排列,而这个数据范围之内并不存在递减的关系,自然会出错了,如果你无法确认是升序或者降序,我们可以选择填写0,这样升序降序都不会出错了。
关于match函数的用法小编就介绍到这里,讲的比较简单,并没有深入的去探究match函数,想要深入的了解这个函数的用法,还需要朋友们亲自动手试试,有一点要提示的是,当其中的数据是无规律的数据的时候,得到的结果或许不是你想要的,至于各种缘由有待自行发掘。

『贰』 Linux输入子系统、平台设备、平台驱动、混杂设备,他们之间有什么关系在什么情况下,选用哪种模型

linux已经驱基本自配置编译除非自另外再发驱网买发板都

『叁』 现在linux驱动很多实用设备驱动模型写吗

设备驱动名一般都在/dev目录下。一般常用的设备的设备文件名如下:/dev/hd[a-t]:IDE设备/dev/sd[a-z]:SCSI设备 /dev/fd[0-7]:标准软驱 /dev/md[0-31]:软raid设备/dev/loop[0-7]:本地回环设备/dev/ram[0-15]:内存/dev/null:无限数据接收设备,相当于黑洞/dev/zero:无限零资源/dev/tty[0-63]:虚拟终端/dev/ttyS[0-3]:串口/dev/lp[0-3]:并口/dev/console:控制台/dev/fb[0-31]:framebuffer

『肆』 求教怎么学习linux内核驱动

1.首先要了解为什么要学习内核?下图已表明,如果要从事驱动开发或系统研究,就要学习内核。

2.内核的知识就像下面的绳结一样,一环扣一环,我们要解开它们,就必须要先找到线头也就是内核中的函数接口。初学阶段,我们一般不深入的研究内核代码,会使用内核的接口函数就不错了。

3.下面提供了如何学习这些内核函数的方法,就像解绳子一样

4.学习内核的四步法则,思维导图的设计尤为重要,这也是能否学习好内核的关键

5.语言基础也需要扎实,所以需要把C语言巩固巩固

『伍』 Linux输入设备驱动

输入设备(如按键、键盘、触摸屏、鼠标等)是典型的字符设备,其一般的工作机理是底层在按键、触摸等动作发送时产生一个中断(或驱动通过Timer定时查询),然后CPU通过SPI、I-C或外部存储器总线读取键值、坐标等数据,并将它们放入一个缓冲区,字符设备驱动管理该缓冲区,而驱动的read ()接口让用户可以读取键值、坐标等数据。显然,在这些工作中,只是中断、读键值/坐标值是与设备相关的,而输入事件的缓冲区管理以及字符设备驱动的file operations接口则对输入设备是通用的。基于此,内核设计了输入子系统,由核心层处理公共的工作。drivers/input/keyboardgpio_keys.c基于input架构实现了一个通用的GPIO按键驱动。该驱动是基于platform_driver架构的,名为“gpio-keys”。它将与硬件相关的信息(如使用的GPIO号,按下和抬起时的电平等)屏蔽在板文件platform_device的platform_data中,因此该驱动可应用于各个处理器,具有良好的跨平台性。GPIO按键驱动通过input_event () 、input_sync()这样的函数来汇报按键事件以及同步事件。从底层的GPIO按键驱动可以看出,该驱动中没有任何file_operations的动作,也没有各种IO模型,注册进入系统也用的是input_register_device ()这样的与input相关的API。这是由于与Linux VFS接口的这一部分代码全部都在drivers/input/evdev.c中实现了。

『陆』 什么是windows驱动开发

这个,介绍只好复制来说了。我觉得你要是有兴趣,随便在那都能找到很多有趣的资料。看下面驱动的发展史:

Windows 驱动程序的发展演变
我们在学习开发驱动程序时有必要弄清楚Windows设备驱动程序的发展演变过程(为了简便起见,以下简称驱动程序),以便明白我们将要开发什么样的驱动程序。这就象你开发一个应用程序时必须弄清楚它是运行在WINDOWS平台下还是在DOS平台下,否则我们能写出什么样的应用程序就可想而知了。
驱动程序开发者的各项任务之中,有许多是为特定的硬件编写驱动程序。由于WINDOWS的发展,这样的工作在 Windows 9X 下要比在前一版Windows(windows3.x 、Windows Workgroup) 中容易得多。先了解一些历史演变,可能会对驱动程序的编写有所帮助。
实模式Windows(Real-Mode Windows)
从一开始,MS-DOS 和系统基本输入输出系统(BIOS) 就已经提供了许多硬件设备的驱动程序。BIOS 通过一些常用的软件中断,开放出驱动程序的服务 ,像INT 10h 是显示系靳中断,INT 13h是磁盘子系靳中断,INT 16h 是键盘中断等等。BIOS 也处理硬件中断,并承担对“可编程中断控制器”(Programmable Interrupt Controller ,PIC )的管理任务。MS-DOS 也通过软件中断(如 INT 21h 、INT 25h 、INT 26h )提供了系统服务 ,并提供一个机制(CONFIG.SYS 中的 device= 语句),让新的或强化后的驱动程序能?蛟谙到y启动时被加载进操作系统内核。
标准模式Windows(Standard-Mode Windows)
早期的 Windows 中,MS-DOS 和 BIOS 是最重要的。Windows运行在实模式状态中,这时的Windows充其量不过是一个强化后的MS-DOS图形用户界面而已。从系统角度看,Windows只不过是个大的图形应用程序。Intel 80286 的出现,使 Windows能?蛟诒;つJ街性诵胁⒒竦酶叽? 16MB 实际内存空间。依靠保护模式和实模式的转换,Windows 仍然继续使用MS-DOS 和 BIOS 提供的服务来完成所有的系统需求。这种运作模式被称为 Windows标准模式(Windows standard mode) 。在 80286 机器上切换实模式和保护模式,系统开销很大。Intel 于是提供了一个快又有效率的指令,让你从实模式切换到保护模式。但Intel 认为没有什么人还需要再从保护模式切换回实模式。结果,唯一能?蛉帽;つJ匠绦颍ㄈ? Windows standard mode )存取实模式软件(如 MS-DOS )的方法就是复位CPU(reset CPU) 。在人们开发出来的各种复位方法中,最普遍的一种就是触发键盘控制器,提供由 Ctrl-Alt-Delete 键所发出的外部信号。于是引发所谓的三键失效(triple fault,即三键热启动),这是 CPU 先天无法处理的一种“失效“。事实上无论哪一种作法,代价都很昂贵,因为它们至少都得经过 BIOS 的引导程序 。事实上,在某些 286 机器,模式的切换要花掉好几毫秒。显然 Windows 需要一种方法,避免每次一有事件发生,像是键盘被按下或鼠标移动等等,就得切换到实模式。解?Q方法就是写一个保护模式驱动程序,可以在保护模式中处理 I/O 中断。这些驱动程序直到今天我们都还在使用,你在 SYSTEM 子目录中看到的扩展名为 .DRV 的文件都是!包括 MOUSE.DRV 、COMM.DRV 等等。我把它们称为 ring3 DLL 驱动程序,因为它们实质上都是 16 位 Windows 动态链接库(DLLs ),在 ring3层 (Intel CPU 最不受保护的层,一般应用程序运行在ring3层,核心态的驱动程序动行在ring0层)执行。它们的任务是在不离开 CPU保护模式的前提下,和 Windows KERNEL 、USER 、GDI 模块之间形成接口。
增强模式Windows(Enhanced-Mode Windows )
Intel 80386 CPU 使 Windows的第三种操作模式(所谓的 enhanced mode)成为可能。在此模式中 Windows 采用分页(paging) 和虚拟86(V86) 特性,创造出??拟机器(VirtualMachines ,VMs )。对一个应用程序而言,VM 就像一独立的的个人电脑,独自拥有自己的键盘、鼠标、显示器等等硬件。而实际上,经过所谓的??拟化(virtualization ),数个 VMs 共享相同硬件。对最终用户而言,最大的好处是他现在能?蛟诖翱谧刺?中(而非全屏幕)运行MS-DOS程序 。"??拟化"是 VxDs 的工作。VxD 的名称来自于 "virtual x device",意思是此驱动程序用来??拟化某个(x )设备。例如:VKD用来??拟化键盘,使Windows 和任何一个MS-DOS程序都自认为独立拥有属于自己的键盘。VMD 用来??拟化鼠标。某些 VxDs 并不是为了??拟化某些硬件,而是为了提供各种底层系统服务。页面交换(PAGESWAP) 和 页面文件(PAGEFILE)就属于这种非设备VxD ,它们共同管理交换文件(swap file ),使 增强模式Windows (enhanced-modeWindows) 得以将磁盘空间分配成为??拟内存的一部份。尽管基础技术令人耳目一新,但增强模式Windows (enhanced-mode Windows )还是继续在磁盘和文件 I/O 方面使用 MS-DOS 和 BIOS 。需要交换(swap )一个文件时,它还是把 CPU 切换到 V86 模式,让 MS-DOS 和 BIOS 来处理 I/O 操作。在保护模式、真实模式、V86 模式之间的所有切换动作都使得 Windows 慢下来。更多
的延时则来自于MS-DOS 和 BIOS 不可重入这一问题(即不能两个程序同时使用相同的服务)。Windows 必须强迫所有应用程序在同一个队列等待实模式服务。
Windows95
Windows 95 将终结这一份对历史的回忆。Windows 95 使用数种不同的驱动程序模型,大部份是使用 32 位 ring0层的虚拟设备驱动程序(VxDs) ,而非 rin3层的 DLLs 。所有的设备驱动程序都有一个具有管理功能的核心虚拟机VMM(虚拟机管理器)管理。
Windows对中断的处理与MS-DOS大不一样。当中断发生时,处理器转换为ring0级保护模式。Windows系统并不像MS-DOS那样通过中断描述符表IDT(Interrupt Descriptor Table)直接指向中断处理过程,而是由IDT入口指向VMM中的程序。该程序将判断是否为中断调用,如果是,则把中断控制权交给虚拟可编程中断控制器VPICD(Virtual Programmable Interrupt Controller Device),VPICD实际上是一个重要的VxD。VPICD再将其交给另一个注册了该中断的VxD(如Audcard.vxd)来处理。VxD程序是通过调用VPICD服务VPICD_Virtualize_IRQ来注册中断的。
Windows 95 对于设备 (device) 的处理,一般的模型是:由一个 VxD 掌管所有中断并执行所有数据传输,应用程序则使用函数调用 (function calls) 的方式对 VxDs 发出服务请求。这种VxD 为主的设备规划模型的一个好例子就是:Windows 95 的串行通信(serial communications) 。从前 Windows的串行通讯是使用一个 ring3 驱动程序(COMM.DRV ),?群?硬件中断处理程序以及驱动一个通用异步收发蕊片(universal asynchronous receiver-transmitter (UART )蕊片)所需的全部逻辑功能代码。在未让此驱动程序知道的情?r下,两个 VxDs (VCD 和COMBUFF )拦截了硬件中断和软件 IN/OUT 指令,为的是??拟化每一个 port ,并且改善因多任务而引起的问题。Windows 95 也有一个 ring3 组件名为 COMM.DRV ,但这个组件已经成为新的VxD (VCOMM )的一个简单的外层程序,只用来提供 16 位程序和 VCOMM之间的接口。VCOMM 则处于底层,联结一般应用程序、VxD clients 、 VxD 端口驱动程序和实际的硬件。端口驱动程序现在负责处理所有中断,并执行真正与硬件起作用的 IN/OUT 指令。
Windows 95 文件系统是另一个好例子。过去,对文件系统服务的请求(requests ),源自于16 位保护模式程序所发出的 INT 21h 。有一个 VxD 用来处理这些 INT 21h ,并将它们切换到 V86 模式,以便让MS-DOS 处理。MS-DOS 发出 INT 13h中断 ,以请求使用 BIOS 的磁盘 I/O 功能;发出 INT 2Fh ,允许网络的 "redirector moles"(重新定向模块)将此请求通过网络传输出去。Windows 95 提供给应用程序的,仍是向上兼容的接口,INT 21h 仍旧是导至文件系统的动作,但是底层基础却大不一样。
在 Windows 95 之中,一个名为“可安砚文件系统“(Installable File System ,IFS )的管理器会处理所有 INT 21h ,甚至是来自于 V86 模式的。然后它把控制权交斤一个文件系统驱动程序(File System Driver ,FSD )。有一个 FSD 名为 VFAT ,是针对 MS-DOS
文件系统(所谓 File Allocation Table ,FAT )而设计;另一个 FSD 名为 CDFSD ,可以解析 CD-ROM 格式;此外还有其他 FSDs ,知道如何经由各种网络彼此通讯。针对本机(local 端)FSD (如VFAT )的磁盘操作,会经过被I/O管理器(Input/Output Supervisor ,IOS)监视管理的一堆VxDs处理。甚至 V86 模式的 INT 13h 中断调用最终也是由 IOS 处理。换句??真,实模式和保护模式所发出的对文件系靳的请求(request ),不论是针对本地(local )或远程(remote )磁盘,有可能完全(或几乎完全)由 VxDs 来处理。Windows 95 这种以 VxD 为中心的驱动程序模型,好处之一是,系统程序员不一定要是 MS-DOS 和 BIOS 的专家,就可以写驱动程序。那些准备提供系统扩展组件的程序员,也同享这个好处;原本你必须了解DOS保护模式接口(DPMI)以及 Windows 核心模块的许多神秘特性或未公开特性,现在只需了解 Win32 的 DeviceIoControl API 函数,以及那些支持所谓 "alertable waits”(即时唤醒,大意是那些可以在VXD中调用的Windows 32位 API函数,但数量极其有限,)的 Win32 API 即可。这两个接口可以让你把 VxD 当做 32 位应用程序的扩展组件。尽管Windows系统驱动程序设计的任务主要是在系统底层上扩展 Windows 的功能,但Windows 95 还是保留了令人印象深刻的向上兼容能力(对上层程序,如dos程序来说,它们的调用接口没变,但底层实际操作却大不一样了)。DPMI 还是存在(有些16 位程序还是需要它),你还是可以运行实模式的网络驱动程序或文件系统驱动程序--如果这是你的必要选择。事实上,你往往可以把 Windows 3.1 的一整组硬件设备、网络驱动程序、16 位应用程序及其必要的 VxDs 整个搬到 Windows 95 ,不至于遭遇什么大问题。

Windows98&2k&NT
1996年的Windows Hardware Engineering Conference(WinHEC)会议上,Microsoft宣布了一种新的Windows设备驱动程序模型――Win32 Driver Model(WDM)。这种新的设备驱动程序模型将成为Windows 2000(即Windows NT 5.0)的核心。
这个消息令从事Windows设备驱动程序(VxD)开发的程序员感到沮丧(虽然大家早已预料到Windows系列与Windows NT系列最终将走到一起)。WDM将vxd的开发人员带到了一个新的起点上,什么都是新的:新的模式,新的观点。如果你曾看过DDK的汇编代码的话,你一定可以体会这个消息对VxD开发者是个沉重的打击,而对于Windows NT设备驱动程序(Kernel Mode Driver)的开发者来说,却是另一番心情――因为WDM基本等于Kernel Mode Driver+Plug and Play。

VxD将让位于WDM,现在令我们欣慰的是Microsoft宣布Windows 98(Windows 98支持VxD,推荐使用WDM方式驱动,但有些设备,如打印机等还不能用它,微软预先设想的是Windows98和Windows 2k x86版在WDM驱动上可以二进制码兼容,但实际上没有完全实现)可能会坚持到200X年(天知道,估计也就是三两年)。在这期间,掌握VxD技术的你还是可以主动要求老板给你加薪的。即使到了WDM一统天下之时,也不用灰心,因为无论是VxD还是WDM,都要求开发人员对计算机硬件有着全面而细致的了解。通过VxD的锻炼,你至少熟悉了计算机的硬件资源并对保护模式有了比较深刻的认识,这些东西都是将来从事WDM开发的硬功夫。

好了,该说说Windows NT了。在Windows NT中,80386保护模式的“保护”比Windows 95中更坚固,这个“镀金的笼子”更加结实,更加难以打破。在Windows 95中,至少应用程序I/O操作是不受限制的,而在Windows NT中,我们的应用程序连这点权限都被剥夺了。在NT中几乎不太可能进入真正的ring0层。
在Windows NT中,存在三种Device Driver:

1.“Virtual device Driver” (VDD)。通过VDD,16位应用程序,如DOS 和Win16应用程序可以访问特定的I/O端口(注意,不是直接访问,而是要通过VDD来实现访问)。

2.“GDI Driver”,提供显示和打印所需的GDI函数。

3.“Kernel Mode Driver”,实现对特定硬件的操作,比如说CreateFile, CloseHandle (对于文件对象而言), ReadFile, WriteFile, DeviceIoControl 等操作。“Kernel Mode Driver”还是Windows NT中唯一可以对硬件中断和DMA进行操作的Driver。SCSI 小端口驱动和 网卡NDIS 驱动都是Kernel Mode Driver的一种特殊形式。

Windows NT的驱动程序模型与Windows 3.1、Windows 95是截然不同的。所以如你的程序使用的某些特有驱动程序是VXD驱动的话,在Windows nt和windows 2k中是不能运行的。你听说过的CIH病毒就是运用的是VXD相似技术。所以不可能在nt和windows 2k中感染CIH病毒。
关于WDM驱动程序方面的相关知识,可以参看《WINDOWS WDM设备驱动程序开发指南》和《Programming the Microsoft Windows Driver Model》两本书或参看微软DDK文档。在本专栏以后的文章中,我们将一起学习WDM驱动程序的开发技术(大势所趋嘛)。

『柒』 linux系统中平台设备的描述,哪些是正确的

一、sysfs文件系统:
sysfs文件系统是Linux2.6内核引入的,它被看成是与proc、devfs和devpty等同类别的文件系统,sysfs文件系统也是一个虚拟文件系统,它可以产生一个包括所有系统硬件的层级视图,与提供进程和状态信息的proc文件系统十分类似;
sysfs文件系统把链接在系统上的所有设备和总线组织成一个分级的文件系统,它们可以由用户空间存取,并向用户空间导出内核数据结构以及它们的属性等信息.sysfs的一个目的就是展示设备驱动模型中各个组件的层次关系,其顶级目录包括:
1、block:包含系统中所有的块设备;
2、devices:包含系统中所有的设备,并根据设备挂载的总线类型组织成层次关系结构;
3、bus:包含系统中所有的总线类型;
4、drivers:包含系统内核中所有已经注册的设备驱动程序;
5、class:包含系统中所有的设备类型;如,网卡设备、声卡设备、输入设备、输出设备,等等;
二、设备模型:
从整体上描述,大概模型就如下图所示:

从图中可以看出,Linux设备模型就是"总线、设备、驱动、类"这四个概念之前的相互关系;这也是Linux2.6内核抽象出来的用于管理系统中所有设备的模型图;
简单地描述设备模型的层次关系如下:
1、驱动核心中可以注册多种类型的总线(bus_type);
2、每一种类型的总线下面可以挂载许多设备(kset,device);
3、每一种类型的总线可以使用很多设备驱动(kset,device_driver);
4、每一个驱动程序可以管理一组设备;
这种基本关系的建立源于实际系统中各种总线、设备、驱动、类结构的抽象;
Linux设备模型中的总线、设备、驱动和类之间环环相扣的复杂关系可以满足内核日益发展的的需要;对智能电源管理、热插拔以及即插即用的支持要求也越来越高;

『捌』 如何学习Linux设备驱动

通常,内核的升级对从事linux应用程序开发的人员来说影响较小,因为系统调用基本保持兼容,影响比较大的是驱动开发人员。每次内核的更新都可能导致许多内核函数原型上的变化,其中既有内核本身提供的函数,也有硬件平台代码提供的函数,后者变化的更加频繁。这一点从许多经典书籍就可验证,当你按照手里的经典著作,如:Alessandro的《linux设备驱动程序》,编写驱动时,发现并不能够成功的在你的linux平台上编译通过、或不能正常执行,原因就在于你用的内核和书里的不一致。
本文从两个方面去解释这个问题,一方面是如何写好linux设备驱动,另一方面是如何应对不断升级的内核。
如何写好Linux设备驱动
Linux设备驱动是linux内核的一部分,是用来屏蔽硬件细节,为上层提供标准接口的一种技术手段。为了能够编写出质量比较高的驱动程序,要求工程师必须具备以下几个方面的知识:
● 熟悉处理器的性能
如:处理器的体系结构、汇编语言、工作模式、异常处理等。对于初学者来说,在还不熟悉驱动编写方法的情况下,可以先不把重心放在这一项上,因为可能因为它的枯燥、抽象而影响到你对设备驱动的兴趣。随着你不断地熟悉驱动的编写,你会很自然的意识到此项的重要性。
● 掌握驱动目标的硬件工作原理及通讯协议
如:串口控制器、显卡控制器、硬件编解码、存储卡控制器、I2C通讯、SPI通讯、USB通讯、SDIO通讯、I2S通讯、PCI通讯等。编写设备驱动的前提就是需要了解设备的操作方法,所以这些内容的重要程度不言而喻。但不是说要把所有设备的操作方法都熟悉了以后才可以写驱动,你只需要了解你要驱动的硬件就可以了。
● 掌握硬件的控制方法
如:中断、轮询、DMA 等,通常一个硬件控制器会有多种控制方法,你需要根据系统性能的需要合理的选择操作方法。初学阶段以实现功能为目的,掌握的顺序应该是,轮询->中断->DMA。随着学习的深入,需要综合考虑系统的性能需求,采取合适的方法。
● 良好的GNU C语言编程基础
如:C语言的指针、结构体、内存操作、链表、队列、栈、C和汇编混合编程等。这些编程语法是编写设备驱动的基础,无论对于初学者还是有经验者都非常重要。
● 良好的linux操作系统概念
如:多进程、多线程、进程调度、进程抢占、进程上下文、虚拟内存、原子操作、阻塞、睡眠、同步等概念及它们之间的关系。这些概念及方法在设备驱动里的使用是linux设备驱动区别单片机编程的最大特点,只有理解了它们才会编写出高质量的驱动。
● 掌握linux内核中设备驱动的编写接口
如:字符设备的cdev、块设备的gendisk、网络设备的net_device,以及基于这些基本接口的framebuffer设备的fb_info、mtd设备的mtd_info、tty设备的tty_driver、usb设备的usb_driver、mmc设备的mmc_host等。
Linux内核为设备驱动编写者提供了标准的接口,驱动编写者无需精通内核的各个部分,只需要明确内核提供给我们的接口,并实现此接口就可以了。内核提供的接口采用的是面向对象的思路,即把目标设备抽象成一个对象,通常利用一个结构体来描述这个对象。驱动工程师的任务就是实现这个对象。这个结构体中会包含设备的属性(用变量表示)和操作方法(用函数指针表示)。如:字符设备的cdev
struct cdev {
struct kobject kobj;
struct mole *owner;
const struct file_operations *ops; // 操作方法结合,其它项都是属性
struct list_head list;
dev_t dev;
unsigned int count;
};
开始阶段可以以模仿为主,即套用一些固定的模板、参考例程。
如何应对不断升级的内核
内核升级对驱动的影响主要体现在,(1)驱动接口定义的变化;(2)内核的一些功能函数的名称、参数、头文件、宏定义的变化;(3)平台代码关于硬件操作方面封装的一些函数的变化;(4)设备模型的影响。
● 驱动接口定义的变化
如:2.4内核中字符设备驱动的注册接口是:
int register_chrdev(unsigned int major, const char * name, struct file_operations *fops)
而2.6内核中已经不建议使用这种方法了,改为:
int cdev_add(struct cdev *p, dev_t dev, unsigned count)
这种接口定义及注册方法带来的变化,发生的并不频繁。解决方案是:参考内核中的代码。这种接口定义及注册方法在内核中非常容易找到,如:字符设备驱动的注册方法及接口定义可以参照内核driver/char/目录下的很多实例。
● 内核的一些功能函数的名称、参数、头文件、宏定义的变化
如:中断注册函数的格式及参数在2.4内核、2.6内核低版本和高版本之间都存在差别,在2.6.8中,中断注册函数的定义为:
int request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *),unsigned long irq_flags, const char * devname, void *dev_id)
irq_flags的取值主要为下面的某一种或组合: SA_INTERRUPT、SA_SAMPLE_RANDOM、SA_SHIRQ
在2.6.26中,中断注册函数的定义为:
int request_irq(unsigned int irq, irq_handler_t handler,unsigned long irqflags, const char *devname, void *dev_id)
typedef irqreturn_t (*irq_handler_t)(int, void *); irq_flags的取值主要为下面的某一种或组合:(功能和2.6.8的对应)IRQF_DISABLED、IRQF_SAMPLE_RANDOM、IRQF_SHARED
当出现这些问题时,编译过程中,编译器会给我们比较明确的错误提示,根据这些提示你可以判断出是否是缺少头文件问题、是否是函数参数定义有误等。解决问题的最好办法还是到你的目标内核中找信息。此时找问题的方法可以借助于搜索,如:你可以在新的内核中搜索request_irq,看新内核中的驱动是如何使用它的,这种方法非常有效。
● 平台代码关于硬件操作方面封装的一些函数的变化
内核中,硬件平台相关的代码在内核更新过程中变化比较频繁,和我们的设备驱动也是息息相关,所以在针对一个新内核编写设备驱动前,一定要熟悉你的平台代码的结构。有时平台虽然提供了内核要求的接口函数,但使用起来功能却并不完善。下面还是先举个例子说明平台代码更新对设备驱动的影响。
如:在linux-2.6.8内核中,调用set_irq_type(IRQ_EINT0,IRQT_FALLING);去设置S3C2410的IRQ_EINT0的中断触发信号类型,你会发现不会有什么效果。跟踪代码发现内核的set_irq_type函数需要平台提供一个针对硬件平台的实现函数
static struct irqchip s3c_irqext_chip = {
.mask = s3c_irqext_mask,
.unmask = s3c_irqext_unmask,
.ack = s3c_irqext_ack,
.type = s3c_irqext_type
};
s3c_irqext_type就是linux内核需要的实现函数,而s3c_irqext_type在2.6.8中的实现为: static int s3c_irqext_type(unsigned int irq, unsigned int type)
{
irqdbf("s3c_irqext_type: called for irq %d, type %d\n", irq, type);
return 0;
}
原来并没有实现。而在较高版本的内核,如2.6.26内核中,这个函数是实现了的。所以你一定要小心。当平台函数不好用时,一定要查查原因,或者直接操作硬件寄存器来达到目的。
● 2.6内核设备模型对驱动的影响
在2.6内核中写设备驱动和在2.4内核中有着很大的不同,主要就是在设备驱动中融入了比设备驱动本身结构还复杂、还难以理解的设备模型。初学驱动时你可以不理会设备模型,但你会发现内核里的驱动代码基本上都是融入了设备模型的了。所以很多时候你不得不面对现实,还是要弄懂它,并且它也的注册方法也会随着内核的升级而发生变化。解决此类问题的最好方法还是参考目标内核驱动代码。

『玖』 嵌入式ARM Linux设备驱动如何学习 有没有做驱动的愿意说说学习心得 学习方法 和学习资料推荐下

主要是坚持,因为涉及的方面很广泛,所以要掌握很多看起来毫不相干的东西,但是他们都有联系,需要至少扎实投入10年,才算是基本掌握了。

阅读全文

与什么是设备驱动模型相关的资料

热点内容
steam令牌换设备了怎么办 浏览:246
新生测听力仪器怎么看结果 浏览:224
化学试验排水集气法的实验装置 浏览:156
家用水泵轴承位置漏水怎么回事 浏览:131
羊水镜设备多少钱一台 浏览:125
机械制图里型钢如何表示 浏览:19
测定空气中氧气含量实验装置如图所示 浏览:718
超声波换能器等级怎么分 浏览:800
3万轴承是什么意思 浏览:110
鑫旺五金制品厂 浏览:861
苏州四通阀制冷配件一般加多少 浏览:153
江北全套健身器材哪里有 浏览:106
水表阀门不开怎么办 浏览:109
花冠仪表盘怎么显示时速 浏览:106
洗砂机多少钱一台18沃力机械 浏览:489
超声波碎石用什么材料 浏览:607
组装实验室制取二氧化碳的简易装置的方法 浏览:165
怎么知道天然气充不了阀门关闭 浏览:902
公司卖旧设备挂什么科目 浏览:544
尚叶五金机电 浏览:59