Raspberry Pi 硬件

简介

Raspberry Pi 电脑分为几个不同的系列:

  • 旗舰 系列通常简称为 "Raspberry Pi",提供高性能硬件、完整的 Linux 操作系统和各种常用端口,外形尺寸与信用卡差不多。

  • Keyboard 系列提供高性能旗舰硬件、完整的 Linux 操作系统,并在键盘外形中捆绑了各种常用端口。

  • Zero 系列提供完整的 Linux 操作系统和基本端口,价格实惠,外形小巧,功耗低。

  • 计算模块 系列,通常简称为 "CM",在适合工业和嵌入式应用的最小外形中提供高性能硬件和完整的 Linux 操作系统。Compute Module 型号的硬件与相应的旗舰型号相当,但端口较少,没有板载 GPIO 引脚。用户应将计算模块连接到一个单独的底板上,该底板可提供特定应用所需的端口和引脚。

此外,Raspberry Pi 还生产 Pico 系列小巧、多功能的 微控制器板。Pico 型号不运行 Linux,也不允许使用可移动存储器,而是允许通过将二进制文件闪存到板载Flash上进行编程。

旗舰系列

型号 B 表示有以太网端口。 型号 A 表示成本较低的型号,外形较小,没有以太网端口,内存减少,USB 端口减少,以限制电路板高度。

Model SoC Memory GPIO Connectivity
Raspberry Pi Model B
Raspberry Pi Model B

BCM2835

256MB

512MB

26-pin GPIO header

  • HDMI

  • 2× USB 2.0

  • standard 15-pin, 1.0mm pitch, 16mm width, CSI (camera) port

  • standard 15-pin, 1.0mm pitch, 16mm width, DSI (display) port

  • 3.5mm audio jack

  • RCA composite video

  • 100Mb/s Ethernet RJ45

  • SD card slot

  • micro USB power

Raspberry Pi Model A
Raspberry Pi Model A

BCM2835

256MB

26-pin GPIO header

  • HDMI

  • USB 2.0

  • standard 15-pin, 1.0mm pitch, 16mm width, CSI (camera) port

  • standard 15-pin, 1.0mm pitch, 16mm width, DSI (display) port

  • 3.5mm audio jack

  • RCA composite video

  • SD card slot

  • micro USB power

Raspberry Pi Model B+
Raspberry Pi Model B+

BCM2835

512MB

40-pin GPIO header

  • HDMI

  • 4× USB 2.0

  • standard 15-pin, 1.0mm pitch, 16mm width, CSI (camera) port

  • standard 15-pin, 1.0mm pitch, 16mm width, DSI (display) port

  • 3.5mm AV jack

  • 100Mb/s Ethernet RJ45

  • microSD card slot

  • micro USB power

Raspberry Pi Model A+
Raspberry Pi Model A+

BCM2835

256MB

512MB

40-pin GPIO header

  • HDMI

  • USB 2.0

  • standard 15-pin, 1.0mm pitch, 16mm width, CSI (camera) port

  • standard 15-pin, 1.0mm pitch, 16mm width, DSI (display) port

  • 3.5mm AV jack

  • microSD card slot

  • micro USB power

Raspberry Pi 2 Model B
Raspberry Pi 2 Model B

BCM2836 (in version 1.2, switched to BCM2837)

1 GB

40-pin GPIO header

  • HDMI

  • 4× USB 2.0

  • standard 15-pin, 1.0mm pitch, 16mm width, CSI (camera) port

  • standard 15-pin, 1.0mm pitch, 16mm width, DSI (display) port

  • 3.5mm AV jack

  • 100Mb/s Ethernet RJ45

  • microSD card slot

  • micro USB power

Raspberry Pi 3 Model B
Raspberry Pi 3 Model B

BCM2837

1 GB

40-pin GPIO header

  • HDMI

  • 4× USB 2.0

  • standard 15-pin, 1.0mm pitch, 16mm width, CSI (camera) port

  • standard 15-pin, 1.0mm pitch, 16mm width, DSI (display) port

  • 3.5mm AV jack

  • 100Mb/s Ethernet RJ45

  • 2.4GHz single-band 802.11n Wi-Fi (35Mb/s)

  • Bluetooth 4.1, Bluetooth Low Energy (BLE)

  • microSD card slot

  • micro USB power

Raspberry Pi 3 Model B+
Raspberry Pi 3 Model B+

BCM2837b0

1GB

40-pin GPIO header

  • HDMI

  • 4× USB 2.0

  • standard 15-pin, 1.0mm pitch, 16mm width, CSI (camera) port

  • standard 15-pin, 1.0mm pitch, 16mm width, DSI (display) port

  • 3.5mm AV jack

  • 300Mb/s Ethernet RJ45 with PoE support

  • 2.4/5GHz dual-band 802.11ac Wi-Fi (100Mb/s)

  • Bluetooth 4.2, Bluetooth Low Energy (BLE)

  • microSD card slot

  • micro USB power

Raspberry Pi 3 Model A+
Raspberry Pi 3 Model A+

BCM2837b0

512 MB

40-pin GPIO header

  • HDMI

  • USB 2.0

  • standard 15-pin, 1.0mm pitch, 16mm width, CSI (camera) port

  • standard 15-pin, 1.0mm pitch, 16mm width, DSI (display) port

  • 3.5mm AV jack

  • 2.4/5GHz dual-band 802.11ac Wi-Fi (100Mb/s)

  • Bluetooth 4.2, Bluetooth Low Energy (BLE)

  • microSD card slot

  • micro USB power

Raspberry Pi 4 Model B
Raspberry Pi 4 Model B

BCM2711

1GB

2GB

4GB

8GB

40-pin GPIO header

  • 2× micro HDMI

  • 2× USB 2.0

  • 2× USB 3.0

  • standard 15-pin, 1.0mm pitch, 16mm width, CSI (camera) port

  • standard 15-pin, 1.0mm pitch, 16mm width, DSI (display) port

  • 3.5mm AV jack

  • Gigabit (1Gb/s) Ethernet RJ45 with PoE+ support

  • 2.4/5GHz dual-band 802.11ac Wi-Fi (120Mb/s)

  • Bluetooth 5, Bluetooth Low Energy (BLE)

  • microSD card slot

  • USB-C power (5V 3A (15W))

Raspberry Pi 5
Raspberry Pi 5

BCM2712

2GB

4GB

8GB

16GB

40-pin GPIO header

  • 2× micro HDMI

  • 2× USB 2.0

  • 2× USB 3.0

  • 2× mini 22-pin, 0.5mm (fine) pitch, 11.5mm width, combined CSI (camera)/DSI (display) ports

  • single-lane PCIe FFC connector

  • UART connector

  • RTC battery connector

  • four-pin JST-SH PWM fan connector

  • Gigabit (1Gb/s) Ethernet RJ45 with PoE+ support

  • 2.4/5GHz dual-band 802.11ac Wi-Fi 5 (300Mb/s)

  • Bluetooth 5, Bluetooth Low Energy (BLE)

  • microSD card slot

  • USB-C power (5V 5A (25W), or 5V 3A (15W) with a 600mA peripheral limit)

有关 Raspberry Pi 旗舰系列端口的更多信息,请参阅 原理图和机械图纸

Keyboard series

键盘系列设备使用形式为 <X00> 的型号标识符,其中 X 表示相应的旗舰系列设备。例如,"Raspberry Pi 500" 是 Raspberry Pi 5 的键盘版本。

Model SoC Memory GPIO Connectivity
Raspberry Pi 400
Raspberry Pi 400

BCM2711

4GB

40-pin GPIO header

  • 2× micro HDMI

  • USB 2.0

  • 2× USB 3.0

  • Gigabit (1Gb/s) Ethernet RJ45

  • 2.4/5GHz dual-band 802.11ac Wi-Fi (120Mb/s)

  • Bluetooth 5, Bluetooth Low Energy (BLE)

  • microSD card slot

  • USB-C power (5V 3A (15W))

Raspberry Pi 500
Raspberry Pi 500

BCM2712

8GB

40-pin GPIO header

  • 2× micro HDMI

  • USB 2.0

  • 2× USB 3.0

  • Gigabit (1Gb/s) Ethernet RJ45

  • 2.4/5GHz dual-band 802.11ac Wi-Fi 5 (300Mb/s)

  • Bluetooth 5, Bluetooth Low Energy (BLE)

  • microSD card slot

  • USB-C power (5V 5A (25W), or 5V 3A (15W) with a 600mA peripheral limit)

Zero series

后缀为 H 的型号已将针脚预焊在 GPIO 针脚上。没有 H 后缀的型号没有连接到 GPIO 针座的针座引脚;用户必须手动焊接引脚或安装第三方引脚套件。

所有 Zero 型号都具有以下连接功能:

  • a microSD card slot

  • a mini HDMI port

  • 2× micro USB ports (one for input power, one for external devices)

Since version 1.3 of the original Zero, all Zero models also include:

  • a mini 22-pin, 0.5mm (fine) pitch, 11.5mm width, CSI (camera) port

Model SoC Memory GPIO Wireless Connectivity
Raspberry Pi Zero
Raspberry Pi Zero

BCM2835

512MB

40-pin GPIO header (unpopulated)

none

Raspberry Pi Zero W
Raspberry Pi Zero W

BCM2835

512MB

40-pin GPIO header (unpopulated)

  • 2.4GHz single-band 802.11n Wi-Fi (35Mb/s)

  • Bluetooth 4.0, Bluetooth Low Energy (BLE)

Raspberry Pi Zero WH
Raspberry Pi Zero WH

BCM2835

512MB

40-pin GPIO header

  • 2.4GHz single-band 802.11n Wi-Fi (35Mb/s)

  • Bluetooth 4.0, Bluetooth Low Energy (BLE)

Raspberry Pi Zero 2 W
Raspberry Pi Zero 2 W

RP3A0

512MB

40-pin GPIO header (unpopulated)

  • 2.4GHz single-band 802.11n Wi-Fi (35Mb/s)

  • Bluetooth 4.2, Bluetooth Low Energy (BLE)

Raspberry Pi Zero 2 WH
Raspberry Pi Zero 2 WH

RP3A0

512MB

40-pin GPIO header

  • 2.4GHz single-band 802.11n Wi-Fi (35Mb/s)

  • Bluetooth 4.2, Bluetooth Low Energy (BLE)

Compute Module series

Model SoC Memory Storage Form factor Wireless Connectivity
Raspberry Pi Compute Module 1
Raspberry Pi Compute Module 1

BCM2835

512MB

4GB

DDR2 SO-DIMM

none

Raspberry Pi Compute Module 3
Raspberry Pi Compute Module 3

BCM2837

1GB

0GB (Lite)

4GB

DDR2 SO-DIMM

none

Raspberry Pi Compute Module 3+
Raspberry Pi Compute Module 3+

BCM2837b0

1GB

0GB (Lite)

8GB

16GB

32GB

DDR2 SO-DIMM

none

Raspberry Pi Compute Module 4S
Raspberry Pi Compute Module 4S

BCM2711

1GB

2GB

4GB

8GB

0GB (Lite)

8GB

16GB

32GB

DDR2 SO-DIMM

none

Raspberry Pi Compute Module 4
Raspberry Pi Compute Module 4

BCM2711

1GB

2GB

4GB

8GB

0GB (Lite)

8GB

16GB

32GB

dual 100-pin high density connectors

optional:

  • 2.4/5GHz dual-band 802.11ac Wi-Fi 5 (300Mb/s)

  • Bluetooth 5, Bluetooth Low Energy (BLE)

Raspberry Pi Compute Module 5
Raspberry Pi Compute Module 5

BCM2712

2GB

4GB

8GB

0GB (Lite)

16GB

32GB

64GB

dual 100-pin high density connectors

optional:

  • 2.4/5GHz dual-band 802.11ac Wi-Fi 5 (300Mb/s)

  • Bluetooth 5, Bluetooth Low Energy (BLE)

Note
使用 DDR2 SO-DIMM 物理外形尺寸的计算模块与 DDR2 SO-DIMM 电气规格 兼容。

有关 Raspberry Pi 计算模块的更多信息,请参阅 计算模块文档

Pico microcontrollers

后缀为 H 的型号已将针脚预焊在 GPIO 针脚上。没有 H 后缀的型号没有连接到 GPIO 针座的针座引脚;用户必须手动焊接引脚或安装第三方引脚套件。

Model SoC Memory Storage GPIO Wireless Connectivity
Raspberry Pi Pico
Raspberry Pi Pico

RP2040

264KB

2MB

two 20-pin GPIO headers (unpopulated)

none

Raspberry Pi Pico H
Raspberry Pi Pico H

RP2040

264KB

2MB

two 20-pin GPIO headers

none

Raspberry Pi Pico W
Raspberry Pi Pico W

RP2040

264KB

2MB

two 20-pin GPIO headers (unpopulated)

* 2.4GHz single-band 802.11n Wi-Fi (10Mb/s) * Bluetooth 5.2, Bluetooth Low Energy (BLE)

Raspberry Pi Pico WH
Raspberry Pi Pico WH

RP2040

264KB

2MB

two 20-pin GPIO headers

* 2.4GHz single-band 802.11n Wi-Fi (10Mb/s) * Bluetooth 5.2, Bluetooth Low Energy (BLE)

Raspberry Pi Pico 2
Raspberry Pi Pico 2

RP2350

520KB

4MB

two 20-pin GPIO headers (unpopulated)

none

Raspberry Pi Pico 2 W
Raspberry Pi Pico 2 W

RP2350

520KB

4MB

two 20-pin GPIO headers (unpopulated)

  • 2.4GHz single-band 802.11n Wi-Fi (10Mb/s)

  • Bluetooth 5.2, Bluetooth Low Energy (BLE)

有关 Raspberry Pi Pico 型号的更多信息,请参阅 Pico 文档

Schematics and mechanical drawings

Schematics for the various Raspberry Pi board versions:

Raspberry Pi 5

Raspberry Pi 2 Model B

Raspberry Pi 1 Model A+

Note
Mechanical drawings for the Raspberry Pi 3 Model A+ are also applicable to the Raspberry Pi 1 Model A+.

Raspberry Pi Zero 2 W

Test pad locations

The Raspberry Pi Zero 2 W has a number of test pad locations used during production of the board.

zero2 pad diagram
Label Function X (mm from origin) Y (mm from origin)

STATUS_LED

Power state of LED (LOW = ON)

5.15

8.8

CORE

Processor power

6.3

18.98

RUN

Connect to GND to reset

8.37

22.69

5V

5V input

8.75

11.05

5V

5V input

11.21

6.3

GND

Ground pin

10.9

3.69

GND

Ground pin

17.29

2.41

USB_DP

USB port

22.55

1.92

USB_DM

USB port

24.68

1.92

OTG

On-the-go ID pin

39.9

7.42

1V8

1.8V analog supply

42.03

8.42

TV

Composite TV out

45.58

3.17

GND

Ground pin

49.38

3.05

GND

Ground pin

55.99

22.87

3V3

3.3V I/O supply

48.55

22.44

SD_CLK

SD Card clock pin

60.95

18.45

SD_CMD

SD Card command pin

58.2

16.42

SD_DAT0

SD data pin

58.13

20.42

SD_DAT1

SD data pin

60.65

21.1

SD_DAT2

SD data pin

57.78

13.57

SD_DAT3

SD data pin

60.8

15.22

BT_ON

Bluetooth power status

25.13

19.55

WL_ON

Wireless LAN power status

27.7

19.2

产品合规性和安全性

所有Raspberry Pi产品都经过了广泛的合规性测试。有关详细信息,请参阅 产品信息门户

易燃等级

Raspberry Pi设备中使用的PCB符合UL94-V0。

Note
这仅适用于多氯联苯。

树莓派合规支持

合规性支持计划旨在消除浏览合规性问题的负担,并使公司更容易将新产品带给消费者。它提供了在合规性测试期间为我们的树莓派工作的相同测试工程师的访问权限,将用户与 UL 的一个专门团队联系起来,该团队通过他们对树莓派的深入了解来评估和测试用户的产品。

了解有关 Raspberry Pi合规支持计划 的更多信息。

由树莓派提供支持

树莓派计划为希望使用树莓派标志的公司提供了一个流程,涵盖了内部有树莓派电脑或silicon的产品,以及树莓派提供的服务。如果你想开始申请,你可以 在线 申请。

认可的设计合作伙伴

我们的 认可设计合作伙伴 名单提供了一系列我们密切合作和支持的咨询公司,因此他们可以在硬件、软件和机械领域提供付费设计服务。

频率管理和热控制

所有Raspberry Pi型号都执行一定程度的热管理,以避免在重载下过热。SoC有一个内部温度传感器,GPU上的软件会轮询该传感器以确保温度不超过我们定义的所有型号的85°C限制。可以将其设置为较低的值,但不能设置为较高的值。随着设备接近极限,芯片(Arm、GPU)上使用的各种频率有时甚至电压都会降低。这减少了产生的热量,保持了温度可控。

当内核温度在80°C到85°C之间时,Arm内核将逐步节流。如果温度达到85°C,Arm内核和GPU都将被节流。

对于Raspberry Pi 3 Model B+,PCB技术进行了更改,以提供更好的散热和增加的热质量。此外,还引入了软温度限制,目标是最大限度地延长设备在达到85°C的硬限制之前可以 冲刺 的时间。当达到软限制时,时钟速度从1.4GHz降低到1.2GHz,工作电压略有降低。这降低了温度上升的速度:我们将1.4GHz的短周期换成1.2GHz的较长周期。默认情况下,软限制为60°C,这可以通过 config.txt 中的 temp_soft_limit 设置进行更改。

Raspberry Pi 4 Model B继续采用与Raspberry Pi 3 Model B+相同的PCB技术,以帮助散发多余的热量。目前没有定义软限制。

使用DVFS

Note
DVFS的讨论仅适用于4-系列产品(Raspberry Pi 4 Model B、Raspberry Pi 400 和 Compute Module 4,Pi 400)。

Raspberry Pi 4设备实现动态电压和频率缩放(DVFS)。这种技术允许Raspberry Pi 4设备在较低温度下运行,同时仍能提供相同的性能。

SoC 内部的各种时钟(如 Arm、Core、V3D、ISP、H264、HEVC)都受到固件的监控,只要它们不是以全速运行,提供给由时钟驱动的芯片特定部分的电压就会相对于全速降低。实际上,只需提供足够的电压,就能保证模块以特定的速度正常运行。这可以显著降低 SoC 的功耗,从而减少产生的总热量。

由于低电压运行可能涉及系统稳定性问题,尤其是在使用低电压固定时钟外设(如 PCIe)时,因此有三种 DVFS 模式可用,可在 /boot/firmware/config.txt 中使用以下属性进行配置。大多数系统应使用 dvfs=3 ,无显示器系统可能会因使用 dvfs=1 而略微降低功耗,但有可能出现 PCIe 稳定性问题。

属性=值 描述

dvfs=1

允许欠压

dvfs=2

默认工作频率的固定电压

dvfs=3

如果在 config.txt 中指定了 over_voltage ,则禁用动态电压缩放,导致系统恢复为 dvfs=2

Note
此设置已在5-系列设备上删除,并且实际上始终处于模式3。

此外,更步进的中央处理器调速器也用于对ARM核心频率进行更细粒度的控制,这意味着DVFS更有效。这些步骤现在是1500MHz、1000MHz、750MHz和600MHz。当SoC被节流时,这些步骤也会有所帮助,这意味着一路节流回600MHz的可能性要小得多,从而全面提高满载性能。

默认 CPU 调速器为 ondemand 。可以使用 cpufreq-set 命令(来自 cpufrequtils 软件包)手动更改调速器,以减少空闲功耗:

$ sudo apt install cpufrequtils
$ sudo cpufreq-set -g powersave

测量温度

由于树莓派设备上使用的SoC的架构,以及树莓派操作系统发行版中上游温度监控代码的使用,基于Linux的温度测量可能不准确。然而, vcgencmd 命令提供当前SoC温度的准确瞬时读数,因为它直接与GPU通信:

$ vcgencmd measure_temp

添加散热器

由于内置节流功能,因此不需要散热片来防止 SoC 过热损坏。不过,散热片或小型风扇可以减少热节流并提高性能。垂直安装 Raspberry Pi 可获得最佳气流,从而略微改善散热。

