安泰电子世界网 首页 Ardunio Raspberry Pi 硬件(八)

Raspberry Pi 硬件(八)

2024-11-5 16:59 | 发布者: txc | 查看: 122 | 评论: 0

简介:Raspberry Pi 硬件

GPIO引导方式

注意GPIO 启动模式仅在 Raspberry Pi 3A+、3B、3B+、计算模块 3 和 3+ 上可用。

早期的Raspberry Pis可以配置为允许在上电时使用连接到GPIO连接器的硬件选择启动模式。这是通过在 SoC 的 OTP 存储器中设置位来完成的。设置位后,它们会永久分配五个 GPIO 以允许进行此选择。一旦设置了 OTP 位,就无法取消设置它们。您应该仔细考虑启用此功能,因为这五条GPIO线将始终控制启动。虽然您可以在 Raspberry Pi 启动后将 GPIO 用于其他功能,但您必须设置它们,以便在 Raspberry Pi 启动时启用所需的启动模式。
若要启用 GPIO 启动模式,请将以下行添加到config.txt文件中:

program_gpio_bootmode=n

其中 n 是您希望使用的 GPIO 组。然后重新启动 Raspberry Pi 一次,以使用此设置对 OTP 进行编程。组 1 是 GPIO 22-26,组 2 是 GPIO 39-43。除非您有计算模块,否则必须使用组 1:组 2 中的 GPIO 仅在计算模块上可用。由于 OTP 位的排列方式,如果首先对组 1 的 GPIO 启动模式进行编程,则可以选择稍后选择组 2。反之则不然:一旦为 GPIO 引导模式选择了 bank 2,就无法选择 bank 1。
启用 GPIO 启动模式后,Raspberry Pi 将不再启动。您必须拉起至少一个引导模式 GPIO 引脚才能引导 Raspberry Pi。

引脚分配

Raspberry Pi 3B 和计算模块 3

Bank1Bank 2引导类型
2239SD0
2340SD1
2441NAND(目前不支持 Linux)
2542SPI(目前不支持 Linux)
2643USB接口

上表中的 USB 同时选择 USB 设备启动模式和 USB 主机启动模式。为了使用 USB 启动模式,必须在 OTP 存储器中启用它。有关详细信息,请参阅 USB 设备启动和 USB 主机启动

Later Raspberry Pi 3B (BCM2837B0 with the metal lid), Raspberry Pi 3A+, 3B+ 和 Compute Module 3+

Bank 1Bank 2引导类型
2037SD0
2138SD1
2239NAND(目前不支持 Linux)
2340SPI(目前不支持 Linux)
2441USB设备
2542USB 主机 - 大容量存储设备
2643USB 主机 - 以太网
注意各种启动模式按GPIO线的数字顺序进行尝试,即SD0,然后是SD1,然后是NAND等。

启动流程

SD0 是 Broadcom SD 卡/MMC 接口。当 SoC 中的引导 ROM 运行时,它始终将 SD0 连接到内置的 microSD 卡插槽。在具有 eMMC 设备的计算模块上,SD0 连接到该模块;在计算模块上,Lite SD0 在边缘连接器上可用,并连接到 CMIO 载板中的 microSD 卡插槽。SD1 是 Arasan SD 卡/MMC 接口,也支持 SDIO。所有内置无线局域网的树莓派型号都使用 SD1 通过 SDIO 连接到无线芯片。
GPIO线路上的默认拉电阻为50KΩ,如BCM2835 ARM外设数据表第102页所述。建议使用 5KΩ 的拉电阻来拉动 GPIO 线路:这将使 GPIO 能够正常工作,但不会消耗太多功率。

NVMe SSD 启动

NVMe(非易失性存储器)是通过 PCIe 总线访问外部存储的标准。您可以通过计算模块 4 (CM4) IO 板或 Raspberry Pi 5 上的 PCIe 插槽连接 NVMe 驱动器。通过一些额外的配置,您可以从 NVMe 驱动器启动。

先决条件

硬件

  • NVMe M.2 固态硬盘

  • 用于从 PCIe 转换为 M.2 标准的适配器。

    • 对于 Raspberry Pi 5,我们推荐 M.2 HAT+,它可以从 Raspberry Pi 的 PCIe FFC 插槽转换为 M Key 接口。

    • 对于 CM4,搜索“PCI-E 3.0 ×1 通道转 M.2 NGFF M-Key SSD NVMe PCI Express 适配器卡”

要检查您的 NVMe 驱动器是否正确连接,请从另一个存储设备(例如 SD 卡)启动您的 Raspberry Pi 并运行 ls -l /dev/nvme*。示例输出如下所示。

crw------- 1 root root 245, 0 Mar  9 14:58 /dev/nvme0
brw-rw---- 1 root disk 259, 0 Mar  9 14:58 /dev/nvme0n1

