设备驱动层

驱动层一般由硬件抽象层(HAL)、板级支持包(BSP)和驱动程序组成,是嵌入式系统中不可或缺的重要部分。它的作用是为上层程序提供外部设备的操作接口,并且实现设备的驱动程序。上层程序可以不管操作的设备内部实现,只需要调用驱动的接口即可。

硬件抽象层(HAL

嵌入式系统通常包含三个部分:

嵌入式应用程序

嵌入式操作系统

硬件平台

应用程序运行在操作系统之上,利用操作系统提供的接口完成特定功能。操作系统一般是RTOS,完成应用的任务调度和控制等核心功能。硬件平台根据应用的不同,所具备的功能各不相同,而且所使用的硬件设备也不一样,因此具有复杂的多样性。

由于硬件平台的复杂多样,针对不同平台进行操作系统的移植是极为耗时的工作,因此经过不断发展,嵌入式系统的三层结构演化为四层结构,即在操作系统层和硬件平台之间,增加硬件抽象层(HAL)。

硬件抽象层本质上就是一组对硬件进行操作的API接口,是对硬件功能抽象的结果。硬件抽象层通过API为操作系统和应用程序提供服务。一般上HAL包含相关硬件的初始化、数据的输入输出操作、硬件设备的配置操作等功能。

有了硬件抽象层,操作系统和应用程序就不需要关心底层的硬件平台信息,内核与硬件相关的代码也不必因硬件的不同而修改,只要硬件抽象层能够提供必需的服务即可,从而屏蔽底层硬件,方便进行系统的移植。

HAL只是对硬件的一个抽象,对一组API进行定义,却不提供具体的实现。通常HAL各种功能的实现是以BSP的形式来完成对具体硬件的操作的。

HAL设计的一些要素是:

与硬件的密切相关性

与操作系统的无关性

接口的功能包括硬件或者系统所需硬件支持的所有功能

接口简单明了

板级支持包(BSP

板级支持包是介于系统硬件和操作系统的驱动程序之间的一层,是HAL的具体实现,所以有些人也称BSP层位HAL。

BSP主要实现对操作系统的支持,为上层驱动程序提供访问硬件设备寄存器所需的函数,使之能够更好的运行于硬件主板。

BSP的特点有:硬件相关性,BSP程序直接对硬件进行操作;操作系统相关性,不同操作系统的软件层次结构不同,硬件抽象层的接口定义不同,因此具体实现也不一样。BSP,一定要按照操作系统的接口定义来实现,因此,大多数的BSP编程过程都是在某一个成型的BSP模板上进行修改。

具体功能体现在两个方面:

1.系统启动时,完成对硬件的初始化,如对系统内存,寄存器以及设备的中断设置等。

2.为操作系统的通用设备驱动程序提供访问硬件的手段,亦即硬件相关的设备驱动。

设备驱动程序

设备驱动程序是指操作系统中的驱动程序,为上层软件提供设备的操作接口,必要的时使用BSP提供的函数来实现硬件设备操作。驱动程序的好坏直接影响系统的性能。

设备驱动层

时间: 2024-10-15 00:04:27

设备驱动层的相关文章

块设备之设备驱动层

块设备是通过generic_make_request提交请求给I/O调度层,然后驱动层通过调用blk_init_queue来准备请求,这节来看看怎么样写一个块设备驱动程序.一个块设备的是由一个gendisk结构体来描述,每一个gendisk可以支持多个分区,内核对于块设备的访问,都是基于这个结构体展开 struct gendisk { int major; //主设备号 int first_minor; //第一个次设备号 int minors; //次设备个数,每个分区都需要一个次设备号 ch

Linux设备驱动中的阻塞和非阻塞I/O

[基本概念] 1.阻塞 阻塞操作是指在执行设备操作时,托不能获得资源,则挂起进程直到满足操作所需的条件后再进行操作.被挂起的进程进入休眠状态(不占用cpu资源),从调度器的运行队列转移到等待队列,直到条件满足. 2.非阻塞 非阻塞操作是指在进行设备操作是,若操作条件不满足并不会挂起,而是直接返回或重新查询(一直占用CPU资源)直到操作条件满足为止. 当用户空间的应用程序调用read(),write()等方法时,若设备的资源不能被获取,而用户又希望以阻塞的方式来访问设备,驱动程序应当在设备驱动层的

块设备驱动框架详解

一.正确的理解块设备驱动的概念 1.块设备和字符设备的差异 (1)块和字符是两种不同的访问设备的策略 (2)同一个设备可以同时支持块和字符两种访问策略 (3)设备本身的物理特性决定了哪一种访问策略更适合 (4)块设备本身驱动层支持缓冲区,而字符设备驱动层没有缓冲 (5)块设备驱动最适合存储设备 2.块设备驱动的特点 (1)字符设备只能顺序访问(如串口发送数据顺序),而块设备可以随机访问(不连续块访问). (2)传统的机械式块设备(如硬盘.DVD)虽然可以随机访问,但是连续访问效率更高,因此块设备

Linux设备驱动模型--分离分层思想

一.设备驱动的分层思想:以platform设备驱动.input设备驱动为例看看他们在分层思想上的体现 [1]在核心层:一类设备总线通用的功能特性,如果某一设备支持的总线比较特别可以不使用这些功能特性,在自己的设备总线结构体中 进行重载. 例(1)platform核心层:定义在drivers/base/platform.c文件 Linux内核对设备总线先进行了一次全局的抽象,即概括了所有设备驱动总线具有的功能特性: struct bus_type { //具备总线名.总线属性.总线上设备属性.总线

【转】写一个块设备驱动(1)

原文地址:写一个块设备驱动 一直对块设备驱动似懂非懂,这次发现了这个介绍块设备驱动很好的系列,打算把这套东西弄懂,一起跟着作者学习一遍 作者写这个系列的初衷如下,我觉得很好,网上搜到的大部分都是介绍一些玄乎的东西,看完似懂非懂的~ 在这套教程中,我们通过写一个建立在内存中的块设备驱动,来学习linux内核和相关设备驱动知识. 选择写块设备驱动的原因是: 1:容易上手 2:可以牵连出更多的内核知识 3:像本文这样的块设备驱动教程不多,所以需要一个 概述 在开始赵磊的教程之前,先对块IO子系统进行一

Linux设备驱动核心理论(一)

4.Linux内核模块 4.1 Linux内核模块简介 如果把所有需要的功能都编译到Linux内核.这回导致两个问题,一是生成的内核会很大,二是如果我们要在现有的内核中新增或删除功能,将不得不重新编译内核. 现在我们需要的是一种机制使得编译出的内核本身并不需要包含所有功能,而在这些功能需要被使用的时候,其对应的代码被动态地加载到内核中. Linux提供了这样的一种机制,这种机制被称为模块(Module).模块具有这样的特点: 模块本身不被编译如内核映像,从而控制内核的大小. 模块一旦被加载,它就

spi驱动框架全面分析,从master驱动到设备驱动

内核版本:linux2.6.32.2 硬件资源:s3c2440 参考:  韦东山SPI视频教程 内容概括: 1.I2C 驱动框架回顾 2.SPI 框架简单介绍 3.master 驱动框架 3.1 驱动侧 3.2 设备侧 4.SPI 设备驱动框架 4.1 设备册 4.2 驱动侧 5.设备驱动程序实例 1.I2C 驱动框架回顾 在前面学习 I2C 驱动程序的时候我们知道,I2C 驱动框架分为两层,一层是控制器驱动程序 i2c_adapter,它一般是由芯片厂商写好的,主要提供一个 algorithm

设备驱动之SPI

本文非专业讲SPI,只是讲网上看到的资料略微总结,并加上自己的想法,附资料links. devs.c  :各个platform_device 的定义,比如I2C.USB.SPI等等.应该是内核加载时,读取该配置文件,然后注册进系统.目录在/arch/arm/plat-samsung/devs.c 比如: /* SPI */ #ifdef CONFIG_PLAT_S3C24XX static struct resource s3c_spi0_resource[] = { //下面s3c_devic

Linux设备驱动核心理论(三)

10.中断与时钟 10.1 中断与定时器 所谓中断是指CPU在执行程序的过程中,出现了某些突发事件急待处理,CPU必须暂停执行当前程序,转去处理突发事件,处理完毕后CPU又返回原程序被中断的位置并继续执行. 根据中断的来源,中断可分为内部中断和外部中断,内部中断的中断来源来自CPU内部(软件中断.溢出.除法错误等,例如,操作系统从用户态切换到内核态需借助CPU内部的软件中断),外部中断的中断来源来自CPU外部,由外设提出请求. 根据中断是否可以屏蔽分为可屏蔽中断与不屏蔽中断(NMI),可屏蔽中断