风扇外壳

为确保 Raspberry Pi 的最佳性能,请使用主动冷却解决方案,如风扇。Raspberry Pi 固件可管理所有官方风扇的转速。

Raspberry Pi 4 风扇

对于 Raspberry Pi 4,将 Raspberry Pi 4 外壳风扇 添加到 Raspberry Pi 4 外壳的盖子上。

Raspberry Pi 5 风扇

Raspberry Pi 5可以使用下列选项之一来帮助冷却:

Raspberry Pi 5 的两个风扇选项都插入了位于电路板右上方 40 针 GPIO 接头和 USB 2 端口之间的四针 JST-SH PWM 风扇接头。风扇连接器的电流限制与 USB 外围设备相同。我们向超频者推荐 Active Cooler 机箱,因为它能提供更好的散热性能。

当 Raspberry Pi 5 的温度升高时,风扇的反应如下:

  • 50°C以下,风扇停止(0%转速)

  • 50°C,风扇低速开启(30%转速)

  • 在60°C时,风扇转速增加到中速(50%转速)

  • 在67.5°C时,风扇转速提升至高速(70%转速)

  • 在75°C风扇增加到全速(100%速度)

温度降低使用具有5°C滞后的相同映射;当温度下降到低于上述每个阈值的5°C时,风扇速度会降低。

启动时风扇打开,转速表输入检查风扇是否在旋转。如果是,则启用 cooling_fan 设备树overlay。默认情况下,此overlay位于 bcm2712-rpi-5-b.dtb 中,但带有 status=disabled

Raspberry Pi 5 风扇连接器引脚

Raspberry Pi 5 风扇连接器是一个1mm间距的JST-SH插座,包含以下四个引脚:

引脚

功能

线材颜色

1

+5V

红色

2

PWM

蓝色

3

GND

黑色

4

Tach

黄色

树莓派启动EEPROM

以下 Raspberry Pi 型号使用 EEPROM 启动系统:

  • 自 Raspberry Pi 4B 起的旗舰机型

  • 从 CM4 开始的计算模块型号(包括 CM4S)

  • 自 Pi 400 起带键盘的型号

所有其他型号的 Raspberry Pi 计算机都使用位于启动文件系统中的 bootcode.bin 文件。

Note
您可以在 rpi-eeprom GitHub存储库 中找到用于创建 rpi-eeprom 的脚本和预编译二进制文件。

诊断

如果在启动过程中发生错误,则会通过绿色 LED 显示 错误代码。较新版本的引导加载程序将在所有 HDMI 显示屏上显示 诊断信息

更新引导加载程序

有多种方法可以更新Raspberry Pi的引导加载程序。

旗舰型号自 Raspberry Pi 4B 开始;计算模块自 CM5 开始;键盘型号自 Pi 400 开始

Raspberry Pi OS 会自动更新引导加载程序以修复重要错误。要手动更新引导加载器或更改启动顺序,请使用 raspi-config

Note
计算模块 4 和计算模块 4S 不支持自动引导加载程序更新,因为引导rom 无法从 eMMC 加载`recovery.bin`文件。推荐的更新机制是 rpiboot 或通过 flashrom - 请参阅 rpi-eeprom-update -h 获取更多信息。

使用 Raspberry Pi Imager 更新引导加载程序

Raspberry Pi Imager提供了一个用于更新引导加载程序和选择引导模式的GUI。

  1. 下载 Raspberry Pi Imager

  2. 选择一张备用 SD 卡(引导加载程序映像会格式化整张卡)

  3. 启动 Raspberry Pi Imager

  4. 选择 Choose OS

  5. 选择 Misc utility images

    Select Misc utility images
  6. 为您的 Raspberry Pi 版本选择 Bootloader(Pi 400 属于 4 系列)。

    Choose a family for your bootloader
  7. 选择启动模式: SD (推荐), USBNetwork

    Choose the storage from which you’d like to boot
  8. 选择 SD card,然后选择 Write

  9. 单击 Yes 继续

  10. 使用新映像启动树莓派,等待至少十秒钟

  11. 当绿色活动 LED 以稳定模式闪烁且 HDMI 显示屏显示绿色屏幕时,您已成功写入引导加载程序。

  12. 关闭 Raspberry Pi 电源并取出 SD 卡

使用 raspi-config 更新引导加载程序

要从Raspberry Pi OS中更改引导模式或引导加载程序版本,请运行 raspi-config

  1. Update Raspberry Pi OS 获取最新版本的 rpi-eeprom 软件包。

  2. 运行 sudo raspi-config

  3. 选择 Advanced Options

  4. 选择 Bootloader Version.

  5. 选择 Default(出厂默认设置)或 Latest (最新的引导加载程序版本)。

  6. 使用 sudo reboot 重新启动。

更新引导加载程序配置

引导加载程序的 default 版本代表最新的出厂默认固件镜像。它更新以提供关键bug修复、硬件支持,并在 latest 版本中测试功能后定期更新。 latest 引导加载程序更频繁地更新以包含最新的修复和改进。

高级用户可以切换到 latest 引导加载程序以获取最新功能。

首先确保你的设备正在使用最新的软件,运行下面命令升级软件: 运行以下命令启动 raspi-config

$ sudo apt update && sudo apt full-upgrade

然后使用以下命令打开 raspi-config:

$ sudo raspi-config

导航到 Advanced Options ,然后导航到 Bootloader Version 。选择 Latest 并选择 Yes 以确认。选择 Finish 并确认您要重新启动。重新启动后,再次打开命令提示符并更新您的系统:

$ sudo apt update

如果您运行 sudo rpi-eeprom-update ,您应该会看到引导加载程序的最新版本可用,并且是最新版本。

*** UPDATE AVAILABLE ***
BOOTLOADER: update available
   CURRENT: Thu 18 Jan 13:59:23 UTC 2024 (1705586363)
    LATEST: Mon 22 Jan 10:41:21 UTC 2024 (1705920081)
   RELEASE: latest (/lib/firmware/raspberrypi/bootloader-2711/latest)
            Use raspi-config to change the release.

  VL805_FW: Using bootloader EEPROM
     VL805: up to date
   CURRENT: 000138c0
    LATEST: 000138c0

现在您可以更新您的引导加载程序。

$ sudo rpi-eeprom-update -a
$ sudo reboot

重新启动,然后运行 sudo rpi-eeprom-update 。您现在应该看到 CURRENT 日期已更新到引导加载程序的最新版本:

BOOTLOADER: up to date
   CURRENT: Mon 22 Jan 10:41:21 UTC 2024 (1705920081)
    LATEST: Mon 22 Jan 10:41:21 UTC 2024 (1705920081)
   RELEASE: latest (/lib/firmware/raspberrypi/bootloader-2711/latest)
            Use raspi-config to change the release.

  VL805_FW: Using bootloader EEPROM
     VL805: up to date
   CURRENT: 000138c0
    LATEST: 000138c0

读取当前引导程序配置

要查看当前运行的引导加载程序所使用的配置,请运行以下命令:

$ rpi-eeprom-config

从引导加载程序映像读取配置

要从引导加载程序镜像中读取配置:

$ rpi-eeprom-config pieeprom.bin

编辑当前引导加载程序配置

以下命令将当前引导加载程序配置加载到文本编辑器中。当编辑器关闭时, rpi-eeprom-config 将更新后的配置应用于最新可用的引导加载程序版本,并使用 rpi-eeprom-update 在系统重新启动时安排更新:

$ sudo -E rpi-eeprom-config --edit
$ sudo reboot

如果更新的配置相同或为空,则不进行任何更改。

编辑器由 EDITOR 环境变量选择。

应用保存的配置

以下命令将 boot.conf 应用于最新可用的引导加载程序镜像,并使用 rpi-eeprom-update 在系统重新启动时安排更新。

$ sudo rpi-eeprom-config --apply boot.conf
$ sudo reboot

自动更新

rpi-eeprom-update systemd 服务在启动时运行,并在有新镜像可用时应用更新,自动迁移当前引导加载程序配置。

要禁用自动更新:

$ sudo systemctl mask rpi-eeprom-update

要重新启用自动更新:

$ sudo systemctl unmask rpi-eeprom-update
Note
如果设置了 FREEZE_VERSION bootloader配置,则更新服务将跳过任何自动更新。如果安装了多个操作系统或交换SD卡,则无需单独禁用更新服务。

rpi-eeprom-update

Raspberry Pi OS使用 rpi-EEPROM-update 脚本来实现 [automaticupdates,automatic update] 服务。该脚本还可交互运行或封装,以创建自定义引导程序更新服务。

阅读当前引导加载程序版本:

$ vcgencmd bootloader_version

检查是否有可用的更新:

$ sudo rpi-eeprom-update

安装更新:

$ sudo rpi-eeprom-update -a
$ sudo reboot

取消待处理的更新:

$ sudo rpi-eeprom-update -r

安装特定的引导加载程序镜像:

$ sudo rpi-eeprom-update -d -f pieeprom.bin

-d 标志指示 rpi-eeprom-update 使用指定镜像文件中的配置,而不是自动迁移当前配置。

显示内置的文档:

$ rpi-eeprom-update -h

引导加载程序发布状态

固件发布状态对应于引导加载程序固件镜像的特定子目录( /lib/firmware/raspberrypi/bootloader/... ),并且可以更改以选择不同的发布流。

  • default - 更新了新的硬件支持,关键bug修复和定期更新的新功能,已通过最新版本测试

  • latest - 新功能可用时更新

由于发布状态字符串只是一个子目录名称,因此可以创建您自己的发布流,例如固定版本或自定义网络启动配置。

更改引导加载程序版本

Note
您可以通过编辑 /etc/default/rpi-eeprom-update 文件并将 FIRMWARE_RELEASE_STATUS 条目更改为适当的流来更改更新期间要使用的发布流。

更新引导加载程序镜像文件中的引导加载程序配置

以下命令将 pieeprom.bin 中的引导加载程序配置替换为 boot.conf 并将新镜像写入 new.bin

$ rpi-eeprom-config --config boot.conf --out new.bin pieeprom.bin

recovery.bin

开机时,BCM2711 和 BCM2712 上的 ROM 会在 SD 卡启动分区的根目录下查找名为 recovery.bin 的文件。如果找到有效的 recovery.bin 文件,ROM 将执行该文件而不是 EEPROM 的内容。这种机制可确保引导加载器flash镜像始终可以重置为具有出厂默认设置的有效镜像。

引导加载程序更新文件

文件名

目的

recovery.bin

引导加载程序恢复可执行文件

pieeprom.upd

引导加载程序EEPROM镜像

pieeprom.bin

引导加载程序EEPROM镜像 - 与pieeprom.upd相同,但会更改recovery.bin行为

pieeprom.sig

引导加载程序镜像的sha256校验和 (pieeprom.upd/pieeprom.bin)

vl805.bin

VLI805 USB固件EEPROM镜像 - 树莓派4B修订版1.3及更早版本。

vl805.sig

vl805.bin的sha256校验和

  • 如果引导加载程序更新映像名为 pieeprom.upd ,那么更新完成后, recovery.bin 将更名为 recovery.000 ,然后系统重新启动。由于 recovery.bin 已不存在,ROM 将从 SPI 闪存加载新更新的引导加载程序,操作系统将正常启动。

  • 如果引导加载程序更新映像名为 pieeprom.bin ,则 recovery.bin 将在更新完成后停止。更新成功时,HDMI 输出为绿色,绿色活动 LED 快速闪烁。如果更新失败,HDMI 输出将变为红色,活动 LED 将显示 错误代码

  • .sig 文件包含相应映像文件的十六进制 sha256 校验和;将来可能会添加其他字段。

  • BCM2711 和 BCM2712 上的 ROM 不支持从 USB 大容量存储器或 TFTP 加载 recovery.bin 。相反,较新版本的引导加载程序支持自更新机制,引导加载程序能够自行重新刷新 SPI 闪存。请参阅 bootloader 配置 页面上的 ENABLE_SELF_UPDATE

  • 启动时,临时 EEPROM 更新文件会被 rpi-eeprom-update 服务自动删除。

有关 rpi-eeprom-update 配置文件的更多信息,请参阅 rpi-eeprom-update -h

EEPROM写保护

引导加载程序和 VLI EEPROM 都支持硬件写保护。 请参阅 eeprom_write_protect 选项,了解如何在烧录 EEPROM 时启用硬件写保护。

启动诊断

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

启动诊断屏幕

如果引导加载程序无法从插入的SD卡引导,或无法进行网络引导;例如,如果卡上没有可引导映像,或者它有缺陷,或者网络引导参数不正确,也会出现此诊断页面。

显示诊断页面后,只有通过拔掉设备电源然后重新插入电源才能重新启动。

顶部一行描述Raspberry Pi的型号及其内存容量。二维码是指向 downloads page 的链接。

诊断信息如下:

Line Information

bootloader

Bootloader git version - RO (if EEPROM is write protected) - software build date

update-ts

the timestamp corresponding to when the EEPROM configuration was updated; this timestamp is checked in self-update mode to avoid updating to an old configuration

secure-boot

If secure-boot is enabled, displays the processor revision (B0/C0) and signed-boot status flags; otherwise, this line is blank

board

Board revision - serial number - Ethernet MAC address

boot

mode (current boot mode name and number) order (the BOOT ORDER configuration) retry (retry count in the current boot mode) restart (number of cycles through the list of boot modes)

SD

The SD card detect status (detected/not detected).

part

Master Boot Record primary partitions type:LBA

fw

Filename for start.elf and fixup.dat if present (e.g. start4x.elf, fixup4x.dat)

net

Network boot: link status (up/down), client IP address (ip), subnet (sn), default gateway (gw)

tftp

Network boot: TFTP server IP address

display

Indicates whether hotplug was detected (HPD=1) and if so whether the EDID was read successfully (EDID=ok) for each HDMI output

要禁用诊断显示,请使用 bootloader 配置中的 DISABLE_HDMI 选项。

树莓派启动模式

树莓派有许多不同的引导阶段。本文档解释了引导模式的工作原理,以及Linux引导支持哪些模式。

指定 bootcode.bin - 仅引导模式

USB主机和以太网引导可以通过基于BCM2837的Raspberry Pi来执行 - 即Raspberry Pi 2B V1.2、Raspberry Pi 3B和Raspberry Pi 3B+(Raspberry Pi 3A+不能网络引导,因为它没有内置的以太网接口)。此外,Raspberry Pi 4之前的所有Raspberry Pi型号都可以使用 bootcode.bin 方法来启用USB主机引导。

Note
自 Raspberry Pi 4 起,旗舰设备不再使用 bootcode.bin 文件。相反,这些设备使用板载 EEPROM 芯片中的引导加载程序。有关详细信息,请参阅 EEPROM 启动流程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

Note
适用于 Raspberry Pi 4 之前发布的电路板。

有关使用 EEPROM 引导加载程序启用 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 或 macOS 上的 screen 或 Windows 上的 putty 连接到串口。

将串口设置为以 115200-8-N-1 的速度接收,然后启动 Raspberry Pi。 当 bootcode.bin 运行时,你应该能立即从设备获得串口输出。

USB启动模式

USB 有两种不同的启动模式:

  • USB 设备启动

  • USB 主机启动

固件会根据 OTP 位在启动时选择这两种模式。有两个位控制 USB 启动。第一个位启用 USB 设备启动,默认为启用;第二个位启用 USB 主机启动。

如果 USB 主机启动模式位被设置,处理器就会读取 OTGID 引脚,以决定是作为主机启动(与任何 Raspberry Pi Model B/B+ 一样驱动为零)还是作为设备启动(保持浮动)。Raspberry Pi Zero 可以通过 USB 连接器访问 OTGID 引脚;而 Compute Module 则可以访问边缘连接器上的 OTGID 引脚。

其他一些 OTP 位允许某些 GPIO 引脚选择启动模式。

USB设备启动模式

Note
USB 设备启动在 计算模块系列Zero系列Model A 旗舰系列变体 上可用。

当启动模式被激活时(通常是在从SD卡启动失败后),树莓派将其USB端口置于设备模式,并等待主机的USB重置。可以在 Github 找到显示主机需要如何与树莓派对话的示例代码。

主机首先通过控制端点 0 向设备发送一个结构,其中包含引导的大小和签名(未启用安全功能,因此不需要签名)。其次,向端点 1 发送代码(bootcode.bin)。 最后,设备将回复一个成功代码:

  • 0 - 成功

  • 0x80 - 失败

USB主机启动模式

Note
Compute Module 系列(自 Compute Module 3 起)Zero 系列(自 Zero 2 W 起)、Raspberry Pi 2B(1.2 版)、Raspberry Pi 3B 和 所有旗舰系列设备(自 Raspberry Pi 3B+ 起)支持主机启动。Raspberry Pi 3A+ 支持大容量存储器启动,但不支持网络启动。

USB主机启动模式遵循以下顺序:

  • 启用USB端口并等待D+线拉高表示USB 2.0设备(我们只支持USB2.0)

  • 如果设备是集线器:

    • 为枢纽的所有下游端口供电

    • 对于每个端口,循环最多两秒(如果设置了 program_usb_boot_timeout=1 ,则为五秒)

      • 从复位释放并等待D+被调高以指示设备已连接

      • 如果检测到设备:

        • 发送 获取设备描述符

          • 如果 VID == SMSC && PID == 9500

            • 将设备添加到以太网设备列表

        • 如果类接口==大量储存类别

          • 将设备添加到大容量存储设备列表

  • 否则

    • 枚举单个设备

  • 通过大容量存储设备列表 **从 大容量存储设备 启动

  • 通过以太网设备列表

在 Raspberry Pi 3B、3A+ 和 3B+ 上,主机启动默认为禁用。要启用 USB 主机启动,请在 /boot/firmware/config.txt 的末尾添加一行包含 program_usb_boot_mode=1 的内容。

Warning

您对 OTP 所做的任何更改都是永久性的,无法撤销。

在 Raspberry Pi 3A+ 上,将 OTP 位设置为启用 USB 主机启动模式将永久阻止 Raspberry Pi 以 USB 设备模式启动。

USB大容量存储启动

USB 大容量存储启动让您可以从闪存盘或 USB 磁盘等 USB 大容量存储设备启动 Raspberry Pi。在连接 USB 设备(尤其是硬盘和固态硬盘)时,请注意它们的电源要求。连接一个以上的磁盘通常需要额外的外部电源,这些电源可以来自供电的磁盘盒或供电的 USB 集线器。

Note
Models prior to Raspberry Pi 4B have known issues which prevent booting with some USB devices.

带有 EEPROM 引导加载程序的设备

只要在 BOOT_ORDER 配置中指定 USB 启动,Raspberry Pi 4 和更新的旗舰系列设备以及 Compute Module 4 和 4S 之后的 Compute Module 设备默认支持 USB 启动。

Note
早期版本的 Raspberry Pi 4 可能需要 bootloader update 才能从 USB 启动。
Note
早期版本的 Compute Module 4 可能需要 bootloader update 才能从 USB 启动。

Raspberry Pi 3B+

Raspberry Pi 3B++支持直接使用USB大容量存储启动。

Raspberry Pi 2B, 3A+, 3B, CM3, CM3+, Zero 2 W

在 Raspberry Pi 2B v1.2、3A+、3B、Zero 2 W 以及 Compute Module 3 和 3+上,必须首先启用 USB主机启动模式。这允许 USB 大容量存储器启动和 网络启动

Note
Raspberry Pi 3A+或Zero 2 W不支持网络启动。

要在这些设备上启用 USB 主机启动模式,请在 OTP(一次性可编程)内存中设置 USB 主机位。要设置该位,请从 SD 卡启动,其中 /boot/firmware/config.txt 包含 program_usb_boot_mode=1 行。一旦设置了该位,就可以不使用 SD 卡而通过 USB 启动。

启用带 OTP 的 USB 主机启动模式

Warning

对 OTP(一次性可编程)内存所做的任何更改都是永久性的,无法撤销。

在 Raspberry Pi 3A+ 上,设置 OTP 位以启用 USB 主机启动模式将永久阻止 Raspberry Pi 以 USB 设备模式启动。

使用任何已刷新 Raspberry Pi OS 的 SD 卡来编程 OTP 位。

要启用 USB 主机启动模式,请在 config.txt 中添加以下一行:

program_usb_boot_mode=1