软件

运行以下命令以查看您正在运行的固件:

sudo rpi-eeprom-update

对于 Raspberry Pi 5,您需要 2023 年 12 月 6 日或之后发布的固件。
对于 CM4,NVMe 启动支持于 2021 年 7 月推出。您需要自该日期起发布的以下软件版本:

  • 引导加载程序

  • VideoCore 固件

  • Raspberry Pi OS Linux 内核

最新的 Raspberry Pi OS 版本拥有您需要的一切。使用 Raspberry Pi Imager 将 Raspberry Pi OS 映像安装到驱动器上。

编辑EEPROM引导顺序

对于 Raspberry Pi 5,您需要启动 Raspberry Pi OS 来编辑启动顺序。在此步骤中,您可以从 SD 卡或 USB 驱动器启动 Raspberry Pi。即使更换引导设备,EEPROM配置也会保留,因为EEPROM配置存储在电路板本身上。
使用 Raspberry Pi 配置 CLI 更新引导加载程序:

sudo raspi-config

在 Advanced Options > Bootloader Version (引导加载程序版本) 下,选择 Latest。然后,使用 Finish 或 Escape 键退出 raspi-config。
运行以下命令,将固件更新到最新版本。

sudo rpi-eeprom-update -a

然后,使用 sudo reboot 重新启动。您的 Raspberry Pi 5 应该从 NVMe 启动。
对于 CM4,请使用 rpiboot 更新引导加载程序。您可以在 USB 启动 GitHub 存储库中找到有关构建 rpiboot 和配置 IO 板以将 ROM 切换到 usbboot 模式的说明。
对于带有 eMMC 的 CM4 版本,请确保在引导顺序中首先设置 NVMe。请记住将 NVMe 启动模式 6 添加到 recovery/boot.conf 中的BOOT_ORDER。
当 SD 卡插槽为空时,CM4 Lite 会自动从 NVMe 启动。

NVMe BOOT_ORDER

EEPROM配置中的BOOT_ORDER设置控制引导行为。 对于 NVMe 启动,请使用 boot mode 。有关更多信息,请参阅 Raspberry Pi 引导加载程序配置

以下是引导加载程序检测到 NVMe 驱动器时的 UART 输出示例:

Boot mode: SD (01) order f64
Boot mode: USB-MSD (04) order f6
Boot mode: NVME (06) order f
VID 0x144d MN Samsung SSD 970 EVO Plus 250GB
NVME on

然后,它将找到一个 FAT 分区并加载 start4.elf:

Read start4.elf bytes  2937840 hnd 0x00050287 hash ''

然后,它将加载内核并启动操作系统:

MESS:00:00:07.096119:0: brfs: File read: /mfs/sd/kernel8.img
MESS:00:00:07.098682:0: Loading 'kernel8.img' to 0x80000 size 0x1441a00
MESS:00:00:07.146055:0:[    0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd083]

在 Linux 中,SSD 显示为 /dev/nvme0,“命名空间”显示为 /dev/nvme0n1。将有两个分区 /dev/nvme0n1p1 (FAT) 和 /dev/nvme0n1p2 (EXT4)。使用 lsblk 检查分区分配:

NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
nvme0n1     259:0    0 232.9G  0 disk
├─nvme0n1p1 259:1    0   256M  0 part /boot/firmware
└─nvme0n1p2 259:2    0 232.6G  0 part /

故障 排除

如果引导过程失败,请在 rpi-eeprom GitHub 存储库上提交问题,并确保在引导过程中附加控制台副本和屏幕上显示的任何内容。

HTTP 引导

网络安装功能使用以太网上的 HTTP 将 Raspberry Pi 启动到嵌入式 Raspberry Pi Imager

除了网络安装之外,您还可以使用通过 HTTP 下载的文件(使用 boot-mode 7)显式启动设备 。即使禁用了启动时的网络安装,您仍然可以使用它。

例如,您可以将其作为回退引导方法添加到BOOT_ORDER中,或者将其放在 GPIO 条件后面,以便在 GPIO 引脚被拉低时从您自己的服务器启动 HTTP 引导。

例如,如果将以下内容添加到EEPROM配置中,并且GPIO 8(默认状态为1或HIGH)将被拉低,则将下载文件 http://downloads.raspberrypi.org:80/net_install/boot.img 和 http://downloads.raspberrypi.org:80/net_install/boot.sig。如果启用了启动时的网络安装,它将使用相同的 URL。如果 GPIO 8 没有被拉低,则行为将保持不变。

[gpio8=0]
BOOT_ORDER=0xf7
HTTP_HOST=downloads.raspberrypi.org
NET_INSTALL_ENABLED=0

