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

Raspberry Pi 硬件(四)

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

简介:Raspberry Pi 硬件

Raspberry Pi 4 上的启动诊断

从 Raspberry Pi 4 引导加载程序版本 2020-04-16 开始,可以在启动时在 HDMI 显示器上显示诊断信息。要查看此诊断信息,请关闭 Raspberry Pi 4 电源,取出 SD 卡,然后重新打开电源。与下面类似的诊断显示应出现在连接的显示屏上。

如果引导加载程序无法从插入的 SD 卡引导,或者无法进行网络引导,也会出现此诊断页面;例如,如果卡上没有可启动映像,或者该映像有缺陷,或者网络启动参数不正确。
显示诊断页面后,只能通过重启设备电源(即拔下电源然后重新插入电源)来重新启动。
顶行描述了 Raspberry Pi 的型号及其内存容量。二维码是下载页面的链接。
诊断信息如下:

线:信息
bootloaderBootloader git version - RO (if EEPROM is write protected) - 软件构建日期
update-tsEEPROM配置更新时对应的时间戳。此时间戳在自我更新模式下进行检查,以避免更新到旧配置。
secure-boot如果启用了安全启动,则会显示处理器修订版 (B0/C0) 和签名启动状态标志。否则,此行为空。
board主板修订版 - 序列号 - 以太网MAC地址
bootmode(当前启动模式名称和编号)、顺序BOOT ORDER 配置)、重试(当前启动模式下的重试计数)、restart(启动模式列表中的循环次数)。
SDSD卡检测状态(检测到/未检测到)。
part主引导记录主分区类型:LBA。
fwstart.elf 的文件名和 fixup.dat(如果存在)(例如 start4x.elf、fixup4x.dat)。
net网络启动:链路状态(上/下)、客户端 IP 地址 (ip)、子网 (sn)、默认网关 (gw)
tftp网络启动:TFTP 服务器 IP 地址
display指示是否检测到热插拔 (HPD=1),如果是,是否成功读取每个 HDMI 输出的 EDID (EDID=ok)。

可以使用DISABLE_HDMI选项禁用此显示,请参阅引导加载程序配置

注意这纯粹用于诊断启动故障;它不是一个交互式引导加载程序。如果您需要交互式引导加载程序,请考虑使用 U-Boot 等工具。

Raspberry Pi 启动模式

Raspberry Pi 有许多不同的启动阶段。本文档介绍了引导模式的工作原理,以及 Linux 引导支持哪些模式。

特殊的仅bootcode.bin启动模式

USB 主机和以太网启动可以通过基于 BCM2837的 Raspberry Pi 执行 - 即 Raspberry Pi 2B 版本 1.2、Raspberry Pi 3B 和 Raspberry Pi 3B+(Raspberry Pi 3A+ 无法网络启动,因为它没有内置以太网接口)。此外,Raspberry Pi 4 之前的所有 Raspberry Pi 型号都可以使用仅限bootcode.bin的方法启用 USB 主机启动。
注意:Raspberry Pi 4 和 Raspberry Pi 5 不使用 bootcode.bin 文件。相反,引导加载程序位于板载 EEPROM 芯片中。请参阅有关 Raspberry Pi 引导流和 SPI 引导 EEPROM 的文档。
将 SD 卡格式化为 FAT32 并复制到最新的bootcode.bin。SD 卡必须存在于 Raspberry Pi 中才能启动。从 SD 卡加载bootcode.bin后,Raspberry Pi 将继续使用 USB 主机模式启动。
这对于基于 BCM2835 和 BCM2836 芯片的 Raspberry Pi 1、2 和 Zero 型号以及 Raspberry Pi 3 无法启动的情况非常有用(与刻录到BCM2837A0中的启动代码相比,最新bootcode.bin包括 Raspberry Pi 3B 的其他错误修复)。
如果您的大容量存储设备仍然无法正常工作,即使使用此bootcode.bin,请向 SD 卡添加一个名为“timeout”的新文件。这将延长到六秒,等待大容量存储设备初始化的时间。

bootcode.bin UART 使能

注意适用于早于 Raspberry Pi 4 Model B 的主板。

有关在 Raspberry Pi 4 引导加载程序上启用 UART 的信息,请参阅引导加载程序配置文档。
可以启用早期 UART 来调试引导问题(对上述仅bootcode.bin引导模式有用)。为此,请确保您拥有最新版本的固件(包括 bootcode.bin)。要检查当前固件是否支持 UART,请执行以下操作:

strings bootcode.bin | grep BOOT_UART

要从bootcode.bin启用 UART,请执行以下操作:

sed -i -e "s/BOOT_UART=0/BOOT_UART=1/" bootcode.bin

接下来,将合适的 USB 串行电缆连接到您的主机(Raspberry Pi 可以工作,尽管您可能会发现最简单的方法是使用 USB 串行电缆,因为它可以在没有任何讨厌的config.txt设置的情况下工作)。在 Raspberry Pi 或计算模块上使用标准引脚 6、8 和 10(GND、GPIO14、GPIO15)。
然后在 Linux 或 Mac 上使用 screen 或在 Windows 上使用 putty 连接到串行。
将串行设置为在 115200-8-N-1 接收,然后启动 Raspberry Pi。当bootcode.bin运行时,您应该会立即从设备获得串行输出。