然后,使用 sudo reboot 重启 Raspberry Pi。要检查 OTP 编程是否正确,请运行以下命令:

$ vcgencmd otp_dump | grep 17:
17:3020000a

检查是否显示输出 0x3020000a 。如果不是,则说明OTP位没有成功编程。在这种情况下,请再次进行编程过程。如果该位仍未设置,这可能表明Raspberry Pi硬件本身存在故障。

您现在可以像从SD卡启动一样从USB大容量存储设备启动。有关详细信息,请参阅以下部分。

从USB大容量存储启动

过程 与SD卡相同 - 只需将USB存储设备镜像为操作系统镜像。

准备好存储设备后,连接驱动器并启动Raspberry Pi,同时了解外部驱动器的额外USB电源要求。

5到10秒后,Raspberry Pi应该开始启动并在连接的显示器上显示彩虹启动屏幕。确保您没有在Raspberry Pi中插入SD卡,因为如果您这样做了,它将首先启动。

请参阅 引导模式文档 了解引导顺序和替代引导模式(网络、USB设备、GPIO或SD引导)。

已知问题

  • 检查可启动USB设备的默认超时时间为两秒。一些闪存驱动器和硬盘启动速度太慢。可以将此超时时间延长至五秒(向SD卡添加新文件 timeout ),但请注意,某些设备需要更长的时间才能响应。

  • 某些闪存驱动器具有非常特定的协议要求,引导代码无法处理,因此可能不兼容。

指定的 bootcode.bin -仅引导模式

Important
适用于Raspberry Pi 4 Model B。

如果您无法使用特定的USB设备来启动Raspberry Pi,另一种选择(适用于Raspberry Pi2Bv1.2、3A+、3B和3B+)是使用特殊的 bootcode.bin-only 启动模式。Raspberry Pi仍将从SD卡启动,但 bootcode.bin 是唯一从中读取的文件。

硬件兼容性

在尝试从USB大容量存储设备启动之前,建议验证设备在Linux下是否正常工作。使用SD卡启动并插入USB大容量存储设备。这应该显示为可移动驱动器。这对于USB SATA适配器尤其重要,引导加载程序在大容量存储模式下可能支持它,但如果Linux选择 USB Attached SCSI-UAS,则会失败。

机械硬盘几乎总是需要一个供电的 USB 集线器。即使看起来一切正常,如果没有供电的 USB 集线器,也可能会遇到间歇性故障。

多个可启动驱动器

在搜索可启动分区时,引导程序会并行扫描所有 USB 大容量存储设备,并选择第一个作出响应的设备。如果引导分区不包含合适的 start.elf 文件,则会选择下一个可用设备。 没有根据 USB 拓扑指定启动设备的方法,因为这会减慢启动速度,并增加不必要且难以支持的复杂配置。

Note
config.txt 文件 条件筛选器 可用于在复杂设备配置中选择备用固件。

网络启动

本节介绍如何在Raspberry Pi 3B、3B+ 和 2B v1.2上启动网络。

在 Pi 4 和 Pi 5 上,网络启动是通过 EEPROM 中的第二阶段引导加载器实现的。更多信息,请参阅 Raspberry Pi 引导加载器配置

网络引导仅适用于上述型号的Raspberry Pi内置的有线适配器。不支持通过无线LAN引导,也不支持从任何其他有线网络设备引导。

网络启动流程

