芯片组件->固件(驱动与应用软件)->BSP->内核驱动

时间:2024-03-23 12:58:03

一、固件

每个硬件都有一个固件。

https://iask.sina.com.cn/b/1SSPgMkIAk35.html 是不是电脑每个硬件都有一个主控芯片存放固件信息?顾名思义是不是存放固件系统的硬件是不是叫做主控芯片?

固件是存储在非易失存储器(如ROM、EPROM、E2PROM或FLASH)上的软件。在设备硬件自身中执行的底层软件。通过固件,标准驱动程序才能实现特定机器的操作。

固件其他定义:下载到FPGA且需要烧录的代码,运行在微处理器上的微代码。

固件组成:操作系统(OS)、设备驱动程序及应用程序代码等。

每块芯片上的组件都有一个驱动程序。该图中有一个固件和一块芯片。该芯片包含数个组件,而固件也包含数个应用程序及设备驱动程序。

芯片组件->固件(驱动与应用软件)->BSP->内核驱动

用上图来描述激光打印机是如何打印一页的:

1.假设组件A是USB组件,它负责接收来自打印任务的数据包。

2.驱动程序A读取来自组件A的接收数据包,并将它们交给应用程序A。

3.应用程序A组装所有的数据包,并且等到接收足够一页的数据包时,将数据提交给另一个应用程序,如调用光栅应用程序、数据压缩应用程序等的打印任务解释器。

4.最终应用程序B得到光栅数据,并提交给驱动程序B,而驱动程序B再配置组件B的寄存器,并用这些数据来控制激光。

上图所示的固件架构只是一种可能的情况,下图给出了另一种可能的架构。

芯片组件->固件(驱动与应用软件)->BSP->内核驱动

https://blog.51cto.com/zhaoyuejin/1243994 固件与驱动的区别

设备上没有固件?

一个设备在工作前,必须下载固件到设备里。硬件市场竞争激烈,以至于用设备控制固件的 EEPROM 的成本,制造商都不愿意花,固件发布在随硬件一起的一张 CD 上, 操作系统负责传送固件到设备自身。硬件越来越复杂,硬件的许多功能使用了程序实现,与直接硬件实现相比,固件拥有处理复杂事物的灵活性和便于升级、维护等优点。

固件一般存放在设备上的flash中,但出于成本和灵活性考虑,许多设备都将固件的映像(image)以文件的形式存放在硬盘中,设备驱动程序初始化时再装载到设备内部的存储器中。这样,方便了固件的升级,并省略了设备的flash存储器。

如何工作?

固件运行在非“控制处理器”(指不直接运行操作系统的处理器,例如外设中的处理器,或者被用于bare metal的主处理器的其中一些核)中的程序。这些程序很多时候使用和操作系统所运行的处理 器完全不同的指令集。

这些程序以二进制形式存在于Linux内核的源代码树中,生成目标系统的时候,通常拷贝在/lib/firmware目录下。当driver对device进行初始化的时候,通过request_firmware()等接口, 在一个用户态helper程序的帮助下,可以把指定的firmware加载到内存中,由驱动传输到指定的设备上。

二、BSP(嵌入式,PC不提)

“BSP”(board support package)则是针对某一具体硬件系统(通常为板级系统)的支持软件包。起作用是给其上运行的操作系统提供一个标准的界面。这样一来,操作系统的移植将变得更为方便。

Board Support Package,板级支持包,属于操作系统的一部分。BSP是一般是厂家提供的,驱动是自己写的。

写BSP一定要按照该系统BSP的定义形式来写,这样才能与上层OS保持正确的接口,良好的支持上层OS。

BSP是相对于操纵系统而言,VxWorks的BSP和Linux的BSP相对于某一CPU来说尽管实现的功能一样,可是写法和接口定义是完全不同的。

1)BSP是你的板子相关的代码,比如GPIO的配置,I2C连接的设备。同一款CPU,不同的板子也会因为引脚的接法不同,设备上从属设备不一样导致BSP不一样;
2)驱动的话和你的子设备是密切相关的,相同设备在相同软件平台下驱动基本是可以通用的,和板子的关系不是很大的。

BSP在嵌入式系统和Windows系统中的不同

在PC机上的windows或linux系统也是有BSP的.只是PC机均采用同一的X86体系架构,操作系统(windows,linux..)的BSP相对x86架构是单一确定的,不需要做任何修改就可以很轻易支持OS在x86上正常运行,所以在PC机上谈论BSP这个概念也没什么意义了.

 嵌入式系统来说情况则完全不同,目前市场上多种结构的嵌入式CPU(RISC)并存(PPC,ARM,MIPS....),为了性能的需要,外围设备也会有不同的选择和定义。一个嵌入式操作系统针对不同的CPU,会有不同的BSP,即使同一种CPU,由于外设的一点差别(如外部扩展DRAM的大小,类型改变),BSP相应的部分也不一样。 所以根据硬件设计编写e和修改BSP,保证系统正常的运行是非常重要的。

在目前的嵌入式领域中通常也把HAL叫做板级支持包 BSP(Board Support Package)。

https://blog.csdn.net/csshuke/article/details/47003769 嵌入式系统HAL原理与BSP的实现方法

上层程序

Tools - Applications

I/O System

VxWorks Libraries

TCP/IP

 

Wind Kernel

BSP

 

SCSI Controllerr

Serial Controller

Clock Timer

Ethernet Controller

.. ..

硬件

http://blog.chinaunix.net/uid-29025972-id-4889943.html BSP简介及与BIOS区别

单片机系统使用BSP(板级支持包BoradSupportPackage)可以直接进行应用开发;

日益增长的芯片种类和复杂度,直接使用BSP挑战大,为了程序的可阅读性以及可移植性提出了硬件抽象层HAL这一个概念;

HAL库的实现是基于BSP库的,只是将其进一步封装,形成统一的标准,操作系统使用HAL接口来实现对硬件的操作;

WinCE面向的硬件架构种类太多,x86, ARM, MIPS等,微软不可能把这些都做出来,因此硬件和内核通信的部分,交给了OEM厂商,这些厂商按照接口规范实现特定硬件的软件抽象,供内核调用。因此就加OEM抽象层(OAL)=HAL。

Windows HDL:hal.dll

参考:https://blog.csdn.net/tq384998430/article/details/53484512  板级支持包BSP和硬件抽象层HAL的区别和关联;

参考:https://bbs.csdn.net/topics/390886702   关于BSP与HAL的区别

https://baike.baidu.com/item/bsp/4572854?fr=aladdin

https://blog.csdn.net/csshuke/article/details/47003769

参考:https://blog.csdn.net/zzsfqiuyigui/article/details/7182457 什么是BSP

 

三、操作系统内核驱动

但在Linux Kernel中,Driver和Firmware是有明确含义的:

驱动:Driver是控制被操作系统管理的外部设备(Device)的代码段。

driver和firmware没有什么直接的关系,但firmware通常由驱动去加载。OS不需要理解firmware是什么,只是把它当做数据。firmware是什么,只有使用这些数据的那个设备才知道。

https://www.cnblogs.com/gaozhengwei/p/10368876.html Linux驱动和固件有何区别