Raspberry Pi 的工业用途
Raspberry Pi 通常用作其他产品的一部分。本文档介绍了一些可用于使用 Raspberry Pi 其他功能的额外工具。
一次性可编程设置
所有 Raspberry Pi 单板计算机 (SBC) 都有一个内置的一次性可编程 (OTP) 内存区域,这实际上是片上主系统 (SoC) 的一部分。顾名思义,OTP 内存只能写入一次(即二进制 0 可以更改为 1)。一旦位更改为 1,它就永远无法返回为 0。查看 OTP 的一种方法是将每个比特视为一个保险丝。编程它涉及故意熔断保险丝——这是一个不可逆的过程,因为你不能进入芯片内部更换它!
本白皮书假设 Raspberry Pi 运行的是 Raspberry Pi 操作系统 (OS),并且完全是最新的固件和内核。
可以使用许多 OTP 值。要查看所有 OTP 值的列表,您可以使用:
vcgencmd otp_dump
这个转储中的一些有趣的行是:
28 - 序列号
29 - 序列号的 1 补码
30 - 主板修订号
此外,从 36 到 43(含),有 8 行 32 位可供客户使用。
注意 | 在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 值
警告 | OTP 值是一次性可编程的。一旦位从 0 更改为 1,就无法更改回去。 |
---|
|
要设置客户 OTP 值,您需要使用 SET_CUSTOMER_OTP (0x38021) 标记,如下所示:
vcmailbox 0x00038021 [8 + number * 4] [8 + number * 4] [start_num] [number] [value] [value] [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 代码作为示例来实现此目的。
在非BCM2712设备上锁定 OTP
可以锁定 OTP 更改以避免再次编辑它们。
这可以使用 OTP 写入邮箱的特殊参数来完成:
vcmailbox 0x00038021 8 8 0xffffffff 0xaffe0000
锁定后,客户 OTP 值将无法再更改。请注意,此锁定操作是不可逆的。
锁定 BCM2712 设备上的 OTP
可以使用以下命令将客户区域标记为只读。
vcmailbox 0x00030086 4 4 0
OTP 仅在设备重置之前被锁定,因此每次启动时都需要重新应用 OTP 锁定。
使客户 OTP 位在非 BCM2712 设备上无法读取
完全可以阻止读取客户的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 命令对这些行进行编程和读取。如果不需要安全启动/文件系统加密,则可以使用设备私钥行来存储通用信息。
设备私钥行只能通过 vcmailbox 命令读取,该命令需要访问 /dev/vcio,该命令仅限于 Raspberry Pi OS 上的视频组。
Raspberry Pi 计算机没有受硬件保护的密钥存储。建议将此功能与安全启动结合使用,以限制对此数据的访问。
Raspberry Pi OS 不支持加密的根文件系统。
有关开源磁盘加密的详细信息,请参阅 Cryptsetup。
密钥编程脚本 rpi-otp-private-key
rpi-otp-private-key 脚本包装设备私钥 vcmailbox API,以便更轻松地读取和写入 OpenSSL 格式的密钥。
将 32 字节密钥读取为 64 个字符的十六进制数字:
cd usbboot/tools
rpi-otp-private-key
输出示例:
f8dbc7b0a4fcfb1d706e298ac9d0485c2226ce8df7f7596ac77337bd09fbe160
将随机生成的 32 字节数字写入设备私钥。
# rpi-otp-private-key -w $(openssl rand -hex 32)
注意 | 要指定要使用的 OTP 行数,请传递 。若要在密钥库中指定起始位置,请传递 。-l <word count>-o <word offset> |
---|
|
用于读取/写入密钥的邮箱 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
写入所有行(将尾随的八个零替换为关键数据):
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 为:
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:设置 bank 以检查 GPIO 引导模式
位 21:支持从 SD 卡启动
位 22:设置要从中启动的库
位 28:启用 USB 设备启动
位 29:启用 USB 主机引导(以太网和大容量存储)