要进行网络引导,引导ROM执行以下操作:

  • 初始化板载以太网设备(微芯片LAN9500或LAN7500)

  • 发送DHCP请求(供应商类别标识符DHCP选项60设置为 PXEClient:Arch:00000:UNDI:002001

  • 收到DHCP回复

  • 接收DHCP代理回复(可选)

  • ARP到tftpboot服务器

  • ARP回复包括tftpboot服务器以太网地址

  • TFTP RRQ bootcode.bin

    • 找不到文件:服务器回复TFTP错误响应和文本错误消息

    • 文件存在:服务器将回复文件的第一个数据块(512字节),标题中包含块号

      • Raspberry Pi回复包含块号的TFTP确认字符包,并重复直到最后一个不是512字节的块

  • TFTP RRQ bootsig.bin

    • 这通常会导致错误 未找到文件 。这是意料之中的,TFTP引导服务器应该能够处理它。

从这里开始, bootcode.bin 代码继续加载系统。它将尝试访问的第一个文件是 <serial_number>/start.elf 。如果这不会导致错误,那么任何其他要读取的文件都将附加 serial_number 。这很有用,因为它使您能够为Raspberry Pis创建具有单独 start.elf / 内核的单独目录。

要获取设备的序列号,你可以尝试这种启动模式,并使用 tcpdump / wireshark 查看访问了哪些文件,或者运行标准的 Raspberry Pi OS SD 卡并 cat /proc/cpuinfo

如果您将所有文件放入TFTP目录的根目录,则将从那里访问所有以下文件。

调试网络启动模式

首先要检查的是OTP位是否正确编程。为此,您需要将 program_usb_boot_mode=1 添加到 config.txt 并重新启动(使用可以正确启动到Raspberry Pi OS的标准SD卡)。完成此操作后,您应该能够:

$ vcgencmd otp_dump | grep 17:

如果第17行包含 3020000a ,则OTP已正确编程。您现在应该能够取出SD卡,插入以太网,然后以太网LED应该在Raspberry Pi通电后大约5秒点亮。

要在服务器上捕获以太网数据包,请在tftpboot服务器(或DHCP服务器,如果它们不同)上使用tcpdump。您需要在那里捕获数据包,否则您将无法看到直接发送的数据包,因为网络交换机不是集线器!

$ sudo tcpdump -i eth0 -w dump.pcap

这会将eth0中的所有内容写入名为 dump.pcap 的文件。然后,您可以对数据包进行后处理或将其上传到cloud dshark进行通信。

DHCP请求/回复

您至少应该看到如下所示的DHCP请求和回复:

6:44:38.717115 IP (tos 0x0, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 348)
    0.0.0.0.68 > 255.255.255.255.67: [no cksum] BOOTP/DHCP, Request from b8:27:eb:28:f6:6d, length 320, xid 0x26f30339, Flags [none] (0x0000)
	  Client-Ethernet-Address b8:27:eb:28:f6:6d
	  Vendor-rfc1048 Extensions
	    Magic Cookie 0x63825363
	    DHCP-Message Option 53, length 1: Discover
	    Parameter-Request Option 55, length 12:
	      Vendor-Option, Vendor-Class, BF, Option 128
	      Option 129, Option 130, Option 131, Option 132
	      Option 133, Option 134, Option 135, TFTP
	    ARCH Option 93, length 2: 0
	    NDI Option 94, length 3: 1.2.1
	    GUID Option 97, length 17: 0.68.68.68.68.68.68.68.68.68.68.68.68.68.68.68.68
	    Vendor-Class Option 60, length 32: "PXEClient:Arch:00000:UNDI:002001"
	    END Option 255, length 0
16:44:41.224619 IP (tos 0x0, ttl 64, id 57713, offset 0, flags [none], proto UDP (17), length 372)
    192.168.1.1.67 > 192.168.1.139.68: [udp sum ok] BOOTP/DHCP, Reply, length 344, xid 0x26f30339, Flags [none] (0x0000)
	  Your-IP 192.168.1.139
	  Server-IP 192.168.1.1
	  Client-Ethernet-Address b8:27:eb:28:f6:6d
	  Vendor-rfc1048 Extensions
	    Magic Cookie 0x63825363
	    DHCP-Message Option 53, length 1: Offer
	    Server-ID Option 54, length 4: 192.168.1.1
	    Lease-Time Option 51, length 4: 43200
	    RN Option 58, length 4: 21600
	    RB Option 59, length 4: 37800
	    Subnet-Mask Option 1, length 4: 255.255.255.0
	    BR Option 28, length 4: 192.168.1.255
	    Vendor-Class Option 60, length 9: "PXEClient"
	    GUID Option 97, length 17: 0.68.68.68.68.68.68.68.68.68.68.68.68.68.68.68.68
	    Vendor-Option Option 43, length 32: 6.1.3.10.4.0.80.88.69.9.20.0.0.17.82.97.115.112.98.101.114.114.121.32.80.105.32.66.111.111.116.255
	    END Option 255, length 0

Vendor-Option Option 43 包含回复的重要部分,这必须包含字符串"Raspberry Pi Boot",由于引导ROM中的bug,您可能需要在字符串末尾添加三个空格。

TFTP 文件读取

当供应商选项被正确指定时,您将看到一个后续的TFTP RRQ数据包正在发送。RRQ可以通过第一个数据块或错误说找不到文件来回复。在一些情况下,他们甚至收到了第一个数据包,然后Raspberry Pi中止了传输(当检查文件是否存在时会发生这种情况)。下面的示例只有三个数据包:原始读取请求、第一个数据块(总是516字节,包含一个排针和512字节的数据,尽管最后一个块总是小于512字节,可能是零长度)和第三个数据包(包含帧号以匹配数据块中的帧号的确认字符)。

16:44:41.224964 IP (tos 0x0, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 49)
    192.168.1.139.49152 > 192.168.1.1.69: [no cksum]  21 RRQ "bootcode.bin" octet
16:44:41.227223 IP (tos 0x0, ttl 64, id 57714, offset 0, flags [none], proto UDP (17), length 544)
    192.168.1.1.55985 > 192.168.1.139.49152: [udp sum ok] UDP, length 516
16:44:41.227418 IP (tos 0x0, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 32)
    192.168.1.139.49152 > 192.168.1.1.55985: [no cksum] UDP, length 4

已知问题

以太网启动模式存在许多已知问题。由于启动模式的实现是在芯片本身中,除了使用仅带有 bootcode.bin 文件的SD卡之外,没有其他变通方法。

DHCP请求在五次尝试后超时

Raspberry Pi将尝试五次DHCP请求,其间间隔五秒,总共25秒。如果服务器在此期间无法响应,则Raspberry Pi将进入低功耗状态。除了SD卡上的bootcode.bin之外,没有其他解决方法。

不支持单独子网上的TFTP服务器

在Raspberry Pi 3 Model B+(BCM2837B0)中修复。

DHCP中继功能发生故障

DHCP检查还检查跳数值是否为 1 ,这不会与DHCP中继一起使用。

在Raspberry Pi 3 Model B+中修复。

树莓派启动字符串

由于计算字符串长度时出错,DHCP回复中的 Raspberry Pi Boot 字符串需要额外的三个空格。

在Raspberry Pi 3 Model B+中修复。

DHCP UUID 不变

DHCP UUID 设置为常量值。

在Raspberry Pi 3 Model B+中修复;该值设置为32位序列号。

ARP 检查在 TFTP 事务中间可能无法响应

Raspberry Pi仅在初始化阶段响应ARP请求;一旦它开始传输数据,它将无法继续响应。

在Raspberry Pi 3 Model B+中修复。

DHCP请求/回复/确认序列未正确实现

在启动时,树莓派会广播一个DHCPDISCOVER数据包。DHCP服务器用一个DHCPOFFER数据包进行响应。但是树莓派接下来会继续启动,而不发送DHCPREQUEST或等待DHCPACK。这可能导致两个独立的设备被分配到同一个IP地址,并且同时使用该IP地址,而没有被正确地分配给客户端。

不同的DHCP服务器在这种情况下的行为也不尽相同。dnsmasq(取决于设置)会对MAC地址进行哈希运算来确定IP地址,并且会ping该IP地址以确保它没有被占用。这样做可以降低发生这种情况的可能性,因为它需要哈希值发生碰撞。

GPIO启动模式

Note
GPIO启动模式仅适用于Raspberry Pi 3A+、3B、3B+、Compute Module 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。除非您有 Compute Module,否则必须使用第 1 组:第 2 组中的 GPIO 仅在 Compute Module 上可用。由于 OTP 位的排列方式,如果首先为第 1 组 的 GPIO 启动模式编程,那么稍后就可以选择第 2 组。反之则不行:一旦为 GPIO 启动模式选择了第 2 组,就不能再选择第 1 组。

启用GPIO启动模式后,Raspberry Pi将不再启动。您必须拉起至少一个启动模式GPIO引脚才能让Raspberry Pi启动。

引脚分配

Raspberry Pi 3B 和 Compute Module 3

Bank 1 Bank 2 引导类型

22

39

SD0

23

40

SD1

24

41

NAND (no Linux support at present)

25

42

SPI (no Linux support at present)

26

43

USB

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

后来的 Raspberry Pi 3B(带金属盖的 BCM2837B0)、Raspberry Pi 3A+、3B+ 和Compute Module 3+

Bank 1 Bank 2 引导类型

20

37

SD0

21

38

SD1

22

39

NAND (no Linux support at present)

23

40

SPI (no Linux support at present)

24

41

USB device

25

42

USB host - mass storage device

26

43

USB host - Ethernet

Note
按照GPIO线的数字顺序尝试各种引导模式,即SD0、SD1、NAND等。

Boot flow

SD0 是 Broadcom SD 卡/MMC 接口。SoC 内的启动 ROM 运行时,总是将 SD0 连接到内置 microSD 卡插槽。在带有 eMMC 设备的 Compute Modules 上,SD0 与 eMMC 设备相连;在 Compute Modules Lite 上,SD0 位于边缘连接器上,与 CMIO 载板上的 microSD 卡插槽相连。SD1 是 Arasan SD 卡/MMC 接口,也能使用 SDIO。所有内置无线局域网的 Raspberry Pi 型号都使用 SD1 通过 SDIO 连接到无线芯片。

GPIO 线路的默认上拉电阻为 50KΩ,如 BCM2835 ARM 外围设备datasheet 第 102 页所述。建议将 GPIO 线路的上拉电阻设为 5KΩ:这将让 GPIO 正常工作,也不会消耗过多的功率。

NVMe SSD启动

NVMe(Non-Volatile Memory express)是通过 PCIe 总线访问外部存储的标准。您可以通过计算模块 4 IO 板上的 PCIe 插槽、计算模块 5 IO 板上的 M.2 插槽以及使用 M.2 HAT+ 的 Raspberry Pi 5 连接 NVMe 硬盘。通过一些额外的配置,您可以从 NVMe 驱动器启动。

先决条件

硬件

  • NVMe M.2 SSD

  • 从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 apt update && sudo apt full-upgrade

Edit the bootloader boot priority

使用树莓派配置工具来更新bootloader:

$ sudo raspi-config

Advanced Options > Bootloader Order 下,指定引导加载程序应首先尝试从 NVMe 启动: 。

运行以下命令将固件更新到最新版本:

$ sudo rpi-eeprom-update -a

然后,使用 sudo reboot 重新启动。您的Raspberry Pi 应该从NVMe启动。

对于CM4,使用 rpiboot 更新引导加载程序。您可以在 USB boot GitHub存储库 中找到构建 rpiboot 和配置IO板以将ROM切换到usbboot模式的说明。

对于带有 eMMC 的 CM4 版本,请确保在启动顺序中将 NVMe 设为第一。记住在 recovery/boot.conf 中的 BOOT_ORDER 中添加 NVMe 启动模式 6

当SD卡插槽为空时,CM4 Lite会自动从NVMe启动。

NVMe BOOT_ORDER

EEPROM配置中的 BOOT_ORDER 设置控制引导行为。 对于NVMe引导,使用引导模式 6 。有关详细信息,请参阅 Raspberry Pi引导加载程序配置

示例

以下是引导加载程序检测到NVMe驱动器时通用异步收发设备输出的示例:

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.imghttp://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.imgboot.sig 签名文件是包含启动文件系统的内存盘。有关详细信息,请参阅 boot_ramdisk.

如果启用了安全引导并且没有设置 HTTP_HOSTBOOT_ORDER 中的 HTTP将被忽略。

要求

要使用HTTP引导, update 到2022年3月10日或更高版本发布的引导加载程序。HTTP启动需要有线以太网连接。

要使用自定义CA证书,请将 update 到2024年4月5日或更高版本发布的引导加载程序。只有运行BCM2712 CPU的设备支持自定义CA证书。

Keys

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

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

USBBOOT 拥有编写公钥所需的所有工具。

使用以下命令将公钥添加到 EEPROM 中。boot.conf 包含你的修改:

$ rpi-eeprom-config -c boot.conf -p mypubkey.pem -o pieeprom.upd pieeprom.original.bin

使用以下命令为 EEPROM 生成签名:

$ rpi-eeprom-digest -i pieeprom.upd -o pieeprom.sig

然后,使用以下命令用私钥签署网络安装映像:

$ rpi-eeprom-digest -i boot.img -o boot.sig -k myprivkey.pem

最后,将 boot.imgboot.sig 放在网络服务器上,以使用自己签名的网络安装映像。

证书

为了安全起见,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=<your_website>
HTTP_PATH=<path_to_files>
HTTP_CACERT_HASH=<hash>

当您指定 HTTP_CACERT_HASH 时,Network Install通过端口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。要查看Network Install解析的完整 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

引导顺序

Important
以下启动顺序仅适用于基于 BCM2837 和 BCM2837B0 的 Raspberry Pi 型号。在此之前的型号上,Raspberry Pi 将尝试使用 SD 卡启动,然后使用 USB 设备模式启动。有关 Raspberry Pi 4 和 Raspberry Pi 5 的启动顺序,请参阅 EEPROM 启动流程 部分。

Raspberry Pi 3 上的 USB 启动默认值取决于使用的版本。有关在默认情况下未启用 USB 启动模式的信息,请参阅 page

当 BCM2837 启动时,它会使用两个不同的来源来确定要启用哪些启动模式。首先,检查一次性可编程 (OTP) 存储器块,查看启用了哪些启动模式。如果启用了 GPIO 启动模式设置,则会测试相关的 GPIO 线路,以选择应尝试哪些启用了 OTP 的启动模式。请注意,GPIO 启动模式只能用于选择 OTP 中已启用的启动模式。有关配置 GPIO 启动模式的详情,请参阅 GPIO 启动模式。GPIO 启动模式默认为禁用。

接下来,引导 ROM 会检查每个引导源是否有一个名为 bootcode.bin 的文件;如果有,它就会将代码加载到本地 128K 缓存中并跳转到该文件。整个启动模式过程如下:

  • BCM2837 启动

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

  • 如果启用了 GPIO 启动模式,则使用 GPIO 启动模式完善启用的启动模式列表

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

    • 成功 - 启动

    • 失败 - 超时(五秒)

  • 如果启用:检查辅助 SD

    • 成功 - 启动

    • 失败 - 超时(五秒)

  • 如果启用:检查 NAND

  • 如果启用:检查 SPI

  • 如果启用:检查 USB

    • 如果 OTG 引脚 == 0

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

        • 找到设备:

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

            • 搜索每个端口

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

            • 存储在设备列表中

      • 对每个 MSD 进行递归

        • 如果发现 bootcode.bin 引导

      • 对每个 LAN951x 进行搜索

        • DHCP / TFTP 启动

    • 否则(设备模式启动)

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

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

Note
  • 如果没有插入 SD 卡,SD 启动模式需要 5 秒钟才能失效。为了减少这种情况并更快地回到 USB 模式,可以插入一张没有任何内容的 SD 卡,或者使用上述 GPIO 启动模式 OTP 设置只启用 USB。

  • GPIO 的默认值在 ARM 外围设备datasheet 第 102 页进行了定义。如果启动时的值不等于默认值,则启用该启动模式。

  • USB 枚举是一种向集线器上的下游设备供电的方法,然后等待设备拉动 D+ 和 D- 线,以显示它是 USB 1 还是 USB 2。 这可能需要一些时间:在某些设备上,硬盘驱动器旋转和启动枚举过程可能需要长达三秒钟的时间。因为这是检测硬件是否已连接的唯一方法,所以我们必须等待最短的时间(两秒)。如果设备在最长超时后仍未响应,可以使用 config.txt 中的 program_usb_boot_timeout=1 将超时时间延长至五秒。

  • MSD 启动优先于以太网启动。

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

  • 启动 ROM 现在还支持 GUID 分区,并已使用 Mac、Windows 和 Linux 对硬盘进行了分区测试。

  • 使用供应商ID 0x0424 和产品ID 0xec00 检测LAN951x:这与独立LAN9500设备不同,后者的产品ID为 0x95000x9e00。 要使用独立 LAN9500,需要添加 I2C EEPROM 以更改这些 ID,使其与 LAN951x 匹配。

主 SD 卡启动模式按标准设置为 GPIO 49-53。可以通过第二组引脚从 SD 卡启动,即在 GPIO 引脚上添加 SD 卡。不过,我们尚未启用这一功能。

NAND 启动和 SPI 启动模式虽然还不能完全支持 GPU,但也能正常工作。

USB 设备启动模式在生产时默认已启用,但 USB 主机启动模式只有在 program_usb_boot_mode=1 时才能启用。启用后,处理器将使用处理器上 OTGID 引脚的值来决定这两种模式。在任何 Raspberry Pi Model B/B+ 上,OTGID 引脚都被驱动为 0,因此一旦启用,将只能通过主机模式启动(由于 LAN951x 设备的阻碍,无法通过设备模式启动)。

如果 OTGID 引脚处于浮动状态(例如插入 PC 时),USB 将在 Raspberry Pi Zero 或 Compute Module 上作为 USB 设备启动,因此您可以将 bootcode.bin 添加到该设备。这样做的 usbboot 代码是 可在 GitHub 上获取

EEPROM 启动流程

自 Raspberry Pi 4 起,Raspberry Pi 旗舰设备开始使用 EEPROM 引导加载程序。 这些产品与以前产品的主要区别在于,第二级引导加载程序是从 SPI Flash EEPROM 加载的,而不是以前产品使用的 bootcode.bin 文件。

第一阶段bootloader

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

  • SoC通电

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

  • If nRPIBOOT GPIO为高或OTP未定义 nRPIBOOT GPIO

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

      • If 启用了SD recovery.bin ,则检查主SD/EMMC的`recovery.bin`

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

        • 失败 - 继续

    • 检查第二阶段的SPI EEPROM

      • 成功 - 运行第二阶段bootloader

      • 失败 - 继续

  • While True

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

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

      • 失败 - 重试USB设备启动

Note
recovery.bin 是用于重新刷新bootloader SPI EEPROM映像的最小第二阶段程序。

第二阶段bootloader

本节介绍第二阶段bootloader的高级流程。

有关每种启动模式的更多信息,请参阅 引导加载器配置 页面;有关此阶段加载的 GPU 固件文件的描述,请参阅 boot folder 页面。

  • 初始化时钟和 SDRAM

  • 读取 EEPROM 配置文件

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

    • 检查 POWER_OFF_ON_HALTWAKE_ON_GPIO EEPROM 配置设置

    • If POWER_OFF_ON_HALT1 ,且 WAKE_ON_GPIO0 ,则

      • 使用 PMIC 关闭系统电源

    • Else ,If WAKE_ON_GPIO1

      • If GPIO3 被拉低,则启用 GPIO3 上的下降沿中断来唤醒系统

    • 睡眠

  • While True

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

    • If 引导模式 == RESTART

      • 跳回 BOOT_ORDER 字段中的第一个启动模式

    • Else if 引导模式 == STOP

      • 显示 start.elf 未找到 错误模式,并永远等待。

    • Else if 引导模式 == SD CARD

      • 尝试从 SD 卡加载固件

        • 成功 - 运行固件

        • 失败 - 继续

    • Else if 引导模式 == NETWORK

      • 使用 DHCP 协议请求 IP 地址

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

      • If 未找到固件或发生超时或网络错误,则继续

    • Else if 引导模式 == USB-MSD 或引导模式 == BCM-USB-MSD 那么

      • If USB 发现未超时

        • 检查 USB 大容量存储设备

        • If 发现新的大容量存储设备,则

          • 对于每个驱动器(LUN)

            • 尝试加载固件

              • 成功 - 运行固件

              • 失败 - 进入下一个 LUN

    • Else if 引导模式 == NVME ,则

      • 扫描 PCIe 以查找 NVMe 设备,If 找到

        • 尝试从 NVMe 设备加载固件

          • 成功 - 运行固件

          • 失败 - 继续

    • Else if 引导模式 == RPIBOOT

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

树莓派5的区别

  • 电源按钮用于从 PMIC 的 STANDBYHALT 而非 GPIO 3 唤醒。

  • 固件不加载 start.elf ,而是加载 Linux 内核。实际上,引导加载器有一个嵌入版的 start.elf

  • 连接到 3A 电源时,默认禁用 USB 启动。在 /boot/firmware/config.txt 中设置 usb_max_current_enable=1 可启用 USB 启动。或者,也可以在 USB 启动失败时单次按下电源按钮,临时启用 usb_max_current_enable 并继续启动。但是,如果通过按下电源按钮启用该设置,重启后该设置将不会继续存在。

Bootloader更新

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

故障安全操作系统更新( tryboot

bootloader/firmware提供了一个一次性标志,如果设置了该标志,则会被清除,但会加载 tryboot.txt ,而不是 config.txt 。该备用配置将指定待更新的操作系统固件、cmdline、kernel和 os_prefix 参数。由于该标记会在启动固件前被清除,因此宕机或重置后,下次重启时将加载原始的 config.txt 文件。

要设置 tryboot 标志,请在 reboot 命令中的分区号之后添加 tryboot 。通常,分区号默认为零,但如果添加额外参数,则必须指定它。向 reboot 传递参数时一定要使用引号:它只接受一个参数:

$ sudo reboot '0 tryboot'

所有Raspberry Pi型号都支持 tryboot ,但是,在Raspberry Pi 4 Model B 修订版 1.0 和 1.1 上,EEPROM不得设置写保护。这是因为较旧的Raspberry Pi 4B 设备必须断开电源(来取消tryboot状态),因此将其存储在EEPROM中。

如果启用了 secure-boot ,则 tryboot 模式将导致加载 tryboot.img 而不是 boot.img

tryboot_a_b 模式

如果 autoboot.txt 中的 tryboot_a_b 属性设置为 1 ,则将加载 config.txt 而不是 tryboot.txt 。这是因为 tryboot 开关已在更高一级(分区)完成,因此没有必要在备用分区内设置 tryboot.txt 文件。

boot.img ramdisk 中加载文件时,tryboot_a_b 属性被隐式设置为 1

树莓派 bootloader 配置

编辑配置

在编辑 bootloader 配置之前,请使用 update your system 获取最新版本的 rpi-eeprom 软件包。

要查看当前EEPROM配置,请运行以下命令:

$ rpi-eeprom-config

要编辑当前EEPROM配置并将更新应用于最新的EEPROM版本,请运行以下命令:

$ sudo -E rpi-eeprom-config --edit

有关EEPROM更新过程的详细信息,请参阅 boot EEPROM

配置属性

本节介绍bootloader中可用的所有配置项。语法与 config.txt相同,但属性特定于bootloader。条件过滤器 也受支持,除了EDID。

BOOT_UART

如果为 1 ,则在GPIO 14和15上启用通用异步收发设备调试输出。将接收调试终端配置为115200bps,8位,无奇偶校验位,1个停止位。

默认值: 0

UART_BAUD

仅限树莓派5。

更改bootloader通用异步收发设备的波特率。

支持的值: 9600192003840057600115200230400460800921600

默认值: 115200

WAKE_ON_GPIO

如果 1 ,则 sudo halt 将在低功耗模式下运行,直到GPIO3或GLOBAL_EN短路接地。

此设置与Raspberry Pi 5之后的旗舰机型、CM5 之后的计算模块以及 Pi 500 之后的键盘机型无关无关,因为 电源按钮 总是可以用于从 HALTSTANDBY 唤醒。

默认值: 1

POWER_OFF_ON_HALT

如果 1WAKE_ON_GPIO=0 ,则 sudo停止 将关闭所有PMIC输出。这是停止的最低功率状态,但可能会导致某些HAT出现问题,因为5V仍将开启。 GLOBAL_EN 必须短路到地才能启动。

Raspberry Pi 400有一个指示电源按钮,即使处理器关闭也能运行。默认情况下启用此行为,但是, WAKE_ON_GPIO=2 可以设置为使用外部GPIO电源按钮而不是电源按钮。

从Raspberry Pi 5及Pi 500键盘系列开始,这会将PMIC置于 待机 模式,所有输出都将关闭。无需设置 WAKE_ON_GPIO ,按下 电源按钮 将启动设备。

默认值: 在 CM5 和键盘型号之后的计算模块上为 “1”;否则为 "0

BOOT_ORDER

BOOT_ORDER 设置允许灵活配置不同引导模式的优先级。它表示为一个 32 位无符号整数,其中每个位代表一种启动模式。启动模式按从最低有效位到最高有效位的顺序尝试。

BOOT_ORDER fields

BOOT_ORDER 属性定义了不同启动模式的顺序。从右向左读取,最多可定义八位数。

Value Mode Description

0x0

SD CARD DETECT

尝试使用 SD 卡,然后等待卡检测到卡已更改。由于 0xf (RESTART)已经可用,因此已被弃用。

0x1

SD CARD

SD card (or eMMC on Compute Module 4).

0x2

NETWORK

Network boot - See Network boot server tutorial.

0x3

RPIBOOT

RPIBOOT - See usbboot.

0x4

USB-MSD

USB mass storage boot - See USB mass storage boot.

0x5

BCM-USB-MSD

USB 2.0 boot from USB Type C socket (CM4: USB type A socket on CM4IO board). Not available on Raspberry Pi 5.

0x6

NVME

CM4 and Pi 5 only: boot from an NVMe SSD connected to the PCIe interface. See NVMe boot for more details.

0x7

HTTP

HTTP boot over ethernet. See HTTP boot for more details.

0xe

STOP

Stop and display error pattern. A power cycle is required to exit this state.

0xf

RESTART

BOOT_ORDER 字段中的第一个启动模式重新启动,即循环。

RPIBOOT 旨在与 Compute Module 4 一起使用,以加载自定义调试映像(例如Linux RAM-disk),而不是正常启动。这应该是最后一个启动选项,因为它当前不支持超时或重试。

BOOT_ORDER 的例子
BOOT_ORDER Description

0xf41

先试 SD,再试 USB-MSD,然后重复(如果 BOOT_ORDER 为空,则为默认值)

0xf14

Try USB first, followed by SD then repeat

0xf21

Try SD first, followed by NETWORK then repeat

0xf46

先试 NVMe,再试 USB-MSD,然后重复

MAX_RESTARTS

如果遇到RESTART( 0xf )启动模式超过MAX_RESTARTS次,则会触发看门狗重置。不建议一般使用,但对于需要完全重置以解决硬件或网络接口问题的测试或远程系统可能很有用。

默认值: -1 (infinite)

SD_BOOT_MAX_RETRIES

SD引导失败后重试的次数,然后移动到由 BOOT_ORDER 定义的下一个引导模式。

-1 表示无限次重试。

默认值: 0

NET_BOOT_MAX_RETRIES

网络引导失败后在移动到由BOOT_ORDER定义的下一个引导模式之前重试的次数。

-1 表示无限次重试。

默认值: 0

DHCP_TIMEOUT

当前迭代失败之前整个DHCP序列的超时时间(以毫秒为单位)。

最低: 5000

默认值: 45000

DHCP_REQ_TIMEOUT

重试DHCP DISCOVER或DHCP REQ之前的超时时间(以毫秒为单位)。

最低: 500

默认值: 4000

TFTP_FILE_TIMEOUT

通过TFTP下载单个文件的超时时间(以毫秒为单位)。

最低: 5000

默认值: 30000

TFTP_IP

TFTP服务器的可选带点十进制ip地址(例如192.168.1.99),它覆盖DHCP请求中的server-ip。

这在家庭网络上可能很有用,因为可以使用tftpd-hpa代替dnsmasq,其中宽带路由器是DHCP服务器。

默认值: ""

TFTP_PREFIX

为了支持每个 Raspberry Pi 独特的 TFTP 启动目录,引导加载程序会在文件名前加上设备特定目录的前缀。如果在前缀目录中既找不到 start4.elf 也找不到 start.elf,那么前缀就会被清除。

在早期型号上,序列号被用作前缀,但在 Raspberry Pi 4 和 5 上,MAC 地址不再由序列号生成,因此很难通过检查 DHCPDISCOVER 数据包在服务器上自动创建 tftpboot 目录。为了支持这一点,TFTP_PREFIX 可以自定义为 MAC 地址、固定值或序列号(默认值)。

Value Description

0

Use the serial number e.g. 9ffefdef/

1

使用 TFTP_PREFIX_STR 指定的字符串

2

Use the MAC address e.g. dc-a6-32-01-36-c2/

默认值:0

TFTP_PREFIX_STR

指定当 TFTP_PREFIX 设置为 1 时使用的自定义目录前缀字符串。例如:- TFTP_PREFIX_STR=tftp_test/

默认值: ""

最大长度:32个字符

PXE_OPTION43

用不同的字符串覆盖 PXE Option43 匹配字符串。通常情况下,对 DHCP 服务器进行定制比改变客户端行为要好,但在无法做到这一点的情况下,我们提供了这个选项。

默认值: Raspberry Pi Boot

DHCP_OPTION97

在早期版本中,客户端 GUID(Option97)只是重复四次的序列号。默认情况下,新的 GUID 格式是四字符代码(FourCC)(Raspberry Pi 4 为 RPi4 0x34695052 或 Raspberry Pi 5 为 RPi5 0x35695052 )、电路板修订版(例如 0x00c031110x00d04170)(4 个字节)、mac 地址的最小有效 4 个字节和 4 个字节序列号的连接。 这样做的目的是使其具有唯一性,同时也为 DHCP 服务器提供结构化信息,从而无需依赖以太网 MAC OUID 就能识别 Raspberry Pi 4 和 5 计算机。

指定 DHCP_OPTION97=0 可恢复旧的行为,或指定一个非零十六进制值来指定自定义的 4 字节前缀。

默认值: 0x34695052

MAC_ADDRESS

使用给定值覆盖Raspberry Pi以太网MAC地址。例如 dc:a6:32:01:36:c2

默认值: ""

MAC_ADDRESS_OTP

使用存储在 客户OTP 寄存器中的值覆盖Raspberry Pi以太网MAC地址。

例如,使用存储在 Customer OTP 的第0行和第1行中的MAC地址。

MAC_ADDRESS_OTP=0,1

第一个值(示例中的第 0 行)包含 OUI 和 MAC 地址最重要的 8 位。第二个值(示例中的第 1 行)存储 MAC 地址的剩余 16 位。 这与 Raspberry Pi 制造时编程的 MAC 地址格式相同。

可以按任一顺序选择和组合任何两个客户行。

vcgencmd otp_dump 输出中, Customer OTP 行是 OTP 寄存器 36 至 43,因此如果对前两行进行如下编程,那么 MAC_ADDRESS_OTP=0,1 将给出一个 MAC 地址 e4:5f:01:20:24:7e

36:247e0000
37:e45f0120

默认值: ""

静态IP地址配置

如果TFTP_IP并设置了以下选项,则跳过DHCP并应用静态IP配置。如果TFTP服务器与客户端位于同一子网上,则可以省略GATEWay。

CLIENT_IP

客户端的IP地址,例如 192.168.0.32

默认值: ""

SUBNET

子网地址掩码,例如 255.255.255.0

默认值: ""

GATEWAY

如果TFTP服务器在不同的子网上,则使用的网关地址,例如 192.168.0.1

默认值: ""

DISABLE_HDMI

如果 DISABLE_HDMI=1HDMI 启动诊断 显示将被禁用。其他非零值保留供将来使用。

默认值: 0

HDMI_DELAY

跳过 HDMI 诊断显示,最多 N 秒(默认 5 秒),除非发生致命错误。默认行为旨在避免在正常的 SD/USB 启动过程中短暂出现启动加载程序诊断屏幕。

默认值: 5

ENABLE_SELF_UPDATE

使bootloader能够从TFTP或USB大容量存储设备(MSD)引导文件系统更新自身。

如果启用了自我更新,引导加载程序将在引导文件系统中查找更新文件(.sig/.upd)。如果更新映像与当前映像不同,则应用更新并重置系统。否则,如果 EEPROM 映像字节对字节完全相同,则引导继续正常进行。

注意事项:

  • 2021 年之前的引导加载程序版本不支持 自我更新

  • 2022 年之前,SD 启动时未启用自我更新。在 Raspberry Pi 4 上,ROM 已经可以从 SD 卡加载 recovery.bin。在 CM4 上,self-update 和 recovery.bin 都不起作用,需要 USB 启动(参见 计算模块 EEPROM 启动加载程序文档)。

  • 从 2022 年( betastable)开始,启用 SD 卡自更新功能。

  • 对于网络启动,请确保 TFTP boot 目录可以通过 NFS 挂载,并且 rpi-eeprom-update 可以写入该目录。

默认值: 1

FREEZE_VERSION

以前只有 rpi-eeprom-update 脚本会检查该属性。但现在启用了自我更新后,引导加载程序也会检查该属性。如果设置为 1,它将覆盖 ENABLE_SELF_UPDATE 以停止自动更新。要禁用 FREEZE_VERSION ,必须使用 recovery.bin 的 SD 卡启动。

自定义EEPROM更新脚本也必须检查此标志。

默认值: 0

HTTP_HOST

如果启动了网络安装或 HTTP引导,则会从此服务器下载 boot.imgboot.sig

无效的主机名将被忽略。它们只能包含小写字母数字字符和 -. 。 如果设置了 HTTP_HOST ,则禁用 HTTPS,而使用普通 HTTP。 可以指定一个 IP 地址,以避免 DNS 查找。 主机名中不要包含 HTTP 或任何正斜杠符号。

默认值: fw-download-alias1.raspberrypi.com

HTTP_PORT

您可以使用此属性更改用于网络安装和 HTTP 启动的端口。使用默认主机 fw-download-alias1.raspberrypi.com 时,将启用 HTTPS。如果更改了 HTTP_HOST ,则会禁用 HTTPS,而使用普通 HTTP。

禁用 HTTPS 后,即使将 HTTP_PORT 更改为 443 ,仍将使用普通 HTTP。

默认值: 443 ,如果启用 HTTPS,则为 80

HTTP_PATH

用于网络安装和 HTTP引导的路径。

区分大小写。 使用Linux斜杠作为路径分隔符。 不需要前导和尾随正斜杠。

如果未设置 HTTP_HOST ,则忽略 HTTP_PATH ,URL 将是 https://fw-download-alias1.raspberrypi.com:443/net_install/boot.img 。如果设置了 HTTP_HOST ,URL 将是: http://<HTTP_HOST>:<HTTP_PORT>/<HTTP_PATH>/boot.img

默认值: net_install

IMAGER_REPO_URL

嵌入式 Raspberry Pi Imager 应用程序是通过启动时下载的 JSON 文件配置的。

您可以更改嵌入式 Raspberry Pi Imager 应用程序使用的 JSON 文件的 URL,让它提供您自己的图像。 您可以使用标准 Raspberry Pi Imager 应用程序通过 --repo 参数传递 URL 进行测试。

默认值: http://downloads.raspberrypi.org/os_list_imagingutility_v3.json

NET_INSTALL_ENABLED

启用网络安装后,如果bootloader检测到键盘,它会在引导时显示网络安装屏幕。

要启用网络安装,请添加 NET_INSTALL_ENABLED=1 ,或禁用网络安装,请添加 NET_INSTALL_ENABLED=0

如果设置了 DISABLE_HDMI=1 ,则忽略此设置并禁用网络安装。

为了检测键盘,网络安装必须初始化USB控制器并枚举设备。这将启动时间增加大约1秒,因此在某些嵌入式应用程序中禁用网络安装可能是有利的。

默认值:Raspberry Pi 4B和Raspberry Pi 400上的 1 , Compute Module 4 上的 0

NET_INSTALL_KEYBOARD_WAIT

如果启用了网络安装,bootloader会尝试检测键盘和 SHIFT 键以启动网络安装。您可以使用此属性以毫秒为单位更改此等待的长度。

将此设置为 0 会禁用键盘等待,尽管如果没有找到引导文件并且USB引导模式 4 处于 BOOT_ORDER 中,仍然可以启动网络安装。

Note
测试表明键盘和SHIFT检测至少需要750毫秒。

默认值: 900

NETCONSOLE - 高级日志记录

NETCONSOLE 将调试消息复制到网络接口。IP地址和端口由 NETCONSOLE 字符串定义。

Note
NETCONSOLE 会阻塞,直到以太网链接建立或超时。超时值为 DHCP_TIMEOUT,但除非请求网络启动,否则不会尝试 DHCP。
格式

更多信息,请参阅 Netconsole 文档

src_port@src_ip/dev_name,dst_port@dst_ip/dst_mac
E.g. 6665@169.254.1.1/,6666@/

为了简化解析,引导加载程序要求每个分隔符都必须存在。您必须指定源 IP 地址,但可以将以下字段留空以使用其默认值:

  • src_port - 6665

  • dev_name - "" (the device name is always ignored)

  • dst_port - 6666

  • dst_ip - 255.255.255.255

  • dst_mac - 00:00:00:00:00

查看数据的一种方法是将测试的 Raspberry Pi 4 连接到另一个运行 WireShark 的 Raspberry Pi,选择 udp.srcport == 6665 作为过滤器,然后选择 Analyze → Follow → UDP stream 以 ASCII 日志的形式查看。

默认情况下不应启用 NETCONSOLE ,因为它可能会导致网络问题。可以通过GPIO过滤器按需启用它:

# Enable debug if GPIO 7 is pulled low
[gpio7=0]
NETCONSOLE=6665@169.254.1.1/,6666@/

默认: "" (未启用)

最大长度:32个字符

PARTITION

如果没有通过 reboot 命令(例如 sudo reboot N )或 autoboot.txt 中的 boot_partition=N 明确设置引导分区号,可以使用 PARTITION 选项指定引导分区号。 如果用户按下按钮,这可用于从应急分区启动。

# Boot from partition 2 if GPIO 7 is pulled low
[gpio7=0]
PARTITION=2

默认值:0

PSU_MAX_CURRENT

仅限树莓派5。

如果设置了该属性,固件就会跳过 USB 供电协商,并假定已连接到具有给定额定电流的电源。 通常情况下,该属性应设置为 30005000 ,即低电流或高电流电源。

默认值: ""

USB_MSD_EXCLUDE_VID_PID

最多四个VID/PID对的列表,指定bootloader应忽略的设备。如果这与HUB匹配,则不会枚举HUB,从而导致排除所有下游设备。 这旨在允许在引导枚举期间忽略有问题的(例如枚举非常慢)设备。这是特定于bootloader的,不会传递给操作系统。

该格式是以逗号分隔的十六进制值列表,其中VID为最重要的半字节。不允许空格。 例如。 034700a0,a4231234

默认值: ""

USB_MSD_DISCOVER_TIMEOUT

如果在此超时时间内未找到USB大容量存储设备,则USB-MSD将停止并选择下一个启动模式。

最低: 5000 (5秒)

默认值: 20000 (20秒)

USB_MSD_LUN_TIMEOUT

在进入下一个 LUN(如多插槽 SD 卡读卡器)之前等待的时间(以毫秒为单位)。虽然还在调整中,但如果连接的是老式/慢速设备以及包含操作系统的快速 USB-MSD 设备,这可能有助于加快启动速度。

最小值: 100

默认值: 2000 (2秒)

USB_MSD_PWR_OFF_TIME

仅限树莓派4。

当 Pi 重新启动电源时,硬件会关闭 USB 电源。较短的断电时间可能会导致某些 USB 设备出现问题,因此可以使用此参数强制较长时间的断电,就像电缆被物理移除一样。

在 RaspberryPi 4 1.3 及更旧版本上,可配置/长时间断电要求启用 XHCI 控制器,因此实际上是先短时间断电,然后再长时间配置断电。通过将该参数设置为零,可以跳过较长的可配置断电时间。

在较新的版本中,硬件会确保 USB 电源在重启后关闭,引导加载程序仅在超时后才会启用电源。这是在内存初始化确保 USB 电源关闭至少两秒后发生的。因此,该参数通常对较新的硬件版本没有影响。

最小值: 0

最大: 5000

默认值: 1000 (1秒)

USB_MSD_STARTUP_DELAY

如果已定义,则会在USB主机控制器初始化后延迟给定超时的USB枚举。如果USB硬盘驱动器需要很长时间才能初始化并触发USB超时,则可以使用此延迟为驱动程序提供额外的初始化时间。还可能需要增加整体USB超时( USB_MSD_DISCOVER_TIMEOUT )。

最小值: 0

最大: 30000 (30秒)

默认值: 0

VL805

仅在 Compute Module 4 上。

如果 VL805 属性设置为 1 ,则bootloader将搜索VL805 PCIe XHCI控制器,并尝试使用嵌入在bootloaderEEPROM中的VL805固件对其进行初始化。这使工业设计能够使用VL805 XHCI控制器,而无需为VL805固件提供专用的SPI 则必须重新刷写bootloader EEPROM

  • 在 Compute Module 4 上,引导加载程序从不写入专用的 VL805 SPI EEPROM。该选项只是将控制器配置为从 SDRAM 加载固件。

  • 如果 VL805 XHCI 控制器有专用 EEPROM,请勿使用该选项。它将无法初始化,因为 VL805 ROM 会尝试使用专用的 SPI EEPROM(如果已安装)。

  • 嵌入式 VL805 固件假定 USB 配置与 Raspberry Pi 4B 相同(两个 USB 3.0 端口和四个 USB 2.0 端口)。不支持加载其他 VL805 固件映像,此类配置应使用专用的 VL805 SPI EEPROM。

默认值: 0

XHCI_DEBUG

此属性是一个位字段,用于控制大容量存储启动模式下USB调试消息的详细程度。启用所有这些消息会生成大量日志数据,这将减慢启动速度,甚至可能导致启动失败。对于详细日志,最好使用 NETCONSOLE

Value Log

0x1

USB descriptors

0x2

Mass storage mode state machine

0x4

Mass storage mode state machine - verbose

0x8

All USB requests

0x10

Device and hub state machines

0x20

All xHCI TRBs (VERY VERBOSE)

0x40

All xHCI events (VERY VERBOSE)

要组合值,请将它们添加在一起。例如:

# Enable mass storage and USB descriptor logging
XHCI_DEBUG=0x3

默认值: 0x0 (未启用USB调试消息)

[config.txt] 部分

读取 config.txt 文件后,GPU 固件 start4.elf 会读取bootloader EEPROM 配置,并检查是否存在名为 [config.txt] 的部分。如果存在 [config.txt] 部分,则会在内存中将从该部分开始到文件结束的内容添加到从引导分区读取的 config.txt 文件内容中。 这可用于自动将设置应用到每个操作系统,例如 dtoverlays。

Warning
如果使用无效配置配置引 导加载程序,导致引导失败,则必须重新刷新引导加载程序 EEPROM,使用有效配置引导。
Tip
某些配置属性存在于 config.txt 中。有关这些属性的更多信息,请参阅 配置属性

显示并行接口 (DPI)

Using a DPI Display on the Raspberry Pi

显示器并行接口(DPI)显示器可以通过40-pin 通用输入/输出(GPIO)连接器连接到Raspberry Pi设备,作为使用专用显示串行接口(DSI)或高清多媒体接口(HDMI)端口的替代方案。

所有带有 40 路接头的 Raspberry Pi 电路板和计算模块都有一个 24 位的并行 RGB 接口。该接口允许将并行 RGB 显示器连接到 Raspberry Pi GPIO,可以是 RGB24(8 位红、绿、蓝)或 RGB666(每种颜色 6 位)或 RGB565(5 位红、6 位绿、5 位蓝)。

该接口由 GPU 固件控制,用户可通过指定的 config.txt 参数和启用正确的 Linux 设备树overlay对其进行修改。

GPIO引脚

Raspberry Pi GPIO 第 0 组可选择的备用功能之一是 DPI(显示并行接口),它是一个简单的时钟并行接口(最多 8 位 R、G 和 B;时钟、使能、hsync 和 vsync)。该接口可作为 GPIO Bank 0 上的备用功能 2 (ALT2):

GPIO ALT2

GPIO0

PCLK

GPIO1

DE

GPIO2

LCD_VSYNC

GPIO3

LCD_HSYNC

GPIO4

DPI_D0

GPIO5

DPI_D1

GPIO6

DPI_D2

GPIO7

DPI_D3

GPIO8

DPI_D4

GPIO9

DPI_D5

GPIO10

DPI_D6

GPIO11

DPI_D7

GPIO12

DPI_D8

GPIO13

DPI_D9

GPIO14

DPI_D10

GPIO15

DPI_D11

GPIO16

DPI_D12

GPIO17

DPI_D13

GPIO18

DPI_D14

GPIO19

DPI_D15

GPIO20

DPI_D16

GPIO21

DPI_D17

GPIO22

DPI_D18

GPIO23

DPI_D19

GPIO24

DPI_D20

GPIO25

DPI_D21

GPIO26

DPI_D22

GPIO27

DPI_D23

Note
在 565、666 或 24 位模式下,有多种方式可以在 DPI 输出引脚上显示颜色值(请参阅下表和下面 dpi_output_format 参数中的 output_format 部分):

Mode

RGB bits

GPIO

27

26

25

24

23

22

21

20

19

18

17

16

15

14

13

12

11

10

9

8

7

6

5

4

1

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

2

565

-

-

-

-

-

-

-

-

7

6

5

4

3

7

6

5

4

3

2

7

6

5

4

3

3

565

-

-

-

7

6

5

4

3

-

-

7

6

5

4

3

2

-

-

-

7

6

5

4

3

4

565

-

-

7

6

5

4

3

-

-

-

7

6

5

4

3

2

-

-

7

6

5

4

3

-

5

666

-

-

-

-

-

-

7

6

5

4

3

2

7

6

5

4

3

2

7

6

5

4

3

2

6

666

-

-

7

6

5

4

3

2

-

-

7

6

5

4

3

2

-

-

7

6

5

4

3

2

7

888

7

6

5

4

3

2

1

0

7

6

5

4

3

2

1

0

7

6

5

4

3

2

1

0

禁用其他GPIO外设

必须禁用所有其他使用冲突 GPIO 引脚的 overlay。在 config.txt 中,请注意注释掉或关闭任何启用I2C或SPI的 dtparams :

dtparam=i2c_arm=off
dtparam=spi=off

配置显示器

内核模式设置 (KMS) 通用显示接口可向任意显示器输出,只要有适当的驱动程序即可。

自动检测

自动检测允许您的Raspberry Pi与显示器连接,而无需手动配置设备树overlay。 默认情况下启用自动检测。您可以通过在 config.txt 中添加以下行来启用显示自动检测:

display_auto_detect=1

0 代替 1 以禁用自动检测。 在启用自动检测的情况下连接 Raspberry Pi 官方显示屏时,KMS 会自动确定显示屏型号并配置相应的显示屏设置。

手动配置显示器

Note
在 Raspberry Pi OS Bookworm 或更高版本中,以前用于设置 DPI 的 config.txt 中的 dpi_output_formatdpi_timings 已被 vc4-kms-dpi-generic overlay 取代。

要使用 Raspberry Pi 官方显示屏以外的任何显示屏,必须在 config.txt 中指定一个 dtoverlay 条目。面板制造商应在 Linux 内核代码中为你的显示器配置时序,并提供一个 overlay 来启用这些设置。有关示例,请参阅 Adafruit Kippah 显示器条目。下面的示例演示了如何在 /boot/firmware/config.txt 文件中为 Kippah 显示器设置 dtoverlay 条目:

dtoverlay=vc4-kms-kippah-7inch-overlay

显示时序通常在内核中定义,但也可以在提供的 panel-dpi 驱动程序中定义。如果你的面板在内核代码中没有定义覆盖,你可以使用 panel-dpi 驱动程序将显示时序定义为参数。这样就可以为任何显示器手动配置设备树。

以下示例演示了如何使用设备树参数定义计时:

dtoverlay=vc4-kms-v3d
dtoverlay=vc4-kms-dpi-generic,hactive=480,hfp=26,hsync=16,hbp=10
dtparam=vactive=640,vfp=25,vsync=10,vbp=16
dtparam=clock-frequency=32000000,rgb666-padhi
Note
设备树行长度不得超过80个字符。当设置需要超过80个字符的行时,将该参数的分配拆分为多行。

参数显示树定义支持以下选项:

Option Description

clock-frequency

Display clock frequency (Hz)

hactive

Horizontal active pixels

hfp

Horizontal front porch

hsync

Horizontal sync pulse width

hbp

Horizontal back porch

vactive

Vertical active lines

vfp

Vertical front porch

vsync

Vertical sync pulse width

vbp

Vertical back porch

hsync-invert

Horizontal sync active low

vsync-invert

Vertical sync active low

de-invert

Data Enable active low

pixclk-invert

Negative edge pixel clock

width-mm

Defines the screen width in millimetres

height-mm

Defines the screen height in millimetres

rgb565

Change to RGB565 output on GPIOs 0-19

rgb666-padhi

Change to RGB666 output on GPIOs 0-9, 12-17, and 20-25

rgb888

Change to RGB888 output on GPIOs 0-27

bus-format

Override the bus format for a MEDIA_BUS_FMT_* value, also overridden by rgbXXX overrides

backlight-gpio

Defines a GPIO to be used for backlight control (default value: none)

GPIO 和 40 引脚接头

目前所有 Raspberry Pi 电路板上都有一个 40 针 GPIO(通用输入/输出)针座。所有电路板上的 GPIO 针座的针距都是 0.1 英寸(2.54 毫米)。

Note
在没有 "H" 后缀的 Zero 和 Pico 设备上,报头没有填充(没有报头)。
GPIO pinout diagram

通用 I/O (GPIO) 引脚可配置为通用输入、通用输出或多达六种特殊备用设置之一,其功能取决于引脚。

GPIO layout
Note
GPIO 引脚编号方案不按数字顺序排列。电路板上有 GPIO 引脚 0 和 1(物理引脚 27 和 28),但这两个引脚是为高级用途预留的。

Outputs

指定为输出引脚的 GPIO 引脚可设置为高电平(3.3V)或低电平(0V)。

Inputs

被指定为输入引脚的 GPIO 引脚可读作高电平(3.3V)或低电平(0V)。使用内部上拉或下拉电阻可以更方便地实现这一功能。GPIO2 和 GPIO3 引脚具有固定的上拉电阻,其他引脚可通过软件进行配置。

查看 Raspberry Pi 的 GPIO 引脚图

在 Raspberry Pi 上打开终端窗口并运行 pinout 命令,即可访问 GPIO 参考。该工具由 GPIO Zero Python 库提供,Raspberry Pi OS 默认安装了该库。 WARNING: 将简单元件连接到 GPIO 引脚是安全的,但要注意接线方式。LED 应使用电阻器来限制通过它们的电流。不要将 5V 电压用于 3.3V 元件。不要将电机直接连接到 GPIO 引脚,而应使用 H 桥电路或电机控制器板

权限

要使用 GPIO 端口,用户必须是 gpio 组的成员。默认用户账户是该组的成员,但必须使用以下命令手动添加其他用户:

$ sudo usermod -a -G gpio <username>

GPIO引脚

BCM2835 封装上的 GPIO 连接有时在外设datasheet中称为 "引脚",这是一个半导体设计术语,意思是 "芯片与外界的连接"。

引脚是可配置的 CMOS 推挽输出驱动器/输入缓冲器。基于寄存器的控制设置可用于

  • 内部上拉/下拉启用/禁用

  • 输出 驱动强度

  • 输入施密特触发滤波

上电状态

上电复位时,所有 GPIO 引脚均恢复为通用输入。此外,还应用了默认上拉状态,详情见 Arm 外设datasheet中的备用功能表。大多数 GPIO 都应用了默认上拉状态。

中断

每个GPIO引脚在配置为通用输入时,都可以配置为Arm的中断源。几个中断生成源是可配置的:

  • 电平敏感(高/低)

  • 上升/下降沿

  • 异步上升/下降沿

电平中断保持中断状态,直到系统软件清除电平(例如,通过服务附加的外围设备生成中断)。

正常的上升/下降沿检测在检测中内置了少量的同步。在系统时钟频率下,对引脚进行采样,中断产生的标准是三个周期窗口内的稳定过渡,即记录为1 0 0或0 1 1。异步检测绕过这种同步,能够检测非常狭窄的事件。

替代功能

几乎所有 GPIO 引脚都有替代功能。SoC 内部的外设块可以选择出现在一组 GPIO 引脚中的一个或多个引脚上,例如,I2C 总线可以配置到至少三个独立的位置。当引脚被配置为替代功能时,引脚控制(如驱动强度或施密特滤波)仍然适用。

有些功能适用于所有引脚,有些则适用于特定引脚:

  • PWM (pulse-width modulation)

    • Software PWM available on all pins

    • Hardware PWM available on GPIO12, GPIO13, GPIO18, GPIO19

  • SPI

    • SPI0: MOSI (GPIO10); MISO (GPIO9); SCLK (GPIO11); CE0 (GPIO8), CE1 (GPIO7)

    • SPI1: MOSI (GPIO20); MISO (GPIO19); SCLK (GPIO21); CE0 (GPIO18); CE1 (GPIO17); CE2 (GPIO16)

  • I2C

    • Data: (GPIO2); Clock (GPIO3)

    • EEPROM Data: (GPIO0); EEPROM Clock (GPIO1)

  • Serial

    • TX (GPIO14); RX (GPIO15)

电压规格

电路板上有两个 5V 引脚和两个 3.3V 引脚,以及一些无法重新配置的接地引脚 (GND)。其余引脚均为通用 3.3V 引脚,即输出设置为 3.3V,输入为 3.3V 容差。

下表给出了 BCM2835、BCM2836、BCM2837 和基于 RP3A0 的产品(如 Raspberry Pi Zero 或 Raspberry Pi 3+)的 GPIO 引脚的各种电压规格。有关计算模块的信息,请参阅 相关datasheet

Symbol Parameter Conditions   Min Typical Max Unit

VIL

Input Low Voltage

-

-

-

0.9

V

VIH

Input high voltagea

-

1.6

-

-

V

IIL

Input leakage current

TA = +85◦C

-

-

5

µA

CIN

Input capacitance

-

-

5

-

pF

VOL

Output low voltageb

IOL = -2mA

-

-

0.14

V

VOH

Output high voltageb

IOH = 2mA

3.0

-

-

V

IOL

Output low currentc

VO = 0.4V

18

-

-

mA

IOH

Output high currentc

VO = 2.3V

17

-

-

mA

RPU

Pullup resistor

-

50

-

65

kΩ

RPD

Pulldown resistor

-

50

-

65

kΩ

a 启用滞后
b 默认驱动强度(8mA)
c 最大驱动强度(16mA)

下表给出了基于 BCM2711 的产品(4-系列产品)上 GPIO 引脚的电压规格。有关计算模块的信息,请参阅 相关datasheet

Symbol Parameter Conditions   Min Typical Max Unit

VIL

Input Low Voltage

-

-

-

0.8

V

VIH

Input high voltagea

-

2.0

-

-

V

IIL

Input leakage current

TA = +85◦C

-

-

10

µA

VOL

Output low voltageb

IOL = -4mA

-

-

0.4

V

VOH

Output high voltageb

IOH = 4mA

2.6

-

-

V

IOL

Output low currentc

VO = 0.4V

7

-

-

mA

IOH

Output high currentc

VO = 2.6V

7

-

-

mA

RPU

Pullup resistor

-

33

-

73

kΩ

RPD

Pulldown resistor

-

33

-

73

kΩ

a 启用滞后
b 默认驱动强度 (4mA)
c 最大驱动强度 (8mA)

GPIO引脚控制

GPIO驱动强度并不表示最大电流,而是引脚仍然符合规格的最大电流。您应该设置GPIO驱动强度以匹配所连接的设备,以便设备正常工作。

驱动强度如何控制

焊盘内部并联了许多驱动器。如果驱动强度设置为低 (0b000),这些驱动器大多为三态,因此不会增加输出电流。如果驱动强度增加,并联的驱动器就会越来越多。下图显示了这种行为。

Warning
对于4-系列产品,当前级别为图表中所示值的一半。
GPIO驱动强度图

当前值

电流值规定了焊盘仍能满足规格要求的最大电流。

电流值不是引脚将输出的电流,也不是电流限制。

引脚输出为电压源:

  • 如果设置为高电平,引脚将尝试将输出驱动到轨电压(3.3V)

  • 如果设置低,引脚将尝试将输出驱动到地(0V)

引脚将尝试驱动输出高或低。成功将取决于连接的要求。如果引脚短路接地,它将无法驱动高。它将尝试提供尽可能多的电流,电流仅受内阻的限制。

如果引脚被驱动到高电平并短路到地面,在适当的时候它会失效。如果您将其连接到3.3V并将其驱动到低电平,情况也是如此。

满足规格取决于保证的电压电平。因为引脚是数字的,所以有两个电压电平,高电平和低电平。I/O端口有两个处理输出电平的参数:

  • VOL,最大低电平电压(3.3V VDD IO 时为 0.14V)

  • VOH,最低高电平电压(3.3V VDD IO 时为 3.0V)

VOL=0.14V 表示如果输出为低电平,则电压将<= 0.14V。 VOH=3.0V 表示如果输出为高电平,则电压将 >= 3.0V。

举例来说,驱动强度为 16mA 意味着,如果将引脚设置为高电平,则可以消耗高达 16mA 的电流,而输出电压保证 >=VOH。这也意味着,如果您设置的驱动强度为 2mA,而电流为 16mA,电压将**不是 VOH,而是更低。事实上,它可能还不够高,以至于外部设备无法将其视为高电平。

有更多关于GPIO引脚的 物理特性 的信息。

Note
在计算模块设备上,可以将 VDD IO 从标准的 3.3V 改为 3.3V。在这种情况下,VOL 和 VOH 将根据 GPIO 部分中的表格进行更改。

为什么我不能将所有引脚设置为最大电流?

Raspberry Pi 3.3V 电源的设计最大电流为每个 GPIO 引脚约 3mA。如果为每个引脚加载 16mA 电流,则总电流为 272mA。在这种负载水平下,3.3V 电源将崩溃。会出现大电流尖峰,尤其是在有电容负载的情况下。尖峰电流会在其附近的所有其他引脚上反弹。这很可能会对 SD 卡甚至 SDRAM 行为造成干扰。

什么是安全电流?

所有焊盘电子元件的设计电流均为 16mA。这是一个不会损坏设备的安全值。即使将驱动强度设置为 2mA,然后加载到 16mA 输出,也不会损坏器件。除此之外,没有保证的最大安全电流。

GPIO地址

  • 0x 7e10 002c PADS(GPIO 0-27)

  • 0x 7e10 0030 PADS(GPIO 28-45)

  • 0x 7e10 0034 PADS(GPIO 46-53)

Bits Field name Description Type Reset

31:24

PASSWRD

Must be 0x5A when writing; accidental write protect password

W

0

23:5

Reserved - Write as 0, read as don’t care

4

SLEW

Slew rate; 0 = slew rate limited; 1 = slew rate not limited

RW

0x1

3

HYST

Enable input hysteresis; 0 = disabled; 1 = enabled

RW

0x1

2:0

DRIVE

Drive strength, see breakdown list below

RW

0x3

请注意同时开关输出(SSO)的限制,它不仅取决于设备,还取决于印刷电路板的质量和布局、去耦电容器的数量和质量、引脚上的负载类型(电阻、电容)以及 Raspberry Pi 无法控制的其他因素。

驱动强度列表

  • 0 = 2mA

  • 1 = 4mA

  • 2 = 6mA

  • 3 = 8mA

  • 4 = 10mA

  • 5 = 12mA

  • 6 = 14mA

  • 7 = 16mA

Raspberry Pi的工业用途

Raspberry Pi经常被用作其他产品的一部分。此文档描述了一些可用于使用Raspberry Pi其他功能的额外功能。

一次性可编程设置

Using the one-time programmable memory on Raspberry Pi single-board computers

所有 Raspberry Pi 单板电脑(SBC)都有一个内置的一次性可编程(OTP)内存区域,它实际上是芯片上主系统(SoC)的一部分。顾名思义,OTP 内存只能被写入一次(即二进制 0 变为 1)。一旦某个位变为 1,就永远不能再变回 0。一种看待 OTP 的方法是将每个位视为保险丝。编程时需要故意烧断保险丝,这是一个不可逆的过程,因为你无法进入芯片内部更换保险丝!

本白皮书假定Raspberry Pi正在运行Raspberry Pi操作系统(OS),并且完全更新了最新的固件和内核。

有许多 OTP 值可以使用。要查看所有 OTP 值 的列表,请运行以下命令:

$ vcgencmd otp_dump

这个转储中的一些重要的行是:

  • 28 - 序列号

  • 29 - 序列号的补码

  • 30 - 电路板修订号

此外,从36到43(包括),有8行32位可供客户使用。

Note
在BCM2712设备上,这些数字是不同的。第31行是序列号,第32行是电路板修订号。客户行包括77到84行。

其中一些行可以用 vcmailbox 编程。这是固件的Linux驱动程序接口,将处理行的编程。为此,请参阅 文档 和vcmailbox 示例应用程序

vcmailbox应用程序可以直接从Raspberry Pi OS上的命令行使用。一个示例用法是:

$ vcmailbox 0x00010004 8 8 0 0

…​它将返回如下内容:

0x00000020 0x80000000 0x00010004 0x00000008 0x800000008 0xnnnnnnnn 0x00000000 0x00000000

上面使用 邮箱属性接口 GET_BOARD_SERIAL ,请求大小为8字节,响应大小为8字节(为请求0、0发送两个整数)。对此的响应将是两个整数(0x00000020和0x80000000),后跟标签代码、请求长度、响应长度(设置第31位以指示它是响应),然后是64位序列号(其中MS 32位始终为0)。

写入和读取客户OTP值

Warning
OTP值是一次性可编程的。一旦位从0更改为1,它就不能更改回来。

要设置客户OTP值,您需要使用 SET_CUSTOMER_OTP (0x38021)标记,如下所示:

$ vcmailbox 0x00038021 [8 + number * 4] [8 + number * 4] [start_num] [number] [value] [value] [value] ...
  • start_num = 从0-7编程的第一行

  • number =要编程的行数

  • value = 要编程的每个值

因此,要将OTP客户行4、5和6分别编程为0x11111111、0x222222、0x33333333,您将使用:

$ vcmailbox 0x00038021 20 20 4 3 0x11111111 0x22222222 0x33333333

然后这将对第40、41和42行进行编程。

要读回值,您可以使用:

$ vcmailbox 0x00030021 20 20 4 3 0 0 0

这应该显示:

0x0000002c 0x80000000 0x00030021 0x00000014 0x80000014 0x00000000 0x00000003 0x11111111 0x22222222 0x33333333

如果您想将此功能集成到您自己的代码中,您应该能够通过使用vcmailbox.c代码作为示例来实现这一点。

在非BCM2712设备上锁定OTP

可以锁定OTP更改以避免它们再次被编辑。

这可以使用带有OTP写入邮箱的特殊参数来完成:

$ vcmailbox 0x00038021 8 8 0xffffffff 0xaffe0000

一旦锁定,客户OTP值就不能再更改。请注意,此锁定操作是不可逆的。

在BCM2712设备上锁定OTP

可以使用以下命令将客户区域标记为只读。

$ vcmailbox 0x00030086 4 4 0

OTP 仅在设备重置前锁定,因此每次启动时都需要重新应用 OTP 锁。

使非 BCM2712 设备上的客户 OTP 位不可读

可以完全阻止读取客户 OTP 位。这可以通过使用 OTP 写入邮箱的特殊参数来实现:

$ vcmailbox 0x00038021 8 8 0xffffffff 0xaffebabe

此操作不太可能对绝大多数用户有用,并且不可逆。

BCM2712 设备上的客户 MAC 地址

在 BCM2712 设备上,以太网、Wi-Fi 和蓝牙 MAC 地址设置在 OTP 内存中。这些值可以随客户值而变化。

获取客户的 mac 地址 vcmailbox 0x00030082/3/4 6 6 0 0,其中 2 代表以太网,3 代表 Wi-Fi,4 代表蓝牙:

$ vcmailbox 0x00030083 6 6 0 0
0x00000020 0x80000000 0x00030083 0x00000006 0x80000006 0xddccbbaa 0x0000ffee 0x00000000

要设置客户 MAC 地址,必须以两个 32 字节的形式发送,字节顺序要正确。您可以运行命令检查格式是否正确:

$ vcmailbox 0x00030085 6 6 0x44332211 0x6655

检查日志,查看 MAC 地址是否符合您的预期:

$ sudo vclog -m
1057826.701: read mac address 11:22:33:44:55:66

多播地址不被视为有效。MAC 地址最高有效八位字节中的最低有效位是多播位,因此请确保未设置该位。

然后,您可以使用命令 vcmailbox 0x00038082/3/4 6 6 <row1> <row0> 设置客户 MAC 地址:

$ vcmailbox 0x00038082 6 6 0x44332211 0x6655

如果客户 MAC 地址被设置为 ff:ff:ff:ff:ff:ff,则会被忽略。

设备专用私钥

使用 Broadcom BCM2712 处理器的设备有 16 行 OTP 数据(512 位),支持文件系统加密。

不使用 BCM2712 的设备有 8 行 OTP 数据(256 位)可用作设备专用私钥。

可以使用与管理客户 OTP 行类似的 vcmailbox 命令对这些行进行编程和读取。如果 不需要安全启动/文件系统加密,则设备私钥行可用于存储通用信息。

  • 设备私钥行只能通过 vcmailbox 命令读取,该命令需要访问 /dev/vcio ,而该权限仅限于 Raspberry Pi OS 上的 video 组。

  • Raspberry Pi 计算机没有硬件保护的密钥存储。建议将此功能与 安全启动 结合使用,以限制对此数据的访问。

  • Raspberry Pi OS 不支持加密的根文件系统。

有关开源磁盘加密的更多信息,请参阅 Cryptsetup

使用 rpi-otp-private-key 烧录密钥

Note
rpi-otp-private-key 脚本仅适用于使用 Broadcom BCM2711BCM2712 处理器的设备。

rpi-otp-private-key 脚本包装了设备私钥 vcmailbox API,以便更轻松地以 OpenSSL 格式读取和写入密钥。

Note
usbboot 存储库包含您需要的所有工具,包括 rpi-eeprom 作为 Git 子模块。

将 32 字节密钥读取为 64 个字符的十六进制数字:

$ cd usbboot/tools
$ rpi-otp-private-key

Example:

f8dbc7b0a4fcfb1d706e298ac9d0485c2226ce8df7f7596ac77337bd09fbe160

将 32 字节随机生成的数字写入设备私钥。

Warning
此操作无法撤消。
$ rpi-otp-private-key -w $(openssl rand -hex 32)
Note
要指定要使用的 OTP 行数,请传递 -l <word count> 。要指定密钥存储中的起始位置,请传递 -o <word offset>

用于读取/写入密钥的邮箱 API。

读取所有行。

$ vcmailbox 0x00030081 40 40 0 8 0 0 0 0 0 0 0 0

Example:

0x00000040 0x80000000 0x00030081 0x00000028 0x80000028 0x00000000 0x00000008 0xf8dbc7b0 0xa4fcfb1d 0x706e298a 0xc9d0485c 0x2226ce8d 0xf7f7596a 0xc77337bd 0x09fbe160 0x00000000

写入所有行(将尾随的八个零替换为密钥数据):

$ vcmailbox 0x00038081 40 40 0 8 0 0 0 0 0 0 0 0

写入上例中显示的密钥:

$ vcmailbox 0x38081 40 40 0 8 0xf8dbc7b0 0xa4fcfb1d 0x706e298a 0xc9d0485c 0x2226ce8d 0xf7f7596a 0xc77337bd 0x09fbe160

OTP寄存器和位定义

Raspberry Pi 系列使用的所有 SoC 都有一个内置的一次性可编程 (OTP) 存储块。少数位置有出厂编程数据。

OTP内存大小:

  • 非BCM2712设备:66个32位值

  • BCM2712设备:192个32位值

要显示 OTP 的内容,请运行以下命令:

$ vcgencmd otp_dump

非BCM2712设备上的OTP寄存器

此列表包含寄存器上的公开可用信息。如果此处未定义寄存器或位,则它不是公开的。

16

OTP 控制寄存器 - BCM2711

  • 位 26:禁用 VC JTAG

  • 第 27 位: 禁用 VC JTAG

17

启动模式寄存器

  • 位 1:将振荡器频率设置为 19.2MHz

  • 位 3:启用 SDIO 引脚上的上拉功能

  • 位 15:禁用 ROM RSA 密钥 0 -(如果设置,则启用安全启动)(BCM2711)

  • 位 19:启用 GPIO 启动模式

  • 位 20:设置检查 GPIO 启动模式的存储体

  • 位 21:启用从 SD 卡启动

  • 位 22:设置从 SD 卡启动的存储体

  • 位 28:启用 USB 设备启动

  • 位 29 :启用 USB 主机启动(以太网和大容量存储器)

Note
在 BCM2711 上,引导模式由 bootloader EEPROM 配置 定义,而不是 OTP。
18

引导模式寄存器副本

28

序列号

29

~(序列号)

30

revision code 1

33

板修订扩展 - 含义取决于板型号。 可通过 /proc/device-tree/chosen/rpi-boardrev-ext 中的 device-tree 获取,出于测试目的,可通过在 config.txt 中设置 board_rev_ext 来临时覆盖此 OTP 值。

  • Compute Module 4

    • 第 30 位:计算模块是否安装了 Wi-Fi 模块

      • 0 - Wi-Fi

      • 1 - 无 Wi-Fi

    • 第 31 位:计算模块是否安装了 EMMC 模块

      • 0 - EMMC

      • 1 - 无 EMMC(精简版)

  • 树莓派 400

    • 位 0-7: piwiz 使用的默认键盘国家代码。

36-43

customer OTP values

45

MPG2解码密钥

46

WVC1 解码密钥

47-54

用于安全启动的 RSA 公钥的 SHA256

55

安全启动标志(保留给启动加载程序使用)

56-63

256 位设备专用私钥

64-65

MAC 地址;如果设置,系统将优先使用该地址,而不是根据序列号自动生成的地址

66

高级启动寄存器(非 BCM2711)

  • 第 0-6 位:ETH_CLK 输出引脚的 GPIO

  • 第 7 位:启用 ETH_CLK 输出

  • 第 8-14 位:LAN_RUN 输出引脚的 GPIO

  • 位 15:启用 LAN_RUN 输出

  • 位 24:扩展 USB HUB 超时参数

  • 第 25 位:ETH_CLK 频率:

    • 0 - 25MHz

    • 1 - 24MHz

1还包含用于禁用过压、OTP编程和OTP读取的位。

BCM2712设备上的OTP寄存器

此列表包含寄存器上的公开可用信息。如果此处未定义寄存器或位,则它不是公开的。

22

引导模式寄存器

  • 位 1:从 SD 卡启动

  • 位 2-4 :从 SPI EEPROM 启动(以及哪些 GPIO)

  • 位 10:禁止从 SD 卡启动

  • 位 11:禁止从 SPI 启动

  • 位 12:禁止从 USB 启动

23

复制引导模式寄存器

29

高级启动模式

  • 位 0-7 :用于 SD 卡检测的 GPIO

  • 位 8-15: 用于 RPIBOOT 的 GPIO

31

序列号的低 32 位

32

电路板版本

33

板属性 - 含义取决于板型号。 可通过 /proc/device-tree/chosen/rpi-boardrev-ext 中的 device-tree 获取。

35

序列号的上 32 位 完整的 64 位序列号在 /proc/device-tree/serial-number 中提供

50-51

以太网 MAC 地址 在设备树中传递给操作系统,例如 /proc/device-tree/axi/pcie@120000/rp1/ether@100000/local-mac-address

52-53

Wi-Fi MAC 地址 在设备树中传递给操作系统,例如 /proc/device-tree/axi/mmc@1100000/wifi@1/local-mac-address

54-55

蓝牙 MAC 地址 这将在设备树中传递给操作系统,例如 /proc/device-tree/soc/serial@7d50c000/bluetooth/local-bd-address

77-84

customer OTP values

86

board country - piwiz 使用的默认键盘国家代码。 如果已设置,则可通过 /proc/device-tree/chosen/rpi-country-code 中的设备树查看。

87-88

customer Ethernet MAC address 如果已设置,则覆盖 OTP 第 50-51 行

89-90

customer Wi-Fi MAC address 如果设置,则覆盖 OTP 第 52-53 行

89-90

customer Bluetooth MAC address 如果设置,则覆盖 OTP 第 54-55 行

109-114

出厂设备 UUID 目前是一个 16 位数字 ID,应与设备上的条形码相匹配。用 0 字符填充并用 c40 编码。

可通过 /proc/device-tree/chosen/rpi-duid 中的 device-tree 获取。

用于PCIe的树莓派连接器

树莓派的PCIe连接器
树莓派的PCIe连接器

Raspberry Pi 5在电路板的右侧有一个FPC连接器。该连接器为快速外围设备提供了PCIe Gen 2.0×1接口。

要连接PCIe HAT+设备,请将其连接到您的Raspberry Pi。您的Raspberry Pi应该会自动检测到该设备。要连接非HAT+设备,请将其连接到您的Raspberry Pi,然后[enable-pcie,手动启用PCIe]

有关PCIe FPC连接器引脚和创建第三方设备、附件和HAT所需的其他详细信息,请参阅 Raspberry Pi Connector for PCIe标准文档。它应与 Raspberry Pi HAT+规范 一起阅读。

Note
只有某些设备 支持 枚举 Switch 后面的 PCIe 设备。

启用PCIe

默认情况下,除非连接到HAT+设备,否则不会启用PCIe连接器。要启用连接器,请将以下行添加到 /boot/firmware/config.txt

dtparam=pciex1

使用 sudo reboot 重新启动以使配置更改生效。

Note
您也可以使用别名 nvme

从PCIe启动

默认情况下,Raspberry Pi设备不从PCIe存储启动。要启用从PCIe启动,请更改引导加载程序配置中的 BOOT_ORDER 。使用以下命令编辑EEPROM配置:

$ sudo rpi-eeprom-config --edit

BOOT_ORDER 行替换为以下行:

BOOT_ORDER=0xf416

要从非HAT+设备启动,还需要添加以下行:

PCIE_PROBE=1

保存更改后,使用 sudo reboot 重新启动Raspberry Pi以更新EEPROM。

PCIe Gen 3.0

Warning
Raspberry Pi 5未通过Gen 3.0速度认证。PCIe Gen 3.0连接可能不稳定。

默认情况下,Raspberry Pi 5 使用 Gen 2.0 速度(5 GT/s)。使用以下方法之一来强制使用 Gen 3.0(8 GT/s):

  • config.txt

  • raspi-config

连接已通过Gen 2.0速度(5 GT/sec)认证,但您可以强制执行Gen 3.0(10 GT/sec)速度。要启用PCIe Gen 3.0速度,请将以下行添加到 /boot/firmware/config.txt

dtparam=pciex1_gen=3

使用 sudo reboot 重新启动您的Raspberry Pi以使这些设置生效。

运行以下命令打开 Raspberry Pi 配置 CLI:

$ sudo raspi-config

完成以下步骤,启用 PCIe Gen 3.0 速度:

  1. 选择 Advanced Options.

  2. 选择 PCIe Speed.

  3. 选择 Yes 以启用 PCIe Gen 3 模式.

  4. 选择 Finish 退出.

  5. 使用 sudo reboot 重启 Raspberry Pi,使这些设置生效。

电源按钮

Note
本节仅适用于带有电源按钮的Raspberry Pi型号,例如Raspberry Pi 5。

当您第一次将Raspberry Pi插入电源时,它会自动打开并启动到操作系统,而无需按下按钮。

如果您运行Raspberry Pi Desktop,您可以通过短暂按下电源按钮来启动彻底关闭。将出现一个窗口,询问您是要关闭、重新启动还是注销。

选择一个选项或再次按下电源按钮以启动干净的关机。

Note
如果您运行Raspberry Pi Desktop,您可以快速连续按两次电源按钮以关闭。如果您在没有桌面的情况下运行Raspberry Pi OS Lite,请按一次电源按钮以启动关机。

重启

如果Raspberry Pi板已关闭,但仍连接到电源,请按电源按钮重新启动板。

Note
重置电源管理集成电路(PMIC)也可以重新启动电路板。连接HAT可以重置PMIC。在连接HAT之前,请务必断开设备与电源的连接。

强制关机

要强制硬关机,请按住电源按钮。

添加自己的电源按钮

The J2 jumper on Raspberry Pi 5
The J2 jumper

J2 跳线位于 RTC 电池连接器和电路板边缘之间。通过在这两个焊盘之间添加一个常开(NO)瞬时开关,您就可以在 Raspberry Pi 5 上添加自己的电源按钮。短暂闭合该开关将执行与板载电源按钮相同的操作。

电源

电源要求因Raspberry Pi型号而异。所有型号都需要5.1V电源,但所需电流通常会根据型号而增加。Raspberry Pi 3之前的所有型号都需要micro USB电源连接器,而Raspberry Pi 4、Raspberry Pi 400和Raspberry Pi 5使用USB-C连接器。

每个Raspberry Pi消耗的电流取决于连接的外围设备。

推荐电源

对于树莓派1、树莓派2和树莓派3,我们推荐 2.5A micro USB电源。对于树莓派4和树莓派400,我们推荐 树莓派4的3A USB-C电源。对于树莓派5,我们推荐 27W USB-C电源

Note
没有Raspberry Pi型号支持USB-PPS。
Note
如果您使用第三方USB-PD多端口电源,则在连接Raspberry Pi时将额外设备插入电源会导致电源和Raspberry Pi之间的重新协商。如果Raspberry Pi通电,则会无缝发生这种情况。如果Raspberry Pi断电,这种重新协商可能会导致Raspberry Pi启动。

以太网供电(PoE)

The PoE connector,width=
Raspberry Pi 5 PoE header

Raspberry Pi 5上的以太网插孔支持PoE+,支持IEEE 802.3at-2009 PoE标准。

Raspberry Pi4B和Pi3B+上的以太网插孔支持PoE,支持IEEE 802.3af-2003 PoE标准。

所有带有支持 PoE 以太网插孔的 Raspberry Pi 型号都需要一个 HAT 才能通过以太网端口获取电源。对于支持 PoE 的型号,我们推荐使用 PoE HAT。对于支持 PoE+ 的型号,我们推荐使用 PoE+ HAT

典型功率要求

产品 推荐的PSU电流容量 最大总USB外设电流消耗 典型裸板有源电流消耗

Raspberry Pi 1 Model A

700mA

500mA

200mA

Raspberry Pi 1 Model B

1.2A

500mA

500mA

Raspberry Pi 1 Model A+

700mA

500mA

180mA

Raspberry Pi 1 Model B+

1.8A

1.2A

330mA

Raspberry Pi 2 Model B

1.8A

1.2A

350mA

Raspberry Pi 3 Model B

2.5A

1.2A

400mA

Raspberry Pi 3 Model A+

2.5A

仅受PSU、电路板和连接器额定值限制。

350mA

Raspberry Pi 3 Model B+

2.5A

1.2A

500mA

Raspberry Pi 4 Model B

3.0A

1.2A

600mA

Raspberry Pi 5

5.0A

1.6A (如果使用3A电源,则为600mA)

800mA

Pi 400

3.0A

1.2A

800mA

Pi 500

5.0A

1.6A (600mA if using a 3A power supply)

800mA

Zero

1.2A

仅受PSU、电路板和连接器额定值限制

100mA

Zero W

1.2A

仅受PSU、电路板和连接器额定值限制。

150mA

Zero 2 W

2A

仅受PSU、电路板和连接器额定值限制。

350mA

Note
当连接到+5V(25W)时,Raspberry Pi 5为下游USB外围设备提供1.6A的电源。当连接到任何其他兼容电源时,Raspberry Pi 5将下游USB设备的功率限制为600mA。

大多数Raspberry Pi为USB外围设备提供足够的电流,为大多数USB设备供电,包括键盘、鼠标和适配器。但是,一些设备需要额外的电流,包括调制解调器、外部磁盘和大功率天线。要连接功率要求超过上表中指定的值的USB设备,请使用外部供电的USB集线器进行连接。

随着您使用树莓派上的各种接口,树莓派的电源要求会增加。结合起来,GPIO引脚可以安全地绘制50mA;每个引脚可以单独绘制高达16mA。HDMI端口使用50mA。相机模块需要250mA。USB键盘和鼠标可以使用100mA或高达1000mA。检查您计划连接到树莓派的设备的额定功率,并相应地购买电源。如果您不确定,请使用外部供电的USB集线器。

运行以下命令检查 USB 端口的电源输出状态:

$ vcgencmd get_config usb_max_current_enable

下表描述了不同Raspberry Pi型号在各种工作负载期间消耗的电量(以安培为单位):

Raspberry Pi 1B+

Raspberry Pi 2B

Raspberry Pi 3B

Raspberry Pi Zero

Raspberry Pi 4B

Boot

Max

0.26

0.40

0.75

0.20

0.85

Avg

0.22

0.22

0.35

0.15

0.7

Idle

Avg

0.20

0.22

0.30

0.10

0.6

Video playback (H.264)

Max

0.30

0.36

0.55

0.23

0.85

Avg

0.22

0.28

0.33

0.16

0.78

Stress

Max

0.35

0.82

1.34

0.35

1.25

Avg

0.32

0.75

0.85

0.23

1.2

Halt current

0.10

0.055

0.023

注:这些测量使用了标准的 Raspberry Pi 操作系统镜像(截至 2016 年 2 月 26 日,Raspberry Pi 4 则截至 2019 年 6 月),在室温下进行,Raspberry Pi 与 HDMI 显示器、USB 键盘和 USB 鼠标相连。Raspberry Pi 3 Model B 连接到无线局域网接入点,Raspberry Pi 4 连接到以太网。所有这些功率测量值都是近似值,没有考虑额外 USB 设备的功耗;如果多个额外 USB 设备或 HAT 连接到 Raspberry Pi,功耗很容易超过这些测量值。

Extra PMIC features on Raspberry Pi 4 and Compute Module 4

Raspberry Pi 4和CM4都使用了许多不同的PMIC器件。所有PMIC都提供额外的功能以及电压供应功能。本文档描述了如何在软件中访问这些功能。

关闭时降低Raspberry Pi 5瓦数

默认情况下,Raspberry Pi 5 关机时的功耗约为 1W 至 1.4W。可以通过使用 sudo rpi-eeprom-config -e 手动编辑 EEPROM 配置来降低功耗。将设置更改为

BOOT_UART=1
POWER_OFF_ON_HALT=1
BOOT_ORDER=0xf416

当掉电到0.01W左右时,这应该会降低功耗。

电源警告

自 Raspberry Pi B+(2014 年)以来,除 Zero 系列外,所有型号的 Raspberry Pi 都有低电压检测电路,可检测电源电压是否降至 4.63V 以下(±5%)。这将会在内核日志中添加一条记录。

如果您看到警告,请切换到更高质量的电源和电缆。低质量的电源可能会损坏存储或导致Raspberry Pi中的不可预测行为。

电压可能会因多种原因下降。您可能插入了太多高要求的USB设备。电源可能不足。或者电源电缆可能使用太细的电线。

Making a more resilient file system

Raspberry Pi 设备经常被用作数据存储和监控设备,并经常用于可能会突然断电的地方。与任何计算设备一样,断电可能会导致存储损坏。

本白皮书提供了一些选项,说明如何通过选择适当的文件系统和设置来确保数据完整性,从而防止在上述及其他情况下出现数据损坏。

电源和树莓派操作系统

引导程序通过设备树 /proc/device-tree/chosen/power 传递有关电源的信息。用户通常不会直接读取。

max_current

以mA为单位的最大电流

uspd_power_data_objects

PDO的转储-高级用户的调试

usb_max_current_enable

限流器设置为高还是低

usb_over_current_detected

在将控制权转移到操作系统之前,引导期间是否发生任何USB过流

reset_event

PMIC复位原因,例如看门狗、过压或欠压、过温

PMIC 内置 ADC,除其他外,可以测量电源电压 EXT5V_V 。使用以下命令查看 ADC 测量值:

$ vcgencmd pmic_read_adc

你看不到 USB 电流或其他直接连接到 5V 的电流,因为这会绕过 PMIC。你不应该指望它增加到源电源的功率。不过,这对监控内核电压等情况还是很有用的。

反向供电

USB 规范要求 USB 设备不得向上游设备提供电流。如果 USB 设备确实向上游设备提供电流,则称为反向供电。这种情况通常发生在连接了劣质的供电 USB 集线器时,会导致供电 USB 集线器向 Raspberry Pi 主机供电。不建议这样做,因为通过集线器向 Raspberry Pi 供电会绕过 Raspberry Pi 内置的保护电路,使其在电源浪涌时容易受到损坏。

实时时钟(RTC)

Raspberry Pi 5包括一个RTC模块。这可以通过位于USB-C电源连接器右侧的板上的J5(BAT)连接器由电池供电。

The J5 battery connector
The J5 battery connector

您可以设置唤醒闹钟,将电路板切换到极低功耗状态(约 3mA)。达到闹钟时间后,电路板将重新开启。这对延时摄影等周期性工作非常有用。

要支持唤醒警报的低功耗模式,请编辑引导加载程序配置:

$ sudo -E rpi-eeprom-config --edit

adding the following two lines.

POWER_OFF_ON_HALT=1
WAKE_ON_GPIO=0

您可以使用以下方法测试功能:

$ echo +600 | sudo tee /sys/class/rtc/rtc0/wakealarm
$ sudo halt

这将使电路板停止进入非常低的功耗状态,然后唤醒并在10分钟后重新启动。

RTC还提供启动时间,例如在 dmesg 中,对于无法访问NTP的用例:

[    1.295799] rpi-rtc soc:rpi_rtc: setting system clock to 2023-08-16T15:58:50 UTC (1692201530)
Note
即使没有连接到J5连接器的备用电池,RTC仍然可用。

添加备用电池

Lithium-manganese rechargeable RTC battery
Lithium-manganese rechargeable RTC battery

官方电池部分是可充电锂锰纽扣电池,带有预装的两针JST-SH插头和粘合剂安装垫。这适用于在板的主电源断开时为RTC供电。由于断电时的电流消耗以个位数µA为单位,因此保持时间以月为单位。

Note
我们不建议将初级(不可充电)锂电池用于RTC。RTC备用电流消耗高于大多数专用RTC模块,并将导致较短的使用寿命。
Warning
请勿将锂离子电池用于RTC。

启用电池充电

RTC配备了一个恒流(3mA)恒压充电器。

默认情况下禁用电池充电。有显示充电电压和限制的 sysfs 文件:

/sys/devices/platform/soc/soc:rpi_rtc/rtc/rtc0/charging_voltage:0
/sys/devices/platform/soc/soc:rpi_rtc/rtc/rtc0/charging_voltage_max:4400000
/sys/devices/platform/soc/soc:rpi_rtc/rtc/rtc0/charging_voltage_min:1300000

要以设定电压为电池充电,请将 rtc_bbat_vchg 添加到 /boot/firmware/config.txt :

dtparam=rtc_bbat_vchg=3000000

使用 sudo reboot 重新启动以使用新的电压设置。检查 sysfs 文件以确保充电电压设置正确。

禁用电池充电

要停止充电,请从 config.txt 中删除任何包含 rtc_bbat_vchg 的行。

串行外设接口(SPI)

树莓派计算机配备了许多 SPI 总线。SPI可用于连接各种外围设备——显示器、网络控制器(以太网、CAN总线)、UART等。这些设备最好由内核设备驱动程序支持,但 spidev 应用编程接口允许用多种语言编写用户空间驱动程序。

SPI硬件

Raspberry Pi Zero、1、2和3有三个SPI控制器:

  • SPI0,具有两个硬件芯片选择,可用于所有 Raspberry Pi 的排针;还有一个替代映射,仅在 Compute Module 上可用。

  • SPI1 具有三种硬件芯片选择,适用于除原始Raspberry Pi 1 Model A和Model B之外的所有Raspberry Pi型号。

  • SPI2 也有三种硬件芯片选择,仅在 Compute Module 1、3和3+上可用。

在树莓派4、400和 Compute Module 4 上,有四个额外的SPI总线:SPI3到SPI6,每个都有两个硬件芯片选择。这些额外的SPI总线可通过某些GPIO引脚上的备用功能分配获得。有关详细信息,请参阅 BCM2711 Arm外围设备 datasheet。

https://datasheets.raspberrypi.com/bcm2835/bcm2835-peripherals.pdf[BCM2835 Arm外设] datasheet中的第10章描述了主控制器。第2.3章描述了辅助控制器。

引脚/GPIO映射

SPI0
SPI function Header pin Broadcom pin name Broadcom pin function

MOSI

19

GPIO10

SPI0_MOSI

MISO

21

GPIO09

SPI0_MISO

SCLK

23

GPIO11

SPI0_SCLK

CE0

24

GPIO08

SPI0_CE0_N

CE1

26

GPIO07

SPI0_CE1_N

SPI0备用映射(仅 Compute Module ,CM4除外)
SPI function Broadcom pin name Broadcom pin function

MOSI

GPIO38

SPI0_MOSI

MISO

GPIO37

SPI0_MISO

SCLK

GPIO39

SPI0_SCLK

CE0

GPIO36

SPI0_CE0_N

CE1

GPIO35

SPI0_CE1_N

SPI1
SPI function Header pin Broadcom pin name Broadcom pin function

MOSI

38

GPIO20

SPI1_MOSI

MISO

35

GPIO19

SPI1_MISO

SCLK

40

GPIO21

SPI1_SCLK

CE0

12

GPIO18

SPI1_CE0_N

CE1

11

GPIO17

SPI1_CE1_N

CE2

36

GPIO16

SPI1_CE2_N

SPI2(仅 Compute Module ,CM4除外)
SPI function Broadcom pin name Broadcom pin function

MOSI

GPIO41

SPI2_MOSI

MISO

GPIO40

SPI2_MISO

SCLK

GPIO42

SPI2_SCLK

CE0

GPIO43

SPI2_CE0_N

CE1

GPIO44

SPI2_CE1_N

CE2

GPIO45

SPI2_CE2_N

SPI3(仅限BCM2711)
SPI function Header pin Broadcom pin name Broadcom pin function

MOSI

03

GPIO02

SPI3_MOSI

MISO

28

GPIO01

SPI3_MISO

SCLK

05

GPIO03

SPI3_SCLK

CE0

27

GPIO00

SPI3_CE0_N

CE1

18

GPIO24

SPI3_CE1_N

SPI4(仅限BCM2711)
SPI function Header pin Broadcom pin name Broadcom pin function

MOSI

31

GPIO06

SPI4_MOSI

MISO

29

GPIO05

SPI4_MISO

SCLK

26

GPIO07

SPI4_SCLK

CE0

07

GPIO04

SPI4_CE0_N

CE1

22

GPIO25

SPI4_CE1_N

SPI5(仅限BCM2711)
SPI function Header pin Broadcom pin name Broadcom pin function

MOSI

08

GPIO14

SPI5_MOSI

MISO

33

GPIO13

SPI5_MISO

SCLK

10

GPIO15

SPI5_SCLK

CE0

32

GPIO12

SPI5_CE0_N

CE1

37

GPIO26

SPI5_CE1_N

SPI6(仅限BCM2711)
SPI function Header pin Broadcom pin name Broadcom pin function

MOSI

38

GPIO20

SPI6_MOSI

MISO

35

GPIO19

SPI6_MISO

SCLK

40

GPIO21

SPI6_SCLK

CE0

12

GPIO18

SPI6_CE0_N

CE1

13

GPIO27

SPI6_CE1_N

主模式

信号名称缩写

Signal name abbreviations:

SCLK

serial clock

CE

chip enable (often called chip select)

MOSI

master out slave in

MISO

master in slave out

MOMI

master out master in

标准模式

在标准SPI模式下,外设实现标准的三线串行协议(SCLK、MOSI和MISO)。

双向模式

在双向 SPI 模式中,执行的是相同的 SPI 标准,但数据线(MOMI)只用一根,而不是标准模式中的两根(MISO 和 MOSI)。在这种模式下,MOSI 引脚用作 MOMI 引脚。

低速串行接口(LoSSI)模式

LoSSI 标准允许向外围设备(LCD)发出命令,并将数据传输到外围设备。LoSSI 命令和参数的长度为 8 位,但有一个额外位用于指示字节是命令还是参数/数据。数据时,该额外位设置为高电平;命令时,该额外位设置为低电平。由此产生的 9 位值被序列化到输出端。LoSSI 通常与 MIPI DBI 类型 C 兼容的 LCD 控制器一起使用。

Note
某些命令会触发 SPI 控制器的自动读取,因此此模式不能用作多用途 9 位 SPI。

传输模式

  • Polled

  • Interrupt

  • DMA

速度

CLK 寄存器的时钟分频器 (CDIV) 字段设置 SPI 时钟速度:

SCLK

Core Clock / CDIV

如果 CDIV 设置为 0,则除数为 65536。除数必须是 2 的倍数,奇数向下舍入。请注意,由于模拟电气问题(上升时间、驱动强度等),并非所有可能的时钟速率都可用。

有关更多信息,请参阅 Linux driver 部分。

芯片选择

在 DMA 模式下运行时,与 CS 线的自动置位和置位取消相关的设置和保持时间如下:

  • CS 线将在传输的第一个字节的 msb 之前至少三个核心时钟周期置位。

  • CS 线将在最后一个时钟脉冲的后沿之后不早于一个核心时钟周期置位。

SPI 软件

Linux driver

默认的 Linux 驱动程序是 spi-bcm2835

SPI0 默认禁用。要启用它,请使用 raspi-config,或确保 /boot/firmware/config.txt 中的 dtparam=spi=on 行未注释。默认情况下,它使用两条芯片选择线,但可以使用 dtoverlay=spi0-1cs 将其减少为一条。此外还有 dtoverlay=spi0-2cs ;不带任何参数的情况下,它等同于 dtparam=spi=on

要启用 SPI1,可以使用 1、2 或 3 条芯片选择线。在 /boot/firmware/config.txt 中添加相应行:

#1 chip select
dtoverlay=spi1-1cs
#2 chip select
dtoverlay=spi1-2cs
#3 chip select
dtoverlay=spi1-3cs

SPI2、SPI3、SPI4、SPI5 和 SPI6 也有类似的overlays。

由于某些限制,该驱动程序不使用硬件芯片选择线。相反,它可以使用任意数量的 GPIO 作为软件/GPIO 片选。这意味着你可以自由选择任何空闲的 GPIO 作为 CS 线路,而且所有这些 SPI 覆盖都包含该控制 - 详情请参见 /boot/firmware/overlays/README ,或运行(例如) dtoverlay -h spi0-2csdtoverlay -a | grep spi 可能有助于列出所有这些线路)。

速度

驱动程序支持内核时钟整除的所有速度,但如上所述,由于 GPIO 和所连接设备的限制,并非所有这些速度都能支持数据传输。根据经验,任何超过 50MHz 的速度都不可能工作,但具体情况可能会有所不同。

支持的模式位
SPI_CPOL

clock polarity

SPI_CPHA

clock phase

SPI_CS_HIGH

chip select active high

SPI_NO_CS

1 device per bus, no Chip select

SPI_3WIRE

bidirectional mode, data in and out pin shared

双向模式也称为 3 线模式,由 spi-bcm2835 内核模块支持。请注意,在这种模式下,spi_transfer 结构的 txrx 字段必须是空指针,因为只能进行半双工通信。否则,传输将失败。spidev_test.c 源代码没有正确考虑这一点,因此在三线模式下根本无法工作。

每个字支持的位数
  • 8 - 正常

  • 9 - 支持使用 LoSSI 模式

传输模式

所有 SPI 总线都支持中断模式。 SPI0 和 SPI3-6 也支持 DMA 传输。

SPI 驱动程序延迟

thread 讨论了延迟问题。

spidev

spidev 为单个 SPI CS 线路提供了一个基于 ioctl 的用户空间接口。设备树用于指示 CS 线路是由内核驱动模块驱动,还是由 spidev 代表用户管理;两者不可能同时进行。请注意,Raspberry Pi 自己的内核对于使用设备树来启用 spidev 比较宽松 - 上游内核会对此类使用发出警告,最终可能会完全禁止使用。

从 C 使用 spidev

Linux 文档中有一个环回测试程序可以用作起点。请参阅 Troubleshooting 部分。

从 Python 使用 spidev

有多个 Python 库提供对 spidev 的访问,包括 spidevpip install spidev - 请参阅 https://pypi.org/project/spidev/)和 SPI-Py (https://github.com/lthiery/SPI-Py)。

在 bash 等 shell 中使用 spidev

以下命令将写入二进制 1、2 和 3:

$ echo -ne "\x01\x02\x03" > /dev/spidev0.0

其他SPI库

还有其他用户空间库通过直接操作硬件来提供 SPI 控制:不建议使用这种方法。

故障排除

环回测试

这可以用来测试SPI发送和接收。在MOSI和MISO之间放一根电线。它不测试CE0和CE1。

$ wget https://raw.githubusercontent.com/raspberrypi/linux/rpi-6.1.y/tools/spi/spidev_test.c
$ gcc -o spidev_test spidev_test.c
$ ./spidev_test -D /dev/spidev0.0
spi mode: 0
bits per word: 8
max speed: 500000 Hz (500 KHz)

FF FF FF FF FF FF
40 00 00 00 00 95
FF FF FF FF FF FF
FF FF FF FF FF FF
FF FF FF FF FF FF
DE AD BE EF BA AD
F0 0D

以上部分内容抄自 elinux SPI 页面,该页面也借鉴了此处内容。两者均采用 CC-SA 许可。

通用串行总线(USB)

一般来说,Linux 支持的所有设备都可以与 Raspberry Pi 一起使用,但 Raspberry Pi 4 之前的型号有一些限制。

最大功率输出

与所有电脑一样,Raspberry Pi 上的 USB 端口提供的功率是有限的。USB 设备的问题通常是由电源问题引起的。要排除电源不足的原因,请使用供电集线器将 USB 设备连接到 Raspberry Pi。

Model Max power output of USB ports

Raspberry Pi Zero, 1

500mA per port1

Raspberry Pi 2, 3, 4

1200mA total across all ports

Raspberry Pi 5

600mA if using a 3A supply, 1600mA if using a 5A supply

  1. 对于原始 Raspberry Pi 1 Model B,每个端口的限制电流为 100mA。

Raspberry Pi 5

Raspberry Pi 5 需要能够在 +5V 电压下提供 3A 电流(15W)的优质 USB-C 电源才能启动。不过,使用这样的电源会限制外设的电流消耗。如果您使用的电源无法在首次启动时以 +5V 电压提供 5A 电流,则操作系统会警告您外围设备的电流将限制在 600mA。

对于希望驱动大功率外设(如硬盘和固态硬盘),同时为峰值工作负载保留余量的用户,应使用能够在 +5V 电压下提供 5A 电流(25W)的支持 USB-PD 的电源。如果 Raspberry Pi 5 固件检测到这样的电源,就会将外围设备的 USB 电流限制增加到 1.6A,为下游 USB 设备提供 5W 的额外电源,并提供 5W 的额外板载电源余量。

Note
电源余量由 USB 端口和风扇共享。

Raspberry Pi 4

Raspberry Pi 4 提供两个 USB 3.0 端口和两个 USB 2.0 端口,它们与 VL805 USB 控制器相连。所有四个端口的 USB 2.0 线路都连接到 VL805 中的一个 USB 2.0 集线器。这就将 USB 1.1 和 USB 2.0 设备的总可用带宽限制为单个 USB 2.0 端口的带宽。

在 Raspberry Pi 4 上,以前型号使用的 USB 控制器位于 USB Type C 端口上,默认情况下被禁用。

Raspberry Pi Zero, 1, 2 and 3

Raspberry Pi 1 Model B+、Raspberry Pi 2 和 Raspberry Pi 3 板提供四个 USB 2.0 端口。Raspberry Pi Zero 板有一个微型 USB on-the-go (OTG) 端口。

Raspberry Pi 4 之前型号的 USB 控制器对某些设备只有基本的支持,因此软件处理开销较大。它还只支持一个根 USB 端口:来自连接设备的所有流量都通过这条单一总线传输,其最高运行速度为 480Mbps。

USB 2.0 规范定义了三种设备速度—​低速、全速和高速。大多数鼠标和键盘为低速,大多数 USB 音效设备为全速,大多数视频设备(网络摄像头或视频采集)为高速。

一般来说,将多个高速 USB 设备连接到 Raspberry Pi 不会有任何问题。

与低速和全速设备通信时产生的软件开销意味着同时激活低速和全速设备的数量受到限制。少量这些类型的设备连接到 Raspberry Pi 不会造成任何问题。

已知的 USB 问题

与 USB 3.0 集线器的互操作性

在使用全速或低速设备(包括大多数鼠标和键盘)时,USB 3.0 集线器存在一个问题。大多数 USB 3.0 集线器硬件中的一个错误意味着 Raspberry Pi 4 之前的型号无法与连接到 USB 3.0 集线器的全速或低速设备对话。

通过 USB 3.0 集线器连接 USB 2.0 高速设备(包括 USB 2.0 集线器)时可正常运行。

避免将低速或全速设备连接到 USB 3.0 集线器。作为一种变通方法,将 USB 2.0 集线器插入 USB 3.0 集线器的下游端口并连接低速设备,或在 Raspberry Pi 和 USB 3.0 集线器之间使用 USB 2.0 集线器,然后将低速设备插入 USB 2.0 集线器。

USB 1.1 网络摄像头

老式网络摄像头可能是全速设备。由于这些设备会传输大量数据并产生额外的软件开销,因此无法保证可靠运行。作为一种变通方法,可尝试使用较低分辨率的摄像头。

USB 声卡

昂贵的发烧级声卡通常使用大量 USB 带宽。无法保证 96kHz/192kHz DAC 的可靠运行。作为一种变通方法,强制输出流为 CD 质量(44.1kHz/48kHz 16 位)可将流带宽降至可靠水平。

单 TT USB 集线器

USB 2.0 和 3.0 集线器有一种与连接到其下游端口的全速或低速设备对话的机制,称为事务转换器 (TT)。该设备可缓冲来自主机的高速请求,并以全速或低速将其传输到下游设备。USB 规范允许两种集线器配置: 单 TT(所有端口一个 TT)和多 TT(每个端口一个 TT)。由于硬件限制,如果在单 TT 集线器上插入过多的全速或低速设备,设备可能会表现不可靠。建议使用多 TT 集线器连接多个全速和低速设备。作为一种变通方法,将全速和低速设备分散到 Raspberry Pi 自身的 USB 端口和单 TT 集线器之间。

树莓派修订代码

每个不同的Raspberry Pi模型修订版都有一个唯一的修订版代码。您可以通过运行以下命令来查找Raspberry Pi的修订代码:

$ cat /proc/cpuinfo

最后三行显示硬件类型、修订代码和Raspberry Pi的唯一序列号。例如:

Hardware    : BCM2835
Revision    : a02082
Serial      : 00000000765fc593
Note
所有Raspberry Pi计算机都报告 BCM2835 ,即使是带有BCM2836、BCM2837、BCM2711和BCM2712处理器的计算机。您不应该使用此字符串来检测处理器。使用以下信息或 cat /sys/firmware/devicetree/base/model 解码修订代码。

老式修订代码

第一组Raspberry Pi型号被赋予了从 00020015 的顺序十六进制修订代码:

Code Model Revision RAM Manufacturer

0002

B

1.0

256MB

Egoman

0003

B

1.0

256MB

Egoman

0004

B

2.0

256MB

Sony UK

0005

B

2.0

256MB

Qisda

0006

B

2.0

256MB

Egoman

0007

A

2.0

256MB

Egoman

0008

A

2.0

256MB

Sony UK

0009

A

2.0

256MB

Qisda

000d

B

2.0

512MB

Egoman

000e

B

2.0

512MB

Sony UK

000f

B

2.0

512MB

Egoman

0010

B+

1.2

512MB

Sony UK

0011

CM1

1.0

512MB

Sony UK

0012

A+

1.1

256MB

Sony UK

0013

B+

1.2

512MB

Embest

0014

CM1

1.0

512MB

Embest

0015

A+

1.1

256MB/512MB

Embest

新式修订代码

随着Raspberry Pi 2的推出,引入了新式的修订代码。十六进制代码的每一位不是顺序的,而是代表有关修订的一条信息:

NOQuuuWuFMMMCCCCPPPPTTTTTTTTRRRR
Part Represents Options

N (bit 31)

Overvoltage

0: Overvoltage allowed

1: Overvoltage disallowed

O (bit 30)

OTP Program1

0: OTP programming allowed

1: OTP programming disallowed

Q (bit 29)

OTP Read1

0: OTP reading allowed

1: OTP reading disallowed

uuu (bits 26-28)

Unused

Unused

W (bit 25)

Warranty bit2

0: Warranty is intact

1: Warranty has been voided by overclocking

u (bit 24)

Unused

Unused

F (bit 23)

New flag

1: new-style revision

0: old-style revision

MMM (bits 20-22)

Memory size

0: 256MB

1: 512MB

2: 1GB

3: 2GB

4: 4GB

5: 8GB

6: 16GB

CCCC (bits 16-19)

Manufacturer

0: Sony UK

1: Egoman

2: Embest

3: Sony Japan

4: Embest

5: Stadium

PPPP (bits 12-15)

Processor

0: BCM2835

1: BCM2836

2: BCM2837

3: BCM2711

4: BCM2712

TTTTTTTT (bits 4-11)

Type

0x00: A

0x01: B

0x02: A+

0x03: B+

0x04: 2B

0x05: Alpha (early prototype)

0x06: CM1

0x08: 3B

0x09: Zero

0x0a: CM3

0x0c: Zero W

0x0d: 3B+

0x0e: 3A+

0x0f: Internal use only

0x10: CM3+

0x11: 4B

0x12: Zero 2 W

0x13: 400

0x14: CM4

0x15: CM4S

0x16: Internal use only

0x17: 5

0x18: CM5

0x19: 500

0x1a: CM5 Lite

RRRR (bits 0-3)

Revision

0, 1, 2, etc.

1 有关 programming the OTP bits 的信息。

2 Raspberry Pi 4 上从未设置过保修位。

正在使用的新式修订代码

Note
此列表并非详尽-可能有未在此表中使用的代码。有关使用修订代码识别电路板的最佳方法,请参阅下一节。
Code Model Revision RAM Manufacturer

900021

A+

1.1

512MB

Sony UK

900032

B+

1.2

512MB

Sony UK

900092

Zero

1.2

512MB

Sony UK

900093

Zero

1.3

512MB

Sony UK

9000c1

Zero W

1.1

512MB

Sony UK

9020e0

3A+

1.0

512MB

Sony UK

9020e1

3A+

1.1

512MB

Sony UK

920092

Zero

1.2

512MB

Embest

920093

Zero

1.3

512MB

Embest

900061

CM1

1.1

512MB

Sony UK

a01040

2B

1.0

1GB

Sony UK

a01041

2B

1.1

1GB

Sony UK

a02082

3B

1.2

1GB

Sony UK

a020a0

CM3

1.0

1GB

Sony UK

a020d3

3B+

1.3

1GB

Sony UK

a020d4

3B+

1.4

1GB

Sony UK

a02042

2B (with BCM2837)

1.2

1GB

Sony UK

a21041

2B

1.1

1GB

Embest

a22042

2B (with BCM2837)

1.2

1GB

Embest

a22082

3B

1.2

1GB

Embest

a220a0

CM3

1.0

1GB

Embest

a32082

3B

1.2

1GB

Sony Japan

a52082

3B

1.2

1GB

Stadium

a22083

3B

1.3

1GB

Embest

a02100

CM3+

1.0

1GB

Sony UK

a03111

4B

1.1

1GB

Sony UK

b03111

4B

1.1

2GB

Sony UK

b03112

4B

1.2

2GB

Sony UK

b03114

4B

1.4

2GB

a01040

2B

1.0

1GB

Sony UK

a01041

2B

1.1

1GB

Sony UK

a21041

2B

1.1

1GB

Embest

a02042

2B (with BCM2837)

1.2

1GB

Sony UK

a22042

2B (with BCM2837)

1.2

1GB

Embest

900061

CM1

1.1

512MB

Sony UK

a02082

3B

1.2

1GB

Sony UK

a22082

3B

1.2

1GB

Embest

a32082

3B

1.2

1GB

Sony Japan

a52082

3B

1.2

1GB

Stadium

a22083

3B

1.3

1GB

Embest

900092

Zero

1.2

512MB

Sony UK

920092

Zero

1.2

512MB

Embest

900093

Zero

1.3

512MB

Sony UK

920093

Zero

1.3

512MB

Embest

a020a0

CM3

1.0

1GB

Sony UK

a220a0

CM3

1.0

1GB

Embest

9000c1

Zero W

1.1

512MB

Sony UK

a020d3

3B+

1.3

1GB

Sony UK

a020d4

3B+

1.4

1GB

Sony UK

9020e0

3A+

1.0

512MB

Sony UK

9020e1

3A+

1.1

512MB

Sony UK

a02100

CM3+

1.0

1GB

Sony UK

a03111

4B

1.1

1GB

Sony UK

b03111

4B

1.1

2GB

Sony UK

c03111

4B

1.1

4GB

Sony UK

b03112

4B

1.2

2GB

Sony UK

c03112

4B

1.2

4GB

Sony UK

b03114

4B

1.4

2GB

Sony UK

c03114

4B

1.4

4GB

Sony UK

d03114

4B

1.4

8GB

Sony UK

b03115

4B

1.5

2GB

Sony UK

c03115

4B

1.5

4GB

Sony UK

d03115

4B

1.5

8GB

Sony UK

902120

Zero 2 W

1.0

512MB

Sony UK

c03130

400

1.0

4GB

Sony UK

a03140

CM4

1.0

1GB

Sony UK

b03140

CM4

1.0

2GB

Sony UK

c03140

CM4

1.0

4GB

Sony UK

d03140

CM4

1.0

8GB

Sony UK

b04170

5

1.0

2GB

Sony UK

c04170

5

1.0

4GB

Sony UK

d04170

5

1.0

8GB

Sony UK

b04171

5

1.1

2GB

Sony UK

c04171

5

1.1

4GB

Sony UK

d04171

5

1.1

8GB

Sony UK

e04171

5

1.1

16GB

Sony UK

b04180

CM5

1.0

2GB

Sony UK

c04180

CM5

1.0

4GB

Sony UK

d04180

CM5

1.0

8GB

Sony UK

d04190

500

1.0

8GB

Sony UK

b041a0

CM5 Lite

1.0

2GB

Sony UK

c041a0

CM5 Lite

1.0

4GB

Sony UK

d041a0

使用修订代码进行板识别

从命令行我们可以使用以下内容来获取板的修订代码:

$ cat /proc/cpuinfo | grep Revision
Revision      : c03111

在上面的示例中,我们有一个十六进制修订代码 c03111 。将其转换为二进制,我们得到 0 0 0 000 0 0 1 100 0000 0011 00010001 。根据上表,已插入空格以显示修订代码的每个部分之间的边界。

从最低位开始,最下面的四个(0-3)是板修订号,所以这个板的修订号为1。接下来的八个位(4-11)是板类型,在这种情况下是二进制 00010001 ,十六进制 11 ,所以这是一个树莓派4B。使用相同的过程,我们可以确定处理器是BCM2711,板由索尼英国制造,它有4GB的内存。

在您的程序中获取修订代码

显然有太多的编程语言,不可能给出所有的例子,但是这里有两个关于 CPython 的快速例子。这两个例子都使用系统调用来运行一个bash命令,该命令获取 cpuinfo 并将结果通过管道传输到 awk 以恢复所需的修订代码。然后他们使用位操作从代码中提取 NewModelMemory 字段。

#include <stdio.h>
#include <stdlib.h>

int main( int argc, char *argv[] )
{
  FILE *fp;
  char revcode[32];

  fp = popen("cat /proc/cpuinfo | awk '/Revision/ {print $3}'", "r");
  if (fp == NULL)
    exit(1);
  fgets(revcode, sizeof(revcode), fp);
  pclose(fp);

  int code = strtol(revcode, NULL, 16);
  int new = (code >> 23) & 0x1;
  int model = (code >> 4) & 0xff;
  int mem = (code >> 20) & 0x7;

  if (new && model == 0x11 && mem >= 3)  // Note, 3 in the mem field is 2GB
     printf("We are a 4B with at least 2GB of RAM!\n" );

  return 0;
}

在Python中也是如此:

import subprocess

cmd = "cat /proc/cpuinfo | awk '/Revision/ {print $3}'"
revcode = subprocess.check_output(cmd, shell=True)

code = int(revcode, 16)
new = (code >> 23) & 0x1
model = (code >> 4) & 0xff
mem = (code >> 20) & 0x7

if new and model == 0x11 and mem >= 3 : # Note, 3 in the mem field is 2GB
    print("We are a 4B with at least 2GB RAM!")

修订代码使用的最佳实践

为避免在创建新的董事会修订时出现问题,请不要使用修订代码(例如 c03111 )。

一个简单的实现使用支持的修订代码列表,将检测到的代码与列表进行比较以确定是否支持设备。 当新的版块版本发布或生产位置发生变化时,这种情况会中断:每个版本都会创建一个不在支持的修订代码列表中的新修订代码。这将导致同一版块类型的新修订被拒绝,尽管它们总是backwards-compatible。每次出现新修订时,您都必须发布一个包含新修订代码的新支持修订代码列表——这是一个繁重的支持负担。

相反,请使用以下方法之一:

  • 通过板卡类型字段(3A、4B 等)进行筛选,该字段表示型号,但不表示修订版。

  • 根据内存容量字段进行筛选,因为内存与板卡的计算能力大致对应。

例如,您可以限制对具有2GB或更多RAM的Raspberry Pi 4B型号的支持。 上一节中的示例使用这种推荐的方法。

Note
在检查任何其他字段之前,始终检查第23位,即’New’标志,以确保修订代码是新版本。

跨发行版检查Raspberry Pi型号和CPU

/proc/cpuinfo 的支持和格式因Linux发行版而异。要在任何Linux发行版(包括Raspberry Pi OS)上检查Raspberry Pi设备的型号或CPU,请检查设备树:

$ cat /proc/device-tree/compatible | tr '\0' '\n'
raspberrypi,5-model-b
brcm,bcm2712

这将输出两个以空分隔的字符串值,每个值都包含一个以逗号分隔的make和model。例如,Raspberry Pi 5输出上面的板和CPU字符串。这些对应于以下值:

  • raspberrypi (board make)

  • 5-model-b (board model)

  • brcm (CPU make)

  • bcm2712 (CPU model)

Raspberry Pi型号具有以下设备树值:

Device Name Make Model CPU Make CPU

Pi 500

raspberrypi

500

brcm

bcm2712

Compute Module 5

raspberrypi

5-compute-module

brcm

bcm2712

Raspberry Pi 5

raspberrypi

5-model-b

brcm

bcm2712

Pi 400

raspberrypi

400

brcm

bcm2711

Compute Module 4S

raspberrypi

4s-compute-module

brcm

bcm2711

Compute Module 4

raspberrypi

4-compute-module

brcm

bcm2711

Raspberry Pi 4 Model B

raspberrypi

4-model-b

brcm

bcm2711

Zero 2 W

raspberrypi

model-zero-2-w

brcm

bcm2837

Compute Module 3+

raspberrypi

3-plus-compute-module

brcm

bcm2837

Compute Module 3

raspberrypi

3-compute-module

brcm

bcm2837

Raspberry Pi 3 Model A+

raspberrypi

3-model-a-plus

brcm

bcm2837

Raspberry Pi 3 Model B+

raspberrypi

3-model-b-plus

brcm

bcm2837

Raspberry Pi 3 Model B

raspberrypi

3-model-b

brcm

bcm2837

Raspberry Pi 2 Model B

raspberrypi

2-model-b

brcm

bcm2836

Zero W

raspberrypi

model-zero-w

brcm

bcm2835

Zero

raspberrypi

model-zero

brcm

bcm2835

Compute Module 1

raspberrypi

compute-module

brcm

bcm2835

Raspberry Pi Model A+

raspberrypi

model-a-plus

brcm

bcm2835

Raspberry Pi Model B+

raspberrypi

model-b-plus

brcm

bcm2835

Raspberry Pi Model B Rev 2

raspberrypi

model-b-rev2

brcm

bcm2835

Raspberry Pi Model A

raspberrypi

model-a

brcm

bcm2835

Raspberry Pi Model B

raspberrypi

model-b

brcm

bcm2835

本页内容