Raspberry Pi 硬件
GPIO 和 40-Pin引脚
Edit this on GitHub
Raspberry Pi的一个强大功能是电路板顶部边缘的一排GPIO(通用输入/输出)引脚。当前所有的Raspberry Pi板上都有一个40-Pin GPIO接头(在Raspberry Pi Zero、Raspberry Pi Zero W和Raspberry Pi Zero 2 W上未安装)。在Raspberry Pi 1 Model B+ (2014)之前,电路板包含一个26-Pin接头。所有主板上的GPIO接头(包括Raspberry Pi 400)的引脚间距为0.1英寸(2.54毫米)。
任何GPIO引脚都可以被配置(在软件中)为输入或输出引脚,并用于多种用途。
Note
|
GPIO 引脚的编号不按数字顺序排列;板上的GPIO 引脚 0 和 1(物理引脚 27 和 28)预留用于高级用途(见下文)。 |
输入
指定为输入引脚的GPIO引脚可以读取为高电平(3.3V)或低电平(0V)。使用内部上拉或下拉电阻器可以更容易地做到这一点。引脚 GPIO2 和 GPIO3 具有固定的上拉电阻,其他引脚可以在软件中进行配置。
更多
除了可以作为输入和输出外,GPIO引脚还可用于各种替代功能,有些功能在所有引脚上可用,有些功能只在特定引脚上可用。
-
PWM (脉宽调制)
-
所有引脚均支持软件 PWM
-
GPIO12、GPIO13、GPIO18和GPIO19支持硬件 PWM
-
-
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
-
数据: (GPIO2); 时钟 (GPIO3)
-
EEPROM 数据: (GPIO0); EEPROM 时钟 (GPIO1)
-
-
串口
-
TX (GPIO14); RX (GPIO15)
-
GPIO 引脚排列
可以通过打开终端命令窗口并运行pinout命令来访问Raspberry Pi上的便捷参考。此工具由 GPIO Zero Python库提供,该库默认安装在Raspberry Pi OS中。
有关 GPIO 引脚的高级功能的更多详细信息,请参见 gadgetoid 的 交互式引脚排列图。
Warning
|
虽然将简单组件连接到 GPIO 引脚是安全的,但请务必小心连接方式。LED中具有电阻来限制通过组件的电流,请勿将 5V 用在3.3V组件上。请勿将电机直接连接到 GPIO引脚,而应使用 H 桥电路或电机控制器板。 |
权限
如果需要使用GPIO端口,则用户必须是 gpio
组的成员。用户 pi
默认为GPIO成员,其他用户需要被添加为GPIO成员。
sudo usermod -a -G gpio <username>
Python 中的 GPIO
运用 GPIO Zero ,可以容易地通过Python 控制 GPIO 设备。 该库的完整文档位于 gpiozero.readthedocs.io 中。
LED
控制连接到 GPIO17 的 LED,可以使用以下命令:
from gpiozero import LED
from time import sleep
led = LED(17)
while True:
led.on()
sleep(1)
led.off()
sleep(1)
在像Thonny的IDE中运行以上命令,LED将反复闪烁。 LED状态包括on()、off()、toggle()和blink()。
按键
如果要读取连接到 GPIO2 的按键的状态,可以使用以下命令:
from gpiozero import Button
from time import sleep
button = Button(2)
while True:
if button.is_pressed:
print("Pressed")
else:
print("Released")
sleep(1)
按键功能包括属性 is_pressed
和 is_held
; 回调 when_pressed
、 when_released
和 when_held
; 方法 wait_for_press()
和 wait_for_release
。
按键 + LED指示灯
要将LED和按键连在一起,可以使用以下命令:
from gpiozero import LED, Button
led = LED(17)
button = Button(2)
while True:
if button.is_pressed:
led.on()
else:
led.off()
或者:
from gpiozero import LED, Button
led = LED(17)
button = Button(2)
while True:
button.wait_for_press()
led.on()
button.wait_for_release()
led.off()
或者:
from gpiozero import LED, Button
led = LED(17)
button = Button(2)
button.when_pressed = led.on
button.when_released = led.off
原理图和机械图
Edit this on GitHub
各种版本的Raspberry Pi板的原理图:
Raspberry Pi Zero 2 W
测试焊盘位置
Raspberry Pi Zero 2 W 在电路板生产过程中使用了许多测试焊接点位置。
标签 | 功能 | X (距离原点的距离,单位为毫米) | Y (距离原点的距离,单位为毫米) |
---|---|---|---|
STATUS_LED |
LED的电源状态 (LOW = ON) |
5.15 |
8.8 |
CORE |
处理器功率 |
6.3 |
18.98 |
RUN |
连接到GND进行复位 |
8.37 |
22.69 |
5V |
5V 输入 |
8.75 |
11.05 |
5V |
5V 输入 |
11.21 |
6.3 |
GND |
接地引脚 |
10.9 |
3.69 |
GND |
接地引脚 |
17.29 |
2.41 |
USB_DP |
USB端口 |
22.55 |
1.92 |
USB_DM |
USB端口 |
24.68 |
1.92 |
OTG |
移动ID引脚 |
39.9 |
7.42 |
1V8 |
1.8V模拟电源 |
42.03 |
8.42 |
TV |
符合电视输出 |
45.58 |
3.17 |
GND |
接地引脚 |
49.38 |
3.05 |
GND |
接地引脚 |
55.99 |
22.87 |
3V3 |
3.3V I/O电源 |
48.55 |
22.44 |
SD_CLK |
SD卡时钟引脚 |
60.95 |
18.45 |
SD_CMD |
SD卡命令引脚 |
58.2 |
16.42 |
SD_DAT0 |
SD数据引脚 |
58.13 |
20.42 |
SD_DAT1 |
SD数据引脚 |
60.65 |
21.1 |
SD_DAT2 |
SD数据引脚 |
57.78 |
13.57 |
SD_DAT3 |
SD数据引脚 |
60.8 |
15.22 |
BT_ON |
蓝牙电源状态 |
25.13 |
19.55 |
WL_ON |
无线网电源状态 |
27.7 |
19.2 |
产品合规性和安全性
Edit this on GitHub
所有Raspberry Pi产品都经过了严格的合规性测试,有关更多信息,请参见 产品信息门户。
Raspberry Pi 合规性支持
合规支持计划旨在消除解决合规问题的负担,并使公司更容易将新产品带给消费者。它可以让你接触在合规性测试期间对我们的Raspberry Pi产品进行测试的相同测试工程师,将用户与 UL 的专门团队联系起来,由他们对Raspberry Pi的深入了解来评估和测试用户的产品。
了解有关 Raspberry Pi 合规支持计划 的更多信息。
由Raspberry Pi提供支持
Raspberry Pi为希望使用 Raspberry Pi logo的公司提供了一个申请流程,并涵盖了内置 Raspberry Pi 计算机或芯片的产品,并由 Raspberry Pi 提供服务。如果你想开始申请流程,你可以 online 申请。
认可的设计合作伙伴
我们为认可的 认可的设计合作伙伴 提供了一系列咨询和支持,我们保持与之进行密切合作,以便他们可以在硬件、软件和机械方面提供付费设计服务。
频率管理和热控制
Edit this on GitHub
所有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的讨论 仅 适用于 Raspberry Pi 4 Model B、Raspberry Pi 400和CM4。 |
Raspberry Pi 4设备实现动态电压和频率缩放 (DVFS),此技术允许Raspberry Pi 4设备在较低的温度下运行,同时提供相同的性能。
SoC 内部的各种时钟(例如 ARM、内核、V3D、ISP、H264、HEVC)由固件监控,当它们未全速运行时,提供给时钟驱动芯片的特定部分的电压相对于全速而言有所降低。实际上,仅提供足够的电压来保持模块以其运行的特定速度正常运行。这可能导致 SoC 使用的功率降低,从而减少产生的总热量。
由于运行欠压可能会导致系统稳定性问题,尤其是在使用欠压固定时钟外设(如PCIe)时。因此提供三种可用的DVFS模式,可在 /boot/config.txt
中使用以下属性进行配置。大多数系统应使用 dvfs=3
,无头系统可能受益于 dvfs=1
的小功率降低,但存在PCIe稳定性问题的风险。
property=取值 | 描述 |
---|---|
dvfs=1 |
允许欠压 |
dvfs=2 |
默认工作频率的固定电压 |
dvfs=3 |
按需调整电压以实现超频(默认)。如果在 |
此外,还使用了分级CPU调速器来对ARM内核频率进行更精确的控制(表示DVFS更有效)。现在的步进为1500MHz、1000MHz、750MHz 和 600MHz。当SoC受到限制时,这些步进也可以提供帮助,并且意味着一直限制回600MHz的可能性要小得多,从而全面提高满载性能。
默认的CPU调控器是 ondemand
,可以使用 cpufreq-set
命令(来自 cpufrequtils
包)手动更改调控器,以减少空闲功耗:
sudo apt install cpufrequtils
sudo cpufreq-set -g powersave
Raspberry Pi 4 启动 EEPROM
Edit this on GitHub
Raspberry Pi 4、Raspberry Pi 400、CM4和CM4S使用 EEPROM 来启动系统。所有其他型号的Raspberry Pi计算机都使用位于启动文件系统中的 bootcode.bin
文件来启动系统。
Note
|
Github 上提供了用于创建 rpi-eeprom 包的脚本和预编译的二进制文件,该包用于更新Raspberry Pi 4引导加载程序和VLI USB控制器EEPROM。
|
更新启动加载程序
Raspberry Pi 4 和 Raspberry Pi 400
Raspberry Pi OS 自动更新启动加载程序以进行关键错误修复。 手动更新启动加载程序或更改启动模式的推荐方法是 Raspberry Pi Imager 和 raspi-config
使用 Raspberry Pi Imager 更新启动加载程序
Important
|
这是更新启动加载程序的推荐方法。 |
Raspberry Pi Imager 提供了一个 GUI,用于更新启动加载程序和选择启动模式。
-
选择备用 SD 卡,内容将被覆盖!
-
启动
Raspberry Pi Imager
-
在`Operating System`下选择
Misc utility images
-
选择
Bootloader
-
选择启动模式,即
SD
(推荐)、USB`或`Network
. -
选择
SD card
,然后单击Write
-
使用新镜像启动Raspberry Pi并等待至少10秒钟。
-
更新成功时,绿色LED 将以稳定模式闪烁,HDMI 显示屏将呈现绿色。
-
关闭Raspberry Pi电源并取出 SD 卡。
使用 raspi-config 更新启动加载程序
从Raspberry Pi OS中更改启动模式或启动加载程序版本,请运行 raspi-config
-
更新 Raspberry Pi操作系统获取最新版本的rpi-eeprom软件包。
-
运行
sudo raspi-config
-
选择
Advanced Options
-
选择
Bootloader Version
-
选择
Default
(对于出厂默认设置)或Latest
(对于最新的稳定引导加载程序版本)。 -
重启
更新EEPROM配置
启动行为(例如SD或USB启动)由嵌入在EEPROM镜像中的配置文件控制,并且可通过 rpi-eeprom-config
工具进行修改。
有关配置的详细信息,请参见 启动加载程序 配置部分。
自动更新
`rpi-eeprom-update` `systemd` 服务在启动时运行,如果有新的映像可用,它会应用更新,自动迁移当前的启动加载程序配置。
禁用自动更新:
sudo systemctl mask rpi-eeprom-update
重新启用自动更新:
sudo systemctl unmask rpi-eeprom-update
Note
|
如果设置了 FREEZE_VERSION 启动加载程序 EEPROM 配置,则 EEPROM 更新服务将跳过任何自动更新。如果安装了多个操作系统或交换 SD 卡时,则无需单独禁用 EEPROM 更新服务。 |
rpi-eeprom-update
Raspberry Pi操作系统使用 rpi-eeprom-update
脚本来实现 自动更新 服务。该脚本还可以交互运行或包装以创建自定义启动加载程序更新服务。
读取当前的EEPROM版本:
vcgencmd bootloader_version
检查是否有可用的更新:
sudo rpi-eeprom-update
安装更新:
sudo rpi-eeprom-update -a sudo reboot
取消挂起的更新:
sudo rpi-eeprom-update -r
安装特定的启动加载程序EEPROM镜像:
sudo rpi-eeprom-update -d -f pieeprom.bin
-d
标志表示 rpi-eeprom-update
使用指定镜像文件中的配置,而不是自动迁移当前配置。
显示内置文档:
rpi-eeprom-update -h
启动加载程序发布状态
固件版本状态对应于启动加载程序固件镜像 (/lib/firmware/raspberrypi/bootloader/...
)的特定子目录,并且可以更改以选择不同的发布流。
-
default
- 需要支持新硬件、修复关键错误和定期`更新` 版本测试的新功能时进行更新。 -
latest
- 当新功能成功通过 beta 测试时进行更新。 -
beta
- 测试新功能或实验性功能。
由于发布状态字符串只是一个子目录名称,因此可以创建自己的发布流,例如固定版本或自定义网络启动配置。
注意 default
和 latest
是指向 critical
和 stable
的旧版本名称的符号链接。
更改启动加载程序版本
Note
|
你可以通过编辑 /etc/default/rpi-eeprom-update 文件并将 FIRMWARE_RELEASE_STATUS 条目更改为相应的流,来更改更新期间要使用的发布流。
|
更新 EEPROM 镜像文件中的启动加载程序配置
以下命令用 boot.conf
替换 pieeprom.bin
中启动加载程序配置,并将新镜像写入 new.bin
:
rpi-eeprom-config --config boot.conf --out new.bin pieeprom.bin
recovery.bin
上电时,BCM2711 ROM会在SD卡上的引导分区的根目录中查找名为 recovery.bin
的文件。如果找到有效的recovery.bin,则ROM执行该文件,而不是EEPROM的内容。这种机制确保启动加载程序EEPROM始终可以重置为出厂默认设置的有效镜像。
另请参见 Raspberry Pi 4 启动流程
EEPROM更新文件
文件名 |
目的 |
recovery.bin |
启动加载程序EEPROM恢复可执行文件 |
pieeprom.upd |
启动加载程序 EEPROM 镜像 |
pieeprom.bin |
启动加载程序EEPROM镜像 - 与 pieeprom.upd 相同,但更改了 recovery.bin 行为 |
pieeprom.sig |
启动加载程序镜像的sha256 校验 (pieeprom.upd/pieeprom.bin) |
vl805.bin |
VLI805 USB 固件 EEPROM 镜像 - 在没有专用 VLI EEPROM 1.4 及更高版本的主板版本中被忽略 |
vl805.sig |
vl805.bin 的 sha256 校验 |
-
如果启动加载程序更新镜像名为
pieeprom.upd
,则recovery.bin
将被重命名为`recovery.000` ,当更新完成时,系统将重新启动。由于recovery.bin
不再存在,ROM从EEPROM加载最新更新的启动加载程序,并且操作系统正常启动。 -
如果启动加载程序更新镜像名为
pieeprom.bin
,则recovery.bin
将在更新完成后停止。更新成功时,HDMI输出将为绿色,绿色LED快速闪烁。如果更新失败,HDMI输出将为红色,并通过LED显示 错误代码 。 -
.sig
文件包含相应镜像文件的十六进制sha256校验,后续可能会添加其他字段。 -
BCM2711 ROM不支持从大容量的USB或TFTP加载
recovery.bin
。相反,新版本的启动加载程序支持自我更新机制,其中启动加载程序能够自行刷新EEPROM。请参见 启动加载程序配置 页面上的`ENABLE_SELF_UPDATE`。 -
rpi-eeprom-update
服务会在启动时会自动删除临时EEPROM更新文件。
有关 rpi-eeprom-update
配置文件的更多信息,请参见 rpi-eeprom-update -h
。
EEPROM 写保护
启动加载程序和 VLI EEPROMs 都支持硬件写保护。 有关如何在刷新EEPROM时启用此功能的更多信息,请参见 eeprom_write_protect 选项。
Raspberry Pi 4上的启动诊断
Edit this on GitHub
从Raspberry Pi 4启动程序版本2020-04-16开始,诊断信息可以在启动时显示在HDMI显示器上。如果要查看此诊断信息,请关闭Raspberry Pi 4的电源,移除SD卡,然后重新通电。连接的显示器上应出现类似以下的诊断信息。
如果启动加载程序无法从插入的 SD卡启动或者无法通过网络启动,则会出现此诊断页面; 例如,如果卡上没有启动镜像或者卡有缺陷或者网络启动参数不正确。
显示诊断页面后,只能通过重新上电(即拔下电源然后重新插入电源)来重新启动。
顶行描述了Raspberry Pi的型号及其内存容量。二维码是 下载页面 的链接。
诊断信息如下::
行: | 信息 |
---|---|
bootloader |
启动加载程序 git 版本 - RO(如果 EEPROM有写保护) - 软件构建日期 |
update-ts |
与更新 EEPROM 配置的时间对应的时间戳。在 自更新 模式下检查此时间戳,以避免更新到旧配置。 |
secure-boot |
|
board |
主板版本 - 序列号 - 以太网MAC地址 |
boot |
模式 (当前启动模式名称和编号) 顺序 (the 启动顺序 配置) 重试 (当前启动模式下的重试计数) 重新启动 (通过启动模式列表的循环次数). |
SD |
SD卡检测状态(检测到/未检测到)。 |
part |
主启动记录主分区类型:LBA。 |
fw |
start.elf 和 fixup.dat 的文件名是否存在 (例如 start4x.elf、fixup4x.dat)。 |
net |
网络启动: - 链路状态 (打开/关闭) 客户端 IP 地址 (ip)、子网 (sn)、默认网关 (gw) |
tftp |
网络启动: TFTP 服务器 IP 地址 |
display |
表示示是否检测到热插拔 ( |
可以使用 DISABLE_HDMI
禁用此显示,晴参见 启动加载程序配置。
Note
|
这仅仅是为了诊断启动故障;其不是一个交互式启动加载程序。如果你需要交互式启动加载程序,请考虑使用 U-Boot 等工具。 |
Raspberry Pi 启动模式
Edit this on GitHub
Raspberry Pi包含多个启动阶段。本文档介绍启动模式的工作原理以及 Linux启动支持哪些模式。
特定的 bootcode.bin
-only 启动模式
基于 BCM2837 的Raspberry Pi可执行USB 主机和以太网启动- 即Raspberry Pi 2B 版本 1.2、Raspberry Pi 3B 和Raspberry Pi 3B+(Raspberry Pi 3A+ 无法通过网络启动,因为其无内置以太网接口)。此外, 除Raspberry Pi 4B之外 的所有Raspberry Pi型号都可以使用新的 bootcode.bin
-only 方法来启用USB主机。
Note
|
Raspberry Pi 4B不使用bootcode.bin文件 - 相反其启动加载程序位于板载EEPROM芯片中。参见 Raspberry Pi 4 启动流程 和 SPI 启动 EEPROM. |
将SD卡格式化为FAT32并复制最新的 bootcode.bin
。SD卡必须存在于Raspberry Pi中才能用于启动。从SD卡加载bootcode.bin后,Raspberry Pi继续使用USB主机模式启动。
对于采用 BCM2835 和 BCM2836 芯片的 Raspberry Pi 1、Raspberry Pi 2 和 Raspberry Pi Zero 以及Raspberry Pi 3 无法启动的场景均非常有用的(与烧录到 BCM2837A0 中的启动代码相比,最新的bootcode.bin包括 Raspberry Pi 3B 的错误修复)。
如果你遇到大容量存储设备无法正常工作的问题,即使使用bootcode.bin,请向SD卡中添加一个新文件 'timeout' 。这个操作会使等待大容量存储设备初始化的时间延长到 6 秒。
bootcode.bin
UART 使能
Note
|
适用于Raspberry Pi 4 Model B之前的电路板。 |
有关在Raspberry Pi 4启动加载程序上启用 UART 的信息,请参见 本页面 。
可以启用早期阶段的UART来调试引导问题(对上述bootcode.bin-only启动模式有帮助)。所以请确保你拥有最新版本的固件(包括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 或CM板上的标准引脚 6、8 和 10(GND、GPIO14、GPIO15)。
然后使用linux上的 screen
或Mac或windows上的 putty
连接到串口。
将串口设置在 115200-8-N-1接收,然后启动Raspberry Pi/CM。当运行bootcode.bin时,你可以立即从设备获得串行输出。
启动顺序
Edit this on GitHub
Important
|
以下启动顺序仅适用于基于 BCM2837 和 BCM2837B0 的Raspberry Pi型号。在这之前的Raspberry Pi型号可以尝试SD卡启动和 USB设备启动模式 。有关Raspberry Pi 4 启动顺序,请参见 Raspberry Pi 4 启动流程 章节。 |
Raspberry Pi 3上的USB启动默认设置取决于所使用的版本。有关启用 USB 启动模式的跟多信息信息(默认情况下未启用),请参见 本页 。
当启动BCM2837时,它使用两个不同的源来确定要启用的启动模式。首先,检查OTP(一次性可编程)内存块以查看启用了哪些启动模式。如果启用了 GPIO 启动模式,则会测试相关的 GPIO线路,以选择应尝试哪种启用了 OTP 的启动模式。请注意,GPIO 启动模式只能用于选择 OTP 中已启用的启动模式。有关配置 GPIO 启动模式的详细信息,请参见 GPIO 启动模式 。默认情况下,GPIO 启动模式处于禁用状态。
下一步是启动 ROM 检测每个启动源中是否存在一个名为 bootcode.bin文件;如果检测成功,其会将代码加载到本地 128K 缓存中并跳转到该处。整体启动流程如下:
-
启动BCM2837
-
读取 OTP以确定要启用的启动模式
-
如果启用了 GPIO 启动模式,请使用 GPIO 启动模式来优化已启用的启动模式的列表
-
如果启用:检查主SD GPIO 48-53 上的 bootcode.bin
-
成功 - 启动
-
失败 - 超时 (5秒)
-
-
如果启用: 检查从SD
-
成功 - 启动
-
失败 - 超时 (5秒)
-
-
如果启用: 检查 NAND
-
如果启用: 检查 SPI
-
如果启用: 检查 USB
-
如果 OTG pin == 0
-
启动 USB, 等待有效的 USB 2.0 设备(两秒钟)
-
发现设备:
-
如果 device type == hub
-
对每个端口进行递归
-
-
如果 device type == (mass storage or LAN951x)
-
存储在设备列表中
-
-
-
-
多每个MSD进行递归
-
如果 bootcode.bin 发现 boot
-
-
多每个LAN951x进行递归
-
DHCP / TFTP 启动
-
-
-
否则 (设备模式启动)
-
启用设备模式并等待主机 PC反馈
-
我们使用VID回复PC: 0a5c PID: 0x2763 (Raspberry Pi 1 or Raspberry Pi 2) 或0x2764 (Raspberry Pi 3)
-
-
Note
|
|
按照标准主SD卡启动模式设置为GPIO 49-53。可以从第二组引脚上的从SD卡启动,即将从SD 卡添加到GPIO引脚。但是我们暂未启用此功能。
NAND启动和SPI启动模式确实有效,尽管其还没有完整的GPU支持。
USB设备启动模式在生产时默认开启,但USB主机启动模式仅在 program_usb_boot_mode=1
时启用。启用后,处理器将通过OTGID引脚的值来选择两种模式。在Raspberry Pi ModelB / B+上,OTGID引脚被设置为“0 ”, 因此只能通过主机模式启动(不能通过设备模式启动,因为被LAN951x设备挡住了)。
如果将OTGID引脚设置为空(例如插入PC时),USB将作为Raspberry Pi Zero或CM上的USB设备启动,因此你可以将 bootcode.bin '写入' 到设备中。在 available on Github 上可以找到实现此操作的 usbboot
代码。
Raspberry Pi 4 启动流程
Edit this on GitHub
这款产品与之前产品的主要区别在于第二阶段启动加载程序是从SPI闪存 EEPROM 加载的,而不是从之前产品的 bootcode.bin
文件加载。
第一阶段启动加载程序
ROM 的启动流程(第一阶段)如下:-
-
给BCM2711 SoC上电
-
读取 OTP 以确定是否配置了
nRPIBOOT
GPIO -
如果
nRPIBOOT
GPIO 为高电平或者OTP未定义nRPIBOOT
GPIO-
检查 OTP 以查看是否可以从SD/EMMC 加载
recovery.bin
-
如果启用了SD
recovery.bin
,则检查主SD/EMMC的recovery.bin
-
成功 - 运行
recovery.bin
并更新 SPI EEPROM -
失败 - 继续
-
-
-
检查第二阶段加载器的 SPI EEPROM
-
成功 - 运行第二阶段启动加载设备
-
失败 - 继续
-
-
-
以上操作均成功
-
尝试从 USB设备启动 加载 recovery.bin from
-
成功 - 运行
recovery.bin
并更新 SPI EEPROM 或切换到 USB 大容量存储设备模式 -
失败 - 重试 USB 设备启动
-
-
Note
|
仅CM4 为 nRPIBOOT 预留了 GPIO。
|
Note
|
recovery.bin 是用于刷新启动加载程序 SPI EEPROM 镜像的最小第二阶段程序。
|
第二阶段启动加载程序
本节介绍第二阶段启动加载程序的高级流程。
请参见 启动加载程序配置 页面,获取有关每种启动模式的更多信息。请参见 启动文件夹 页面,获取有关此阶段加载的GPU固件文件的说明。
* 初始化时钟和 SDRAM
* 读取 EEPROM 配置文件
* 检查 PM_RSTS
寄存器以确定是否请求HALT
检查`POWER_OFF_ON_HALT` 和 WAKE_ON_GPIO
EEPROM 配置设置
如果 POWER_OFF_ON_HALT
设置为 1
和 WAKE_ON_GPIO
设置为 0
则
* 使用 PMIC 关闭系统电源
否则,如果 WAKE_ON_GPIO
为 1
* 如果GPIO3被拉低,则启用 GPIO3 上的下降沿中断
睡眠
* 以上操作均成功
从EEPROM配置文件中的BOOT_ORDER参数读取下一个启动模式。
如果 boot-mode == RESTART
* 返回 BOOT_ORDER
字段中的第一个启动模式
如果 boot-mode == STOP
* 显示 start.elf 未发现 错误模式 并永远等待.
否则,如果 boot-mode == SD CARD
* 尝试从 SD 卡加载固件
成功 - 运行固件
失败 - 继续
否则,如果 boot-mode == NETWORK
,则
* 使用 DHCP 协议请求 IP 地址
* 从 DHCP 或静态定义的 TFTP 服务器加载固件
* 如果未找到固件或发生超时或网络错误,请继续
否则,如果 boot-mode == USB-MSD
或 boot-mode == BCM-USB-MSD
,则
* 虽然 USB 发现尚未超时
检查 USB 大容量存储设备
如果找到新的大容量存储设备,则
* 对于每个驱动器 (LUN)
* 尝试加载固件
成功 - 运行固件
失败 - 前进到下一个 LUN
否则,如果 boot-mode == NVME
,则
扫描 PCIe 以查找 NVMe 设备(如果找到)
尝试从 NVMe 设备加载固件
* 成功 - 运行固件
* 失败 - 继续
否则,如果 boot-mode == RPIBOOT
,则
* 尝试使用 USB 设备模式从 USB OTG 端口加载固件 - 参见 usbboot ,RPIBOOT模式没有超时。
启动加载程序更新
如果找到 pieeprom.upd
文件,也可以在启动固件之前更新启动加载程序。有关启动加载程序更新的更多信息,请参见 启动加载程序 EEPROM 页面。
故障安全操作系统更新 (TRYBOOT)
启动加载程序/固件提供了一个一次性标志,如果设置了该标志,则该标志将被清除,但会导致加载 tryboot.txt
而不是 config.txt
。此备用配置将指定挂起的OS更新固件、cmdline、内核和os_prefix参数。由于该标志在启动固件之前被清除,因此崩溃或重置将导致在下次重新启动时加载原始的config.txt文件。
设置 tryboot
标志,请在 reboot
命令的分区号后添加tryboot。分区号默认为零,但是如果添加了额外的参数,则必须指定分区号。
# Quotes are important. Reboot only accepts a single argument. 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。
Raspberry Pi 4 启动加载程序配置
Edit this on GitHub
编辑配置
在编辑引导加载程序配置之前,请 更新系统 以获取最新版本的 rpi-eeprom
软件包。
查看当前的EEPROM配置:
rpi-eeprom-config
对其进行编辑并将更新应用到最新的EEPROM版本,请执行以下操作:
sudo -E rpi-eeprom-config --edit
有关 EEPROM 更新过程的详细信息,请参阅 启动 EEPROM 界面。
配置属性
本节介绍引导加载程序中可用的所有配置项。语法与 config.txt 相同,但属性是特定于启动加载程序。除 EDID 外,还支持条件筛选器 。
POWER_OFF_ON_HALT
如果设置为 1
且 WAKE_ON_GPIO=0
,则 sudo halt
将关闭所有PMIC输出。这是halt可能的最低功耗状态,但可能会给一些HAT带来问题,因为5V电压仍然存在。GLOBAL_EN
必须接地短路才能启动。
Raspberry Pi 400 具有一个专用的电源按钮,即使处理器关闭也能运行。默认启用此设置,但可以将`WAKE_ON_GPIO=2`设置为使用外部GPIO电源按钮,而非专用电源按钮。
默认值: 0
BOOT_ORDER
该`BOOT_ORDER` 设置允许配置不同启动模式的优先级。它表示为 32 位无符号整数,其中每个半字节表示一个启动模式。按照最低有效半字节到最高有效半字节顺序尝试启动模式。
BOOT_ORDER
领域
BOOT_ORDER 定义不同启动模式的顺序,从右到左读取,最多可以定义 8 位数字。
取值 | 模式 | 描述 |
---|---|---|
0x0 |
SD CARD DETECT |
尝试 SD,然后等待卡检测指示卡已更改 - 现在已弃用,因为0xf(重新启动)可用。 |
0x1 |
SD CARD |
SD 卡(或CM4上的eMMC)。 |
0x2 |
NETWORK |
网络启动 - 参见 网络启动服务教程 |
0x3 |
RPIBOOT |
RPIBOOT - 参见 usbboot |
0x4 |
USB-MSD |
USB 大容量存储启动 - 参见 USB大容量存储启动 |
0x5 |
BCM-USB-MSD |
USB 2.0从USB-C端口启动(CM4:CM4IO 板上的 USB-A接口)。 |
0x6 |
NVME |
仅限 CM4:从连接到PCIe接口的NVMe固态硬盘启动。有关更多详细信息,参见 NVMe boot 。 |
0x7 |
HTTP |
通过以太网进行 HTTP 引导。 有关更多详细信息,参见 HTTP boot 。 |
0xe |
STOP |
停止并显示错误模式。需要重启电源才能退出此状态。 |
0xf |
RESTART |
从BOOT_ORDER字段中的第一个引导模式重新启动,即循环。 |
RPIBOOT
旨在与CM4 一起使用来加载自定义调试镜像(例如 Linux RAM 磁盘)而非正常启动后。这是最后一个启动选项,因为它当前不支持超时或重试。
BOOT_ORDER
示例
BOOT_ORDER | 描述 |
---|---|
0xf41 |
首先尝试 SD,然后尝试 USB-MSD,然后重复(如果BOOT_ORDER为空,则默认)。 |
0xf14 |
首先尝试 USB,然后尝试 SD,再重复。 |
0xf21 |
首先尝试 SD,然后尝试网络,再重复。 |
MAX_RESTARTS
如果遇到 RESTART (0xf
) 启动模式的次数超过 MAX_RESTARTS 次,则会触发看门狗复位。不建议将其用于常规用途,但对于需要完全重置以解决硬件或网络接口问题的测试或远程系统可能很有用。
默认值: -1
(无限)
TFTP_IP
TFTP 服务器的可选点分十进制 IP地址(例如192.168.1.99),用于覆盖DHCP请求的服务器IP。
这个在家庭网络上很有用,因为可以使用tftpd-hpa代替dnsmasq,其中宽带路由器是DHCP服务器。
默认值: ""
TFTP_PREFIX
为了支持每个Raspberry Pi的唯一 TFTP 启动目录,启动加载程序会在文件名前面加上设备特定的目录。如果在前缀目录中找不到 start4.elf 和 start.elf,则清除前缀。 在早期型号上,序列号用作前缀,但在Raspberry Pi 4上,MAC地址不再从序列号生成,因此很难通过检查DHCPDISCOVER数据包在服务器上自动创建tftpboot目录。为了支持此功能,可以将TFTP_PREFIX自定义为 MAC 地址、固定值或序列号(默认)。
取值 | 描述 |
---|---|
0 |
使用序列号,例如 |
1 |
使用由 TFTP_PREFIX_STR 指定的字符串 |
2 |
使用 MAC 地址,例如 |
默认值: 0
TFTP_PREFIX_STR
指定当 TFTP_PREFIX
设置为1时使用的自定义目录前缀字符串。例如:- TFTP_PREFIX_STR=tftp_test/
默认值: ""
最大长度: 32个字符
PXE_OPTION43
使用不同的字符串覆盖 PXE Option43 匹配字符串。通常,将自定义应用于 DHCP 服务器比更改客户端行为更好,但如果无法做到这一点,则会提供此选项。
默认值: Raspberry Pi Boot
DHCP_OPTION97
在早期版本中,客户端GUID(选项97)只是重复4次的序列号。默认情况下,新的GUID格式是 RPi4
的fourcc(0x 34695052-little endian)、板版本(例如0x00c03111) (4字节)、mac地址的4个最低有效字节和4字节序列号的串联。这是唯一的,但也为DHCP服务器提供结构化信息,允许Raspberry Pi 4计算机在不依赖以太网MAC OUID的情况下被识别。
指定 DHCP_OPTION97=0 以回复设置,或指定非零十六进制值以指定自定义 4 字节前缀。
默认值: 0x34695052
MAC_ADDRESS_OTP
使用存储在 Customer OTP 寄存器中的值覆盖Raspberry Pi以太网 MAC 地址。
例如,要使用存储在 Customer OTP
的第0行 和第1行中的MAC地址。
MAC_ADDRESS_OTP=0,1
第一个值(示例中的第 0 行)包含 OUI 和 MAC 地址中最重要的 8 位。第二个值(示例中的第 1 行)存储 MAC 地址的剩余 16 位。 这与用于制造时编程的Raspberry Pi MAC地址的格式相同。
可以选择任意两个客户OTP行,并按任一顺序组合。
Customer OTP
行是 vcgencmd otp_dump
输出中的OTP寄存器36至43,因此,如果前两行编程如下,则 MAC_ADDRESS_OTP=0,1
,将给出 e4:5f:01:20:24:7e
的MAC地址。
36:247e0000 37:e45f0120
默认值: ""
ENABLE_SELF_UPDATE
使启动加载程序能够从 TFTP 或 USB 大容量存储设备 (MSD) 启动文件系统更新自身。
如果启用了自更新,则启动加载程序将在启动文件系统中查找更新文件 (.sig/.upd)。如果更新镜像与当前镜像不同,则应更新并重置系统。否则,如果EEPROM镜像逐字节相同,则启动将继续正常进行。
注意:-
-
SD启动中未启用自更新;ROM已经可以从SD卡加载recovery.bin。。
-
2021年之前的启动加载程序版本不支持
自更新
. -
对于网络启动,确保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.img
和 boot.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。
默认值:如果启用了HTTPS,默认值为 443
,否则为 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成像仪应用程序配置有启动时下载的json文件。
您可以更改嵌入式Raspberry Pi Imager应用程序使用的json文件的URL,让它提供您自己的图像。
您可以使用标准的 Raspberry Pi Imager 应用程序通过 --repo
参数传递URL来测试这一点。
默认值: http://downloads.raspberrypi.org/os_list_imagingutility_v3.json
NET_INSTALL_ENABLED
启用网络安装时,如果引导程序检测到键盘,它会在引导时显示网络安装屏幕。
要启用网络安装,请添加 NET_INSTALL_ENABLED=1
, 要禁用网络安装,请添加 NET_INSTALL_ENABLED=0
。
如果设置了 DISABLE_HDMI=1
,此设置将被忽略,网络安装将被禁用。.
为了检测键盘,网络安装必须初始化USB控制器并枚举设备。这增加了大约1秒的启动时间,因此在某些嵌入式应用中禁用网络安装可能是有利的。
默认值: 在Raspberry Pi 4和Raspberry Pi 400上为 1
,在计算模块4上为 0
。
NET_INSTALL_KEYBOARD_WAIT
如果启用了网络安装,引导程序会尝试检测键盘和 SHIFT
键来启动网络安装。您可以使用此属性更改等待时间(以毫秒为单位)。
将此项设置为 0
将禁用键盘等待,尽管如果没有找到引导文件并且USB引导模式 4
处于`BOOT_ORDER` 状态,仍然可以启动网络安装。
Note
|
测试表明键盘和 SHIFT 检测至少需要 750 毫秒。 |
默认值: 900
NETCONSOLE - 高级日志记录
NETCONSOLE
将调试消息复制到网络接口。IP地址和端口由 NETCONSOLE
字符串定义。
Note
|
NETCONSOLE会一直阻塞,直到以太网链接建立或超时。超时值是 DHCP_TIMEOUT ,尽管除非请求网络启动,否则不会尝试DHCP。
|
格式
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 - "" (始终忽略设备名称)
-
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个字符
分区
如果没有通过 reboot
命令(例如sudo reboot N)或 autoboot.txt
中的 boot_partition=N
明确设置分区选项,则分区选项可用于指定引导分区号。
如果用户按下按钮,这可用于从救援分区引导。
# Boot from partition 2 if GPIO 7 is pulled low [gpio7=0] PARTITION=2
默认值: 0
USB_MSD_EXCLUDE_VID_PID
最多 4 个 VID/PID 对的列表,指定引导加载程序应忽略的设备。如果这与 HUB 匹配,则不会枚举 HUB,从而导致排除所有下游设备。 这旨在允许在引导枚举期间忽略有问题(例如枚举非常慢)的设备。这是特定于引导加载程序的,不会传递给操作系统。
格式是以逗号分隔的十六进制值列表,其中 VID 是最重要的半字节。不允许使用空格。 例如 034700a0,a4231234
默认值: ""
USB_MSD_DISCOVER_TIMEOUT
如果在此超时内未找到 USB 大容量存储设备,则停止 USB-MSD 并选择下一个启动模式。
最小值: 5000
(5 秒)
默认值: 20000
(20 秒)
USB_MSD_LUN_TIMEOUT
在前进到下一个 LUN(例如多插槽 SD-CARD 读卡器)之前等待多长时间(以毫秒为单位)。这仍在调整中,但如果连接了旧的/慢速设备以及包含操作系统的快速USB-MSD设备,则可能有助于加快启动速度。
最小值: 100
默认值: 2000
(2 秒)
USB_MSD_PWR_OFF_TIME
在 USB 大容量存储启动期间,USB 端口的电源会关闭一小段时间,以确保 USB 大容量存储设备的正确运行。大多数设备使用默认设置可以正常工作:仅当您在从特定设备启动时遇到问题时,才更改此设置。设置 USB_MSD_PWR_OFF_TIME=0
将防止在 USB 大容量存储启动期间关闭 USB 端口的电源。
最小值: 250
最大值: 5000
默认值: 1000
(1 秒)
USB_MSD_STARTUP_DELAY
如果已定义,则在 USB 主控制器初始化后,将 USB 枚举延迟给定超时。如果 USB 硬盘驱动器初始化需要很长时间并触发 USB 超时,则此延迟可用于为驱动程序提供额外的初始化时间。可能还需要增加整体 USB 超时 (USB_MSD_DISCOVER_TIMEOUT
) 。
最小值: 0
最大值: 30000
(30 秒)
默认值: 0
VL805
仅限计算模块 4。
如果该 VL805
属性设置为 1
, 则引导加载程序将搜索 VL805 PCIe XHCI 控制器,并尝试使用嵌入在引导加载程序 EEPROM 中的 VL805 固件对其进行初始化。这使得工业设计能够使用 VL805 XHCI 控制器,而无需为 VL805 固件提供专用的 SPI EEPROM。
-
在计算模块 4 上,引导加载程序从不写入专用的 VL805 SPI EEPROM。此选项仅将控制器配置为从 SDRAM 加载固件。
-
如果 VL805 XHCI 控制器具有专用的 EEPROM,请不要使用此选项。它将无法初始化,因为VL805 ROM将尝试使用专用的SPI EEPROM(如果安装)。
-
嵌入式 VL805 固件采用与树莓派 4B 相同的 USB 配置(2 个 USB 3.0 端口和 4 个 USB 2.0 端口)。不支持加载备用 VL805 固件映像,应使用专用的 VL805 SPI EEPROM 进行此类配置。
默认值: 0
XHCI_DEBUG
此属性是一个位字段,用于控制大容量存储引导模式的 USB 调试消息的详细程度。启用所有这些消息会生成大量日志数据,这会减慢启动速度,甚至可能导致启动失败。对于详细日志,最好使用 NETCONSOLE
。
取值 | 日志 |
---|---|
0x1 |
USB 描述符 |
0x2 |
大容量存储模式状态机 |
0x4 |
大容量存储模式状态机 - 详细 |
0x8 |
所有 USB 请求 |
0x10 |
设备和集线器状态机 |
0x20 |
所有 xHCI TRB(非常详细) |
0x40 |
所有 xHCI 事件(非常详细) |
若要合并值,请将它们相加。例如:
# Enable mass storage and USB descriptor logging XHCI_DEBUG=0x3
默认值: 0x0
(未启用 USB 调试消息)
config.txt
中的配置属性
boot_ramdisk
如果该属性设置为 1
,那么引导加载程序将尝试加载一个名为 boot.img
的 ramdisk 文件, 其中包含 引导文件系统。后续文件 (例如 start4.elf
) 从ramdisk中读取,而不是从原始引导文件系统中读取。
boot_ramdisk`的主要目的是支持 `secure-boot
, 但是,未签名的 boot.img
文件对于网络引导或 RPIBOOT
配置也很有用。
-
虚拟硬盘文件的最大大小为 96MB。
-
boot.img
文件是原始磁盘.img
文件。 推荐的格式是没有 MBR 的普通 FAT32 分区。 -
虚拟硬盘文件系统的内存在操作系统启动之前释放。
-
如果选择了 TRYBOOT 引导加载程序将搜索
tryboot.img
而不是boot.img
。 -
另参见 autoboot.txt
有关 secure-boot`和创建 `boot.img
文件的更多信息,请参见 USBBOOT
默认值: 0
boot_load_flags
自定义固件(裸机)的实验属性。
位 0 (0x1) 表示 .elf 文件是自定义固件。这将禁用任何兼容性检查(例如,是否支持 USB MSD 启动)并在启动可执行文件之前重置 PCIe。
默认值: 0x0
uart_2ndstage
如果 uart_2ndstage
为 1
,则启用UART的调试记录。该选项还会自动启用. 该选项还会自动启用 start.elf
中的UART日志记录。这也在 Boot options 页面中进行了描述。
BOOT_UART
属性还会启用引导加载程序UART日志记录,但不会启用 start.elf
中的UART日志记录,除非还设置了 uart_2ndstage=1
。
默认值: 0
erase_eeprom
如果 erase_eeprom
设置为 1
, recovery.bin
将擦除整个SPI EEPROM,而不是刷新引导加载程序映像。该属性在正常启动过程中不起作用。
默认值: 0
eeprom_write_protect
配置EEPROM Write Status Register
。 这可以设置为将整个EEPROM标记为写保护或清除写保护。
此选项必须与 EEPROM /WP
引脚配合使用,该引脚控制EEPROM Write Status Register
。 拉低 /WP
low (CM4 EEPROM_nEP
或 Pi4B TP5
) 不会对EEPROM进行写保护,除非已经配置了`Write Status Register` 。
详情请参见 Winbond W25x40cl datasheet 。
recovery.bin
的 config.txt
中的 eeprom_write_protect
设置。
取值 | 描述 |
---|---|
1 |
配置写保护区域以覆盖整个EEPROM。 |
0 |
清除写保护区域。 |
-1 |
什么都不做。 |
Note
|
flashrom 不支持清除写保护区域,如果定义了写保护区域,将无法更新 EEPROM。
|
默认值: -1
config.txt
中的安全启动配置属性
以下 config.txt
属性用于对 secure-boot
OTP设置进行编程。这些更改是不可逆的,并且只能在刷新引导加载程序EEPROM映像时通过RPIBOOT进行编程。这确保了 secure-boot
不能被远程设置或通过意外插入过时的SD卡映像来设置。
有关启用 secure-boot
的详细信息,请参见 USBBOOT 中的 secure-boot readme 和 secure-boot tutorial 。
program_pubkey
如果此属性设置为 1
, 则 recovery.bin
会将 EEPROM 镜像中公钥的hash写入 OTP。设置后,启动加载程序将拒绝使用不同 RSA 密钥签名的 EEPROM 镜像或未签名镜像。
默认值: 0
revoke_devkey
如果该属性被设置为 1
,则 recovery.bin
将 向OTP写入一个值,以防止ROM加载不支持`secure-boot` 的第二阶段引导加载程序的旧版本。此操作可以防止通过恢复到旧版本的启动加载程序来关闭安全引导。
默认值: 0
program_rpiboot_gpio
由于Raspberry Pi 4B或Raspberry Pi 400上没有专用的 nRPIBOOT
跳线,因此必须使用替代GPIO,通过拉低GPIO来选择 nRPIBOOT
模式。而且只能选择一个GPIO,可用选项有2、4、5、7、8。此属性不依赖于 安全启动
,但请验证此GPIO配置是否与任何可能在启动期间拉低GPIO的HAT发生冲突。
出于安全考虑,该属性只能通过 RPIBOOT
进行编程,因此必须首先使用 erase_eeprom
擦除启动加载程序EEPROM。这会导致BCM2711 ROM故障切换到 RPIBOOT
模式,则允许设置此选项。
默认值: ``
更新到最新 / 稳定的启动加载程序
启动加载程序的默认版本仅针对关键修复和主要版本进行更新。最新/稳定启动加载程序更新较频繁以同步最新的修复和改进。
高级用户可以切换到最新/稳定启动加载程序以获得最新功能。 打开命令提示符并启动`raspi-config`。
sudo raspi-config
导航至 高级选项
,再导航至 启动加载程序版本
。选择 最新
,然后选择 是
进行确认。选择 完成
并确认你要重新启动。重新启动后,再次打开命令提示符并更新系统。
sudo apt update sudo apt install rpi-eeprom # Update rpi-eeprom to the latest version
如果运行`rpi-eeprom-update`,则会看到一个更新版本的启动加载程序可用,并且是 稳定
版本。
*** UPDATE AVAILABLE *** BOOTLOADER: update available CURRENT: Tue 25 Jan 14:30:41 UTC 2022 (1643121041) LATEST: Thu 10 Mar 11:57:12 UTC 2022 (1646913432) RELEASE: stable (/lib/firmware/raspberrypi/bootloader/stable) Use raspi-config to change the release.
现在可以更新启动加载程序。
sudo rpi-eeprom-update -a sudo reboot
如果你在Raspberry Pi重新启动后再次运行 rpi-eeprom-update
,你应该会看到 当前
日期已更新,表明使用的是最新版本的启动加载程序。
BOOTLOADER: up to date CURRENT: Thu 10 Mar 11:57:12 UTC 2022 (1646913432) LATEST: Thu 10 Mar 11:57:12 UTC 2022 (1646913432) RELEASE: stable (/lib/firmware/raspberrypi/bootloader/stable) Use raspi-config to change the release.
USB 启动模式
Edit this on GitHub
Warning
|
Raspberry Pi的默认方法是使用 SD 卡启动,对于新手和缺乏经验的用户推荐此方法。 |
USB 有两种独立的启动模式;USB 设备启动和 USB 主机启动。
两种启动模式之间的选择是通过固件在启动时读取 OTP 位来实现的。有两个位可以控制 USB 启动:第一个位使能 USB 设备启动(默认)。第二个位使能USB主机启动;如果设置了USB主机启动模式位,则处理器读取 OTGID 引脚以决定是作为主机启动(在Raspberry Pi Model B / B+上驱动为零)还是作为设备启动(左浮动)。Raspberry Pi Zero可通过USB连接器上的OTGID引脚访问该引脚,CM可以访问边缘连接器上的该引脚。
部分OTP位可以通过使用某些GPIO引脚来选择Raspberry Pi使用的启动模式。
Note
|
USB 启动模式仅适用于部分产品型号。 |
USB 设备启动模式
Note
|
USB设备启动模式适用于Raspberry Pi CM、CM3、Raspberry Pi Zero、Raspberry Pi Zero W、Raspberry Pi Zero A、Raspberry Pi Zero A+ 和 Raspberry Pi Zero 3A+。 |
当使能此启动模式时(通常在从SD卡启动失败后),Raspberry Pi将其USB端口置于设备模式并等待主机的USB重置。可以在 Github 上找到显示主机需要如何与Raspberry Pi通信的示例代码。
主机首先向设备向下控制终结点0发送结构,这包含启动的大小和签名(未启用安全性,因此无需签名)。其次代码沿终结点 1(bootcode.bin)向下传输。最后,设备将回复成功代码:
-
0 - 成功
-
0x80 - 失败
USB 主机启动模式
Note
|
USB主机启动模式适用于Raspberry Pi 3B、Raspberry Pi 3B+、Raspberry Pi 3A+ 和Raspberry Pi 2B v1.2。其中Raspberry Pi 3A+ 仅支持大容量存储启动,不支持网络启动。 |
USB 主机启动模式遵循以下顺序:
-
启用 USB 端口并等待 D+ 线被拉高,则表示是 USB 2.0 设备(我们仅支持 USB2.0)
-
如果设备是hub:
-
给hub的所有下行端口供电
-
对于每个端口,循环最多2秒(如果已设置
program_usb_boot_timeout=1
,则循环5秒)-
从复位中释放并等待 D+ 被驱动为高电平,则表示设备已连接
-
如果检测到设备:
-
发送 "Get Device Descriptor"
-
如果 VID == SMSC && PID == 9500
-
将设备添加到以太网设备列表
-
-
-
如果 class interface == mass storage class
-
将设备添加到大容量存储设备列表
-
-
-
-
-
否则
-
枚举单个设备
-
-
浏览大容量存储设备列表
-
从 大容量存储设备 启动
-
-
浏览以太网设备列表
-
从 以太网 启动
-
USB大容量存储启动
Edit this on GitHub
Note
|
适用于Raspberry Pi 2B v1.2、Raspberry Pi 3A+、Raspberry Pi 3B、Raspberry Pi 3B+、Raspberry Pi 4B、Raspberry Pi 400 和Raspberry Pi Zero 2 W,以及Raspberry Pi CM3、Raspberry Pi CM3+ 和Raspberry Pi CM4。 |
本页介绍如何从 USB 大容量存储设备(如闪存驱动器或 USB 硬盘)启动Raspberry Pi。连接 USB 设备(尤其是硬盘和 SSD)时,请注意其电源要求。如果你希望将多个SSD或硬盘连接到Raspberry Pi,则需要外部电源 - 有源硬盘盒或供电的USB hub。请注意,Raspberry Pi 4B之前的型号存在已知问题(某些USB设备无法启动)。
Raspberry Pi 4B 和 Raspberry Pi 400
Raspberry Pi 400 和新版的Raspberry Pi 4B 板中的启动加载程序默认支持 USB 启动,但可能需要修改 BOOT_ORDER
启动加载程序配置。在早期的Raspberry Pi 4B 板上,或者需要选择备用启动模式的场景,必须更新启动加载程序。
如下:-
-
通过 Raspberry Pi Imager 更改启动模式的说明。
-
通过 raspi-config 更改启动模式的说明。
-
其他启动配置选项的 启动加载程序配置 页面。
CM4
请参见 烧录CM的eMMC 以获取启动加载程序更新说明。
Raspberry Pi 2B/3A+/3B/CM3/CM3+/Zero 2 W
在Raspberry Pi 2B v1.2/3A+/3B/Zero 2 W 和CM3、CM3+ 上,你必须首先启用 USB主机启动模式。这是为了允许USB大容量存储启动和 网络启动。请注意,Raspberry Pi 3A+ 或 Zero 2 W 不支持网络启动。
如果要启用 USB 主机启动模式,需要从 SD 卡启动Raspberry Pi,并使用特殊选项来设置一次性可编程 (OTP) 内存中的USB 主机启动模式位。设置此位后,不再需要SD卡。
Important
|
对OTP所做的任何更改都是永久性的,无法撤消。 |
Note
|
在Raspberry Pi 3A+ 上,设置 OTP 位以启用 USB 主机启动模式将永久阻止Raspberry Pi在 USB 设备模式下启动。 |
你可以通过运行Raspberry Pi OS的SD卡对OTP位进行编程。
使用以下代码启用 USB 主机启动模式:
echo program_usb_boot_mode=1 | sudo tee -a /boot/config.txt
这会将 program_usb_boot_mode=1
添加到 `/boot/config.txt`的末尾。
请注意,尽管该选项已命名为 `program_usb_boot_mode`但其仅启用 USB 主机启动模式。USB 设备启动模式仅适用于Raspberry Pi的部分型号- 请参见 USB设备启动模式。
下一步是使用 sudo reboot
重新启动Raspberry Pi,并检查 OTP 是否已编程:
vcgencmd otp_dump | grep 17:
17:3020000a
检查是否显示输出 0x3020000a
。如果不是,则 OTP 位尚未成功编程。在这种情况下,请再次执行编程过程。如果该位仍未设置,则表示Raspberry Pi硬件本身出现故障。
你可以从 config.txt
中删除 program_usb_boot_mode
行,再把SD卡放到另一个Raspberry Pi中,其就不会编程usb主机启动模式。确保 config.txt
末尾没有空行。
你可以从 USB 大容量存储设备启动,方法与从 SD 卡启动相同 - 有关详细信息,请参见以下部分。
从USB大容量存储器启动
该 过程 与SD卡相同 - 只需使用操作系统镜像对USB存储设备进行镜像即可。
准备存储设备后,将驱动器连接到Raspberry Pi并打开Raspberry Pi的电源,同时注意外部驱动器的额外 USB 电源要求。 等待5~10秒后,Raspberry Pi开始启动并在连接的显示器上显示彩虹启动画面。确保未在Raspberry Pi中插入SD卡,因为如果插入了SD卡,其将首先从该卡启动。
请参见 启动模式文档 ,获取启动顺序和备用启动模式(网络、USB设备、GPIO或 SD启动)的更多信息。
已知问题
Important
|
不 适用于Raspberry Pi 4 Model B。 |
-
检查可启动 USB 设备的默认超时时间为2秒,部分闪存驱动器和硬盘的启动速度太慢。可以将此超时时间延长至5秒(将新文件timeout添加到SD卡),但请注意,部分设备可能需要更长的时间才能响应。
-
部分闪存驱动器具有非常具体的协议要求,启动代码无法处理这些要求,因此可能不兼容。
特定的 bootcode.bin
-only 启动模式
Important
|
This does not apply to Raspberry Pi 4 Model B. |
如果你无法使用特定的USB设备启动Raspberry Pi,则Raspberry Pi 2B v1.2/3A+/3B/3B +的替代方案是使用特定的 bootcode.bin-only 启动模式。Raspberry Pi仍将从SD卡启动,但bootcode.bin是从SD卡读取的唯一文件。
硬件兼容性
在尝试从 USB 大容量存储设备启动之前,建议验证该设备在 Linux 下是否正常工作。使用 SD 卡启动并插入 USB 大容量存储设备,则应该显示为可移动驱动器。这对于USB SATA适配器尤其重要,在大容量存储模式下,启动加载程序可能支持该适配器,但如果Linux选择 USB Attached SCSI - UAS 模式,则该适配器会失败。请参见此https://forums.raspberrypi.com/viewtopic.php?t=245931[论坛帖子] ,了解 UAS 以及如何添加 usb-storage.quirks 以解决此问题。
旋转硬盘驱动器需要带供电能力的 USB hub。即使看起来有效,如果没有供电能力的USB HUB可能会遇到间歇性故障。
多个可启动驱动器
当搜索可启动分区时,启动加载程序会并行扫描所有 USB 大容量存储设备,并选择第一个进行响应。如果启动分区不包含合适的 start.elf
文件,则选择下一个可用设备。无根据 USB 拓扑指定启动设备的方法,因为这会减慢启动速度并增加不必要且难以支持的配置复杂性。
Note
|
config.txt 文件 条件筛选器 可用于在复杂的设备配置中选择备用固件。
|
网络启动
Edit this on GitHub
本节介绍网络启动如何在Raspberry Pi 3B/3B+ 和 Raspberry Pi 2B v1.2上的工作原理。在Raspberry Pi 4上,网络启动是在EEPROM的第二阶段启动加载程序中实现。有关更多信息,请参见 Raspberry Pi 4 启动加载程序配置 页面,我们还有一个 关于设置网络启动系统的教程 供参考。网络启动仅适用于上述型号的Raspberry Pi内置的有线适配器。不支持通过无线LAN启动,也不支持从任何其他有线网络设备启动。
如果需要进行网络启动,则启动 ROM 执行以下操作:
-
初始化板载以太网设备(Microchip LAN9500或LAN7500)
-
发送 DHCP 请求 (供应商类标识符 DHCP option 60 设置为 'PXEClient:Arch:00000:UNDI:002001')
-
接收 DHCP 回复
-
(可选) 接收 DHCP 代理回复
-
ARP 到 tftpboot 服务器
-
ARP reply includes tftpboot server ethernet address
-
TFTP RRQ 'bootcode.bin'
-
找不到文件:服务器回复 TFTP 错误响应以及文本错误消息
-
文件存在:服务器将使用文件的第一个块(512 字节)数据进行回复,并在标头中带有块号
-
Raspberry Pi 使用包含块号的 TFTP ACK 数据包进行回复,并重复直到最后一个不是 512 字节的数据块
-
-
-
TFTP RRQ 'bootsig.bin'
-
这通常会导致一个
file not found
错误。TFTP启动服务器能够处理这个问题。
-
从这一点开始,bootcode.bin
代码继续加载系统。它将尝试访问的第一个文件是 [serial_number
]/start.elf 。如果不会发生错误,则任何其他要读取的文件都将以 serial_number
开头。这个操作很有用,因为它使你能够为Raspberry Pi创建带有单独的start.elf /内核目录。如果需要获得设备的序列号,你可以尝试这种启动模式,并查看使用 tcpdump / wireshark 访问了哪些文件,或者你可以运行标准的Raspberry Pi OS SD卡和 cat /proc/cpuinfo
。
如果你将所有文件放入 tftp 目录的根目录中,则将从那里访问所有后续文件。
调试网络启动模式
首先检查OTP位是否正确编程,为此需要将 program_usb_boot_mode=1
添加
到config.txt中并重新启动(使用可以正确启动Raspberry Pi 操作系统的标准SD卡)。完成此操作后,你可以执行以下操作:
vcgencmd otp_dump | grep 17:
如果第 17 行包含 3020000a
,则 OTP 已正确编程。你现在可以取出SD卡并再插入以太网, Raspberry Pi通电后等待约5秒以太网的 LED灯会点亮。
要抓获服务器上的以太网数据包,请在 tftpboot 服务器(如果使用时存在区别可以使用 DHCP 服务器)上使用 tcpdump。你需要在tcpdump抓获数据包,否则你将无法看到直接发送的数据包。
sudo tcpdump -i eth0 -w dump.pcap
以上执行的命令会将eth0的所有内容写入dump.pcap文件,然后你可以对其进行后期处理或上传到 cloudshark.com 进行通信。
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 中的错误,你可能需要在字符串末尾添加3个空格。
TFTP 文件读取
你将会知道Vendor Option选项是否被正确指定:如果被正确指定,你将看到正在发送的TFTP RRQ 数据包。 RRQ 可以通过第一个数据块或错误(表示找不到文件)来回复。在一些情况下,他们甚至会收到第一个数据包,然后传输被 Raspberry Pi 中止(在检查文件是否存在时会发生这种情况)。下面的示例包含3个数据包:原始读取请求、第一个数据块(始终为516字节并包含标头和512字节数据,尽管最后一个块始终小于 512 字节并且长度可能为0)和第三个数据包(包含与数据块中的帧号匹配的帧号的 ACK)。
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请求在5次尝试后超时
Raspberry Pi将尝试5次DHCP请求,中间间隔5秒,总时间为 25 秒。如果服务器在这段时间内无法响应,则Raspberry Pi将进入低功耗状态。除了SD卡上的bootcode.bin之外,暂无其他解决方法。
Raspberry Pi 启动字符串
由于计算字符串长度时出错,DHCP回复中的 "Raspberry Pi 启动 " 字符串需要额外的3个空格。
已在Raspberry Pi 3 Model B+ 中修复。
GPIO 启动模式
Edit this on GitHub
Note
|
GPIO 启动模式适用于 Raspberry Pi 3A+、Raspberry Pi 3A+ 3B/ Raspberry Pi 3A+ 3B+、CM3和CM3+。 |
可以将Raspberry Pi配置为允许使用连接到 GPIO 连接器的硬件在开机时选择启动模式:即 GPIO 启动模式。这是通过设置SoC的OTP存储器中的位来完成的。设置位完成后,它们将会永久分配 5 个 GPIO 以允许进行此选择。如果设置了OTP 位,则无法取消操作;所以在设置之前需要仔细考虑启用此功能,因为这 5个GPIO线将始终控制启动。尽管在Raspberry Pi启动后可以将GPIO用于其他功能,但必须对齐进行设置,以便它们在Raspberry Pi启动时启用所需的启动模式。
若要启用 GPIO 启动模式,请将以下行添加到 config.txt
文件中:
program_gpio_bootmode=n
其中n表示需要使用的 GPIO组。 添加完成后后重新启动Raspberry Pi,以使用此设置对OTP进行编程。Bank 1包含GPIO22-26,Bank2包含GPIO39-43。除非你有CM,否则必须使Bank1:Bank 2中的GPIO仅在CM上可用。由于 OTP位的排列方式,如果首先为Bank1 编程 GPIO启动模式,则后续可以选择Bank2。反之则不然:若为 GPIO 启动模式选择Bank2,则后续无法选择Bank1。
启用 GPIO 启动模式后,Raspberry Pi 将不再启动。你必须拉起至少一个启动模式 GPIO 引脚才能启动 Raspberry Pi。
引脚分配
Boot Flow
SD0是Broadcom SD卡/ MMC接口。当SoC内的启动ROM运行时,它始终将SD0连接到内置的microSD卡槽。在具有 eMMC 设备的CM上,SD0 连接到该模块;CM Lite SD0位于CM Lite的边缘连接器上,并连接到 CMIO 载板中的 microSD 卡槽。
SD1是Arasan SD卡/ MMC接口,也支持SDIO的能力。所有内置无线网的Raspberry Pi型号都使用SD1通过 SDIO连接到无线芯片。
GPIO 线路的默认拉力电阻为 50KΩ,如 BCM2835 ARM 外设 datasheet 的第102页所述。建议使用5KΩ的拉力电阻来拉起 GPIO 线路:这将使 GPIO 正常工作,但不会消耗太多功率。
NVMe SSD 启动
Edit this on GitHub
NVMe(非易失性存储器)是通过 PCIe 总线访问固态硬盘 (SSD) 的标准。你可以通过CM4 IO 板上的 PCIe 插槽连接这些驱动器,从而允许 CM4 从 SSD 启动。
所需硬件
你需要一个NVMe M.2 SSD。你无法将 M.2 SSD直接插入 IO 板上的 PCIe 插槽 - 需要使用适配器。请注意获取正确的适配器类型:可以通过搜索 'PCI-E 3.0 x1 Lane to M.2 NGFF M-Key SSD Nvme PCI Express Adapter Card' 。
最新版本的Raspberry Pi操作系统支持从NVMe驱动器启动。要检查你的 NVMe 驱动器是否正确连接,请从另一个驱动器启动 Raspberry Pi OS 并运行 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
如果你需要将 NVMe 驱动器连接到 PC 或 Mac,你可以使用 USB 适配器:搜索 'NVME PCI-E M-Key Solid State Drive External Enclosure' 。硬件上必须支持 M key SSD。
所需软件
如果需要从NVMe 启动,则需要最新版本的启动加载程序(2021 年7月之后的版本),以及最新版本的 VideoCore 固件和Raspberry Pi操作系统 Linux 内核。最新的Raspberry Pi操作系统版本包含最新的启动加载程序、最新版本的VideoCore和最新版本的Linux内核,因此你可以使用 Raspberry Pi Imager 将软件安装到SSD。
启动加载程序
你可能需要使用 rpiboot
来更新CM4启动加载程序。 有关构建rpiboot和配置IO板以将ROM切换到usbboot模式的说明,请参见 usbboot Github 存储库 。
记得在 recovery/boot.conf
中将NVMe启动模式 6
添加到 BOOT_ORDER 中。
固件和内核
你必须拥有最新版本的VideoCore固件和Raspberry Pi OS Linux内核才能直接从NVMe SSD磁盘启动。Raspberry Pi Bullseye和Buster Legacy版本拥有最新版本的VideoCore固件和Raspberry Pi OS Linux内核。
如果你使用的是 CM4 lite,请取出 SD 卡,主板将从 NVMe 磁盘启动。对于带有 eMMC 的 CM4 版本,请确保在启动顺序中先设置 NVMe。
NVMe BOOT_ORDER
这种启动行为通过EEPROM配置中的BOOT_ORDER设置进行控制:我们为NVMe添加了新的启动模式 6
。请参见 Raspberry Pi 4 启动加载程序配置 。
如下为启动加载程序检测到 NVMe 驱动器时的 UART 输出示例:
Boot mode: SD (01) order f64 Boot mode: USB-MSD (04) order f6 Boot mode: NVME (06) order f VID 0x144d MN Samsung SSD 970 EVO Plus 250GB NVME on
然后它将找到一个 FAT 分区并加载 start4.elf
:
Read start4.elf bytes 2937840 hnd 0x00050287 hash ''
然后它将加载内核并启动操作系统:
MESS:00:00:07.096119:0: brfs: File read: /mfs/sd/kernel8.img MESS:00:00:07.098682:0: Loading 'kernel8.img' to 0x80000 size 0x1441a00 MESS:00:00:07.146055:0:[ 0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd083]
在Linux中,SSD显示为 /dev/nvme0
, "命名空间" 显示为 /dev/nvme0n1
。将包含 /dev/nvme0n1p1
(FAT) 和 /dev/nvme0n1p2
(EXT4) 两个分区。使用 lsblk
检查分区分配:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT nvme0n1 259:0 0 232.9G 0 disk ├─nvme0n1p1 259:1 0 256M 0 part /boot └─nvme0n1p2 259:2 0 232.6G 0 part /
故障排除
如果启动过程失败,请在 rpi-eeprom Github 存储库 上提交问题,包括控制台的副本以及启动期间屏幕上显示的任何内容。
HTTP 启动
Edit this on GitHub
网络安装功能使用HTTP通过以太网将Raspberry Pi启动到嵌入式 Raspberry Pi Imager 应用程序中。
除了网络安装之外,你还可以使用通过HTTP下载的文件以 启动模式 `7`显式地启动设备。 即使 禁用了启动时网络安装 ,你仍然可以使用它。
例如,你可以将其添加到 BOOT_ORDER
作为备用启动方法,或者将其放在 GPIO 条件后,以便在 GPIO 引脚被拉低时从你自己的服务器使能HTTP启动。
例如,如果将以下内容添加到 eeprom 配置中,并且 GPIO 8(默认状态为1或高电平)将被拉低,则文件 http://downloads.raspberrypi.org:80/net_install/boot.img
和 http://downloads.raspberrypi.org:80/net_install/boot.sig
将被下载。如果在启动时使能网络安装,它将使用相同的 URL。如果 GPIO 8 未被拉低,则行为将保持不变。
[gpio8=0]
BOOT_ORDER=0xf7
HTTP_HOST=downloads.raspberrypi.org
NET_INSTALL_ENABLED=0
如果启用了安全启动且未设置 HTTP_HOST ,则将忽略`BOOT_ORDER` 中的HTTP。
要求
要使用 HTTP 启动,你需要 使用最新 / 稳定的启动加载程序配置 并更新到2022年3月10日或更高版本的启动加载程序。HTTP启动仅适用于以太网,因此你需要通过网线将Raspberry Pi连接到网络。
密钥
所有HTTP下载都必须签名。启动加载程序包括默认主机 `fw-download-alias1.raspberrypi.com`上文件的公钥。该密钥将用于验证网络安装镜像,除非 你设置了 HTTP_HOST 并 在eeprom中包含一个公钥。 这允许你在自己的服务器上托管Raspberry Pi网络安装镜像。
Warning
|
使用你自己的网络安装镜像需要你对镜像进行签名并将公钥添加到 eeprom中。如果你使用公共 eeprom 更新,你的密钥将丢失且需要重新添加。 |
USBBOOT 具有编程公钥所需的所有工具。你需要参照下文来操作:
# Add your PUBLIC key to the eeprom. boot.conf contains your modifications rpi-eeprom-config -c boot.conf -p mypubkey.pem -o pieeprom.upd pieeprom.original.bin # Generate signature for your eeprom rpi-eeprom-digest -i pieeprom.upd -o pieeprom.sig # Sign the network install image with your PRIVATE key # Put boot.img and boot.sig on your web server rpi-eeprom-digest -i boot.img -o boot.sig -k myprivkey.pem
并行显示接口 (DPI)
Edit this on GitHub
所有具有 24-Pin接头和CM的 Raspberry Pi 板上均提供高达24位并行 RGB 接口。该接口允许并行 RGB 显示器以 RGB24(8位红色、8位绿色和8位蓝色)或 RGB666(每种颜色 6 位)或 RGB565(5 位红色、6 位绿色和 5 位蓝色)连接到 Raspberry Pi GPIO。
此接口由 GPU 固件控制,用户可以通过特殊的config.txt参数并启用正确的 Linux 设备树覆盖进行编程。
GPIO Pins
Raspberry Pi GPIO 的Bank0 上可选择的替代功能之一是 DPI(显示并行接口),其为一个简单的时钟并行接口(最多8位R、G和B;时钟、启用、hsync 和 vsync)。此接口可用作 GPIO Bank0 上的备用功能 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 引脚的所有其他外设覆盖层。在 config.txt 中,注意注释掉或反转任何支持 I2C 或 SPI 的 dtparams:
dtparam=i2c_arm=off dtparam=spi=off
控制输出格式
输出格式(时钟、颜色格式、同步极性、启用)可以通过传递到从以下字段创建的config.txt中的 dpi_output_format
参数的幻数(无符号整数或前缀为 0x 的十六进制值)进行控制:
output_format = (dpi_output_format >> 0) & 0xf; rgb_order = (dpi_output_format >> 4) & 0xf; output_enable_mode = (dpi_output_format >> 8) & 0x1; invert_pixel_clock = (dpi_output_format >> 9) & 0x1; hsync_disable = (dpi_output_format >> 12) & 0x1; vsync_disable = (dpi_output_format >> 13) & 0x1; output_enable_disable = (dpi_output_format >> 14) & 0x1; hsync_polarity = (dpi_output_format >> 16) & 0x1; vsync_polarity = (dpi_output_format >> 17) & 0x1; output_enable_polarity = (dpi_output_format >> 18) & 0x1; hsync_phase = (dpi_output_format >> 20) & 0x1; vsync_phase = (dpi_output_format >> 21) & 0x1; output_enable_phase = (dpi_output_format >> 22) & 0x1; output_format: 1: DPI_OUTPUT_FORMAT_9BIT_666 2: DPI_OUTPUT_FORMAT_16BIT_565_CFG1 3: DPI_OUTPUT_FORMAT_16BIT_565_CFG2 4: DPI_OUTPUT_FORMAT_16BIT_565_CFG3 5: DPI_OUTPUT_FORMAT_18BIT_666_CFG1 6: DPI_OUTPUT_FORMAT_18BIT_666_CFG2 7: DPI_OUTPUT_FORMAT_24BIT_888 rgb_order: 1: DPI_RGB_ORDER_RGB 2: DPI_RGB_ORDER_BGR 3: DPI_RGB_ORDER_GRB 4: DPI_RGB_ORDER_BRG output_enable_mode: 0: DPI_OUTPUT_ENABLE_MODE_DATA_VALID 1: DPI_OUTPUT_ENABLE_MODE_COMBINED_SYNCS invert_pixel_clock: 0: RGB Data changes on rising edge and is stable at falling edge 1: RGB Data changes on falling edge and is stable at rising edge. hsync/vsync/output_enable_polarity: 0: default for HDMI mode 1: inverted hsync/vsync/oe phases: 0: DPI_PHASE_POSEDGE 1: DPI_PHASE_NEGEDGE
注意,单比特字段都充当 "反转默认行为"。
控制计时和分辨率
在2018年8月或更高版本的固件中,以前用于设置DPI计时的 hdmi_timings
config.txt 条目已被新的 dpi_timings
参数取代。如果 dpi_timings
参数不存在,系统将使用 hdmi_timings
参数来确保向后兼容性。如果两者都不存在并且请求自定义模式,则使用VGAp60的默认参数集。
`dpi_group` 和 `dpi_mode` config.txt 参数用于设置预定模式(HDMI使用的DMT或CEA模式),或者用户可以生成 https://forums.raspberrypi.com/viewtopic.php?f=29&t=24679[自定义模式] 。
如果设置自定义 DPI 模式,则在config.txt中使用:
dpi_group=2 dpi_mode=87
这将告知驱动程序使用DPI面板的自定义 dpi_timings
(旧固件使用 hdmi_timings
) 计时。
`dpi_timings` 参数指定为一组以空格分隔的参数:
dpi_timings=<h_active_pixels> <h_sync_polarity> <h_front_porch> <h_sync_pulse> <h_back_porch> <v_active_lines> <v_sync_polarity> <v_front_porch> <v_sync_pulse> <v_back_porch> <v_sync_offset_a> <v_sync_offset_b> <pixel_rep> <frame_rate> <interlaced> <pixel_freq> <aspect_ratio> <h_active_pixels> = horizontal pixels (width) <h_sync_polarity> = invert hsync polarity <h_front_porch> = horizontal forward padding from DE active edge <h_sync_pulse> = hsync pulse width in pixel clocks <h_back_porch> = vertical back padding from DE active edge <v_active_lines> = vertical pixels height (lines) <v_sync_polarity> = invert vsync polarity <v_front_porch> = vertical forward padding from DE active edge <v_sync_pulse> = vsync pulse width in pixel clocks <v_back_porch> = vertical back padding from DE active edge <v_sync_offset_a> = leave at zero <v_sync_offset_b> = leave at zero <pixel_rep> = leave at zero <frame_rate> = screen refresh rate in Hz <interlaced> = leave at zero <pixel_freq> = clock frequency (width*height*framerate) <aspect_ratio> = * * The aspect ratio can be set to one of eight values (choose closest for your screen): HDMI_ASPECT_4_3 = 1 HDMI_ASPECT_14_9 = 2 HDMI_ASPECT_16_9 = 3 HDMI_ASPECT_5_4 = 4 HDMI_ASPECT_16_10 = 5 HDMI_ASPECT_15_9 = 6 HDMI_ASPECT_21_9 = 7 HDMI_ASPECT_64_27 = 8
覆盖
Linux 设备树覆盖用于将 GPIO 引脚切换到正确的模式(alt function 2)。如前所述,GPU 负责驱动 DPI 显示器。因此无 Linux 驱动程序;覆盖只是正确设置 GPIO alt 功能。
提供 '全脂' DPI覆盖 (dpi24.dtb) ,将28 个 GPIO 设置为 ALT2 模式,提供 完整 的 24 位色彩总线以及水平和垂直同步、使能和像素时钟。请注意,这使用所有Bank0的 GPIO 引脚。
提供第二个覆盖 (vga666.dtb) 用于在666模式下驱动VGA监视器信号,该模式无需时钟和DE引脚(GPIO 0和1),只需GPIO4-21来实现颜色(使用模式5)。
这些覆盖层相当琐碎的,用户可以编辑它们以创建自定义覆盖层,以启用特定用例所需的引脚。
config.txt
设置示例
Gert VGA666 适配器
此设置适用于 Gert VGA 适配器.
请注意,上述 GitHub 链接中的文档提供的说明可能过时了,建议使用以下设置。
dtoverlay=vga666 enable_dpi_lcd=1 display_default_lcd=1 dpi_group=2 dpi_mode=82
[[800x480-lcd-panel]] ==== 800x480 LCD 面板
Note
|
这是使用Adafruit的 DPI 附加板 800x480 LCD面板进行测试的。 |
dtoverlay=dpi24 overscan_left=0 overscan_right=0 overscan_top=0 overscan_bottom=0 framebuffer_width=800 framebuffer_height=480 enable_dpi_lcd=1 display_default_lcd=1 dpi_group=2 dpi_mode=87 dpi_output_format=0x6f005 dpi_timings=800 0 40 48 88 480 0 13 3 32 0 0 0 60 0 32000000 6
通用 I/O (GPIO)
Edit this on GitHub
通用 I/O (GPIO) 引脚可配置为通用输入、通用输出或多达六种特殊备用设置之一,其功能取决于引脚。
BCM2835 上有3个 GPIO组。3个组都有自己的VDD输入引脚。在Raspberry Pi上,所有GPIO组均使用3.3V供电。
Warning
|
将 GPIO 连接到高于 3.3V 的电压可能会破坏 SoC 内的 GPIO 模块。 |
Raspberry Pi的 P1 接头上提供了 Bank 0 中引脚选择。
GPIO 焊盘
BCM2835封装上的GPIO连接有时在外设数据手册中称为 "焊盘" ,这是一个半导体设计术语,意思是 '芯片与外界的连接'。
焊盘是可配置的CMOS输出驱动器/输入缓冲器。基于寄存器的控制设置可用于:
-
内部上拉/下拉使能/禁用
-
输出 驱动强度
-
输入施密特触发器滤波
中断
每个 GPIO 引脚在配置为通用输入时,都可以配置为 ARM 的中断源。可配置多个中断生成源:
-
电平敏感 (高/低)
-
上升沿/下降沿
-
异步上升沿/下降沿
电平中断保持中断状态,直到系统软件清除电平 (例如,通过为生成中断的附加外设提供服务)。
正常的上升沿/下降沿检测在检测中内置了少量同步。在系统时钟频率下,对引脚进行采样,产生中断的标准是3周期窗口内的稳定转换,即记录 '1 0 0' 或 '0 1 1'。异步检测绕过此同步,以便能够检测非常窄的事件。
替代功能
几乎所有的GPIO引脚都有替代功能。 可以配置 SoC 内部的外设模块出现在1组 GPIO 引脚中的一个或多个上,例如,I2C 总线可以配置为至少3个独立的位置。当引脚配置为备用功能时, 焊盘控制( 如驱动强度或施密特滤波)仍然适用。
电压规格
下表给出了基于 BCM2835、BCM2836、BCM2837 和RP3A0 的产品(例如 Raspberry Pi Zero 或 Raspberry Pi 3+)的 GPIO 引脚的各种电压规格。有关CM的信息,请参见 相关的datasheet。
符号 | 参数 | 条件 | 最小值 | 典型值 | 最大值 | 单位 |
---|---|---|---|---|---|---|
VIL |
输入低电压 |
- |
- |
- |
0.9 |
V |
VIH |
输入高电压a |
- |
1.6 |
- |
- |
V |
IIL |
输入漏电流 |
TA = +85◦C |
- |
- |
5 |
µA |
CIN |
输入电容 |
- |
- |
5 |
- |
pF |
VOL |
输出低压b |
IOL = -2mA |
- |
- |
0.14 |
V |
VOH |
输出高压b |
IOH = 2mA |
3.0 |
- |
- |
V |
IOL |
输出低电流c |
VO = 0.4V |
18 |
- |
- |
mA |
IOH |
输出高电流c |
VO = 2.3V |
17 |
- |
- |
mA |
RPU |
上拉电阻 |
- |
50 |
- |
65 |
kΩ |
RPD |
下拉电阻 |
- |
50 |
- |
65 |
kΩ |
a 滞后启用
b 默认驱动强度 (8mA)
c 最大驱动强度 (16mA)
下表给出了基于 BCM2711 的产品 (例如Raspberry Pi 4 和Raspberry Pi 400)的 GPIO 引脚的各种电压规格。有关处理器模块(CM)的信息,请参见 相关的datasheet。
符号 | 参数 | 条件 | 最小值 | 典型值 | 最大值 | 单位 |
---|---|---|---|---|---|---|
VIL |
输入低电压 |
- |
- |
- |
0.8 |
V |
VIH |
输入高电压a |
- |
2.0 |
- |
- |
V |
IIL |
输入漏电流 |
TA = +85◦C |
- |
- |
10 |
µA |
VOL |
输出低电压b |
IOL = -4mA |
- |
- |
0.4 |
V |
VOH |
输出高电压b |
IOH = 4mA |
2.6 |
- |
- |
V |
IOL |
输出低电流c |
VO = 0.4V |
7 |
- |
- |
mA |
IOH |
输出高电流c |
VO = 2.6V |
7 |
- |
- |
mA |
RPU |
上拉电阻 |
- |
33 |
- |
73 |
kΩ |
RPD |
下拉电阻 |
- |
33 |
- |
73 |
kΩ |
a 滞后启用
b 默认驱动强度 (4mA)
c 最大驱动强度 (8mA)
GPIO 焊盘控制
Edit this on GitHub
GPIO 驱动强度并不表示最大电流,而是表示焊盘仍满足规格的最大电流。应将 GPIO 驱动器强度设置为与所连接的设备匹配,以便设备正常工作。
如何控制驱动强度
焊盘内部包含多个并行的驱动器。如果驱动强度设置为低 (0b000) ,则其中大多数是三态的,因此它们不会增加任何输出电流。如果驱动强度增加,就会有越来越多的驱动器并联,入下图所示。
Warning
|
对于Raspberry Pi 4、Raspberry Pi 400 和CM4,电流取值为下图中的一半。 |
电流值是什么意思?
Note
|
电流值指的是焊盘仍符合规格的最大电流。 |
-
这 不是 焊盘提供的电流
-
这 不是 电流限制,因此焊盘不会爆炸
焊盘输出为电压源:
-
如果设置为高电平,焊盘将尝试将输出驱动至电源轨电压(3.3V)
-
如果设置为低电平,焊盘将尝试将输出驱动至地(0V)
焊盘将尝试将输出驱动为高电平或低电平。是否成功将取决于所连接内容的要求。如果焊盘短路接地,它将无法驱动为高电平。它实际上会尝试提供尽可能多的电流,并且电流仅受内部电阻的限制。
如果焊盘被驱动为高电平并且被短路接地,在适当的时候它将失效。如果将其连接到 3.3V 并将其驱动到低电平,情况同样如此。
是否满足规格取决于保证的电压水平。由于焊盘是数字的,因此有两个电压电平,高电平和低电平。I/O 端口有两个处理输出电平的参数:
-
VOL, 最大低电平电压(3.3.V 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
|
在处理器模块(CM)设备上,可以更改标准3.3V的VDD IO。在这种情况下,VOL和VOH将根据链接页面上的表格进行更改。 |
为什么我不将所有焊盘设置为最大电流?
两个原因:
-
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)
位 | 字段名称 | 描述 | 类型 | 重置 |
---|---|---|---|---|
31:24 |
PASSWRD |
写入时必须为0x5A;意外写保护密码 |
W |
0 |
23:5 |
保留 - 写为 0,读为无关 |
|||
4 |
SLEW |
转换率; 0 = 转换速率受限; 1 = 转换速率不受限 |
RW |
0x1 |
3 |
HYST |
使能输入滞后; 0 = 禁用; 1 = 启用 |
RW |
0x1 |
2:0 |
DRIVE |
驱动强度, 请参见下面的细分列表 |
RW |
0x3 |
请注意 SSO (同步开关输出) 限制,这些限制取决于器件以及PCB 的质量和布局、去耦电容器的数量和质量、焊盘上的负载类型(电阻、电容)以及 Raspberry Pi 无法控制的因素。
驱动强度列表
-
0 = 2mA
-
1 = 4mA
-
2 = 6mA
-
3 = 8mA
-
4 = 10mA
-
5 = 12mA
-
6 = 14mA
-
7 = 16mA
外设地址
Edit this on GitHub
如果没有可用的内核驱动程序,并且程序需要使用 mmap 直接访问外设地址,则需要明确外设总线段在虚拟内存映射中的位置。这因使用的 Raspberry Pi 型号而异,因此 bcm_host.c 中有三个辅助函数来帮助提供平台独立性。
Note
|
应使用这些函数而不是硬编码值,因为这将确保将来的兼容性。 |
unsigned bcm_host_get_peripheral_address()
这将返回映射外设的 ARM 端物理地址。
unsigned bcm_host_get_peripheral_size()
这将返回外设空间的大小。
unsigned bcm_host_get_sdram_address()
这将返回 SDRAM 的总线地址。
以下是为写作本文时的当前值,以表格形式表示:
SoC | 外设地址 | 外设大小 | SDRAM 地址 | 源 |
---|---|---|---|---|
BCM2835 |
0x20000000 |
0x01000000 |
0x40000000 |
|
BCM2836 |
0x3f000000 |
0x01000000 |
0xC0000000 |
|
BCM2837 |
0x3f000000 |
0x01000000 |
0xC0000000 |
|
BCM2711 |
0xfe000000 |
0x01800000 |
0xc0000000 |
使用这些函数构建 C 程序
默认情况下,包含文件和库安装在Raspberry Pi操作系统上。只需将以下行添加到 C 程序中:
#include <bcm_host.h>
例:
#include <stdio.h>
#include <bcm_host.h>
int main(void) {
printf("bcm_host_get_peripheral_address -> 0x%08x\n", bcm_host_get_peripheral_address());
printf("bcm_host_get_peripheral_size -> 0x%08x\n", bcm_host_get_peripheral_size());
printf("bcm_host_get_sdram_address -> 0x%08x\n", bcm_host_get_sdram_address());
return 0;
}
链接至::
-lbcm_host
所以一个简单的命令行编译可能是:
cc myfile.c -I/opt/vc/include -L/opt/vc/lib -lbcm_host -o myfile
Raspberry Pi 的工业用途
Edit this on GitHub
Raspberry Pi通常用作其他产品的一部分。本文档介绍了一些可用于使用 Raspberry Pi 其他功能的额外工具。
一次性可编程设置
可以使用许多 OTP 值。要查看所有 OTP 值 的列表,你可以使用:
vcgencmd otp_dump
这个转储中的一些有用定义:
-
28 - 序列号
-
29 - 序列号的补码
-
30 - 修订吗
此外从 36 到 43(含),有8行 32 位可供客户使用
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, 0x22222222, 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 代码作为示例来实现此目的。
===锁定 OTP 更改
可以锁定 OTP 更改以避免再次编辑它们。这可以使用带有 OTP 写入邮箱的特殊参数来完成:
vcmailbox 0x00038021 8 8 0xffffffff 0xaffe0000
锁定后,无法再更改客户 OTP 值。请注意,此锁定操作是不可逆的。
使客户OTP位不可读
完全可以防止客户的OTP位被读取。这可以使用带有 OTP 写入邮箱的特殊参数来完成:
vcmailbox 0x00038021 8 8 0xffffffff 0xaffebabe
此操作对于绝大多数用户来说是不太可能有用,并且是不可逆的。
设备专用密钥
8行 OTP(256 位)可用作特定于设备的私钥,旨在支持文件系统加密。
可以使用与管理客户OTP行类似的vcmailbox命令对这些行进行编程和读取。如果不需要安全启动/文件系统加密,则设备私钥行可用于存储通用信息。
-
只能通过
vcmailbox
命令读取设备私钥行,该命令需要访问/dev/vcio
,该权限仅限于Raspberry Pi操作系统上的视频
组。 -
Raspberry Pi计算机无硬件保护的密钥存储。建议将此功能与 安全启动 结合使用,以限制对此数据的访问。
-
Raspberry Pi OS不支持加密的根文件系统。
有关开源磁盘加密的详细信息,请参见 cryptsetup 。
关键编程脚本 rpi-otp-private-key
https://github.com/raspberrypi/usbboot/blob/master/tools/rpi-otp-private-key[rpi-otp-private-key] 脚本包装了设备私 `vcmailbox` API,以便更轻松地读取/写入与 OpenSSL 相同的格式密钥。
将密钥读取为 64 字节十六进制数字
rpi-otp-private-key
输出示例
f8dbc7b0a4fcfb1d706e298ac9d0485c2226ce8df7f7596ac77337bd09fbe160
将随机生成的 64 字节数字写入设备私钥。
Warning: 此操作无法撤销。
# rpi-otp-private-key -w $(openssl rand -hex 32)
用于读取/写入密钥的邮箱 API
读取所有行。
vcmailbox 0x00030081 40 40 0 8 0 0 0 0 0 0 0 0
输出示例
0x00000040 0x80000000 0x00030081 0x00000028 0x80000028 0x00000000 0x00000008 0xf8dbc7b0 0xa4fcfb1d 0x706e298a 0xc9d0485c 0x2226ce8d 0xf7f7596a 0xc77337bd 0x09fbe160 0x00000000
写入所有行(将末尾的八个0替换为关键数据)
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 寄存器和位定义
Edit this on GitHub
Raspberry Pi系列使用的所有SoC都包含一个内置的一次性可编程(OTP)内存块。
尽管只有少数位置具有工厂编程的数据,它的长度为 66 个 32 位值。
显示 OTP 内容的 vcgencmd
为:
vcgencmd otp_dump
OTP 寄存器
该列表包含登记册上的公开信息。如果此处未定义寄存器或位,则它不是公共的。
17 — 启动模式寄存器
-
Bit 1: 将振荡器频率设置为 19.2MHz
-
Bit 3: 使能 SDIO 引脚上的上拉
-
Bit 19: 启用 GPIO 启动模式
-
Bit 20: 设置组以检查 GPIO 启动模式
-
Bit 21: 使能从 SD 卡启动
-
Bit 22: 设置启动的组
-
Bit 28: 使能 USB 设备启动
-
Bit 29: 使能 USB 主机启动(以太网和大容量存储)
Note
|
在 BCM2711 上,启动模式由 启动加载程序 EEPROM 配置 而不是 OTP 定义。 |
18 — 启动模式寄存器的副本
28 — 序列号
29 — ~(序列号)
30 — 修订代码 1
33 — 扩展板修订 - 含义取决于主板型号。
这可以通过 /proc/device-tree/chosen/rpi-boardrev-ext
中的设备树获得,出于测试目的,可以通过在 config.txt
中的 board_rev_ext
来临时覆盖该OTP值。
-
Compute Module 4
-
Bit 30: 处理器模块(CM)是否安装了 WiFi 模块
-
0 - WiFi
-
1 - 无 WiFi
-
-
Bit 31: 处理器模块(CM)是否安装了 EMMC 模块
-
0 - EMMC
-
1 - 无 EMMC (Lite版)
-
-
-
Raspberry Pi 400
-
Bits 0-7: piwiz 使用的默认键盘国家码
-
36-43 — 客户 OTP 值
45 — MPG2 解码密钥
46 — WVC1 解码密钥
47-54 — 用于安全启动的 RSA 公钥的 SHA256
55 — 安全启动标志(保留供启动加载程序使用)
56-63 — 256 位设备专用私钥
64-65 — MAC 地址; 如果设置,系统将优先使用此地址,而不是基于序列号自动生成地址
66 — 高级启动寄存器 (不是 BCM2711)
-
Bits 0-6: ETH_CLK输出引脚的 GPIO
-
Bit 7: 启用ETH_CLK输出
-
Bits 8-14: LAN_RUN输出引脚的 GPIO
-
Bit 15: 启用LAN_RUN输出
-
Bit 24: 扩展 USB HUB超时参数
-
Bit 25: ETH_CLK频率:
-
0 - 25MHz
-
1 - 24MHz
-
1还包含用于禁用过压、OTP 编程和 OTP 读取的位。
电源
Edit this on GitHub
电源要求因Raspberry Pi型号而异。所有型号都需要 5.1V 电源,但所需电流通常会根据型号而增加。Raspberry Pi 3之前的所有型号都需要micro USB电源连接器,而Raspberry Pi 4和Raspberry Pi 400则使用USB-C连接器。
Raspberry Pi需要多大电流 (mA) 取决于你连接到的设备。下表给出了各种电流要求。
产品 | 推荐的电源电流容量 | 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 400 |
3.0A |
1.2A |
800mA |
Raspberry Pi Zero |
1.2A |
仅受 PSU、主板和连接器额定值的限制。 |
100mA |
Raspberry Pi Zero W |
1.2A |
仅受 PSU、主板和连接器额定值的限制。 |
150mA |
Raspberry Pi Zero 2 W |
2A |
仅受 PSU、主板和连接器额定值的限制。 |
350mA |
Raspberry Pi开发了自己的电源,适用于所有型号。这些是可靠的,使用粗规格电线并且价格合理。
对于Raspberry Pi 0-3,我们推荐 2.5A micro USB 电源。对于Raspberry Pi 4 和Raspberry Pi 400,我们推荐 3A USB-C 电源.
如果需要连接的 USB 设备将使电源要求高于上表中指定的值,则必须使用外部供电的 USB HUB进行连接。
典型电源要求
每个型号的具体电源要求如下所示。
产品 | 推荐的电源电流容量 | 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 400 |
3.0A |
1.2A |
800mA |
Raspberry Pi Zero |
1.2A |
仅受 PSU、主板和连接器额定值的限制。 |
100mA |
Raspberry Pi Zero W |
1.2A |
仅受 PSU、主板和连接器额定值的限制。. |
150mA |
Raspberry Pi Zero 2 W |
2A |
仅受 PSU、主板和连接器额定值的限制。 |
350mA |
从Raspberry Pi B+开始,为下行USB外设提供1.2A电流。假设上行电源有足够的可用电流,则大多数USB设备可以直接连接到这些型号。
高电流的设备或可能吸收浪涌电流的设备(如一些调制解调器和USB硬盘)仍然需要外部供电的USB HUB。当你使用Raspberry Pi上的各种接口时,Raspberry Pi的功率要求会增加。GPIO引脚可以安全地消耗50mA(请注意,这表示50mA分布在所有引脚上:单个GPIO引脚只能安全地消耗16mA),HDMI端口需要50mA,相机模块需要250mA,键盘和鼠标可以占用低至100mA或高达1000mA!检查你计划连接到Raspberry Pi的设备的额定功率并相应地购买电源。如果你不确定,我们建议你购买有源的USB HUB。
下表描述不同Raspberry Pi产品在标准使用中消耗的典型功率(以A为单位):
Raspberry Pi 1B+ |
Raspberry Pi 2B |
Raspberry Pi 3B |
Raspberry Pi Zero |
Raspberry Pi 4B |
||
Boot |
最大值 |
0.26 |
0.40 |
0.75 |
0.20 |
0.85 |
平均值 |
0.22 |
0.22 |
0.35 |
0.15 |
0.7 |
|
Idle |
平均值 |
0.20 |
0.22 |
0.30 |
0.10 |
0.6 |
视频回放 (H.264) |
Max |
0.30 |
0.36 |
0.55 |
0.23 |
0.85 |
平均值 |
0.22 |
0.28 |
0.33 |
0.16 |
0.78 |
|
Stress |
最大值 |
0.35 |
0.82 |
1.34 |
0.35 |
1.25 |
平均值 |
0.32 |
0.75 |
0.85 |
0.23 |
1.2 |
|
停止电流 |
0.10 |
0.055 |
0.023 |
Note
|
对于这些测量,我们在室温下使用了标准的Raspberry Pi操作系统镜像(截至2016年2月26日,或对于Raspberry Pi 4为2019年6月),并将Raspberry Pi连接到HDMI显示器、USB键盘和USB鼠标。Raspberry Pi 3Model B连接到无线LAN接入点,Raspberry Pi 4连接到以太网。所有这些功率测量值均为近似值,并未考虑额外USB设备的功耗;如果多个额外的USB设备或HAT连接到Raspberry Pi,功耗很容易超过这些测量值。 |
电源告警
自Raspberry Pi B+(2014)以来的所有的产品型号上,除Zero系列外都有低压检测电路,可以检测电源电压是否降至 4.63V (+/- 5%)以下。这将导致在所有连接的显示器上显示一个 告警图标 ,并将一个条目添加到内核日志中。
如果你看到告警,则应改进电源和电缆,因为低功耗可能会导致SD卡损坏或Raspberry Pi本身行为不稳定的问题;例如,无法解释的崩溃。
电压可能会因各种原因而下降,例如电源本身不足、电源线太细或者插入了高需求的USB设备。
串行外设接口 (SPI)
Edit this on GitHub
Raspberry Pi计算机配备了较多的 SPI 总线。SPI可用于连接各种外设 - 显示器、网络控制器(以太网,CAN总线)、UART等。这些外设需要由内核设备驱动程序支持,但 spidev
API 允许用户空间驱动程序以多种语言编写。
SPI 硬件
Raspberry Pi Zero 1、Raspberry Pi Zero 2和Raspberry Pi Zero 3分别包含3个SPI控制器:
-
SPI0具有两个硬件芯片选择,其支持在所有Raspberry Pi的接头上使用;还具有一个仅支持在CM上使用的备用映射。
-
SPI1具有3个硬件芯片选择,适用于除原始Raspberry Pi 1 Model A和Model B之外的所有Raspberry Pi型号。
-
SPI2具有三个硬件芯片选择,仅适用于CM1、CM3和CM3+。
Raspberry Pi 4、Raspberry Pi 400和CM4分别具有4个额外的SPI总线:SPI3~SPI6,每个总线均具有2个硬件芯片选择。这些额外的 SPI 总线可通过一些 GPIO 引脚上的替代功能分配来适用 - 请参见 BCM2711 ARM 外设 datasheet。
Chapter 10 in the BCM2835 ARM 外设 datasheet 中的第10章介绍了主控制器,第 2.3 章介绍了辅助控制器。
引脚/GPIO 映射
SPI0
SPI 功能 |
引脚 |
Broadcom 引脚名称 |
Broadcom 引脚功能 |
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 备用映射(仅限处理器模块(CM)系列其中CM4除外)
SPI 功能 |
Broadcom 引脚名称 |
Broadcom 引脚功能 |
MOSI |
GPIO38 |
SPI0_MOSI |
MISO |
GPIO37 |
SPI0_MISO |
SCLK |
GPIO39 |
SPI0_SCLK |
CE0 |
GPIO36 |
SPI0_CE0_N |
CE1 |
GPIO35 |
SPI0_CE1_N |
SPI1
SPI 功能 |
针脚 |
Broadcom 引脚名称 |
Broadcom 引脚功能 |
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 (仅限处理器模块(CM)系列其中CM4除外)
SPI 功能 |
Broadcom 引脚名称 |
Broadcom 引脚功能 |
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 功能 |
引脚 |
Broadcom 引脚名称 |
Broadcom 引脚功能 |
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 功能 |
引脚 |
Broadcom 引脚名称 |
Broadcom 引脚定义 |
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 |
主模式
信号名称缩写
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
LoSSI 模式 (低速串口)
LoSSI 标准允许向外围设备 (LCD) 发出命令并在外围设备之间传输数据。LoSSI 命令和参数的长度为 8 位,但使用一个额外的来表示字节是命令还是参数/数据。该额外位对于数据设置为高电平,对于命令设置为低位。生成的 9 位值将序列化为输出。LoSSI通常与兼容LCD控制器的type C接口的 MIPI DBI 一起使用。
Note
|
一些命令会触发SPI控制器的自动读取,因此该模式不能用作多用途的9位SPI。 |
速度
CLK寄存器的CDIV(时钟分频器)字段设置SPI时钟速度:
SCLK = Core Clock / CDIV
如果 CDIV 设置为 0,则除数为 65536。除数必须是 2 的倍数,奇数向下舍入。请注意,由于模拟电气问题(上升时间、驱动强度等),并非所有可能的时钟速率都可用。
有关详细信息,请参见 Linux 驱动程序 部分。
SPI 软件
Linux 驱动程序
默认的 Linux 驱动程序是 spi-bcm2835
。
SPI0默认禁用。如果要启用SPIO,则使用 raspi-config 或者确保 /boot/config.txt
中的 dtparam=spi=on
行未被注释掉。默认情况下,它使用2条片选线,但使用 dtoverlay=spi0-1cs
将其减少到1条。 dtoverlay=spi0-2cs
也存在,不加任何参数等效于 dtparam=spi=on
。
如果要启用 SPI1,则可以使用 1、2 或 3 条片选线,并在片选线下添加:
dtoverlay=spi1-1cs #1 chip select dtoverlay=spi1-2cs #2 chip select dtoverlay=spi1-3cs #3 chip select
到 /boot/config.txt
文件。SPI2、SPI3、SPI4、SPI5 和 SPI6 也存在类似的覆盖。
由于某些限制,驱动程序不使用硬件芯片选择线,而是可以使用任意数量的GPIO作为软件/GPIO片选。所以你可以自由地选择任何备用GPIO作为CS线,并且这些SPI覆盖都包括该控制——有关详细信息,请参见 /boot/overlays/README
,或者运行(例如) dtoverlay -h spi0-2cs
(dtoverlay -a | grep spi
可能有助于列出这些)。
S速度
该驱动程序支持所有的速度,甚至是核心时钟的整数除数。尽管如上所述,由于 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
`spi-bcm2835` 内核模块支持双向或 "3线" 模式。请注意,在此模式下,spi_transfer结构的 tx 或 rx 字段必须是 NULL 指针,因为只能进行半双工通信。否则,数据传输会失败。spidev_test.c源代码未考虑这一点,因此在3线模式下根本无法工作。
SPI 驱动程序延迟
此 线程 讨论延迟问题。
spidev
spidev
为各个 SPI CS 线路提供基于 ioctl 的用户空间接口。设备树用于指示CS线是由内核驱动程序模块驱动还是由spidev代表用户管理;不可能同时执行这两个操作。请注意,Raspberry Pi内核在使用设备树启用spidev方面更简单- 上行内核会打印有关此类使用的告警,最终可能会完全阻止它。
使用C语言中的 spidev
Linux 文档中有一个环回测试程序可以用作起点。请参见 Troubleshooting 部分。
使用 Python 中的 spidev
有几个Python库提供了对 spidev`的访问,包括 `spidev
(pip install spidev
- 参见 https://pypi.org/project/spidev/) 和 SPI-Py
(https://github.com/lthiery/SPI-Py) 。
故障排除
环回测试
环回测试用于测试SPI发送和接收。在MOSI和MISO之间放置一根电线。换回测试不测试CE0和CE1。
wget https://raw.githubusercontent.com/raspberrypi/linux/rpi-3.10.y/Documentation/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)
Edit this on GitHub
一般来说,Linux 支持的每个设备都可以与 Raspberry Pi 一起使用,尽管 Raspberry Pi 4 之前的型号存在一些限制。
最大供电输出
与所有计算机一样,Raspberry Pi上的USB端口提供有限的电量。USB 设备的问题通常是由电源问题引起的。要排除电源不足导致问题的可能性,请使用有源HUB将 USB 设备连接到Raspberry Pi。
型号 | USB端口的最大供电输出 |
---|---|
Pi Zero, 1 |
每个端口500mA1 |
Pi 2, 3, 4 |
所有端口总计1200 mA |
-
对于原始的Raspberry Pi 1 Model B,每个端口的限制为100mA。
Raspberry Pi 4
Raspberry Pi 4包含两个USB 3.0端口和两个USB 2.0端口,连接到VL805 USB控制器。4个端口上的 USB 2.0 线路均连接到VL805内的单个USB2.0 HUB:这将 USB 1.1 和 USB 2.0 设备的总可用带宽限制为单个 USB 2.0 端口的可用带宽。
在Raspberry Pi 4 上,以前型号上使用的 USB 控制器位于 USB Type C端口上,默认情况下处于禁用状态。
Raspberry Pi Zero/ 1/ 2 / 3
Raspberry Pi 4 之前的型号上的 USB 控制器仅对某些设备提供基本级别的支持,这会带来更高的软件处理开销。它还仅支持一个根USB端口:来自连接设备的所有流量都通过这条单一总线传输,该总线的最高运行速度为480Mbps。
USB 2.0 规范定义了3种设备速度 - 低速、全速和高速。大多数鼠标和键盘都是低速的,大多数USB音频设备是全速的,大多数视频设备(网络摄像头或视频捕获)都是高速的。
通常,将多个高速USB设备连接到Raspberry Pi不会出现任何问题。
与低速和全速设备通信时产生的软件开销表明同时处于活动状态的低速和全速设备的数量受到限制。连接到Raspberry Pi的少量这些类型的设备不会引起任何问题。
已知的USB问题
与 USB 3.0 HUB的互操作性
USB 3.0 HUB在使用全速或低速设备(包括大多数鼠标和键盘)时存在问题。大多数USB 3.0 HUB硬件中的错误表示Raspberry Pi 4之前的型号无法与连接到USB 3.0 HUB的全速或低速设备通信。
USB 2.0 高速设备(包括 USB 2.0 HUB)在通过 USB 3.0 HUB连接时可正常运行。
避免将低速或全速设备连接到 USB 3.0 HUB。解决方法是将 USB 2.0 HUB插入 USB 3.0 HUB的下行端口并连接低速设备,或者在 Raspberry Pi 和 USB 3.0 HUB之间使用 USB 2.0 集线器,然后将低速设备插入 USB 2.0 HUB。
Raspberry Pi 修订代码
Edit this on GitHub
每个不同的Raspberry Pi型号修订版都有一个唯一的修订代码。你可以通过运行以下命令查找Raspberry Pi的修订代码:
cat /proc/cpuinfo
最后三行显示硬件类型、修订代码和 Raspberry Pi 的唯一序列号。例如:
Hardware : BCM2835 Revision : a02082 Serial : 00000000765fc593
Note
|
从4.9版本内核开始,所有的Raspberry Pi计算机都报告 BCM2835 ,即使是BCM2836、BCM2837、BCM2711处理器的计算机。你不应该使用此字符串来检测处理器。使用以下信息或 cat /sys/firmware/devicetree/base/model 对修订代码进行解码。
|
旧式修订代码
第一组Raspberry Pi型号顺序的十六进制修订代码为 0002
~ 0015
:
代码 | 型号 | 修订 | RAM | 制造者 |
---|---|---|---|---|
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
部件 | 含义 | 选项 |
---|---|---|
N (bit 31) |
过压 |
0: 允许过压 |
1: 不允许过压 |
||
O (bit 30) |
OTP编程1 |
0: 允许 OTP 编程 |
1: 不允许 OTP 编程 |
||
Q (bit 29) |
OTP 读取1 |
0: 允许 OTP 读取 |
1: 不允许 OTP 读取 |
||
uuu (bits 26-28) |
闲置 |
闲置 |
W (bit 25) |
保修位2 |
0: 保修完好无损 |
1: 保修因 超频 而失效 |
||
u (bit 24) |
闲置 |
闲置 |
F (bit 23) |
新标志 |
1: 新型修订 |
0: 旧式修订 |
||
MMM (bits 20-22) |
内存大小 |
0: 256MB |
1: 512MB |
||
2: 1GB |
||
3: 2GB |
||
4: 4GB |
||
5: 8GB |
||
CCCC (bits 16-19) |
制造者 |
0: Sony UK |
1: Egoman |
||
2: Embest |
||
3: Sony Japan |
||
4: Embest |
||
5: Stadium |
||
PPPP (bits 12-15) |
处理器 |
0: BCM2835 |
1: BCM2836 |
||
2: BCM2837 |
||
3: BCM2711 |
||
TTTTTTTT (bits 4-11) |
类型 |
0: A |
1: B |
||
2: A+ |
||
3: B+ |
||
4: 2B |
||
5: Alpha (early prototype) |
||
6: CM1 |
||
8: 3B |
||
9: Zero |
||
a: CM3 |
||
c: Zero W |
||
d: 3B+ |
||
e: 3A+ |
||
f: 仅限内部使用 |
||
10: CM3+ |
||
11: 4B |
||
12: Zero 2 W |
||
13: 400 |
||
14: CM4 |
||
15: CM4S |
||
RRRR (bits 0-3) |
修订 |
0、1和2 等 |
1 有关 OTP位编程的信息。
2 保修位永远不会在Raspberry Pi 4上设置。
正在使用的新型修订代码
Note
|
此列表并不详尽 - 可能有一些正在使用的代码不在此表中。有关使用修订代码识别主板的最佳实践,请参见下一节。 |
代码 | 型号 | 修订 | RAM | 制造者 |
---|---|---|---|---|
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 |
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 |
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 |
Sony UK |
b03115 |
4B |
1.5 |
2GB |
Sony UK |
c03111 |
4B |
1.1 |
4GB |
Sony UK |
c03112 |
4B |
1.2 |
4GB |
Sony UK |
c03114 |
4B |
1.4 |
4GB |
Sony UK |
c03115 |
4B |
1.5 |
4GB |
Sony UK |
d03114 |
4B |
1.4 |
8GB |
Sony UK |
d03115 |
4B |
1.5 |
8GB |
Sony UK |
c03130 |
Pi 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 |
902120 |
Zero 2 W |
1.0 |
512MB |
Sony UK |
使用修订代码进行电路板识别
通过命令行我们可以使用以下命令来获取电路板的修订代码:
$cat /proc/cpuinfo | grep Revision
Revision : c03111
在上面的示例中,我们有1个十六进制版本代码 c03111
。将其转换为二进制,我们得到 0 0 0 000 0 0 1 100 0000 0011 00010001 0001
。根据上表,通过插入空格以显示修订代码各部分之间的边界。
从最低位开始,底部四位 (0-3) 是主板的修订号,因此该板的修订号为 1。接下来的8位 (4-11) 是主板类型,本例中为二进制 00010001
,十六进制 11
,因此这是一个Raspberry Pi 4B。使用相同的操作,我们可以确定处理器是BCM2711,主板是由Sony UK制造的,并且具有4GB的RAM。
获取程序中的修订代码
由于编程语言太多无法展示所有语言的示例,但是这里有2个 C
语言和 Python`的简单例子。这2个示例都使用一个系统调用来运行一个bash命令,该命令获取 `cpuinfo
并将结果通过管道传递给 awk
,以恢复所需的修订代码。然后,他们使用位操作从代码中提取 New
、 Model
、 和 Memory
字段。
#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!")
修订代码使用的最佳实践
Raspberry Pi 建议不要将修订代码作为一个整体 (c03111
) 使用,以避免在创建新的板修订版时出现问题。例如,可以考虑在程序中列出受支持的修订代码,并将检测到的代码与列表进行比较,以确定是否允许程序运行。但是当新的主板版本出现或生产地点发生变化时时,则这种机制就会被打破,每个修订版都会创建一个不在程序列表中的新修订代码。你的程序现在将拒绝无法识别的代码,并且可能会中止,即使相同板类型的修订始终向后兼容。你需要发布程序的新版本,并将特定修订版添加到列表中,这可能会造成维护负担。
同样,使用修订代码来指示程序支持的模型可能会产生问题。如果你的程序只计划在具有 2GB 或更多 RAM 的设备上运行,则一种简单的方法是查看具有 2GB 或更多 RAM 的型号的修订代码列表,并将该列表构建到你的程序中。但是一旦发布新的主板修订版,或者如果主板在不同的地点制造,这种情况就会中断。
更好的机制是仅使用板类型字段(3A、4B 等)来确定程序支持的模型;或者可能只是内存量字段。所以将支持任何Raspberry Pi 4B,无论其主板版本代码如何,因为这始终有效。或者你可能希望将程序限制为具有 2GB 或更多 RAM 的设备。只需查看这两个字段即可确定是否允许程序运行。
上一节中的示例使用建议的方法。他们从修订代码中提取主板类型和内存大小,并使用它们来确定其是否是具有 2GB 或更多 RAM 的 Raspberry Pi 4B。
Note
|
在检查任何其他字段之前,你应该始终检查位 23(即 'New' 标志) ,以确保修订代码是新版本。 |