启动顺序

重要:以下引导顺序仅适用于基于 BCM2837 和 BCM2837B0 的 Raspberry Pi 型号。在此之前的型号上,Raspberry Pi 将尝试 SD 卡启动,然后尝试 USB 设备模式启动。有关 Raspberry Pi 4 和 Raspberry Pi 5 启动顺序,请参阅 Raspberry Pi 4 和 Raspberry Pi 5 启动流程部分。
Raspberry Pi 3 上的 USB 启动默认值将取决于所使用的版本。有关在默认情况下未启用时启用 USB 启动模式的信息,请参阅此页面
当BCM2837启动时,它使用两个不同的源来确定要启用的启动模式。首先,检查一次性可编程 (OTP) 存储器块,以查看启用了哪些引导模式。如果启用了 GPIO 启动模式设置,则会测试相关的 GPIO 行,以选择应尝试哪种启用 OTP 的启动模式。请注意,GPIO 引导模式只能用于选择 OTP 中已启用的引导模式。有关配置 GPIO 引导模式的详细信息,请参阅 GPIO 引导模式。默认情况下,GPIO 引导模式处于禁用状态。
接下来,引导 ROM 检查每个引导源中是否存在一个名为 bootcode.bin 的文件;如果成功,它会将代码加载到本地 128K 缓存中并跳转到它。整个启动模式过程如下:

  • BCM2837 boots

  • 读取 OTP 以确定要启用的启动模式

  • 如果启用了 GPIO 启动模式,请使用 GPIO 启动模式来优化已启用启动模式的列表

  • 如果启用:检查主 SD 的 GPIO 48-53 上的bootcode.bin

    • 成功 - 启动

    • 失败 - 超时(五秒)

  • 如果启用:检查辅助 SD

    • 成功 - 启动

    • 失败 - 超时(五秒)

  • 如果启用:检查 NAND

  • 如果启用:检查 SPI

  • 如果启用:检查 USB

    • 如果 OTG 引脚 == 0

      • 启用 USB,等待有效的 USB 2.0 设备(两秒钟)

        • 找到的设备:

          • 如果设备类型 == 集线器

            • 每个端口的递归

          • 如果设备类型 ==(大容量存储或 LAN951x)

            • 存储在设备列表中

      • 通过每个 MSD 递归

        • 如果找到bootcode.bin启动

      • 通过每个 LAN951x 递归

        • DHCP / TFTP 引导

    • Else(设备模式引导)

      • 启用设备模式并等待主机 PC 枚举

      • 我们回复 PC VID: 0a5c PID: 0x2763 (Raspberry Pi 1 或 Raspberry Pi 2) 或 0x2764 (Raspberry Pi 3)

注意:

  • 如果未插入 SD 卡,则 SD 启动模式需要 5 秒钟才能失败。为了减少这种情况并更快地回退到 USB,您可以插入一个没有任何东西的 SD 卡,或者使用上述 GPIO 启动模式 OTP 设置仅启用 USB。

  • GPIO 的默认拉取在 ARM 外设数据表的第 102 页中定义。如果启动时的值不等于默认拉取,则启用该启动模式。

  • USB 枚举是一种为集线器上的下游设备供电的方法,然后等待设备拉取 D+ 和 D- 线以指示它是 USB 1 还是 USB 2。这可能需要一些时间:在某些设备上,硬盘驱动器最多可能需要三秒钟才能启动并启动枚举过程。因为这是检测硬件是否已连接的唯一方法,所以我们必须等待最短的时间(两秒)。如果设备在此最大超时后无法响应,则可以在 config.txt 中使用 program_usb_boot_timeout=1 将超时增加到 5 秒。

  • MSD 引导优先于以太网引导。

  • 不再需要第一个分区是 FAT 分区,因为 MSD 启动将继续搜索第一个分区之外的 FAT 分区。

  • 启动 ROM 现在还支持 GUID 分区,并且已经过使用 Mac、Windows 和 Linux 分区的硬盘驱动器的测试。

  • LAN951x 使用供应商 ID 0x0424和产品 ID 0xec00 进行检测:这与产品 ID 为 0x9500 或 0x9e00 的独立 LAN9500 设备不同。要使用独立LAN9500,需要添加一个 I2C EEPROM 来更改这些 ID 以匹配 LAN951x。

主 SD 卡启动模式标准设置为 GPIO 49-53。可以从第二组引脚上的辅助 SD 卡启动,即将辅助 SD 卡添加到 GPIO 引脚。但是,我们尚未启用此功能。
NAND 启动和 SPI 启动模式确实有效,尽管它们还没有完整的 GPU 支持。
默认情况下,USB 设备启动模式在制造时处于启用状态,但 USB 主机启动模式仅在 program_usb_boot_mode=1 时启用。启用后,处理器将使用处理器上的 OTGID 引脚值在两种模式之间做出决定。在任何 Raspberry Pi 型号 B/B+ 上,OTGID 引脚被驱动为 0,因此只有在启用后才会通过主机模式启动(由于 LAN951x 设备挡路,因此无法通过设备模式启动)。
如果 OTGID 引脚处于浮动状态(例如,插入 PC 时),USB 将作为 Raspberry Pi Zero 或计算模块上的 USB 设备启动,因此您可以将bootcode.bin推入设备。用于执行此操作的 usbboot 代码可在 GitHub 上找到。