boot.img 和 boot.sig签名文件是包含引导文件系统的 RAM 磁盘。有关详细信息,请参阅boot_ramdisk
如果启用了安全启动且未设置HTTP_HOST,则BOOT_ORDER中的 HTTP将被忽略。

要求

要使用 HTTP 引导,请更新到 2022 年 3 月 10 日或更高版本发布的引导加载程序。HTTP 启动需要有线以太网连接。
要使用自定义 CA 证书,请更新到 2024 年 4 月 5 日或更高版本发布的引导加载程序。只有运行 BCM2712 CPU 的设备才支持自定义 CA 证书。

钥匙

所有 HTTP 下载都必须签名。引导加载程序包括默认主机 fw-download-alias1.raspberrypi.com 上文件的公钥。此密钥将用于验证网络安装映像,除非您设置HTTP_HOST并在 EEPROM 中包含公钥。这允许您在自己的服务器上托管 Raspberry Pi 网络安装映像。

警告使用您自己的网络安装映像将需要对映像进行签名并将公钥添加到 EEPROM。如果随后应用公共 EEPROM 更新,密钥将丢失,需要重新添加。

USBBOOT 具有对公钥进行编程所需的所有工具。

# Add your PUBLIC key to the eeprom. boot.conf contains your modifications
rpi-eeprom-config -c boot.conf -p mypubkey.pem -o pieeprom.upd pieeprom.original.bin

# Generate signature for your eeprom
rpi-eeprom-digest -i pieeprom.upd -o pieeprom.sig

# Sign the network install image with your PRIVATE key
# Put boot.img and boot.sig on your web server
rpi-eeprom-digest -i boot.img -o boot.sig -k myprivkey.pem

证书

为了安全起见,Network Install 使用 HTTPS 从 Raspberry Pi 网站下载操作系统映像。此功能使用引导加载程序中包含的我们自己的 CA 根目录来验证主机。
您可以将自己的自定义 CA 证书添加到设备 EEPROM,以便从自己的网站安全地下载图像。使用 rpi-eeprom-config 工具的 --cacertder 选项添加 DER 编码的证书。您必须在EEPROM配置设置中放置证书的哈希值,以确保证书不会被修改。
执行以下命令,生成DER编码证书。

openssl x509 -in your_ca_root_cert.pem -out cert.der -outform DER

然后,运行以下命令以生成证书的 SHA-256 哈希:

sha256sum cert.der

您应看到类似于以下内容的输出:

701bd97f67b0f5483a9734e6e5cf72f9a123407b346088638f597878563193fc  cert.der

接下来,更新 boot.conf 以包含证书的哈希值:

sudo rpi-eeprom-config --edit

在 [gpio8=0] 部分中配置以下设置,替换:

  • <your_website>与您的网站,例如yourserver.org

  • <path_to_files>以及托管在您网站上的操作系统映像的路径,例如path/to/files

  • <hash> 使用您上面生成的哈希值,例如 701bd97f67b0f5483a9734e6e5cf72f9a123407b346088638f597878563193fc

[all]
BOOT_UART=1
POWER_OFF_ON_HALT=0
BOOT_ORDER=0xf461

[gpio8=0]
BOOT_ORDER=0xf7
NET_INSTALL_ENABLED=0
HTTP_HOST=
HTTP_PATH=
HTTP_CACERT_HASH=

指定HTTP_CACERT_HASH时,网络安装将通过端口 443 使用 HTTPS 下载映像。如果没有哈希值,Network install 会通过端口 80 使用 HTTP 下载映像。
最后,使用以下命令将所有内容加载到 EEPROM 中:

rpi-eeprom-config -c boot.conf -p mypubkey.pem -o pieeprom.bin --cacertder cert.der pieeprom.original.bin
rpi-eeprom-digest -k myprivkey.pem -i pieeprom.bin -o pieeprom.sig

在网络启动期间,Raspberry Pi 应使用 HTTPS 而不是 HTTP。若要查看网络安装解析的完整 HTTPS URL 以进行下载,请检查启动输出:

Loading boot.img ...
HTTP: GET request for https://yourserver.org:443/path/to/files/boot.sig
HTTP: GET request for https://yourserver.org:443/path/to/files/boot.img

安全启动

如果启用了安全启动,则 Raspberry Pi 只能运行由客户私钥签名的代码。因此,如果要使用网络安装或 HTTP 启动模式进行安全启动,则必须对 boot.img 进行签名并使用自己的密钥生成 boot.sig,并将这些文件托管在某个位置以供下载。EEPROM中的公钥将用于验证映像。
如果启用了安全启动但未设置HTTP_HOST,则将禁用网络安装和 HTTP 启动。
有关安全启动的详细信息,请参阅 USBBOOT。

最新评论

友情链接:

返回顶部