设备驱动层解析.docx
《设备驱动层解析.docx》由会员分享,可在线阅读,更多相关《设备驱动层解析.docx(10页珍藏版)》请在冰豆网上搜索。
设备驱动层解析
设备驱动层
驱动层一般由硬件抽象层(HAL)、板级支持包(BSP)和驱动程序组成,是嵌入式系统中不可或缺的重要部分。
它的作用是为上层程序提供外部设备的操作接口,并且实现设备的驱动程序。
上层程序可以不管操作的设备内部实现,只需要调用驱动的接口即可。
硬件抽象层(HAL)
硬件抽象层的层次结构
HAL层可细分为:
commonHAL(通用抽象层)、architectureHAL(体系结构抽象层)、variantHAL(变体抽象层)和platformHAL(平台抽象层)。
体系结构抽象层:
eCos所支持的不同处理器系列具有不同的体系结构,如ARM系列、PowerPC系列、MIPS系列等,体系结构抽象层对CPU的基本结构进行抽象和定义,此外它还包括中断的交付处理、上下文切换、CPU启动以及该类处理器结构的指令系统等。
变体抽象层指的是处理器在该处理器系列中所具有的特殊性,这些特殊性包括Cache、
MMU、FPU等,eCos的变体抽象层就是对这些特殊性进行抽象和封装。
平台抽象层是对当前系统的硬件平台进行抽象,包括平台的启动、芯片选择和配置、定时设备、I/O寄存器访问以及中断寄存器等。
硬件抽象层的这三个子模块之间没有明显的界线。
对于不同的目标平台,这种区分具有一定的模糊性。
例如,MMU和Cache可能在某个平台上属于体系结构抽象层,而在另一个平台上则可能属于变体抽象层的范围;再比如,内存和中断控制器可能是一种片内设备而属于变体抽象层,也可能是片外设备而属于平台抽象层
eCos的移植通过这三个子模块来完成,即平台抽象层的移植、变体抽象层的移植和体系结构抽象层的移植。
对一个新的体系结构来说,其体系统结构抽象层的建立相对来说比较困难,需要编写新的体系结构抽象层。
eCos支持大部分当前广泛使用的嵌入式CPU,已具有了支持各种体系结构的硬件抽象层。
因此,eCos的移植很少需要进行体系结构抽象
层的编写。
一般来说,进行eCos开发时,移植的主要工作在于变种抽象层和平台抽象层,这是由于eCos已实现了绝大多数流行嵌入式CPU的体系结构抽象层。
其中,平台抽象层主要完成的工作包括:
内存的布局、平台早期初始化、中断控制器以及简单串口驱动程序等
嵌入式系统通常包含三个部分:
嵌入式应用程序
嵌入式操作系统
硬件平台
应用程序运行在操作系统之上,利用操作系统提供的接口完成特定功能。
操作系统一般是RTOS,完成应用的任务调度和控制等核心功能。
硬件平台根据应用的不同,所具备的功能各不相同,而且所使用的硬件设备也不一样,因此具有复杂的多样性。
由于硬件平台的复杂多样,针对不同平台进行操作系统的移植是极为耗时的工作,因此经过不断发展,嵌入式系统的三层结构演化为四层结构,即在操作系统层和硬件平台之间,增加硬件抽象层(HAL)。
硬件抽象层本质上就是一组对硬件进行操作的API接口,是对硬件功能抽象的结果。
硬件抽象层通过API为操作系统和应用程序提供服务。
一般上HAL包含相关硬件的初始化、数据的输入输出操作、硬件设备的配置操作等功能有了硬件抽象层,操作系统和应用程序就不需要关心底层的硬件平台信息,内核与硬件相关的代码也不必因硬件的不同而修改,只要硬件抽象层能够提供必需的服务即可,从而屏蔽底层硬件,方便进行系统的移植。
HAL只是对硬件的一个抽象,对一组API进行定义,却不提供具体的实现。
通常HAL各种功能的实现是以BSP的形式来完成对具体硬件的操作的。
HAL设计的一些要素是:
与硬件的密切相关性
与操作系统的无关性
接口的功能包括硬件或者系统所需硬件支持的所有功能
接口简单明了
板级支持包(BSP)
板级支持包是介于系统硬件和操作系统的驱动程序之间的一层,是HAL的具体实现,
所以有些人也称BSP层位HAL。
BSP主要实现对操作系统的支持,为上层驱动程序提供访问硬件设备寄存器所需的函数,使之能够更好的运行于硬件主板。
BSP的特点有:
硬件相关性,BSP程序直接对硬件进行操作;操作系统相关性,不同操作系统的软件层次结构不同,硬件抽象层的接口定义不同,因此具体实现也不一样。
BSP,一定要按照操作系统的接口定义来实现,因此,大多数的BSP编程过程都是在某一个成型的BSP模板上进行修改。
具体功能体现在两个方面:
1.系统启动时,完成对硬件的初始化,如对系统内存,寄存器以及设备的中断设置等。
2•为操作系统的通用设备驱动程序提供访问硬件的手段,亦即硬件相关的设备驱动
设备驱动程序
设备驱动程序是指操作系统中的驱动程序,为上层软件提供设备的操作接口,必要的时使用BSP提供的函数来实现硬件设备操作。
驱动程序的好坏直接影响系统的性能。
BSP(boardsupportpackage)板级支持包BSP(boardsupportpackage)是板
级支持包,是介于主板硬件和操作系统之间的一层,应该说是属于操作系统的一部分,主要
目的是为了支持操作系统,为上层的驱动程序提供访问硬件设备寄存器的函数包,使之能够更好的运行于硬件主板。
在嵌入式系统软件的组成中,就有BSP。
BSP是相对于操作系
统而言的,不同的操作系统对应于不同定义形式的BSP例如VxWorks的BSP和Linux
的BSP相对于某一CPU来说尽管实现的功能一样,可是写法和接口定义是完全不同的,所以写BSP一定要按照该系统BSP的定义形式来写(BSP的编程过程大多数是在某一个成型的BSP模板上进行修改)。
这样才能与上层OS保持正确的接口,良好的支持上层
OS。
BSP主要功能为屏蔽硬件,提供操作系统及硬件驱动,具体功能包括:
1.单板硬件初始化,主要是CPU的初始化,为整个软件系统提供底层硬件支持
2.为操作系统提供设备驱动程序和系统中断服务程序
3.定制操作系统的功能,为软件系统提供一个实时多任务的运行环境
4.初始化操作系统,为操作系统的正常运行做好准备
举例在VxWorks中的网卡驱动,首先在config.h中包含该网卡,然后将网卡含网卡的信息的参数放入数组END_TBL_ENTRYendDevTbl[]中,系统通过函数muxDevLoad()调用这个数组来安装网卡驱动。
而在Linux中的网卡驱动,是在space.c中声明该网络设备,再把网卡驱动的一些函数加到dev结构中,由函数ether_setup()来完成网卡驱动的安装。
纯粹的BSP所包含的内容一般说来是和系统有关的驱动和程序,如网络驱动和系统中网络协议有关,串口驱动和系统下载调试有关等等。
离开这些驱动系统就不能正常工作。
用户也可以添加自己的程序到BSP中,但严格来说不应该算BSP.—般来说这种做法不建议。
因为一旦操作系统能良好运行于最终的主板硬件后,BSP也就固定了,不需要做任何改动。
而用户自己在BSP中的程序还会不断的升级更新,这样势必对BSP有不好的影响,对系统造成影响,同时由于BSP调试编译环境较差,也不利于程序的编译调试。
上层程序
Tools-Applications
I/OSystem
VxWorksLibraries
TCP/IP
WindKernel
BSP
SCSIControllerr
SerialController
ClockTimer
EthernetController
....硬件BSP在嵌入式系统和Windows系统中的不同
其实运行与PC机上的windows或linux系统也是有BSP的。
只是PC机均采用统一的X86体系架构,这样一定操作系统(windows,linux..)的BSP相对x86架构是单一确定的,不需要做任何修改就可以很容易支持OS在x86上正常运行,所以在PC机上谈论BSP这个概念也没什么意义了。
而对嵌入式系统来说情况则完全不同,目前市场上多种结构的嵌入式CPU(RISC)并
存(PPC,ARM,MIPS...J,为了性能的需要,外围设备也会有不同的选择和定义。
一个嵌入式操作系统针对不同的CPU,会有不同的BSP即使同一种CPU,由于外设的一点差别(如外部扩展DRAM的大小,类型改变),BSP相应的部分也不一样。
所以根据硬件设计编写和修改BSP,保证系统正常的运行是非常重要的。
BSP和PC机主板上的BIOS区别很大,BIOS主要是负责在电脑开启时检测、初始化系统设备(设置栈指针,中断分配,内存初始化..)、装入操作系统并调度操作系统向硬件发出的指令,它的Firmware代码是在芯片生产过程中固化的,一般来说用户是无法修改。
其实是为下载运行操作系统做准备,把操作系统由硬盘加载到内存,并传递一些硬件接口设置给系统。
在OS正常运行后,BIOS的作用基本上也就完成了,这就是为什么更改BIOS一定要从新关机开机。
PC机BIOS的作用更象嵌入式系统中的Bootloader(最底层的引导软件,初始化主板的基本设置,为接收外部程序做硬件上的准备)。
与Bootloader不同的是BIOS在装载OS系统的同时,还传递一些参数设置(中断端口定义,...),而Bootloader只是简单的装载系统
BSP是和操作系统绑在一起运行在主板上的,尽管BSP的开始部分和BIOS所做的工作类似,可是大部分和BIOS不同,作用也完全不同。
此外BSP还包含和系统有关的基本驱动(串口,网口…),此外程序员还可以编程修改BSP,在BSP中任意添加一些和系统无关的驱动或程序,甚至可以把上层开发而系统规划法的统统放到BSP中。
而BIOS程序是用户不能更改,编译编程的,只能对参数进行修改设置。
更不会包含
一些基本的硬件驱动。
BSP开发处于整个嵌入式开发的前期,是后面系统上应用程序能够正常运行的保证。
大概步骤如下:
1.硬件主板研制,测试。
2.操作系统的选定,BSP编程。
3.上层应用程序的开发。
BSP部分在硬件和操作系统,上层应用程序之间。
BSP是一种根据上层接口描述的一种硬件的支持包,对于某些嵌入式操作系统来说,就是驱动,但对于纯软件来说,驱动一般描述为基于pc或者linux或工作站的驱动,上层接口是操作系统,对驱动这个“名词”理解不同,会得到不同的定义。
。
一般来说前者接口简单(比如接口是一个结构体),而后者,理解其工作模型才是关键,如果都是针对于硬件做驱动,那么,配置寄存器就是相同点!
bsp可以理解成就是最简单的驱动代码,它属于OS或Firmware的一部分,在PC平台最小的BSP需完成的任务上就是初始化芯片组上中断控制器、内存控制器、PCI控制器与串口(作为调试接口,如果你没钱买那些昂贵的硬件仿真器),基本上有这些你就可以对系统板进行调试了,比如DEBUG各种设备驱动:
VGA、USB、IDE、MAC、AC97等。
在OS上的driver一般都是可动态加载的,当然嵌入OS里头直接编进去也就行了,对于一个最小的可运行OS核心来说,BSP是必不可少的,但driver不是。
这里的BSP是BoardSupportPackage的缩写,意为板载支持包。
在这里我们可以
把BSP与通用计算机领域中的BIOS(BasicInputandOutputSystem)对比,以加深对
BSP的认识。
首先来看看BIOS的功能。
BIOS是硬件与软件之间的一个接口,它足固化到计算机存储器中的段程序,主要提供以下功能。
1自检及初始化计算机:
主要负