Raspberry Pi 4 和 Raspberry Pi 5 启动流程

这些产品与以前的产品之间的主要区别在于,第二阶段引导加载程序是从SPI闪存EEPROM加载的,而不是像以前的产品那样从bootcode.bin文件加载的。

第一阶段引导加载程序

ROM 的引导流程(第一阶段)如下:

  • SoC 上电

  • 读取 OTP 以确定是否配置了 nRPIBOOT GPIO

  • 如果 nRPIBOOT GPIO 为高电平或 OTP 未定义 nRPIBOOT GPIO

    • 检查 OTP 以查看是否可以从 SD/EMMC 加载recovery.bin

      • 如果启用了 SD recovery.bin,请检查主 SD/EMMC 是否有recovery.bin

        • 成功 - 运行recovery.bin并更新 SPI EEPROM

        • 失败 - 继续

    • 检查第二级加载器的SPI EEPROM

      • 成功 - 运行第二阶段引导加载程序

      • 失败 - 继续

  • 虽然是真的

    • 尝试从 USB 设备启动加载recovery.bin

      • 成功 - 运行recovery.bin并更新SPI EEPROM或切换到USB大容量存储设备模式

      • 失败 - 重试 USB 设备启动

注意:recovery.bin是一个最小的第二级程序,用于刷新引导加载程序SPI EEPROM映像。

第二阶段引导加载程序

本节介绍第二阶段引导加载程序的高级流程。
有关每种引导模式的更多信息,请参阅引导加载程序配置页面,有关此阶段加载的 GPU 固件文件的描述,请参阅引导文件夹页面。

  • 初始化时钟和 SDRAM

  • 读取EEPROM配置文件

  • 检查PM_RSTS寄存器以确定是否请求 HALT

    • 检查POWER_OFF_ON_HALT和WAKE_ON_GPIO EEPROM配置设置

    • 如果 POWER_OFF_ON_HALT 是 1,WAKE_ON_GPIO 是 0,则

      • 使用PMIC关闭系统电源

    • 否则,如果 WAKE_ON_GPIO 为 1

      • 使能 GPIO3 上的下降沿中断,以便在 GPIO3 被拉低时唤醒

  • 虽然是真的

    • 从EEPROM配置文件的BOOT_ORDER参数中读取下一个引导模式。

    • 如果引导模式 ==RESTART

      • 跳回BOOT_ORDER字段中的第一个引导模式

    • 否则,如果启动模式 ==STOP

    • 否则,如果启动模式 ==SD CARD

      • 尝试从 SD 卡加载固件

        • 成功 - 运行固件

        • 失败 - 继续

    • 否则,如果 boot-mode == NETWORK 那么

      • 使用 DHCP 协议请求 IP 地址

      • 从DHCP或静态定义的TFTP服务器加载固件

      • 如果找不到固件或发生超时或网络错误,请继续

    • 否则,如果 boot-mode == USB-MSD 或 boot-mode == BCM-USB-MSD 那么

      • 虽然 USB 发现未超时

        • 检查 USB 大容量存储设备

        • 如果找到新的大容量存储设备,则

          • 对于每个驱动器 (LUN)

            • 尝试加载固件

              • 成功 - 运行固件

              • 失败 - 前进到下一个 LUN

    • 否则,如果 boot-mode == NVME 那么

      • 扫描 PCIe 以查找 NVMe 设备(如果找到)

        • 尝试从 NVMe 设备加载固件

          • 成功 - 运行固件

          • 失败 - 继续

    • 否则,如果boot-mode == RPIBOOT那么

      • 尝试使用 USB 设备模式从 USB OTG 端口加载固件 - 请参阅 USB 启动。RPIBOOT模式没有超时。

Raspberry Pi 5 的差异

  • 电源按钮用于从 PMIC STANDBY 或 HALT 唤醒,而不是 GPIO 3。

  • 固件不会加载 start.elf,而是加载 Linux 内核。实际上,引导加载程序具有 start.elf 的嵌入式版本。

  • 默认情况下,USB 启动在连接到 3A 电源时处于禁用状态。在 /boot/firmware/config.txt 中设置 usb_max_current_enable=1 以启用 USB 启动。或者,您可以在失败的 USB 启动上按一次电源按钮以暂时启用usb_max_current_enable并继续启动。但是,如果通过按电源按钮启用此设置,则此设置在重新启动后不会保留。

引导加载程序更新

如果找到pieeprom.upd文件,也可以在固件启动之前更新引导加载程序。有关引导加载程序更新的更多信息,请参阅引导加载程序 EEPROM 页面。

最新评论

友情链接:

返回顶部