板卡支持包和 HAL(硬件抽象层)之间存在概念上的联系,设备驱动程序/内核模块执行硬件抽象,板卡支持包为设备驱动程序提供接口或者是硬件抽象层本身.
所以基本上BSP 具有类似于 DOS 时代的 BIOS 的功能:
此外,BSP 应该执行以下操作
- 初始化处理器
- 初始化总线
- 初始化中断控制器
- 初始化时钟
- 初始化 RAM 设置
- 配置段
- 从闪存加载和运行引导加载程序
来自:https ://en.wikipedia.org/wiki/Board_support_package
现代 PC 中的 BIOS 初始化和测试系统硬件组件,并从大容量存储设备加载引导加载程序,然后初始化操作系统。在 DOS 时代,BIOS 为键盘、显示器和其他输入/输出 (I/O) 设备 [设备驱动程序] 提供了一个硬件抽象层,用于标准化应用程序和操作系统的接口。较新的操作系统在加载后不使用 BIOS,而是直接访问硬件组件。
来源:https ://en.wikipedia.org/wiki/BIOS
另一方面是设备树在 BSP 中的使用,设备树是描述机器硬件的统一或标准化概念:
U-boot 引导加载程序并准备发货
Doug Abbott,用于嵌入式和实时应用程序的 Linux(第四版),2018 年
设备树
将 Linux 等操作系统移植到新平台的最大问题之一是硬件描述。这是因为硬件描述分散在几十个左右的设备驱动程序、内核和引导加载程序中,仅举几例。
最终的结果是,这些不同的软件对每个平台来说都是独一无二的,配置选项的数量增加了,每块板都需要一个独特的内核映像。
已经有许多方法来解决这个问题。“板级支持包”或 BSP 的概念试图将所有硬件相关代码收集到一个地方的几个文件中。可以说arch/
Linux 内核源代码树的整个子树是一个巨大的板级支持包。
看一下arch/arm/
内核的子树。在那里,您会发现大量目录,格式为mach-*
和plat-*
,大概分别是“机器”和“平台”的缩写。这些目录中的大多数文件都为 ARM 体系结构的特定实现提供了配置信息。当然,每个实现都以不同的方式描述其配置。
拥有一种可以用来明确描述计算机系统硬件的单一语言不是很好吗?这是设备树的前提和承诺。
系统中的外围设备可以沿多个维度进行表征。例如,字符设备与块设备。有内存映射设备,以及通过 I2C 或 USB 等外部总线连接的设备。然后是平台设备和可发现设备。
可发现设备是那些存在于外部总线上的设备,例如 PCI 和 USB,它们可以告诉系统它们是什么以及它们是如何配置的。也就是说,它们可以被内核“发现”。识别设备后,加载相应的驱动程序是一件相当简单的事情,然后它会询问设备以确定其精确配置。
另一方面,平台设备缺乏任何机制来识别自己。诸如 Sitara 之类的片上系统 (SoC) 实现充斥着这些平台设备——系统时钟、中断控制器、GPIO、串行端口等等。设备树机制对于管理平台设备特别有用。
设备树的概念是在内核的 PowerPC 分支中演变而来的,这似乎是它使用最多的地方。事实上,现在要求所有 PowerPC 平台在启动时将设备树传递给内核。设备树的文本表示是一个扩展名为 .dts 的文件。这些 .dts 文件通常位于内核源代码树的arch/$ARCH/boot/dts
.
设备树是描述计算机系统的设备集合和互连总线的分层数据结构。它被组织为从由“<code>/”表示的根开始的节点,就像根文件系统一样。每个节点都有一个名称,并由名称-值对的“属性”组成。它还可能包含“子”节点。
清单 15.1 是一个来自 devicetree.org 网站的示例设备树。除了说明结构之外,它什么也没做。这里我们有两个节点,分别命名为 node1 和 node2。node1 有两个子节点,node2 有一个子节点。属性由 name=value 表示。值可以是字符串、字符串列表、用方括号括起来的一个或多个数值,或者用尖括号括起来的一个或多个“单元格”。如果属性通过其存在或不存在来传达布尔值,则该值也可以为空。
来源:https ://www.sciencedirect.com/topics/computer-science/board-support-package
通过设备树覆盖内核模块可以在启动时加载,即在 RPi 上添加dtoverlay=lirc-rpi
以/boot/config.txt
加载lirc-pi
内核模块/设备驱动程序:
未来的默认 config.txt 可能包含如下部分:
# Uncomment some or all of these to enable the optional hardware interfaces
#dtparam=i2c_arm=on
#dtparam=i2s=on
#dtparam=spi=on
如果您有一个定义了一些参数的叠加层,则可以在后续行中指定它们,如下所示:
dtoverlay=lirc-rpi
dtparam=gpio_out_pin=16
dtparam=gpio_in_pin=17
dtparam=gpio_in_pull=down
来源:https ://www.raspberrypi.org/documentation/configuration/device-tree.md
当使用 Yocto 构建 BSP 时,所有分散在设备驱动程序、内核、引导加载程序等的硬件信息都被收集起来,这里是开发人员指南如何在 Yocto 中完成此操作https://www.yoctoproject.org /docs/2.5/bsp-guide/bsp-guide.html
[Yocto 文档]... 声明 BSP “...仅关注特定于硬件的组件。在最终分发点,您可以将 BSP 与构建系统和其他工具结合使用。但是,重要的是要保持区别,即这些是碰巧组合在某些最终产品中的独立组件。”</p>
来源:https ://www.microcontrollertips.com/board-support-package/