Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
本文档是 Raspberry Pi Documentation 的简体中文翻译版本。
本项目开源地址:https://github.com/taophilosophy/rpicn
警告
当前正在施工,具体进度请参考编辑日志。
PDF 文档
使用由 safreya 提供的脚本:
https://github.com/FreeBSD-Ask/gitbook-pdf-export
可用于导出本书的 PDF 文档。该脚本使用 Python 3 编写,仅在 Windows 10、FreeBSD 14 上测试过。
具体使用方法见该项目的 README。
本项目由 FreeBSD 中文社区发起。
如有问题请 PR 或 Issue。
微信公众号: rpicn2025 (扫码关注)
目前已校对章节指向 2024.9.8 的树莓派官方文档。
树莓派官方文档使用 Creative Commons Attribution-ShareAlike 4.0 International(CC BY-SA 4.0,署名-相同方式共享 4.0 国际)授权。非常抱歉,根据协议要求,本项目也只能使用 Creative Commons Attribution-ShareAlike 4.0 International(CC BY-SA 4.0,署名-相同方式共享 4.0 国际)及兼容的协议(兼容协议要求与该协议基本相同)进行授权。该协议要求您:
您必须给出适当的署名 ,提供指向本许可协议的链接,同时标明是否(对原始作品)作了修改。树莓派官方英文文档项目位于 https://github.com/raspberrypi/documentation。我们特别授予所有人免于对本项目进行署名及链接的权利。但是您仍然需要遵守树莓派文档项目本身的许可协议。
相同方式共享 — 如果您再混合、转换或者基于本作品进行创作,您必须基于与原先许可协议相同的许可协议分发您贡献的作品。
Raspberry Pi documentation is copyright © 2012-2024 Raspberry Pi Ltd and is licensed under a Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA) licence.
Some content originates from the eLinux wiki, and is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported licence.
The terms HDMI, HDMI High-Definition Multimedia Interface, HDMI trade dress and the HDMI Logos are trademarks or registered trademarks of HDMI Licensing Administrator, Inc
警告
当前施工中断,具体进度请参考编辑日志。 若需维护请提供资金赞助。赞助请联系
[email protected]
入门 树莓派使用入门
树莓派系统(Raspberry Pi OS) 树莓派官方操作系统
系统配置 配置你的树莓派之参数
config.txt
调整底层参数
旧版 config.txt
参数
对非树莓派操作系统可能有用的参数
Linux 内核 如何为树莓派定制配置及构建内核
远程访问 远程访问你的树莓派
摄像头软件 树莓派硬件摄像头的软件和库
树莓派硬件 树莓派硬件技术信息
计算模块硬件 树莓派计算模块硬件技术信息
处理器 树莓派处理器技术信息
摄像头 树莓派摄像头主板
显示屏 树莓派显示屏
键盘和鼠标 树莓派官方键盘和鼠标
Build 扩展板(Build HAT) 如何使用 Build 扩展板(Build HAT)
传感器扩展板(Sense HAT) 监控并可视化传感器数据
电视扩展板(TV HAT) 用树莓派看电视
M.2 HAT+ 通过 PCIe 将存储器接入树莓派
人工智能套件(AI Kit) 树莓派 NPU
树莓派音频扩展板(Raspberry Pi Audio Board) 用树莓派实现高清晰音频
芯片 树莓派自研芯片
Pico 系列微控制器 树莓派 Pico 系列设备技术信息
树莓派调试套件(Raspberry Pi Debug Probe) 支持 Arm 串行线调试 (SWD),并充当串口桥接器
树莓派账号(Raspberry Pi ID) 我们的身份验证服务
树莓派远程访问(Raspberry Pi Connect)Beta 版 用浏览器连接树莓派
我们是 FreeBSD 中文社区,如有问题请 PR。
树莓派官方英文文档使用 Creative Commons Attribution-ShareAlike 4.0 International(CC BY-SA 4.0,署名-相同方式共享 4.0 国际)授权。非常抱歉,根据协议要求,本项目也只能使用 Creative Commons Attribution-ShareAlike 4.0 International(CC BY-SA 4.0,署名-相同方式共享 4.0 国际)及兼容的协议(兼容协议要求与该协议基本相同)进行授权。该协议要求你:
你必须给出适当的署名,提供指向本许可协议的链接,同时标明是否(对原始作品)作了修改。树莓派官方英文文档项目位于 https://github.com/raspberrypi/documentation。我们特别授予所有人免于对本项目进行署名及链接的权利。但是你仍然需要遵守树莓派文档项目本身的许可协议。
相同方式共享 — 如果你再混合、转换或者基于本作品进行创作,你必须基于与原先许可协议相同的许可协议分发你贡献的作品。
Raspberry Pi documentation is copyright © 2012-2024 Raspberry Pi Ltd and is licensed under a Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA) licence.
Some content originates from the eLinux wiki, and is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported licence.
The terms HDMI, HDMI High-Definition Multimedia Interface, HDMI trade dress and the HDMI Logos are trademarks or registered trademarks of HDMI Licensing Administrator, Inc
2024.6.5 同步至
2024.6.5-2024.7.11 完全重译“树莓派启动盘制作工具”
2024.7.11 同步至
2024.7.11 “入门”校对完成
2024.7.12 “树莓派系统(Raspberry Pi OS)”校对完成
2024.7.16 对 16 个树莓派系统部件进行了翻译,已合并 15 个。1 个项目已弃用
2024.6.5-2024.7.16 改正了官方文档原文中的两个错误,补充了一个摄像机型号。已合并
2024.7.21 "系统配置"校对完成
2024.8.1
“config.txt”校对完成
“RP1”校对完成
2024.8.9 同步至官方文档的 2024.8.9 版本
2024.8.15 实现代码高亮
2024.9.4
同步至官方文档的 2024.9.4 版本。
“旧版 config.txt
参数”校对完成
将发现的一个命令错误,一个排版问题提交到树莓派上游,已合并
2024.9.7 请求树莓派上游更新树莓派启动盘制作工具的版本以包含最新的简中翻译,
2024.9.8 同步至官方文档的 。
2024.9.12
树莓派上游发布了树莓派启动盘制作工具v1.9.0
测试了树莓派启动盘制作工具v1.9.0
将本项目的翻译、图片同步到树莓派启动盘制作工具v1.9.0
修正了关于树莓派启动盘制作工具v1.9.0 翻译的几处小错误 ,已经合并,预计随 v1.9.1 分发
“Linux 内核”校对完成
2024.9.14 “远程访问”图片本地化
我们的官方键盘包括三个主机 USB 接口,可用于连接外部设备,如 USB 鼠标,USB 存储设备和其他 USB 控制设备。
该产品的 Micro USB 用于连接树莓派(通过键盘内置的 USB 集线器),可由树莓派控制并为键盘的三个 USB Type A 接口供电。
树莓派键盘有三个锁定键: Num Lock
, Caps Lock
, 和 Scroll Lock
。顶部右侧有三个 LED 指示灯,指示着哪些锁定已启用。
Num Lock
能使用字母键上标有的红色数字键,有效地创建数字键盘。通过按下 Num Lock 键 来启用/禁用此模式。
Caps Lock
能输入大写字母;按 Shift 键 可在该模式下输入小写字母。通过按 Caps Lock 键 可启用/禁用此模式。
Scroll Lock (ScrLk)
能使用光标键浏览网页和电子表格,无需鼠标。通过按住 Fn 键,同时按 ScrLk 键 可启用/禁用此模式。
我们的官方鼠标有三个按钮,可以激活高质量的微动开关。滚轮用于在浏览文档和网页时快速滚动。
在使用鼠标时,请始终将其放在平坦稳定的表面上。鼠标在放置的平面上使用光学检测移动。在光滑的平面上(例如 PVC 和亚克力桌面)鼠标检测不到移动。当你在这样的平面上工作时,请把鼠标放在鼠标垫上。
这是我们推荐的配置,可同时使用你的树莓派、官方键盘和集线器以及官方鼠标。键盘上的集线器可确保轻松访问 USB 设备,鼠标线很长,足以让你的左右手使用鼠标。
注意
重要的是,把电源适配器接入树莓派,再把键盘连接到树莓派。如果把电源适配器接入键盘,再通过键盘为树莓派供电,那么键盘将无法正常工作。
要使用树莓派服务,你首先需要创建一个。
在浏览器中访问 。
输入电子邮件和密码。点击 注册 按钮来创建你的账户。
创建账户后,你将收到一封验证电子邮件。
在邮件中点击 验证电子邮件 按钮,来验证你的电子邮件地址以完成账户创建。
创建树莓派账号后,你就可以使用 使用树莓派账号登录 按钮登录树莓派服务。
与大多数现代网络服务类似,树莓派账号支持使用基于时间的一次性密码 (TOTP) ,即双因素身份验证 (2FA)。
双因素身份验证增加了额外的一层保护。除了密码外,2FA 还需要另外的信息来登录。你应该基于 你拥有的东西(如智能手机)或 你的生物特征信息 来作为第二因素。
本指南使用你的智能手机作为认证的第二因素。
首先,在你的手机上下载一个生成 TOTP 的应用程序。安装一款 2FA 应用程序,如 或 Google Authenticator。
要启用双因素身份验证,请在登录到你的 后点击 双因素身份验证 选项。
在你的手机上打开 2FA 应用程序。使用你的树莓派账号提供的 QR 码扫描你的 2FA 应用程序以开始生成令牌。
输入你 2FA 软件生成的六位数字 TOTP,来注册 2FA 应用程序与你的树莓派 ID。
将出现确认屏幕,其包含恢复代码。请将恢复代码存储到安全的地方。这是在你丢失手机及 2FA 软件后,唯一能绕过 2FA的方法。
你现在已经配置了树莓派账号需要使用手机上 2FA 应用程序生成的 TOTP 进行登录。
注意
你可以随时在 id.raspberrypi.com 上禁用双因素身份验证。
BCM2835 是博通(Broadcom)芯片,应用于树莓派 1A、A+、B、B+、树莓派 Zero、树莓派 Zero W 和树莓派计算模块 1。它内置了一颗 ARM1176JZF-S 单核处理器。可在外设规格文档中找到芯片的一些详细信息。
注意
外设规格文档中有一些错误。但是有个已知勘误表。 可在以下文档找到处理器的其他信息;
GPU 文档和开源驱动程序
这是树莓派 2B 中使用的博通芯片。BCM2836 的底层架构与 BCM2835 相同。唯一的显著区别是删除了 ARM1176JZF-S 处理器,并用四核 Cortex-A7 簇进行替换。
你应该参考:
这是在树莓派 3B、2B 后续型号以及树莓派计算模块 3 中使用的博通芯片。BCM2837 的底层架构与 BCM2836 相同。唯一明显的区别是用四核 ARM Cortex A53(ARMv8)簇替换了四核 ARMv7 簇。
ARM 核心运行在 1.2GHz,使设备比树莓派 2 快约 50%。VideoCore IV 运行在 400MHz。
请参考如下 BCM2836 文档,了解 ARM 外设设备规格的详细信息,该规格同样适用于 BCM2837。
这是在树莓派 3B+、B+ 和树莓派计算模块 3+ 中使用的博通芯片。BCM2837B0 的底层架构与其他版本的树莓派中使用的 BCM2837 芯片相同。ARM 核心硬件相同,但主频更高。
ARM 核心可运行于高达 1.4GHz,使 3B+/3A+ 比旧款树莓派 3 快约 17%。VideoCore IV 运行在 400MHz。ARM 核心为 64 位,但 VideoCore IV 是 32 位的。
BCM2837B0 芯片的封装和 BCM2837 略有不同,并且最明显的是附带了散热片,能获得更好的热管理。这使得更高的时钟频率成为可能,并且能更准确地监控和控制芯片的温度。
树莓派博客上的这篇文章详细介绍了 BCM2837B0 芯片。
这是在树莓派 4B、树莓派 400 和树莓派计算模块 4 中使用的博通芯片。BCM2711 的架构是对旧版树莓派中 SoC 使用的架构的大幅升级。它延续了 BCM2837 的四核 CPU 设计,但使用了更强大的 ARM A72 核心。它带有巨大改进的 GPU 功能集,由于 USB 2 和 USB 3 使用了 PCIe 通道,并且带有局域网连接的以太网控制器,因此输入/输出速度更快。它能够应用的内存也比以前采用的 SoC 更大。
ARM 核心可运行高达 1.5 GHz,使树莓派 4 比 3B+ 快约 50%。新的 VideoCore VI 3D 单元现在最高运行速度为 500 MHz。ARM 核心为 64 位,但 VideoCore 为 32 位,然而有一个新的内存管理单元,这意味着它的可用内存比以前的 SoC 更大。
BCM2711 芯片沿用自 BCM2837B0 以降的散热技术,提供了更好的热管理。
处理器:四核 Cortex-A72(ARM v8)64 位 SoC @ 1.5 GHz。
内存:视型号而定,最高可使用 8GB LPDDR4-2400 SDRAM
缓存:每个核心有 32kB 数据 + 48kB 指令 L1 缓存。1MB L2 缓存。
多媒体:H.265(4Kp60 解码);H.264(1080p60 解码,1080p30 编码);OpenGL ES,3.0 图形
I/O:PCIe 总线,板载以太网,DSI×2 (树莓派 4B 仅使用了一个),CSI×2(树莓派 4B 仅使用了一个),最多 I²C×6,最多 UART×6(与 I²C 复用),最多 SPI×6(树莓派 4B 仅使用了五个),双 HDMI 视频输出,复合视频输出。
BCM2711 的数据表包含更多细节。
博通 BCM2712 是树莓派 5 核心的 16 纳米应用处理器。它是树莓派 4 中使用的 BCM2711 设备的后继产品,并具有 BCM27xx 系列中其他设备许多常见的架构特性,这些设备曾用于旧款树莓派产品。
以四核 Arm Cortex-A76 CPU 簇为核心,主频高达 2.4GHz,每个核心带有 512KB 的 L2 缓存和 2MB 的共享 L3 缓存,集成了优化的 12 核 VideoCore VII GPU;硬件视频缩放器和 HDMI 控制器可驱动双 4kp60 显示器;还集成了由树莓派开发的 HEVC 解码器和图像信号处理器。32 位 LPDDR4X 内存接口提供了高达 17GB/s 的内存带宽,而 ×1 和 ×4 PCI Express 接口支持高带宽外部外设;在树莓派 5 上,后者用于连接树莓派 RP1 南桥(提供了主板上大部分外部 I/O 功能)。4GB、8GB 款树莓派 5 使用 BCM2712C1 步进。
重要功能包括:
四核 Arm Cortex-A76 @ 2.4GHz
ARMv8-A ISA
64K B I 和 D 缓存
每个核心 512KB L2 缓存,2MB 共享 L3 缓存
新的树莓派开发的 ISP
1 千兆像素/秒
改进的 HVS 和显示管线
双 4Kp60 支持
VideoCore V3D VII
~2-2.5× 速度(更多硬件,树莓派 4 上的 1GHz 对比 600MHz)
OpenGL ES 3.1,Vulkan 1.3
4Kp60 HEVC 硬件解码
其他 CODEC 在软件中运行
H264 1080p24 解码约占 CPU 的 10-20%
H264 1080p60 解码约占 CPU 的 50-60%
H264 1080p30 编码(来自 ISP)~30-40%的 CPU
总体而言,BCM2712 中的新功能为常见的 CPU 或 I/O 密集型用例显示了相比树莓派 4 有 2-3 倍的性能提升。
BCM2712D0 版本移除了 BCM2712C1 中未使用的功能。在功能上,C1 和 D0 版本间并无差异。这两种封装在物理上的规格尺寸也一致。
树莓派 RP3A0 是我们首次采用了系统级封装(SiP),它内置了博通 BCM2710A1——这是封装在博通 BCM2837 芯片内部的硅芯片,该芯片用于树莓派 3 和 512MB 的 DRAM。
它被树莓派 Zero 2 W 使用。
RP3A0 是一款四核 64 位 Arm Cortex A53 CPU,主频为 1 GHz,但是如果安装了散热片或使用了其他冷却解决方案,该芯片的潜在超频主频可达 1.2 GHz。
请参考 BCM2836 文档,了解 ARM 外围设备规格的详细信息,该规格同样适用于 BCM2837 和 RP3A0。
注意
旧款树莓派 Zero 使用堆叠封装(PoP)DRAM,其中 DRAM 直接焊接在 BCM2835 芯片顶层。
Raspberry Pi OS
树莓派系统
microSD
存储卡
HAT
扩展板
Raspberry Pi OS Lite
精简版树莓派系统
APT
APT
ports
接口/端口/通道/路/port/省略该词
Legacy
旧版
Hz
Hz
remote access
远程访问
Model
型号/省略该词
Zero
Zero
Compute Modules
计算模块
Camera Modules
摄像头模块
Build HAT
Build 扩展板
Sense HAT
传感器扩展板
TV HAT
电视扩展板
AI Kit
Ai 套件
M.2 HAT+
M.2 HAT+
Audio Board
音频扩展板
Pico
Pico
Pico W
Pico W
Debug Probe
调试器
Probe
调试器
MicroPython
MicroPython
SDK
SDK
peripherals
外设/外部设备
form factor
外形尺寸
Raspberry Pi Imager
树莓派启动盘制作工具
Screen Blank
屏幕节能
boot partition
启动分区
Rolling shutter
卷帘快门
Global shutter
全局快门
rpicam-apps
不翻译,Github 存储库 就是这个名
navigate
切换
option
参数
Native builds
本地编译
Cross-compilation
交叉编译
MicroPython 是编程语言 Python 3 的完整实现,直接运行在嵌入式硬件(如树莓派 Pico)上。你可以用 USB 串口获得交互提示(REPL),立即执行命令,并且内置了文件系统。Pico 版的 MicroPython 包含了用于访问底层芯片特定硬件的模块。
你可以通过将 Pico 通过 USB 连接到计算机,然后将文件拖放到其上来编程,因此我们提供了可下载的 UF2 文件,以便更轻松地安装 MicroPython。
下载适合你板子的正确 MicroPython UF2 文件:
带有 Wi-Fi 和蓝牙 LE 功能的
要在树莓派 Pico W 上使用 Wi-Fi 和蓝牙,可以使用 C/C++ 或 MicroPython,参见 。有关支持的蓝牙协议和配置文件的详细信息,请查看 Blue Kitchen 的 GitHub 仓库。
注意
其他基于 RP2040 的板子的 MicroPython 发行版可在 上找到。
要编程你的设备,请按照以下步骤操作:
在连接 Pico 到计算机的 USB 电缆时,按住 BOOTSEL 按钮。当你的 Pico 显示成 RPI-RP2 的大容量存储设备时,请释放 BOOTSEL 按钮。
将 MicroPython UF2 文件拖放到 RPI-RP2 卷上。你的 Pico 将重启。MicroPython 将自动运行。
通过 USB 串口访问 REPL。
书籍提供了逐步连接你的 Pico 并使用命令行和 IDE 编程 MicroPython 的说明。
你可以在以下位置找到有关 MicroPython 到 RP2040 的端口的信息:
- 用于 RP2040 微控制器的 MicroPython 环境
- 使用 C/C++ 或 MicroPython 将树莓派 Pico W 连接到互联网
- 关于 MicroPython RP2040 端口的官方文档
- 关于 MicroPython 中 rp2
模块的官方文档
查看 了解如何使用 MicroPython 编程语言让你的 Pico 与周围的世界互动。本书已完全更新,适用于 树莓派 Pico W 和最新版本的 MicroPython,它向你展示如何:
设置并开始使用你的 Pico、Pico W
使用 MicroPython 编写程序
控制和感知电子组件
发现如何使用 Pico 独特的可编程 IO
将树莓派 Pico W 转换为物联网的网络连接节点
将你的 Pico W 与智能手机、平板电脑或另一个 Pico W 通过蓝牙低功耗(BLE)连接起来
在 MicroPython 中,没有直接的方法可以通过查看硬件来判断是在树莓派 Pico 还是 Pico W 上运行的软件。然而,你可以间接地通过查看你的特定 MicroPython 固件中是否包含网络功能来判断:
另外,你可以使用sys
模块检查 MicroPython 固件的版本,以确定它是否为树莓派 Pico 或 Pico W 编译而成:
如果sys.implementation._machine
中包含字符串 'Pico W',那么你的固件是为 Pico W 编译的。
树莓派电视扩展板(TV HAT)
树莓派电视扩展板可使你在树莓派上使用内置的 DVB-T 及 DVB-T2 调谐器接收数字地面电视广播系统。通过该扩展板,你可以在树莓派上接收和观看电视,或创建电视服务器,使你能够通过网络将接收到的电视流式传输到其他设备。电视扩展板可与一切 40 针树莓派板一起用作网络上其他设备的服务器。这在树莓派上本身接收和观看电视时的性能可能有所不同,如果你出于此使用目的,我们建议树莓派 2 或更新的树莓派。
主要特点:
索尼 CXD2880 电视调谐器
支持的电视标准:DVB-T2,DVB-T
接收频率:VHF III,UHF IV,UHF V
频道带宽:
DVB-T2:1.7MHz,5MHz,6MHz,7MHz,8MHz
DVB-T:5MHz,6MHz,7MHz,8MHz
警告
电视扩展板不兼容北美所使用的数字电视标准——ATSC。
数字视频广播 - 地面(DVB-T)是 DVB 欧洲联盟的广播数字地面电视传输标准。世界其他地方使用其他的数字电视标准,例如在北美使用的 ATSC。但是这个电视扩展板仅支持 DVB-T 和 DVB-T2 标准。
已实施或采取的 DTT 系统(来源:DVB/EBU/BNE DTT 部署数据库,2023 年 3 月)
遵循我们的入门文档,并使用最新版本的树莓派系统设置树莓派。
将天线转接器连接到电视扩展板,将转接器指向远离 USB 接口的方向,轻轻按下扩展板,覆盖在树莓派的 GPIO 引脚上,并在扩展板的两到三个角落放置间隔柱,通过安装孔将螺丝拧紧以固定它们。然后将电视扩展板的天线转接器连接到你的电视天线的线缆上。
我们推荐用于解码流(称为复用或简称为 muxes)并查看内容的软件称为 TVHeadend。电视扩展板一次只能解码一个复用,每个复用可以包含多个可供选择的频道。可以在连接了电视扩展板的树莓派上查看其内容,也可以发送到同一网络上的其他设备。
启动你的树莓派,然后打开终端,运行以下两个命令来安装 tvheadend 软件:
在 tvheadend 的安装过程中,你将被要求设置管理员账户名称和密码。稍后你会需要这些信息,所以确保设置了一个你能记住的内容。
在你网络中的另一台计算机上,打开一个网络浏览器,然后在地址栏中输入以下内容: http://raspberrypi.local:9981/extjs.html
这应该连接到运行在树莓派上的 tvheadend。在通过浏览器连接到 tvheadend 后,你将被提示使用你在安装 tvheadend 时选择的账户名和密码进行登录。
应该出现设置向导。
首先,你需要设置你希望 tvheadend 使用的语言,然后设置网络、用户和管理员访问权限。如果你没有特定偏好,请将允许网络留空,并在用户名和密码字段中输入星号(*
)。这将能让连接到你的本地网络的人访问 tvheadend。
你应该看到一个名为网络设置的窗口。在网络 2 下,你应该看到 Tuner: Sony CDX2880 #0 : DVB-T #0
。对于网络类型,请选择 DVB-T Network。下一个窗口是为网络分配预定义的复用器;在这里,你选择要接收和解码的电视流。在网络 1 下,对于预定义的复用器,请选择你的本地电视发射器。
注意
你可以使用 Freeview 网站找到你的本地发射器。输入你的邮政编码以查看哪个发射器应该给你一个良好的信号。
当你单击保存并继续时,软件将开始扫描所选的复用器,并显示进度条。大约两分钟后,你应该看到类似以下内容:
在下一个窗口中,名为服务映射,请勾选所有三个框:映射所有服务,创建提供者标签和创建网络标签。你应该看到一个可以观看的电视频道列表,以及它们当前正在播放的节目。
要在浏览器中观看电视频道,请单击频道列表左侧的小电视图标,就在 i 图标的右侧。这将在浏览器中打开一个媒体播放器。根据你的浏览器内置的解码功能和正在播放的流类型,你可能会发现播放会有些卡顿。在这些情况下,我们建议使用本地媒体播放器作为播放应用程序。
要在本地媒体播放器(例如 VLC)中观看电视频道,你需要将其下载为流。单击频道列表左侧的 i 图标,以打开该频道的信息面板。在这里,你可以看到一个可以下载的流文件。
注意
许多应用程序都支持 tvheadend,例如 iOS 上的 TvhClient,可播放树莓派上的电视。
import network
if hasattr(network, "WLAN"):
# 该主板搭载了 WLAN 功能
>>> import sys
>>> sys.implementation
(name='micropython', version=(1, 19, 1), _machine='Raspberry Pi Pico W with RP2040', _mpy=4102)
$ sudo apt update
$ sudo apt install tvheadend
Found muxes: 8
Found services: 172
树莓派 M.2 HAT+
树莓派 M.2 HAT+ M 键(key)能让你把 M.2 外部设备(如 NVMe 存储设备和其他 PCIe 配件)转接到树莓派 5 的 PCIe 接口。
M.2 HAT+ 扩展板可把树莓派 5 上的 PCIe 接口同单个 M.2 M 键接口的设备进行转接。你可以连接使用 2230/2242 尺寸的设备。M.2 HAT+ 可提供高达 3A 的功率。
M.2 HAT+ 遵守树莓派 HAT+ 规范,树莓派系统可自动检测 HAT+ 及其连接的设备。
附带的螺纹间隔柱提供了充足的空间,可在 M.2 HAT+ 下方安装树莓派主动散热器。
M.2 HAT+ 仅兼容树莓派 5 的树莓派外壳(需要你移除盖子和附带的风扇)。
单通道 PCIe 2.0 接口(500 MB/s 峰值传输速率)
支持使用 M.2 M 键接口的设备
支持 2230/2242 尺寸的设备
为接入的 M.2 设备提供高达 3A 的电流
电源和状态指示灯
符合树莓派 HAT+ 规范
包含:
连接线
16 mm GPIO 堆叠排针
4 个螺纹间隔柱
8 颗螺丝
1 个带有花纹的双凸缘固态硬盘配件螺丝(用于固定和支撑 M.2 外围设备)
要使用树莓派 M.2 HAT+,你需要:
树莓派 5
每份 M.2 HAT+ 都配备了排线、GPIO 堆叠排针和要安装的硬件。请按照以下说明来完成 M.2 HAT+ 的安装:
首先,请确保你的树莓派运行的是最新软件。运行以下命令,进行更新:
$ sudo apt update && sudo apt full-upgrade
接下来,请确保你的树莓派固件也是最新的。运行以下命令查看你正在运行的固件版本:
$ sudo rpi-eeprom-update
如果你看到的日期是 2023 年 12 月 6 日及更晚,请继续下一步。如果你看到的日期早于 2023 年 12 月 6 日,请运行以下命令打开树莓派配置 CLI:
$ sudo raspi-config
在 Advanced Options 下 > Bootloader Version,选择 Latest。然后,点击 Finish 或 Esc 键 退出 raspi-config。
运行以下命令以将固件更新到最新版本:
$ sudo rpi-eeprom-update -a
然后,使用 sudo reboot
重启。
在开始安装之前,请断开树莓派的电源。
M.2 HAT+ 兼容于树莓派 5 主动散热器。如果你有主动散热器,请在安装 M.2 HAT+ 之前先安装散热器。
使用提供的四颗螺丝安装间隔柱。将 GPIO 堆叠排针牢固地压在树莓派的 GPIO 引脚上;只要所有引脚都能正确插入即可,方向并不重要。将扁平带状线缆从 M.2 HAT+ 上拔下,并将另一端插入树莓派的 PCIe 接口。从两侧抬起扁平带状线缆固定器,然后将带有铜触点朝向内部、即朝向 USB 的线缆插入。确保扁平带状线缆完全且均匀地插入 PCIe 接口,然后从两侧向下按紧线缆固定器,将扁平带状线缆牢固地固定在位。
把 M.2 HAT+ 放在螺柱上面,然后使用剩下的四颗螺丝将其固定在位。
把排线插入 M.2 HAT+ 上的插槽。从两侧抬起排线固定器,然后插入铜触点朝上的电缆。将排线完全均匀地插入端口,从两侧向下推动电缆固定器,将排线牢固地固定在位。
通过逆时针旋转螺丝来取下驱动附件螺丝。将你的 M.2 固态硬盘插入 M.2 键接口,将固态硬盘以轻微向上的角度滑入插槽。不要强行将固态硬盘插入插槽:而应轻轻地滑入。
将固态硬盘附件螺丝上的凹口推入 M.2 固态硬盘尾部的插槽中。将固态硬盘平放在 M.2 HAT+ 上,并顺时针旋转螺丝,直到固态硬盘固定。不要太过紧拧螺丝。
恭喜,你已成功的安装了 M.2 HAT+。现在把你的树莓派接入电源;树莓派系统能自动检测到 M.2 HAT+。如果你使用桌面版树莓派系统,你应该能在桌面上看到代表硬盘的图标。如果你不使用桌面版,你可以在 /dev/nvme0n1
找到硬盘。要使硬盘自动可用于文件访问,请考虑配置自动挂载。
警告
在连接/断开 M.2 插槽上的设备之前,务必将树莓派断开电源。
要从连接到 M.2 HAT+ 的 NVMe 存储设备启动,请完成以下步骤:
使用树莓派启动盘制作工具格式化你的 NVMe 存储设备。如果你已经有带有树莓派系统镜像的存储卡,可以在你的树莓派上执行此操作。
使用存储卡或 USB 存储设备将树莓派启动到树莓派系统,以持久性更改板载 EEPROM 配置中的引导顺序。
在树莓派终端上运行 sudo raspi-config
以打开树莓派配置 CLI。
在 Advanced Options > Boot Order 下,选择 NVMe/USB boot。然后,点击 Finish 或按 Esc 键 退出 raspi-config
。
使用 sudo reboot
重启你的树莓派。
要获取更多信息,请参阅 NVMe 启动。
警告
树莓派 5 未获 Gen 3.0 速度认证。PCIe Gen 3.0 连接可能不稳定。
要启用 PCIe Gen 3 速度,请按照在启用 PCIe Gen 3.0 中的说明操作。
PDF 格式的原理图。
更多有关 M.2 HAT+ 的信息,如机械规格和操作环境限制,请参阅产品简介。
树莓派传感器扩展板(Sense HAT)可为你的树莓派提供一系列传感功能。板载传感器可让你监测压力、湿度、温度、颜色、方向和运动。明亮的 8×8 RGB LED 矩阵可使传感器数据可视化,五个按钮的摇杆能让用户与你的项目进行交互。
Sense HAT 最初是为在国际空间站上使用而开发的,是树莓派基金会与欧洲航天局合作开展的 Astro Pi 教育计划的一部分。它可以帮助完成一切需要位置、运动、方向或环境传感的项目。
由官方支持的 Python 库提供了对所有板载传感器、LED 矩阵和操纵杆的控制。传感器扩展板兼容带有 40 针 GPIO 引脚排针型号的树莓派计算机。
为了正确工作,传感器扩展板需要最新的内核,启用 I²C,并准备一些库来继续。
确保你的 APT 软件源是最新的:
$ sudo apt update && sudo apt full-upgrade
接下来,安装传感器扩展板软件包,这将确保内核是最新的,启用 I²C,并安装必要的库和程序:
$ sudo apt install sense-hat
最后,如果 I²C 被禁用或在安装之前内核是旧的,则可能需要重启:
$ sudo reboot
安装后,可在 /usr/src/sense-hat/examples
下找到示例代码。
你可以在由树莓派出版的《Experiment with the Sense HAT》一书中找到有关如何使用传感器扩展板的更多信息。由 Raspberry Pi 基金会的教育团队编写,这本书是由 Raspberry Pi Press 出版的 MagPi Essentials 系列的一部分。该书涵盖了 Astro Pi 项目的背景,并指导你如何使用 Python 库利用所有传感器扩展板的功能。
你可以以 PDF 格式免费下载这本书,它已根据知识共享署名-非商业性使用-相同方式共享 3.0 未本地化(CC BY NC-SA)许可发布。
sense-hat 是传感器扩展板的官方支持库;它提供对所有板载传感器和 LED 矩阵的访问。
可在 sense-hat.readthedocs.io 找到该库的完整文档。
RTIMULib 是一个 C++ 和 Python 库,可使嵌入式 Linux 系统与 9 自由度和 10 自由度 IMU 的使用变得更加容易。/etc/RTIMULib.ini 中提供了一个预校准的设置文件,也被 sense-hat 复制并使用。包含的示例在当前工作目录中查找 RTIMULib.ini,因此你可能希望将文件复制到那里以获得更准确的数据。
RTIMULibDrive11 示例已经被预编译,以确保一切按预期工作。可以通过运行 RTIMULibDrive11 启动,并通过按 Ctrl C 停止。
注意
可以通过在适当的目录中运行 make 来编译 C/C++ 示例。
传感器扩展板配备有 8×8 RGB LED 点阵和五向按钮摇杆,并包含以下传感器:
陀螺仪
加速度计
磁力计
温度
气压
湿度
颜色和亮度
Sense HAT 和 Sense HAT V2 的原理图和机械图可供下载。
Sense HAT V1 原理图。
Sense HAT V2 原理图。
传感器扩展板机械图纸。
LED 点阵是一个带有 id“RPi-Sense FB”的 RGB565 帧缓冲区。适当的设备节点可以被写入为标准文件或进行 mmap 映射。包含的“snake”示例展示了如何访问帧缓冲区。
操纵杆显示为名为“Raspberry Pi Sense HAT Joystick”的输入事件设备,映射到方向键和回车键
。它应该受到任意能够处理输入的库的支持,或直接通过 evdev 接口。适用的库包括 SDL、pygame 和 python-evdev。包含的“snake”示例显示了如何直接访问操纵杆。
安装必要的软件并按照以下步骤运行校准程序:
$ sudo apt update
$ sudo apt install octave -y
$ cd
$ cp /usr/share/librtimulib-utils/RTEllipsoidFit ./ -a
$ cd RTEllipsoidFit
$ RTIMULibCal
然后你将看到此菜单:
Options are:
m - calibrate magnetometer with min/max
e - calibrate magnetometer with ellipsoid (do min/max first)
a - calibrate accelerometers
x - exit
Enter option:
按小写的 m
。然后将显示以下消息。按任意键开始。
Magnetometer min/max calibration
--------------------------------
Waggle the IMU chip around, ensuring that all six axes
(+x, -x, +y, -y and +z, -z) go through their extrema.
When all extrema have been achieved, enter 's' to save, 'r' to reset
or 'x' to abort and discard the data.
Press any key to start...
启动后,你将看到屏幕上滚动的类似内容:
Min x: 51.60 min y: 69.39 min z: 65.91
Max x: 53.15 max y: 70.97 max z: 67.97
关注屏幕底部的两行,因为这些是程序中最近发布的测量结果。
现在,拿起树莓派和传感器扩展板,以尽可能多的方式移动它。最好拔掉所有非必要的电缆,以避免混乱。
尝试在俯仰、横滚和偏航轴上各获得一个完整的圆圈。在执行此操作时,请注意不要意外弹出存储卡。花几分钟移动传感器扩展板,当你发现数字不再变化时停止。
现在按小写 s 然后小写 x 退出程序。如果现在运行 ls 命令,你会看到已创建一个新的 RTIMULib.ini 文件。
除了这些步骤,你还可以通过执行上述步骤,但按 m 键而不是 e 键来执行椭球拟合。
当你完成后,将生成的 RTIMULib.ini 复制到 /etc/ 并删除 ~/.config/sense_hat/
中的本地副本:
$ rm ~/.config/sense_hat/RTIMULib.ini
$ sudo cp RTIMULib.ini /etc
通过向 /boot/firmware/config.txt 文件添加以下行来启用 I2C0 和 I2C1:
dtparam=i2c_vc=on
dtparam=i2c_arm=on
输入以下命令以重启:
sudo systemctl reboot
下载并构建闪存工具:
$ git clone https://github.com/raspberrypi/hats.git
$ cd hats/eepromutils
$ make
注意
这些步骤可能不适用于树莓派 2B Rev 1.0 和树莓派 3B。固件将控制 I2C0,致使 ID 引脚被配置为输入。
可以使用以下命令读取 EEPROM 数据:
$ sudo ./eepflash.sh -f=sense_read.eep -t=24c32 -r
下载 EEPROM 设置并构建 .eep 二进制文件:
$ wget https://github.com/raspberrypi/rpi-sense/raw/master/eeprom/eeprom_settings.txt -O sense_eeprom.txt
./eepmake sense_eeprom.txt sense.eep /boot/firmware/overlays/rpi-sense-overlay.dtb
禁用写保护:
$ i2cset -y -f 1 0x46 0xf3 1
写入 EEPROM 数据:
$ sudo ./eepflash.sh -f=sense.eep -t=24c32 -w
重新启用写保护:
i2cset -y -f 1 0x46 0xf3 0
警告
此操作不会损坏你的树莓派或传感器扩展板,但如果发生错误,扩展板可能不能被自动检测到。上述步骤仅供调试目的。
要全面了解如何使用 C/C++ SDK,请阅读我们的文档。然而,如果你打算在 上开发 Pico,可以通过命令行快速设置 C/C++ 工具链,只需运行我们的。
注意
在运行设置脚本之前,请确保你的树莓派操作系统已经。
我们的官方 C SDK 可以从命令行使用,也可以与 Visual Studio Code、Eclipse 和 CLion 等流行的集成开发环境一起使用。要开始,请下载我们的 C/C++ SDK 和示例,并查看我们的'。或者,可以查看下一节进行快速设置。
SDK
示例
你可以在以下位置找到有关 C/C++ SDK 的文档:
与基于 RP2040 的微控制器板的 C/C++ 开发
使用 C/C++ 或 MicroPython 将 Raspberry Pi Pico W 连接到互联网
用于 RP2040 微控制器的库和工具的 C/C++ 开发
Raspberry Pi Pico C/C++ SDK 的文档
注意
如果你正在使用 C/C++ SDK 构建应用程序,并且目标板不仅限于 Raspberry Pi Pico,你需要在 CMake 中传递
-DPICO_BOARD=boardname
。这里的boardname
是你的开发板名称,例如,对于 Adafruit Feather RP2040,你应该传递-DPICO_BOARD=adafruit_feather_rp2040
。更多信息请参考 Raspberry Pi Pico SDK 中的 目录和。
注意
关于在 Raspberry Pi Pico W 上使用 C/C++ SDK 构建应用程序并连接到网络,你需要在 CMake 中传递
-DPICO_BOARD=pico_w -DWIFI_SSID="你的网络" -DWIFI_PASSWORD="你的密码"
。如果只需启用蓝牙支持,则无需传递 SSID 和密码,但仍需传递-DPICO_BOARD=pico_w
字符串至 CMake。
当使用新的微控制器时,第一个程序通常是控制板上的 LED 闪烁。树莓派 Pico 板上有一个单独的 LED,连接到板上的 GP25
(用于 Raspberry Pi RP2040 for Pico),以及 WL_GPIO0
(用于 Pico W 上的 Infineon 43439 无线芯片)。
你可以按照以下步骤进行 LED 的闪烁:
下载适用于 或 的 Blink UF2。
按住 BOOTSEL 按钮,将 Pico 插入树莓派或其他计算机的 USB 端口。
它将作为名为 RPI-RP2 的大容量存储设备挂载。
将 Blink UF2 二进制文件拖放到 RPI-RP2 卷上。Pico 将重新启动。
你应该看到板上的 LED 闪烁。
你可以在 Github 上查看 和 版本的代码。
下一个程序是通过 USB 串行连接打印 'Hello World'。
下载 。
按住 BOOTSEL 按钮,将 Pico 插入树莓派或其他计算机的 USB 端口。
它将作为名为 RPI-RP2 的大容量存储设备挂载。
将 'Hello World' UF2 二进制文件拖放到 RPI-RP2 卷上。Pico 将重新启动。
打开终端窗口并键入:
你应该在终端看到 'Hello, world!' 的输出。
你可以在 Github 上查看。
注意
以下说明简洁,并且仅适用于基于 Linux 的系统。有关详细步骤、其他平台的说明以及一般建议,请参阅 和 书籍。
安装 CMake(版本不低于 3.13)和 GCC 交叉编译器
设置项目以使用树莓派 Pico SDK,通过将 SDK 克隆到本地:
从 SDK 中将 external/pico_sdk_import.cmake
复制到你的项目目录中
在你的环境中设置 PICO_SDK_PATH
为 SDK 的路径,或者稍后通过 -DPICO_SDK_PATH=
选项传递给 cmake
。
设置一个 CMakeLists.txt
如下:
接着编写你的代码,参见 或 书籍获取更多信息。
最简单的例子可以是一个单一源文件(例如 hello_world.c
):
并将以下内容添加到你的 CMakeLists.txt 中:
注意
此示例使用默认的 UART 作为 stdout;如果要使用默认的 USB,请参见 hello-usb 示例。
设置一个 CMake 构建目录。例如,如果不使用 IDE:
当为树莓派 Pico 以外的板子构建时,你应该将 -DPICO_BOARD=board_name
传递给上述 cmake 命令,例如 cmake -DPICO_BOARD=pico_w ..
,以相应地配置 SDK 和构建选项。
这样做会设置各种编译器定义(例如 UART 和其他硬件的默认引脚号),在某些情况下还会启用其他库的使用(例如在构建 PICO_BOARD=pico_w
时启用无线支持),这些库在没有提供所需功能的板子上无法构建。
有关 SDK 自身定义的板子列表,请查看中每个命名板子的头文件。
从你创建的构建目录中制作你的目标。
现在你有了 hello_world.elf
,可以通过调试器加载,或者有了 hello_world.uf2
,可以通过拖放安装并在树莓派 Pico 上运行。
$ sudo apt install minicom
$ minicom -b 115200 -o -D /dev/ttyACM0
$ sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi libstdc++-arm-none-eabi-newlib
$ git clone https://github.com/raspberrypi/pico-sdk.git
cmake_minimum_required(VERSION 3.13)
# 基于 PICO_SDK_PATH 初始化 SDK
# 注意:它必须位于 project() 之前
include(pico_sdk_import.cmake)
project(my_project)
# 初始化树莓派 Pico SDK
pico_sdk_init()
# 你的项目的其余部分
#include <stdio.h>
#include "pico/stdlib.h"
int main() {
setup_default_uart();
printf("Hello, world!\n");
return 0;
}
add_executable(hello_world
hello_world.c
)
# 添加 pico_stdlib 库,它聚合了常用功能
target_link_libraries(hello_world pico_stdlib)
# 除 ELF 外还创建 map/bin/hex/uf2 文件。
pico_add_extra_outputs(hello_world)
$ mkdir build
$ cd build
$ cmake ..
$ make hello_world
树莓派触摸显示屏是一款可通过 DSI 连接器连接到树莓派的液晶显示屏。你可以同时使用触摸显示屏和 HDMI 显示输出。
树莓派 7 吋触摸显示屏
除了树莓派 Zero 和 Zero 2 W 以外,触摸显示屏兼容所有型号的树莓派(这两款型号没有 DSI 接口)。最早的树莓派型号没有适当的安装孔,需要额外的硬件来安装显示屏 PCB 上的支架。
该显示屏核心参数如下:
800×480 RGB LCD 显示屏
24 位色彩
工业品质:水平 140 度视角,垂直 120 度视角
10 点多点触摸触摸屏
通过 I²C 接口进行 PWM 背光控制和电源控制
金属框架背面带有安装孔,可用于树莓派显示转换板和树莓派
背光寿命:20000 小时
工作温度:-20 至 +70 °C
存储温度:-30 至 +80 °C
对比度:500
平均亮度:250 cd/m²
视角(度):
顶部—50
底部—70
左侧—70
右侧—70
功率要求:在最大亮度下,典型值为 5V 200mA。
外部尺寸:192.96 × 110.76 mm
可视区域:154.08 × 85.92 mm
你可以使用支架将树莓派安装在触摸显示屏背面,然后接入适当的线缆。如果有可用的外壳,你也可以将触摸显示屏安装在单独的外壳中。连接方式保持不变,但根据外壳的不同,你可能需要更长的线缆。
连接到触摸显示屏的树莓派
将扁平柔性电缆(FFC)的一端连接到触摸显示 PCB 上的 RPI-DISPLAY 接口。银色/金色接触点应远离显示屏。然后将另一端的 FFC 连接到树莓派上的 DISPLAY 接口。此接口的接触点应朝向树莓派。
如果 FFC 未完全插入或位置不正确,你将在显示屏上碰壁。在故障排除时,尤其是如果你在显示屏上看不到任何内容或显示屏只显示单一颜色时,你应始终仔细检查连接状况。
注意
触摸显示屏的机械图可供下载。
我们建议使用树莓派的 GPIO 为触摸显示屏供电。或者你可以直接使用单独的 Mirco USB 电源适配器为显示屏供电。
要使用树莓派为触摸显示屏供电,你需要在树莓派的 GPIO 上的 5V 和 GND 引脚及显示屏上的 5V 和 GND 引脚间连接两根跳线。如下图所示。
显示屏的 5V 和 GND 引脚的位置
在开始之前,请确保树莓派已关机且未连接到电源。将黑色跳线的一端连接到树莓派上的引脚 6 ( GND ),将红色跳线的一端连接到引脚四 (5V)。如果引脚 6 不可用,你可以使用其他未使用的 GND 引脚来连接黑线。如果引脚 4 不可用,你可以使用其他的 5V 引脚来连接红线,例如引脚 2。
树莓派引脚的位置
接下来,将黑线的另一端连接到显示器上的 GND 引脚,将红线的另一端连接到显示器上的 5V 引脚。在完成所有连接后,下次打开树莓派时,你应该会看到触摸显示屏被点亮。
使用触摸显示屏上的另外三个引脚将显示器连接到早期树莓派 1B 和 B。有关更多信息,请参考我们关于旧版支持的文档。
注意
要判别早期的树莓派,请检查 GPIO 针脚连接器。仅早期型号有 26 针引脚的 GPIO 连接器;后续型号都有 40 针引脚。
如果你不想用树莓派为触摸显示屏供电,可用 Mirco USB 电源适配器。我们建议使用树莓派 12.5W 电源适配器,可确保显示屏正常运行。
如果选择使用 Mirco USB 供电,请不要把树莓派的 GPIO 引脚连接到显示器上。两个板之间唯一的连接应为扁平柔性电缆。
警告
若使用 micro USB 线为显示器供电,并将其安装在外壳内,在使用时会无法触及显示器的 PCB 板。
在树莓派系统 Bookworm 及更高版本中,你可以将屏幕键盘 wvkbd
用作输入设备。要安装 wvkbd
,请运行以下命令:
$ sudo apt install wvkbd
技巧
在旧版树莓派系统发行版中,请你使用
matchbox-keyboard
来代替。
如果你想要在物理上调整显示屏方向,或者将其安装在特定位置,你可以使用软件调整屏幕的方向,以更好地满足你的设置。
要从桌面环境调整屏幕方向,请从“首选项”菜单中选择“屏幕配置”。在布局编辑器中右键单击矩形的 DSI-1 显示器,选择“方向”,然后选择最适合你需求的参数。你还可以通过“触摸屏”参数确保触摸叠加层分配给正确的显示屏。
要在缺少桌面环境的设备上设置屏幕方向,请编辑 /boot/firmware/cmdline.txt
配置文件,向系统传递一个方向。将以下行添加到 cmdline.txt
:
video=DSI-1:800x480@60,rotate=<旋转值>
用以下值替换占位符 <旋转值>
,这些值对应于相对于显示器默认值的旋转度数:
0
90
180
270
例如,旋转值为 90 会将屏幕显示向右旋转 90 度。180 会把屏幕显示旋转 180 度,即倒置。
注意
使用
cmdline.txt
无法单独旋转 DSI 显示器,即无法 HDMI 显示器分离。当同时使用 DSI 和 HDMI 时,它们将应用相同的旋转参数。
警告
在设备树旋转触摸输入可能会与你的输入库发生冲突。请尽可能在你的输入库/桌面中配置触摸事件旋转。
触摸输入的旋转与显示本身的方向无关。要更改此设置,你需要在 /boot/firmware/config.txt
中手动添加 dtoverlay
指令。在 config.txt
中添加以下行:
dtoverlay=vc4-kms-dsi-7inch,invx,invy
然后,在 config.txt
中删除以下行(如有)来禁用自动显示检测:
display_auto_detect=1
叠加层 vc4-kms-dsi-7inch
支持以下选项:
sizex
设置 X 分辨率(默认 800)
sizey
设置 Y 分辨率(默认 480)
invx
反转 X 坐标
invy
反转 Y 坐标
swapxy
交换 X 和 Y 坐标
disable_touch
完全禁用触摸叠加
要指定这些参数,请将它们用逗号分隔添加到你的 dtoverlay 行中的 /boot/firmware/config.txt
。当存在时,布尔值默认为 true
,但你可以使用后缀“=0”将其设置为 false
。整数值需要一个值,例如 sizey=240
。例如,要将 X 分辨率设置为 400 像素并反转 X 和 Y 坐标,请使用以下行:
dtoverlay=vc4-kms-dsi-7inch,sizex=400,invx,invy
警告
这些说明仅适用于最老的树莓派 A、B 款的开发板。要识别最老的树莓派,请检查 GPIO 连接器。只有原始型号带 26 引脚的 GPIO 连接器;后续型号有 40 针引脚。
树莓派 1B 和 B 款上的 DSI 连接器没有与触摸屏控制器和 DSI 控制器通信所需的 I²C 连接。为了解决这个问题,请使用显示套件附带的额外一组跳线。将 GPIO 头上的 SCL/SDA 连接到显示板上标有 SCL/SDA 的水平引脚。使用跳线电缆通过 GPIO 引脚为 B/B 供电。
这些主板上默认禁用了 DSI 显示自动检测。要启用检测,请在 /boot/firmware/config.txt
文件中添加以下行:
ignore_lcd=0
请用 Mirco USB 电源适配器连接到显示屏上的 PWR IN 来供电。不要通过树莓派的 Mirco USB 为设备供电。这将超过流过保险丝的最大电流额定值,因为显示屏的消耗大约为 400mA。
树莓派 AI 套件
树莓派 AI 套件将树莓派 M.2 HAT+ 与 Hailo AI 加速模块捆绑在一起,用于树莓派 5。该套件包含以下物品:
Hailo AI 模块,含神经处理单元(NPU)
树莓派 M.2 HAT+,用于将 AI 模块接入你的树莓派 5
Ai 模块和 M.2 HAT+ 间预装了导热触点
安装螺丝套件
16 mm 堆叠 GPIO 引脚
每秒 13 万亿次(TOPS)神经网络推理加速器,基于 Hailo-8L 芯片设计。
M.2 2242 外形尺寸
要使用 Ai 套件,你需要:
树莓派 5
每份 Ai 套件都配备了预安装的 Ai 模块、排线电缆、GPIO 堆叠排针和安装硬件。请按照以下说明完成安装你的 Ai 套件:
首先,请确保你的树莓派运行的软件是最新的。运行以下命令进行更新:
接下来,请确保你的树莓派固件是最新的。运行以下命令可查看你正在运行的固件版本:
如果你看到的日期是 2023 年 12 月 6 日及更晚,请继续下一步。如果你看到的日期早于 2023 年 12 月 6 日,请运行以下命令打开树莓派配置 CLI:
在 Advanced Options > Bootloader Version 下,选择 Latest。然后,单击 Finish,或按 Esc 键 可退出 raspi-config
。
运行以下命令,可以将固件更新到最新版本:
然后,使用 sudo reboot
重启。
在开始安装前,请断开树莓派的电源。
为了获得最佳性能,我们建议将 Ai 套件与树莓派主动散热器搭配使用。如果你有主动散热器,请在安装 Ai 套件之前安装它。
使用附带的四颗螺丝安装间隔柱。牢固地将 GPIO 堆叠排针压在树莓派的 GPIO 引脚顶部;只要所有引脚都能正确插入即可,方向无所谓。从 Ai 套件上断开排线电缆,将另一端插入树莓派的 PCIe 接口。从两侧抬起排线电缆固定器,然后将带有铜触点朝向内部、即朝向 USB 接口的线缆插入。确保排线电缆完全且均匀地插入 PCIe 接口,然后从两侧按下电缆固定器,将排线电缆牢固地固定在位。
将 AI 套件放在间隔物顶部,并使用剩下的四颗螺丝将其固定在位。
将排线插入 AI 套件上的插槽。从两侧抬起排线固定器,然后插入铜接点朝上的电缆。将排线完全均匀地插入接口,从两侧按下电缆固定器,牢固地固定排线电缆。
恭喜,现在你已成功的安装 AI 套件了。将你的树莓派接入电源;树莓派系统可自动检测 AI 套件。
警告
在连接/断开 M.2 插槽上的设备之前,务必先将你的树莓派断开电源。
本指南将帮助你设置树莓派 5 与树莓派 AI 套件配合使用。这将使你能够使用 Hailo AI 神经网络加速器运行 rpicam-apps
摄像头演示。
对于本指南,你将需要以下物品:
树莓派 5
树莓派 Ai 套件,其中包括:
M.2 HAT+
预装的 Hailo-8L Ai 模块
64 位树莓派系统 Bookworm 系统
官方树莓派摄像头(例如摄像头模块 3 或高质量(HQ)摄像头)
将摄像头连接到你的树莓派 5 主板,按照在安装树莓派摄像头中的说明进行操作。你可以跳过电源连接,因为你需要在下一步中断开树莓派的电源。
按照安装说明将你的 AI 套件硬件连接到你的树莓派 5。
按照说明启用 PCIe Gen 3.0。这一步骤是可选的,但为了使你的 AI 套件获得最佳性能,强烈建议启用它。
安装使用 Ai 套件所需的依赖包。在终端运行以下命令:
这将安装以下依赖项:
Hailo 内核设备驱动程序和固件
HailoRT 中间件软件
Hailo Tappas 核心后处理库
rpicam-apps Hailo 后处理软件演示阶段
最后,使用 sudo reboot
重启你的树莓派,以使这些设置生效。
为确保一切正常运行,请运行以下命令:
如果你看到类似如下信息的输出,则已成功安装了 Ai 套件及其软件依赖包:
另外,你可以运行 dmesg | grep -i hailo
来查看内核日志,应该会产生类似以下的输出:
为了确保摄像头正常运行,请运行以下命令:
这将启动摄像头并显示一个十秒钟的预览窗口。如果你已经验证一切安装正确,就可运行一些演示了。
rpicam-apps
摄像头应用套件实现了一个后处理框架。本节包含一些演示后处理阶段,突出了 Ai 套件的一些功能。
以下演示使用 rpicam-hello
,默认情况下显示一个预览窗口。但是,你也可以使用其他 rpicam-apps
,包括 rpicam-vid
和 rpicam-still
。你可能需要添加或修改一些命令行选项,以使演示命令与替代应用程序兼容。
要开始,请下载演示所需的后处理 JSON 文件。这些文件确定要运行的后处理阶段,并配置每个阶段的行为。例如,你可以在对象检测演示中启用、禁用、加强/减弱时间滤波的强度。或者你可以在分割演示中启用或禁用输出蒙版绘制。
要下载完整的后处理 JSON 文件集合,请克隆 rpicam-apps 存储库。运行以下命令仅拉取存储库中最新的提交,以节省空间:
技巧
后续部分提供的命令使用此存储库中的 JSON 文件。为了便于引用这些文件,此命令在你的主文件夹中创建了克隆的 rpicam-apps 目录。如果你修改了此目录的位置,则还必须修改下面的演示命令,以引用 JSON 文件的新位置。
此演示显示神经网络检测到的物体周围的边界框。要禁用取景器,请使用参数 -n
。要返回纯文本输出,说明检测到的物体,请添加参数 -v 2
。运行以下命令在你的树莓派上尝试演示:
或者,你可以尝试另一款性能和效率上不同权衡的模型。
使用 Yolov8 模型运行演示,请运行以下命令:
使用 YoloX 模型运行演示,请运行以下命令:
使用 Yolov5 人脸模型运行演示,请运行以下命令:
此演示执行对象检测,并通过在取景器图像上绘制颜色掩模来对对象进行分割。运行以下命令在你的树莓派上尝试演示:
此演示执行 17 点人体姿势估计,绘制连接检测点的线条。运行以下命令在你的树莓派上尝试演示:
Hailo 还创建了一组演示,你可以在树莓派 5 上运行,可在GitHub 存储库 hailo-ai/hailo-rpi5-examples 中找到。
你可以在GitHub 存储库 hailo-ai/hailo_model_zoo 中找到 Hailo 广泛的模型库,其中包含大量神经网络。
查看 Hailo 社区论坛和开发者区,进一步讨论有关 Hailo 硬件和工具的内容。
有关 Ai 套件的更多信息,包括机械规格和操作环境限制,请参阅产品简介。
$ sudo apt update && sudo apt full-upgrade
$ sudo rpi-eeprom-update
$ sudo raspi-config
$ sudo rpi-eeprom-update -a
$ sudo apt install hailo-all
$ hailortcli fw-control identify
Executing on device: 0000:01:00.0
Identifying board
Control Protocol Version: 2
Firmware Version: 4.17.0 (release,app,extended context switch buffer)
Logger Version: 0
Board Name: Hailo-8
Device Architecture: HAILO8L
Serial Number: HLDDLBB234500054
Part Number: HM21LB1C2LAE
Product Name: HAILO-8L AI ACC M.2 B+M KEY MODULE EXT TMP
[ 3.049657] hailo: Init module. driver version 4.17.0
[ 3.051983] hailo 0000:01:00.0: Probing on: 1e60:2864...
[ 3.051989] hailo 0000:01:00.0: Probing: Allocate memory for device extension, 11600
[ 3.052006] hailo 0000:01:00.0: enabling device (0000 -> 0002)
[ 3.052011] hailo 0000:01:00.0: Probing: Device enabled
[ 3.052028] hailo 0000:01:00.0: Probing: mapped bar 0 - 000000000d8baaf1 16384
[ 3.052034] hailo 0000:01:00.0: Probing: mapped bar 2 - 000000009eeaa33c 4096
[ 3.052039] hailo 0000:01:00.0: Probing: mapped bar 4 - 00000000b9b3d17d 16384
[ 3.052044] hailo 0000:01:00.0: Probing: Force setting max_desc_page_size to 4096 (recommended value is 16384)
[ 3.052052] hailo 0000:01:00.0: Probing: Enabled 64 bit dma
[ 3.052055] hailo 0000:01:00.0: Probing: Using userspace allocated vdma buffers
[ 3.052059] hailo 0000:01:00.0: Disabling ASPM L0s
[ 3.052070] hailo 0000:01:00.0: Successfully disabled ASPM L0s
[ 3.221043] hailo 0000:01:00.0: Firmware was loaded successfully
[ 3.231845] hailo 0000:01:00.0: Probing: Added board 1e60-2864, /dev/hailo0
$ rpicam-hello -t 10s
$ git clone --depth 1 https://github.com/raspberrypi/rpicam-apps.git ~/rpicam-apps
$ rpicam-hello -t 0 --post-process-file ~/rpicam-apps/assets/hailo_yolov6_inference.json --lores-width 640 --lores-height 640
$ rpicam-hello -t 0 --post-process-file ~/rpicam-apps/assets/hailo_yolov8_inference.json --lores-width 640 --lores-height 640
$ rpicam-hello -t 0 --post-process-file ~/rpicam-apps/assets/hailo_yolox_inference.json --lores-width 640 --lores-height 640
$ rpicam-hello -t 0 --post-process-file ~/rpicam-apps/assets/hailo_yolov5_personface.json --lores-width 640 --lores-height 640
$ rpicam-hello -t 0 --post-process-file ~/rpicam-apps/assets/hailo_yolov5_segmentation.json --lores-width 640 --lores-height 640 --framerate 20
$ rpicam-hello -t 0 --post-process-file ~/rpicam-apps/assets/hailo_yolov8_pose.json --lores-width 640 --lores-height 640
树莓派调试套件是一款提供了 UART 串口和标准 Arm 串行线调试(SWD)接口的 USB 设备。该调试器设计用于简单、无需焊接的即插即用调试。它具有以下功能:
USB ARM 串行线调试(SWD)接口
USB 串口桥接器
兼容 CMSIS-DAP 标准
与兼容 CMSIS-DAP 的 OpenOCD 和其他工具搭配使用
易升级的开源固件
注意
有关树莓派三针调试连接器的更多信息,请参阅规格书。
这使得在 Windows、macOS 和 Linux 等没有 GPIO 引脚来直连 Pico 串口或 SWD 接口的设备也可轻松使用树莓派 Pico。
调试器在 3.3V 容忍 I/O 电压下运行。
调试器附带一根 USB 线和三根调试线:
三针 JST-SH 连接器到 3 针 JST-SH 连接器电缆
三针 JST-SH 连接器到 0.1 英寸排针(母)
三针 JST-SH 连接器到 0.1 英寸排针(公)
两根 0.1 英寸排针电缆 — 用于面包板(公头)或直接连接到带排针的板上(母头) — 颜色如下:
橙色 TX/SC(调试器输出)
黑色 GND
YellowRX/SD(输入到调试器或 I/O)
带有三针 JST-SH 连接器的电缆旨在与较新的树莓派主板用于 SWD 调试端口和 UART 连接器的标准三针连接器一起使用。
调试器有五个 LED 灯:一个是红色 LED 电源指示灯,另外四个是状态指示灯。
注意
当目标连接时,OpenOCD 会同时打开 DAP 的两个 LED,并在调用 DAP_DISCONNECT 时将它们关闭。
根据你的设置,有不同的方法可以将调试器连接到树莓派 Pico。在下面的示例中,我们将调试器连接到具有更新的三针 JST-SH 连接器用于 SWD 的树莓派 Pico H。
连接以下内容:
将调试器“D”接口连接到 Pico H SWD JST-SH 连接器
将调试器“U”接口,带有三针 JST-SH 连接器连接到 0.1 英寸排针(公头):
调试器 RX 连接到 Pico H TX 引脚
调试器 TX 连接到 Pico H RX 引脚
调试器 GND 连接到 Pico H GND 引脚
注意
如果你有非 H Pico 或 Pico W(没有 JST-SH 连接器),你仍然可以将其连接到调试器。在板上的 SWCLK,GND 和 SWDIO 引脚上焊接一个公连接器。使用随调试器附带的备用 3 引脚 JST-SH 连接器到 0.1 英寸排针(母)电缆,连接到调试器的“D”端口。分别将 Pico 或 Pico W 上的 SWCLK,GND 和 SWDIO 连接到调试器上的 SC,GND 和 SD 引脚。
要使用调试器,需安装以下工具。
你需要安装 OpenOCD。
要安装 OpenOCD,请在终端中运行以下命令:
$ sudo apt install openocd
在终端中使用 openocd 命令来运行 OpenOCD。
首先,安装包管理器 Homebrew:
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
在 macOS 上安装 OpenOCD,请运行以下命令:
$ brew install openocd
要运行 OpenOCD,请在终端中使用 openocd 命令。
我们还需要安装 GNU 调试器 (GDB)。
安装 gdb-multiarch :
$ sudo apt install gdb-multiarch
运行以下命令安装 gdb :
$ brew install gdb
你可以安全地忽略安装过程中关于“特殊权限”请求的消息。
重要
GDB 不支持 gdb Arm-based Macs。因此,要么从源代码编译
gdb
,要么使用lldb
来代替gdb
。开发者没有为在 Arm-based Macs 上运行 GDB 提供官方支持。可以在 Sourceware.org 的 GDB 邮件列表中找到有关 GDB 的支持。lldb 可作为 Xcode 命令行工具的一部分进行安装。
GDB 包含在我们的 Pico Windows 安装程序中。它也包含在 Arm GNU Toolchain Downloads 中。
或者,你可以在我们的《树莓派 Pico 入门指南》第 9 章和附录 A 中找到有关手动安装的信息。
注意
不建议在 Windows 上手动安装 GDB。
串行线调试(Serial Wire Debug,SWD)是一种两引脚接口(SWDIO 和 SWCLK),可替代 JTAG 四或五引脚调试接口标准。
Pico 调试器可使你通过 SWD 接口和 OpenOCD 来加载二进制文件:从而无需在每次将新二进制文件推送到 Pico 后拔下,然后按住 BOOTSEL 按钮这些操作。使用调试器上传新的二进制文件是完全自动化的。
假如你构建了一个二进制文件:
$ sudo openocd -f interface/cmsis-dap.cfg -f target/rp2040.cfg -c "adapter speed 5000" -c "program blink.elf verify reset exit"
注意
当你使用调试器上传二进制文件时,使用的是文件的 ELF 版本,而不是你在拖放时使用的 UF2 文件。
它还将让你在服务器模式下使用 openocd,并连接 GDB,这将为你提供断点和“正确”的调试。
$ cd ~/pico/pico-examples/
$ rm -rf build
$ mkdir build
$ cd build
$ export PICO_SDK_PATH=../../pico-sdk
$ cmake -DCMAKE_BUILD_TYPE=Debug ..
$ cd blink
$ make -j4
在调试构建中,当你在调试器下运行时,你将获得更多信息,因为编译器会使用信息构建你的程序,以告诉 GDB 你的程序正在做什么。
有关更多信息,请参阅《树莓派 Pico 入门指南》第 6 章。
要启动 OpenOCD 服务器,请运行以下命令:
$ sudo openocd -f interface/cmsis-dap.cfg -f target/rp2040.cfg -c "adapter speed 5000"
然后打开第二个终端窗口,切换到包含你构建的二进制文件的目录,并启动调试器以将其附加到 OpenOCD 服务器:
$ gdb blink.elf
> target remote localhost:3333
> monitor reset init
> continue
GDB 不适用于所有平台。根据你的操作系统和设备,请使用以下替代方案取代 gdb :
在非树莓派设备上使用 gdb-multiarch
。
在基于 Arm 的 macOS 设备上使用 lldb
。
确保调试器连接到了你树莓派 Pico 的 UART 引脚。
树莓派 Pico UART0 的默认引脚如下:
GND
3
不适用
UART0_TX
1
GP0
UART0_RX
2
GP1
在连接后,树莓派 Pico 的 UART 上的流量将通过调试器中继到你的计算机,并显示为 CDC UART。在树莓派上,显示为 /dev/ttyACM0;在其他平台上,此串口将以不同方式显示(例如,在 macOS 上,显示为 /dev/cu.usbmodemXXXX )。
如果你尚未安装 minicom,请执行以下操作:
$ sudo apt install minicom
并打开串口:
$ minicom -b 115200 -o -D /dev/ttyACM0
技巧
要退出 minicom,请按 CTRL-A,然后按 X 键。
要测试串行通信,你可以构建并上传“Hello World”示例应用程序。
进入 pico-examples 树中的 hello_world 目录,并运行 make。之后,你可以使用 openocd 将其上传到你的树莓派 Pico。要了解构建 hello_serial 示例程序的完整步骤,请参阅《开始使用树莓派 Pico》第 4 章。
$ cd pico-examples
$ mkdir build
$ cd build
$ export PICO_SDK_PATH=../../pico-sdk
$ cmake ..
$ cd hello_world/serial
$ make -j4
$ sudo openocd -f interface/cmsis-dap.cfg -f target/rp2040.cfg -c "adapter speed 5000" -c "program hello_serial.elf verify reset exit"
$ minicom -b 115200 -o -D /dev/ttyACM0
打开 minicom 后,应该在控制台上看到打印出了"Hello, world!"。
对于支持的终端程序,USB 串行 UART 的描述会在 USB 设备描述中进行广告。
此描述中的唯一序列号意味着在 Windows 上,你的 COM 端口编号是"粘性"的每个设备,并且将允许你编写 udev 规则以将命名设备节点与特定的调试器绑定起来。
调试器固件以 UF2 文件的形式由树莓派分发。
调试器固件的最新版本是版本 2。如果你正在运行旧版,或者如果你意外地覆盖了调试器的固件,你可以在 debugprobe GitHub 存储库中找到最新版本的固件。
从最新版本下载 debugprobe.uf2。
捏住调试器外壳顶部以拆除。
在将调试器插入计算机时按住 BOOTSEL 按钮,以挂载名为“RPI-RP2”的卷。
将 debugprobe.uf2 复制到 "RPI-RP2" 卷。文件复制到设备后,将自动卸载设备。
你的调试器将重启,现在运行更新版本的调试器固件。现在已准备好进行调试了。
调试器的原理图和机械图纸可用:
原理图(PDF)
机械图(PDF)
原理图上显示的测试点(TP)位于下图所示位置。
Pico 设备根据产品代次划分系列。
第一代树莓派 Pico 系列被称为 Pico(或 Pico 1),包含四个型号:
树莓派 Pico
树莓派 Pico H
树莓派 Pico W
树莓派 Pico WH
第二代树莓派 Pico 系列被称为 Pico 2,包含两个型号:
树莓派 Pico 2
带有插针的树莓派 Pico 2
树莓派 Pico 2 系列包含两款开发板:树莓派 Pico 2 和带有插针的树莓派 Pico 2。
树莓派 Pico 2 是一款低成本、高性能的微控制器开发板,具有灵活的数字接口。主要特点包括:
由 Raspberry Pi 在英国设计的 RP2350 微控制器芯片
双核 Cortex-M33、或双核 Hazard3 处理器,最高可达 150MHz
520KB 的 SRAM 和 4MB 的板载闪存
带设备模式和主机模式支持的 USB 1.1
低功耗睡眠和休眠模式
通过 USB 大容量存储拖放编程
多功能 GPIO 引脚 ×26,其中 3 个可用于 ADC
SPI ×2,I²C ×2,UART ×2,12 位 500ksps 模拟到数字转换器 (ADC) ×3,可控 PWM 通道 ×24
定时器 ×2,带 4 个报警,AON 定时器 ×1
温度传感器
3× 可编程 IO (PIO) 模块,总共 12 个状态机,支持自定义外围设备
灵活、用户可编程的高速 IO
可以模拟接口,如存储卡和 VGA
树莓派 Pico 2 采用镀边模块设计,便于直接焊接到载板上,而带有插针的 Pico 2 预装有插针。
注意
两款开发板均配备三针串行线调试 (SWD) 插针。然而,带有插针的 Pico 2 使用的是小型、带定位的 3 针连接器,而 Pico 2 则是板边相邻的三个镀边通孔插针。
下载 引脚分布图 (PDF)
下载 STEP 文件
下载树莓派 Pico 的 Fritzing 部件
注意
关于 Fritzing 的更多信息,请访问网站 fritzing.org 。
树莓派 Pico 1 系列包含四款开发板:树莓派 Pico(最左侧),Pico H(左中),Pico W(右中),Pico WH(最右侧)。
树莓派 Pico 是一款低成本、高性能的微控制器开发板,具有灵活的数字接口。主要特点包括:
由 Raspberry Pi 在英国设计的 RP2040 微控制器芯片
双核 Arm Cortex M0+ 处理器,灵活的时钟频率最高可达 133 MHz
SRAM 为 264KB,板载闪存 2MB
带设备模式和主机模式支持的 USB 1.1
低功耗睡眠和休眠模式
通过 USB 大容量存储拖放编程
多功能 GPIO 引脚 ×26
SPI ×2,I²C ×2,串口 ×2,3× 12 位 ADC,可控 PWM 通道 ×2
精确的片上时钟和定时器
温度传感器
片上加速浮点库
可编程 IO (PIO) 状态机 ×8,支持自定义外围设备
树莓派 Pico 采用镀边模块设计,便于直接焊接到载板上,而 Pico H 则预装有插针。
注意
两款开发板均配备三针串行线调试 (SWD) 插针。然而,Pico H 使用的是小型、带定位的 3 针连接器,而 Pico 则是板边相邻的三个镀边通孔插针。
下载 引脚分布图 (PDF)
下载 设计文件 (Cadence Allegro)
下载 STEP 文件
下载树莓派 Pico 的 Fritzing 部件
下载树莓派 Pico H 的 Fritzing 部件
注意
关于 Fritzing 的更多信息,请访问网站 fritzing.org 。
树莓派 Pico W 在保持 Pico 外形尺寸的同时,增加了板载单频 2.4GHz 无线接口(802.11n),该接口采用 Infineon CYW43439 芯片。板载的 2.4GHz 无线接口具有以下特性:
无线(802.11n),单频(2.4 GHz)
WPA3 安全协议
支持最多四个客户端的软接入点
蓝牙 5.2
支持蓝牙低功耗(LE)中央和外围角色
支持经典蓝牙
天线为板载天线,由 ABRACON(前身为 ProAnt)授权。无线接口通过 SPI 连接到 RP2040 微控制器。
由于引脚限制,部分无线接口的引脚是共享的。时钟信号(CLK)与 VSYS 监视器共享,因此只有在没有 SPI 事务进行时,才能通过 ADC 读取 VSYS。Infineon CYW43439 的 DIN/DOUT 和 IRQ 引脚都与 RP2040 上的一个引脚共享。仅在没有 SPI 事务进行时,才适合检查 IRQ。该接口通常以 33MHz 运行。
为了获得最佳的无线性能,天线应处于空旷空间。例如,在天线下方或附近放置金属会降低其增益和带宽性能。将接地金属添加到天线两侧可以改善天线的带宽。
注意
CYW43439 无线芯片通过 SPI 连接到 RP2040。CYW43439 支持通过此接口进行 802.11 无线和蓝牙通信。
重要
一般情况下,
libcyw43
仅授权用于非商业用途,但 Pico W 用户以及其他所有围绕 RP2040 和 CYW43439 构建其产品的用户都可以享受免费的商业使用许可证。
重要
除了 BTstack 标准许可条款外,还提供了一个 补充许可,涵盖了树莓派 Pico W 或树莓派 Pico WH 商业使用 BTstack 的情况。
下载 引脚图 (PDF)
下载 设计文件 (Cadence Allegro)
下载 STEP 文件
下载适用于树莓派 Pico W 的 Fritzing 部件
Pico 系列及其他基于 Raspberry Pi 微控制器的板卡文档。
Raspberry Pi 的微控制器
使用 RP2350 微控制器构建板卡和产品
Raspberry Pi 的微控制器
使用 RP2040 微控制器构建板卡和产品
基于 RP2350 的微控制器板
使用树莓派 Pico 系列设备及其他基于 Raspberry Pi 微控制器的板卡进行 C/C++ 开发
基于 RP2040 的微控制器板
使用树莓派 Pico 及其他基于 RP2040 的微控制器板进行 C/C++ 开发
带无线功能的 RP2040 微控制器板
使用 C/C++ 或 MicroPython 让树莓派 Pico W 上网
注意
在 使用树莓派 Pico W 连接互联网一书中介绍了使用 C/C++ 或 MicroPython 进行 Wi-Fi 和蓝牙开发的文档。
用于在 RP2040 微控制器上进行 C/C++ 开发的库和工具
用于 RP2040 微控制器的 MicroPython 环境
树莓派 Pico C/C++ SDK 的 API 级 Doxygen 文档也可以通过 微型站点 获取。
注意
提供了一个适用于 Windows 10 和 Windows 11 的 Pico C/C++ SDK 一键安装程序。
如果您不确定树莓派 Pico 系列设备上编写了什么程序,并且该程序是使用 Pico C/C++ SDK 构建的,通常会在二进制文件中嵌入一个名称和其他有用信息。您可以使用 Picotool 命令行工具来查找这些详细信息。关于如何使用 Picotool 的完整说明可在我们的 '入门指南' 文档中找到。
注意
debuprobe_on_pico
调试软件尚不支持 Pico 2。
您可以使用一台 Pico 系列设备来调试另一台 Pico 系列设备。这可以通过 debugprobe
实现,debugprobe
是一个允许 Pico 充当 USB → SWD 和 UART 转换器的应用程序。
您可以在 debugprobe GitHub 仓库 中找到最新版本的固件。
下载最新发布的 debugprobe_on_pico.uf2
文件。
按住 BOOTSEL 按钮并将调试设备插入计算机,以挂载名为“RPI-RP2”的卷。
将 debugprobe_on_pico.uf2
复制到该卷上。文件复制完成后,卷会自动卸载。
您的设备将重启,并运行更新版本的 debugprobe
固件。现在它已准备好进行调试。
注意
有关如何使用调试器的说明,请参见 Pico 系列微控制器入门指南。
Pico 的 BOOTSEL 模式存储在 RP2040 芯片的只读内存中,无法意外覆盖。无论如何,只要按住 BOOTSEL 按钮并插入 Pico,它都会显示为一个驱动器,您可以将新的 UF2 文件拖放到该驱动器上。通过软件无法将板卡刷砖。但是,在某些情况下,您可能希望确保 Flash 内存为空。您可以通过在 Pico 处于大容量存储模式时拖放一个特殊的 UF2 二进制文件来完成此操作。
下载 UF2 文件
查看 GitHub 上的代码
RP2350 是由树莓派设计的一款微控制器。
无论你是拥有树莓派 Pico 2 还是其他 RP2350 衍生的微控制器板,你都可以在这里找到所需的所有入门资源。你将找到适用于树莓派 Pico 2 的 C/C++ 或 MicroPython 的入门支持,并可获得使用 RP2350 的其他开发板的相关资源链接。同时,还有关于树莓派 Pico 2 微控制器板和 RP2350 微控制器芯片的技术文档链接。
RP2350 中的后缀数字源于以下因素:
处理器核心数量(2)
大致的处理器类型(M33)
floor(log2(内存 ÷ 16KB))
floor(log2(非易失性存储器 ÷ 128KB)),如果没有板载非易失性存储器,则为 0
RP2350 是树莓派推出的高性能、安全、低成本且易于使用的微控制器。
它拥有大容量的片上存储器、对称的双核处理器系统、确定性的总线结构以及丰富的外设集合,辅以独特的可编程 I/O (PIO) 子系统,为专业用户提供无与伦比的性能和灵活性。详细的文档、精心打磨的 MicroPython 移植版本和 ROM 中的 UF2 引导加载程序,使其成为初学者和爱好者的最佳选择。
RP2350 是一个无状态设备,支持从外部 QSPI 存储器进行缓存执行。这一设计决策允许你为应用选择合适的非易失性存储器密度,并受益于商品闪存的低价格。
RP2350 使用现代 40nm 工艺节点制造,提供高性能、低动态功耗和低漏电率,并支持多种低功耗模式,以延长电池供电的操作时间。
主要特性包括:
双核 Cortex-M33 或 Hazard3 处理器,最高可达 150MHz
520KB 多片高性能 SRAM
通过专用 QSPI 总线支持最多 16MB 的片外 Flash 存储器
DMA 控制器
全连接 AHB 交叉开关
片上可编程 LDO 生成核心电压
2 个片上 PLL 生成 USB 和核心时钟
GPIO 引脚 x30,其中 4 个可用作模拟输入
外设
串口 x2
SPI 控制器 x2
I²C 控制器 x2
PWM 通道 x24
USB 1.1 控制器和 PHY,支持主机和设备模式
可编程 IO (PIO) 模块 x3,总共 12 个状态机
RP2350 拥有全方位安全架构,基于面向 Cortex-M 的 Arm TrustZone 构建,包括以下功能:
支持签名引导
8KB 片上反熔丝一次性可编程 (OTP) 存储器
SHA-256 加速
硬件真随机数生成器 (TRNG)
RP2350 包含一对开源硬件 Hazard3 RISC-V 内核,这些内核可在启动时替代 Cortex-M33 内核。我们的引导 ROM 甚至可以自动检测第二阶段二进制文件的构建架构,并将芯片重新引导到适当的模式中。除了少数安全功能和双精度浮点加速器之外,芯片的所有功能都在 RISC-V 模式中可用。
树莓派设计了树莓派 Pico 2,作为开发板和参考设计,基于 RP2350。
许可你出于任何目的使用、复制、修改和/或分发此设计,无论是否收费。
该设计按“原样”提供,作者对该设计不作任何担保,包括所有适销性和适用性隐含担保。在任何情况下,作者均不对因使用或性能问题引起的任何特殊、直接、间接或后果性损害或任何损害负责,无论是合同、过失或其他侵权行为。
你可以在树莓派论坛上找到关于第三方 RP2350 开发板的讨论。
许多基于 RP2350 的设备使用树莓派的 USB 供应商 ID 和产品 ID 组合。如果你构建了基于 RP2350 的第三方开发板,可能需要一个唯一的 USB 产品 ID (PID)。
如果需要为 Windows 用户提供自定义驱动程序,可能需要一个唯一的 USB PID。
USB-IF 授权树莓派为其供应商 ID (0x2E8A
) 的常用硅组件分配 USB 产品 ID。
要预留与树莓派供应商 ID 相关联的 USB PID,请按照树莓派 USB PID Git 仓库中的说明操作。
注意
如果你使用标准的 RP2350 PID,可以使用
iManufacturer
、iProduct
和iSerial
字符串来唯一标识你的设备。
RP2040 是由树莓派设计的一款微控制器。
无论你是拥有树莓派 Pico 1 还是其他基于 RP2040 的微控制器板,你都可以在此找到所需的一切。这里提供了有关在树莓派 Pico 上使用 C/C++ 或 MicroPython 的入门支持,以及使用 RP2040 的其他板的相关资源链接。此外,还提供了有关树莓派 Pico 微控制器板和我们的 RP2040 微控制器芯片的技术文档链接。
RP2040 后缀数字的含义如下:
处理器核心数(2)
松散定义的处理器类型(M0+)
floor(log2(内存 ÷ 16k))
floor(log2(非易失性存储 ÷ 16k)),如果没有板载非易失性存储则为 0
RP2040 是树莓派推出的首款微控制器,延续了我们一贯的高性能、低成本和易用性。
凭借大容量的片上内存、对称的双核处理器、确定性总线结构和丰富的外设集,RP2040 为专业用户提供了无与伦比的性能和灵活性。借助详细的文档、成熟的 MicroPython 移植和 ROM 中的 UF2 引导加载程序,RP2040 为初学者和爱好者提供了最便捷的入门体验。
RP2040 是一个无状态设备,支持从外部 QSPI 存储器中执行缓存操作。这一设计决定允许你为应用选择适当的非易失性存储密度,并享受商品级闪存器件的低成本优势。
RP2040 使用现代 40nm 工艺制造,提供高性能、低动态功耗和低漏电,支持多种低功耗模式,以延长电池供电设备的使用时间。
关键特性包括:
双 ARM Cortex-M0+ @ 133MHz
264kB 片上 SRAM,分为六个独立的存储单元
支持通过专用 QSPI 总线连接的高达 16MB 的片外 Flash 存储器
DMA 控制器
全连接的 AHB 交叉开关
插值器和整数除法外设
片上可编程 LDO,用于生成内核电压
2 个片上 PLL,用于生成 USB 和内核时钟
30 个 GPIO 引脚,其中 4 个可用作模拟输入
外设
2 个串口
2 个 SPI 控制器
2 个 I²C 控制器
16 个 PWM 通道
带有主机和设备支持的 USB 1.1 控制器和 PHY
8 个 PIO 状态机
即使在深度睡眠模式下,RP2040 的典型电流也为 ~180μA,睡眠电流高度依赖于 PVT:工艺(芯片间电流变化)、电压(电流随电压线性变化)和温度(电流随温度非线性变化)。
对于许多需要最小电流消耗的使用场景,最好的选择是完全关闭系统电源(或 RP2040 系统部分的电源)。本文档提供了一些实现这一目标的电路示例,设计人员可以根据自己的使用需求对这些电路进行调整。
下载 Minimal Viable Board 设计文件(KiCad)
下载 VGA Carrier Board 设计文件(KiCad)
树莓派设计了树莓派 Pico 1 作为开发板和参考设计,Pico 系列目前包括树莓派 Pico(最左),Pico H(左),Pico W(右)和 Pico WH(最右)。
树莓派 Pico 和 Pico W 的设计文件是公开提供的,没有任何限制。
许可允许为任何目的使用、复制、修改和/或分发此设计,无论是否收取费用。
设计按“原样”提供,作者不对与该设计有关的任何明示或暗示的适销性和适用性担保承担责任。在任何情况下,作者都不对因使用或性能问题导致的任何特殊、直接、间接或后果性损害或任何损害负责,无论是因合同、过失或其他侵权行为引起。
你可以在树莓派论坛 中找到关于第三方 RP2040 板卡的讨论。
许多基于 RP2040 的设备使用树莓派的 USB 供应商 ID 和产品 ID 组合。如果你基于 RP2040 设计了第三方板卡,可能需要一个唯一的 USB 产品 ID(PID)。
如果需要为 Windows 用户提供自定义驱动程序,你可能需要唯一的 USB PID。
USB-IF 已授权树莓派使用其供应商 ID(0x2E8A
)许可 USB 产品 ID,用于 RP2040 的常见硅组件。
要预留与树莓派供应商 ID 关联的 USB PID,请按照树莓派USB PID git 仓库中的说明进行操作。
注意
如果你使用标准的 RP2040 PID,可以使用
iManufacturer
、iProduct
和iSerial
字符串唯一标识你的设备。
RP2040 封装中的内部温度传感器为低分辨率传感器,需要用户校准后才具有精确度。
准确测量温度的一个关键部分是了解 ADC VREF 电压。转换公式意味着 ADC VREF 电压中的小误差会导致计算出的温度出现较大差异。RP2040 没有内部固定电压参考来确定 VREF 电压,因此 VREF 电压需要手动测量——需要注意的是,它可能会变化——或者需要提供外部固定电压参考。
注意
随着温度升高,RP2040 传感器电压会下降。
有关内部温度传感器的更多详细信息,请参见 RP2040 数据手册 第 4 章第 4.9.5 节。
RP1 是一款 12×12mm,引脚中心距为 0.65mm 的 BGA 南桥芯片,它为树莓派 5 提供了主要的 I/O(输入/输出)功能。
RP1 可提供:
PCIe 2.0 x4
千兆以太网 MAC(GEM)控制器
USB 3 主机控制器 x2
每个都有 USB 3 x1 和 USB 2 x1 端口
USB 可用带宽是树莓派 4 的 2 倍
SDIO 通道/eMMC x2(树莓派 5 未使用)
MIPI 转换器 x2(4 通道,支持 DSI 和 CSI-2)
视频数模转换器(DAC)(3 通道,支持 PAL/NTSC 和 VGA)
树莓派 5 仅使用单通道(复合视频)
低速外围设备(SPI、UART、I²C、PWM、GPIO、I²S)
Delta-sigma(Σ-Δ)脉宽调制(PWM)音频输出
可在 RP1 外围设备文档中找到更多有关 RP1 的信息。
关于 Pico 系列和其他基于树莓派微控制器的开发板的文档。
树莓派设计的微控制器。
使用 RP2350 微控制器构建开发板和产品。
树莓派设计的微控制器。
使用 RP2040 微控制器构建开发板和产品。
基于 RP2350 的微控制器开发板。
在树莓派 Pico 系列设备和其他基于树莓派微控制器的开发板上进行 C/C++ 开发。
基于 RP2040 的微控制器开发板。
在树莓派 Pico 和其他基于 RP2040 的微控制器开发板上进行 C/C++ 开发。
带有无线功能的基于 RP2040 的微控制器开发板。
使用 C/C++ 或 MicroPython 使树莓派 Pico W 上网。
注意
关于在树莓派 Pico W 上使用 C/C++ 或 MicroPython 进行 Wi-Fi 和蓝牙开发的文档,请参阅 将树莓派 Pico W 连接到互联网 一书。
用于在 RP2040 微控制器上进行 C/C++ 开发的库和工具。
用于 RP2040 微控制器的 MicroPython 环境。
树莓派 Pico C/C++ SDK 的 API 级别 Doxygen 文档也可 作为一个微型网站 提供。
注意
提供了适用于 Windows 10、Windows 11 的 Pico C/C++ SDK 一键安装程序。
树莓派远程访问(Raspberry Pi Connect)可让你在世界上的任意地点,安全地访问你的树莓派。
要使用树莓派远程访问,请在你的树莓派上。然后打开 ,即可在浏览器窗口中访问,运行在你的树莓派上的桌面或 Shell。
Connect 使用安全的加密连接。在默认情况下,Connect 会直接在你的树莓派和浏览器之间进行通信。但是,当 Connect 无法在树莓派和浏览器间建立直接连接时,我们会使用中继服务器。在这种情况下,树莓派官方服务器也仅保留操作 Connect 所需的元数据。
Connect 目前处于 BETA 开发阶段。
注意
要使用 Connect,你的树莓派必须运行着 及更新版本。
要开始安装,请打开终端。运行以下命令,更新你的系统和软件包:
在你的树莓派上,运行以下命令安装 Connect:
安装完成后,请重启你的树莓派或 以使用 Connect:
在下次登录树莓派时,Connect 就会自动启动。
我们提供了 Connect 的替代 精简(Lite) 版本,仅支持远程 Shell 访问,无法进行屏幕共享。
在你的树莓派上,运行以下命令,来安装精简版 Connect:
重启你的树莓派或 来使用 Connect。
考虑,即使你的用户账户未登录,也可访问你的设备。
技巧
精简版命令与完整版 Connect 相同,都叫
rpi-connect
。rpi-connect-lite
只是一个软件包名称而已。
要用命令行手动启动服务,请运行以下命令:
现在你已在树莓派上安装了 Connect,你必须把你的树莓派绑定你的树莓派 ID,才能使用 Connect。
如果你没有树莓派 ID,。
要把你的树莓派绑定树莓派 ID,需要使用 Connect 生成一个验证网址。访问该链接并登录你的树莓派 ID,将你的树莓派添加到你的账户中。
你可以使用树莓派桌面上的 Connect 图标或命令 rpi-connect
生成验证网址。
rpi-connect
服务开始运行后,在系统托盘中将出现Connect 的图标。
单击 Connect 图标,从下拉菜单中选择“Sign in”。
这将打开一个验证网址,你可以用它把你的树莓派绑定到你的树莓派 ID 上。
使用以下命令生成一个链接,将你的树莓派绑定到你的树莓派 ID上:
该命令应输出类似以下内容:
在任意设备上访问生成的验证网址,并使用你的树莓派 ID 登录,将你的树莓派绑定到树莓派 ID。
访问上一步生成的验证 URL。
使用你的 登录 Connect。
认证后,为你的树莓派起个名。请选择一个能帮助你辨识设备的名字。点击“创建设备并登录”按钮可继续。
现在你就可以远程连接到你的树莓派了。Connect 系统托盘图标会变成蓝色,代表你的树莓派已经连接至 Connect 服务。你将会收到一封电子邮件,通知你有新设备登录 Connect。
点击 Connect 系统托盘图标,打开 Connect 菜单。该菜单会显示你的当前登录状态、登出选项,以及启用或禁用远程访问方法的选项。
现在你的树莓派会出现在 Connect 仪表板上,你可以通过浏览器在所有地方访问你的树莓派。Connect 提供了多种远程交互方式。
Connect 能在浏览器中共享你树莓派的屏幕。使用以下说明来共享你树莓派的屏幕。
在任意计算机上访问。
Connect 会将你重定向至树莓派 ID 服务进行登录。登录后,Connect 会显示已连接设备的列表。支持屏幕共享的设备在设备名称下方显示灰色的 屏幕共享 徽章。
点击你想访问的设备右侧的 通过 Connect 按钮。从菜单中选择 屏幕共享 选项。这将打开一个浏览器窗口,显示你树莓派的桌面。
现在你可以像本地使用你的树莓派一样使用它。要了解更多连接信息,请将鼠标悬停在 断开连接 按钮右侧的挂锁图标上。
连接后,Connect 仪表板中 屏幕共享 徽章旁边会出现绿色圆点,表示有活动的屏幕共享会话。悬停以查看当前的屏幕共享会话数。
当屏幕共享会话进行中时,系统托盘中的 Connect 图标会变成紫色并显示一个闭合的圆圈。
要关闭屏幕共享会话,请点击桌面上方的 断开连接 按钮。
要关闭屏幕共享,请点击 Connect 系统托盘图标并取消选择 允许屏幕共享。你的树莓派仍然登录到 Connect,但你将无法从 Connect 仪表板创建屏幕共享会话。
或者,你可以使用以下命令禁用屏幕共享:
在 Connect 仪表板上,屏幕共享 徽章和 通过 Connect 菜单中的 屏幕共享 选项将显示为删除线。
要重新启用屏幕共享,请执行以下操作之一:
点击 Connect 系统托盘图标并选择 允许屏幕共享
运行以下命令:
Connect 包含从浏览器访问在 Raspberry Pi 上运行的 shell 的功能。按照以下说明访问远程 shell。
在其他计算机上访问 。
Connect 会重定向到 Raspberry Pi ID 服务以进行登录。登录后,Connect 显示已链接设备的列表。可远程访问 shell 的设备在设备名称下方显示灰色的 Remote shell 标记。
点击你想访问的设备右侧的 Connect via 按钮。从菜单中选择 Remote shell 选项。这将在你的 Raspberry Pi 上打开一个 shell 会话。
现在你可以像本地一样使用你的 Raspberry Pi。
连接后,Connect 仪表板上的 Remote shell 标记旁边会出现绿色圆点,表示活动的远程 shell 会话。悬停显示当前的远程 shell 会话数量。
当远程 shell 会话进行时,系统托盘中的 Connect 图标会变为紫色,并显示一个闭合的圆圈。
要关闭远程 shell 会话,请运行 exit
命令或关闭窗口。
要关闭远程 shell 访问,请点击 Connect 系统托盘图标并取消选择 Allow remote shell。你的 Raspberry Pi 仍然登录到 Connect,但你将无法从 Connect 仪表板创建远程 shell 会话。
或者,你可以使用以下命令禁用远程 shell 访问:
在 Connect 仪表板上,Remote shell 标记和 Connect via 菜单中的 Remote shell 选项将显示为被划掉。
要重新启用 shell 共享,请执行以下操作之一:
点击 Connect 系统托盘图标并选择 Allow remote shell
运行以下命令:
Connect 作为用户级服务运行,而不是作为 root。因此,只有当你的用户帐户当前在 Raspberry Pi 上登录时,Connect 才能正常工作。如果禁用自动登录并重新启动,这可能导致你的 Raspberry Pi 不可访问。为了即使在你没有登录设备时也能继续运行 Connect,请启用 user-lingering。从你的用户帐户运行以下命令以启用 user-lingering:
Connect 仪表板列出了与你的 Raspberry Pi ID 链接的所有 Raspberry Pi 设备,并显示可以访问它们的各种方法。
点击设备名称以打开设备详细信息页面。该屏幕提供有关设备的低级信息。你还可以编辑设备名称或从 Connect 中删除设备。
从 Connect 中删除设备会自动登出设备上的 Connect。Connect 系统托盘图标变为灰色,并且菜单只提供 Sign in 选项。
要更新到最新版本的 Connect,请运行以下命令:
重新启动设备以使更新生效:
Here's the translation of the provided text:
在树莓派上运行以下命令来注销你的树莓派 ID,这将在连接屏幕上禁用你的设备:
运行以下命令从树莓派上移除连接软件:
卸载后,树莓派的序列号仍与你的树莓派 ID 关联。设备仍然显示在连接仪表板上,但无法用于远程访问。如果你再次安装 Connect,即使使用不同的存储卡,在同一台树莓派上,它将重复使用连接仪表板中现有的设备名称。
要解除树莓派与树莓派 ID 之间的关联,请从连接仪表板的设备列表中移除树莓派。
屏幕共享仅支持共享树莓派的单个主显示器。当树莓派连接多个 HDMI 屏幕时,Connect 有时会共享次要屏幕的内容。你可以通过右键单击桌面并在桌面首选项中更改任务栏位置来解决此问题。
Connect 不支持屏幕键盘。为了完整功能,请使用物理键盘。
Connect 需要支持(ES11)的浏览器,因为它使用了旧版本浏览器中不可用的。
浏览器截获某些键和键组合。因此,你无法将这些键输入到你的 Connect 窗口中。屏幕共享包括一个工具栏,模拟一些最受欢迎的被截获键。
要查看 Connect 服务的当前状态,请运行以下命令:
此命令的输出显示你当前是否已登录到 Connect,以及在你的树莓派上启用的远程服务。
你可以为rpi-connect
及其专用的 WayVNC 服务器启用调试日志,详细记录树莓派上的本地操作。
rpi-connect
中启用增强日志记录用以下命令打开rpi-connect
配置文件进行编辑:
在注释之间输入以下配置行:
最后,使用以下命令重启服务:
wayvnc
服务器中启用增强日志记录打开与 Connect 关联的专用 WayVNC 服务器的配置文件:
在注释之间输入以下配置行:
最后,使用以下命令重启服务:
要查看 Connect 服务及其专用 WayVNC 服务器的日志,请运行以下命令:
$ sudo apt update
$ sudo apt full-upgrade
$ sudo apt install rpi-connect
$ sudo reboot
$ sudo apt install rpi-connect-lite
$ systemctl --user start rpi-connect
$ rpi-connect signin
通过访问 https://connect.raspberrypi.com/verify/XXXX-XXXX 完成登录
警告
如果你收到了一封未知设备登录 Connect 的电子邮件,请立即修改你的树莓派 ID 密码。并从 Connect 中删除设备来永久解除与你账户的绑定。考虑启用双因素身份验证来确保你的账户安全。
注意
屏幕共享需要 Wayland 窗口服务器。默认情况下,树莓派设备仅在树莓派 5、4 或 400 上使用 64 位 发行版的树莓派系统 Bookworm才使用 Wayland。屏幕共享 不支持 精简版树莓派系统和使用 X 窗口服务器的系统。
提示
使用桌面上方的 从远程复制 和 粘贴到远程 按钮在本地和远程剪贴板之间传输文本。
$ rpi-connect vnc off
$ rpi-connect vnc on
提示
在某些操作系统上,浏览器会拦截像 Ctrl + Shift + C 和 Ctrl+C 这样的键组合。你可以使用右键菜单或 Ctrl + Insert 进行复制,Shift + Insert 进行粘贴。
提示
每个远程 shell 连接都会创建一个全新的连接,就像 SSH 一样。要跨多个会话持久化后台命令和配置,请使用 screen
或 tmux
。
提示
CONNECT_TTY
环境变量指示会话使用由 Connect 提供的远程 shell。
$ rpi-connect shell off
$ rpi-connect shell on
$ loginctl enable-linger
$ sudo apt update
$ sudo apt install --only-upgrade rpi-connect
$ sudo reboot
$ rpi-connect signout
提示
要完全从你的连接账户中移除一个树莓派,请从连接仪表板 中移除它。
$ sudo apt remove --purge rpi-connect
提示
如果你安装了 Connect Lite,请在上述命令中使用 rpi-connect-lite
替换 rpi-connect
。
$ rpi-connect status
$ systemctl --user edit rpi-connect
ExecStart=
ExecStart=/usr/bin/rpi-connectd -socket %t/rpi-connect-wayvnc.sock -v
注意
你需要 同时 使用以 ExecStart=
开头的两行。
$ systemctl --user restart rpi-connect
$ systemctl --user edit rpi-connect-wayvnc
ExecStart=
ExecStart=/usr/bin/rpi-connect-env /usr/bin/wayvnc --config /etc/rpi-connect/wayvnc.config --render-cursor --unix-socket --socket=%t/rpi-connect-wayvnc-ctl.sock -Ldebug %t/rpi-connect-wayvnc.sock
注意
你需要 同时 使用以 ExecStart=
开头的两行。
$ systemctl --user restart rpi-connect-wayvnc
$ journalctl --user --follow --unit rpi-connect --unit rpi-connect-wayvnc
要开始你的树莓派之旅,请先准备以下配件:
启动介质(如大容量高速存储卡)
你可以把树莓派配置成带桌面的交互式计算机,也可以将其配置为仅通过网络访问的无头设备(headless)。无需其他外部设备,你就能无头设置树莓派:你可以在安装操作系统时预先配置主机名、用户账户、网络连接和 SSH。但如果你要直接使用树莓派,还需以下若干配件:
显示器
用于把树莓派接入显示器的线缆
键盘
鼠标
下表列出了用于各种款式的树莓派供电所需的 USB-PD 电源适配器。你可以使用其他能提供符合供电功率要求的高品质电源适配器来代替。
树莓派 5
5V/5A、5V/3A(外部设备会被限制到 600mA)
树莓派 4B
5V/3A
树莓派 3(所有系列)
5V/2.5A
树莓派 2(所有系列)
5V/2.5A
树莓派 1(所有系列)
5V/2.5A
树莓派 Zero(所有系列)
5V/2.5A
请把电源适配器接入树莓派(接口标有“POWER IN”、“PWR IN”或“PWR”)。某些型号的树莓派(如 Zero 系列),其 USB 输出接口的规格与电源接口相同。请确保你在树莓派上使用的那个接口是正确的!
树莓派未搭载内置存储,因此需要你来提供启动介质。你可以用安装在受支持的介质上的操作系统,来启动你的树莓派:一般用存储卡,亦可用 USB 存储设备、网络存储设备和通过 PCIe 扩展板转接的存储设备。但是,仅有最新款的树莓派才能支持上述全部类型。
自树莓派 1A+ 以降,所有消费者型号的树莓派都搭载了存储卡槽。把存储卡插入卡槽后,你的树莓派就能自动从存储卡启动。
我们建议,用于安装树莓派系统(Raspberry Pi OS)的存储卡,存储容量至少为 32GB[对于精简版树莓派系统(Raspberry Pi OS Lite),建议至少为 16GB]。你可以使用任意容量不大于 2TB 的存储卡。由于 MBR 的限制,目前不支持容量大于 2TB 的存储卡。同所有其他启动介质一样,读写速度更快的存储卡性能也更佳。
受硬件限制,以下设备仅可从 256GB(及更小)的启动分区上启动:
树莓派 Zero
树莓派 1
基于 BCM2836 SoC 的早期树莓派 2
其他操作系统需求可能各异。请查阅你使用的操作系统文档来了解容量需求。
你可以使用树莓派上的任一 USB 接口来连接有线键盘和 USB 蓝牙接收器。
你可以使用树莓派上的任一 USB 接口来连接有线鼠标和 USB 蓝牙接收器。
树莓派支持以下显示输出功能:
树莓派 5
micro HDMI ×2
树莓派 4(所有系列)
micro HDMI ×2,可使用 3.5 mm 进行音频和复合视频输出
树莓派 3(所有系列)
HDMI,可使用 3.5 mm 进行音频和复合视频输出
树莓派 2 (所有系列)
可使用 3.5 mm 进行 HDMI、音频和复合视频输出
树莓派 1B+
可使用 3.5 mm 进行 HDMI、音频和复合视频输出
树莓派 1A+
可使用 3.5 mm 进行 HDMI、音频和复合视频输出
树莓派 Zero(所有系列)
mini HDMI
注意
所有型号的树莓派均不支持 Type-C 视频传输(DisplayPort alt mode)。
如果你的树莓派有多个 HDMI 端口,请把主显示器插入到标有 HDMI0
的那个口。
常见的显示器都不支持 micro HDMI,亦不支持 mini HDMI。但是,你可以用 micro-HDMI-to-HDMI 转换线 和 mini-HDMI-to-HDMI 转换线来把树莓派上的这些接口转接至 HDMI 显示器。如果显示器不支持 HDMI,请考虑用转换器把 HDMI 输出转为该设备所支持的类型。
所有型号的树莓派都能通过 HDMI、micro HDMI 或 mini HDMI 进行音频输出,且都支持通过 USB 进行音频输出。所有搭载了蓝牙的树莓派都支持蓝牙音频。所有基于树莓派 1、2、3 和 4 的型号都有一个 3.5 mm 的 TRRS AUX 耳机插孔,但可能需要用放大器才能得到足够大的音量输出。
如下型号的树莓派配备了 WiFi 和蓝牙连接功能:
树莓派 5
树莓派 4
树莓派 3B+
树莓派 3
树莓派 Zero W
树莓派 Zero 2 W
后缀“B”代表带以太网接口的款式,“A”代表不带以太网接口。如果你的树莓派没有以太网接口,你还可以用 USB 转以太网转换器来连接有线互联网。
如果你要使用树莓派,还需要操作系统。在默认情况下,树莓派会在卡槽里的存储卡中查找操作系统。
视你的树莓派型号而定,也许你还能用别的存储设备来启动操作系统,比如 USB 设备、网络存储和同扩展板接入的存储设备。
要让存储设备提供树莓派操作系统,你需要:
能把镜像写入到该存储设备的计算机
把你的存储设备接入该计算机的方法
大多数树莓派用户会选择使用存储卡作为他们的启动设备。
我们建议用树莓派启动盘制作工具来安装操作系统。
树莓派启动盘制作工具是一款能帮助你在 macOS、Windows 和 Linux 上下载和写入镜像的软件。启动盘制作工具包含了许多常见的树莓派操作系统镜像。它还能直接加载已下载的镜像,比如树莓派和第三方供应商(如 Ubuntu)。你可以用它预配置树莓派的凭据,设定远程访问。
启动盘制作工具亦兼容打包成 .img
格式的镜像,以及像 .zip
这样的压缩文件。
如果你没有能把镜像写入到存储设备的计算机,你可以通过互联网直接在你的树莓派上安装操作系统。
你可以通过如下方式安装树莓派启动盘制作工具:
在树莓派官网 raspberrypi.com/software 上下载运行最新版本的安装程序。
在终端里用包管理器安装,如 sudo apt install rpi-imager
。
在树莓派启动盘制作工具安装完成后,单击启动盘制作工具的图标(或执行 rpi-imager
)即可启动应用程序。
单击“选择设备(Choose device)”,然后从列表中选定你的树莓派型号。
接下来,单击“选择操作系统(Choose OS)”,然后选定要安装的操作系统。树莓派启动盘制作工具将始终在列表顶部显示树莓派系统(Raspberry Pi OS),且是适用于你树莓派型号的推荐版本。
将所选存储设备接入计算机。若使用外部/内置存储卡读卡器,请先插入存储卡。然后,单击“选择存储设备(Choose storage)”,选择你的存储设备。
警告
如果你的计算机接入了多款存储设备,请务必选择正确的那款设备! 通常可以用大小来识别存储设备。如不确定,请断开其他设备,直到能确定要写入镜像的存储设备。
接下来,点击“下一步(Next)。
在弹出窗口中,树莓派启动盘制作工具会要求你应用操作系统设置。我们强烈建议使用自定义系统配置来设定你的树莓派。单击“编辑设置(Edit Settings)”按钮可打开自定义系统配置( OS customisation)。
如果你没有用自定义系统配置这个功能来设定你的树莓派,在首次启动时,树莓派系统会在配置向导中,要求你再次提供相同内容。你可以单击选项“否(No)”来跳过自定义系统配置。
操作系统定制菜单能让你在首次开机之前,设定你的树莓派。你可以预先配置:
用户名和密码
WiFi 凭据
设备主机名
时区
键盘布局
远程连接
在你首次打开菜单自定义系统配置时,你也许会看到一个提示,询问你是否允许从计算机加载 WiFi 凭据。如果你回答“确认”,启动盘制作工具将从你当前连接的网络预填 Wi-Fi 凭据。如果你回答“否”,你可手动输入 WiFi 凭据。
选项 主机名(hostname) 设定了你的树莓派在网络上广播的主机名(使用 mDNS)。当你把树莓派接入网络后,网络上的其他设备就可以使用 <你的主机名>.local
或 <你的主机名>.lan
与你的树莓派进行通信。
选项 用户名(username)和密码(password) 设定了树莓派上管理员用户账户的用户名和密码。
选项 无线局域网(wireless LAN) 能让你输入无线网络的 SSID(网络名称)和密码。如果你的网络未公开广播 SSID,则应启用“隐藏 SSID”设置。在默认情况下,制作工具会使用你当前所在的地区作为“无线局域网地区”。该设置控制着树莓派使用的 WiFi 广播频率。如果你打算运行无头树莓派,请为无线局域网这个参数输入凭据。
选项 本地化设置( locale settings) 能为你的树莓派设定时区和默认键盘布局。
菜单 服务(Services) 涉及了帮助你远程连接到树莓派的配置。
如果你打算用网络远程使用你的树莓派,请勾选“启用 SSH(Enable SSH)”旁边的方框。或者说,如果你想要不靠显示器直接运行树莓派,请启用该功能。
选择选项 密码验证(password authentication) ,可使用你在自定义系统配置的通用选项卡中提供的用户名和密码通过网络 SSH 连接到你的树莓派。
选择 仅允许公钥验证(Allow public-key authentication only ),可为你的树莓派预配置无密码,仅公钥的 SSH 验证,默认会使用你当前计算机上的私钥。如果你的 SSH 配置中已经有 RSA 密钥,制作工具将使用该公钥。如果没有,你可单击“运行 SSH-keygen(Run SSH-keygen)”来生成公私钥对。制作工具会使用新生成的公钥。
自定义系统配置还有“可选配置(Options)”这个菜单,能让你在写入过程中配置制作工具的操作。这些参数能让你在制作工具完成镜像校验时播放声音、在校验后自动卸载存储介质和禁用遥测。
当你完成自定义系统配置的设定后,可单击“保存(Save)”来保存你的定制选项。
然后,在将镜像写入存储设备时,可单击“确认(Yes)”应用自定义系统配置。
最后,点击弹出窗口“你确定要继续吗?(Are you sure you want to continue?
)”中的“确认(Yes)”,开始向存储设备写入数据。
如果看到要求管理员权限以读取和写入存储介质的提示,要继续,请授予制作工具权限。
这可能需要几分钟。去喝杯咖啡,散散步吧。
如果你想要找刺激,可以点击 取消校验(cancel verify) 来跳过校验这个过程。
当你看到弹出窗口“写入成功”时,表示镜像已完全写入和验证。现在你可以从存储设备启动树莓派了!
接下来,继续进行首次启动配置说明,让你的树莓派跑起来。
网络安装能让树莓派使用制作工具通过网络下载的镜像(存储在设备上)进行操作系统的安装。使用网络安装,你可以在树莓派上安装操作系统,而无需存储卡读卡器,也不需要除树莓派之外的计算机。你可以在所有受支持的存储设备上运行网络安装——如存储卡和 USB 存储设备。
网络安装仅适用于树莓派 4、400、5。如果你的树莓派的引导加载程序比较旧,你可能需要更新引导加载程序才能使用网络安装。
网络安装须满足以下条件:
树莓派型号受支持且固件支持网络安装
显示器
键盘
有线网络连接
要启动网络安装,请在以下配置的基础上,按住 SHIFT 键,同时接通你的树莓派电源:
存储设备未写入镜像
已接入键盘
已接入兼容的存储设备,如存储卡、USB 存储设备
如果你尚未将树莓派连接到互联网,请使用网线进行连接。
连接到互联网后,你的树莓派会下载树莓派的安装程序。若下载失败,你可以重复该过程,再试一次。
在树莓派启动盘制作工具下载完成后,你的树莓派会自动运行启动盘制作工具。有关运行启动盘制作工具的更多信息,请参阅安装操作系统。
有关网络安装配置的更多信息,请参阅 HTTP 引导。
在操作系统镜像写入完成后,把存储设备接入你的树莓派。
首先,拔掉树莓派的电源适配器插头,确保在连接外部设备时,树莓派已关机。如果你在存储卡上安装了操作系统,现在就可以把存储卡插入树莓派的卡槽。如果你在其他存储设备上安装了操作系统,现在就可以将它接入树莓派了。
然后,插入所需的其他外部设备,如鼠标、键盘和显示器。
最后,把电源接入你的树莓派。当你的树莓派开机时,你将看到 LED 状态灯亮起。如果你的树莓派接入了显示器,你在几分钟后就能看到启动屏幕。
如果你在启动盘制作工具中使用了系统自定义来预配置你的树莓派,恭喜你! 你的设备已经准备就绪。可继续下一步,了解如何充分发挥你的树莓派。
若你的树莓派在 5 分钟后仍无法启动,请检查 LED 状态灯。如果 LED 灯闪烁,请查看 LED 警告指示灯以获取更多信息。如果你的树莓派无法启动,可尝试以下解决方案:
如果你的启动设备不是存储卡,请先试试用存储卡启动
为你的存储卡重新写入镜像; 确保在启动盘制作工具中完成了完整的校验步骤
如果你在启动盘制作工具中选择跳过了系统定制,则你的树莓派会在首次启动时运行配置向导。你需要显示器和键盘(没有鼠标也能完成)来设置向导。
如果你正在使用蓝牙键盘、蓝牙鼠标,此步骤将指引你完成设备配对。你的树莓派将扫描可配对的设备,然后连接至第一个扫描到的设备。
此过程适用于内置/外置 USB 蓝牙适配器。如果你使用 USB 适配器,请在启动树莓派前插入。
此页面可帮助你配置区域、语言、时区和键盘布局。
此页面可帮助你配置默认用户账户的用户名和密码。
在默认情况下,旧版树莓派系统会把用户名设置成“pi”。如果你使用的用户名是“pi”,请不要使用旧系统中的默认密码——“raspberry”,来确保你树莓派的安全性。
该页面能帮助你连接到 WiFi 网络。从列表中选择你需要的网络。
如果你的网络需要密码验证,你可以在这里输入。
此页面能让你选择:把默认的互联网浏览器设定为 Firefox(火狐浏览器)或者 Chromium(开源的 Chrome)。对于那个你未设置成默认的浏览器,你可以选择卸载。
当你的树莓派接入互联网后,此页面能帮你把操作系统和软件更新到最新版本。在软件更新过程中,向导会删除非默认浏览器(如果你在默认浏览器这一步选择卸载它)。可能需要几分钟时间才能完成更新。
当你看到弹出窗口指示系统已经更新,请点击“确定(OK)”继续下一步。
在配置向导结束后,点击“重启(Restart)”来重启你的树莓派。你的树莓派将应用个性化并启动至桌面。
树莓派已经设定且准备就绪,接下来做什么?
树莓派操作系统预装了许多基本应用程序,因此可开箱即用。如果你想使用那些我们认为有用的软件,请单击屏幕左上角的树莓派图标。选择 首选项(Preferences) > 推荐软件(Recommended Software),你将找到软件包管理器。你可以在那免费安装各种推荐软件。
具体来说,如果你打算把树莓派当家用电脑用,你可能会需要 LibreOffice,它对于撰写和编辑文档和电子表格极有用。你还可以使用诸如屏幕放大器和 Orca 屏幕阅读器之类的工具,来让树莓派更易于使用,这些应用程序在通用访问里。
我们的教程向你介绍了各种有关你新树莓派使用的方法。你可以跟随那些让你感兴趣的教程,来学习编程、控制外部设备,创建令人激动的新项目。
对于树莓派官方产品的支持,与其他树莓派用户交流,请访问树莓派论坛。
你可以在由 Gareth Halfacree 撰写的最新版《树莓派官方初学者指南》中找到有关树莓派入门使用的更多信息。
可学习如何:
配置你的树莓派,为其安装操作系统,并开始使用这台功能齐全的计算机。
使用编程语言 Scratch 3、Python 和 MicroPython,通过逐步指南开始编程项目。
尝试连接电子元件,乐在其中,创造令人惊叹的项目。
第五版的新增内容:
针对最新的树莓派计算机进行更新:树莓派 5 和树莓派 Zero 2 W。
涉及最新的树莓派系统。
涉及树莓派 Pico 的新章节!
你可以在树莓派出版社的网站上购买这本书。
现有若干款树莓派官方摄像头模块。最早的 500 万像素型号发布于 2013 年,随后于 2016 年发布了 800 万像素的摄像头模块 2。最新款的摄像头是发布于 2023 年的 1200 万像素的摄像头模块 3。最早的 500 万像素摄像头树莓派现已停产。
上述所有摄像头都有可见光和红外夜视版本。除此之外,摄像头模块 3 还带有标准、广角类型,总计四种不同的版本。
摄像头模块 3(左)和摄像头模块 3 广角(右)
摄像头模块 3 红外夜视(左)和摄像头模块 3 红外夜视广角(右)
此外,于 2020 年推出了可与外置镜头搭配使用的 1200 万像素的高质量摄像头,配有 CS 卡口——于 2023 年推出了 M12 卡口。高质量(HQ)摄像头没有红外夜视版本,但可根据需要拆除红外滤镜。
高质量(HQ)摄像头,M12 卡口(左)和 C/CS 卡口(右)
最后,有全局快门相机(发布于 2023 年)。GS 相机没有红外版本(但如有需要,也可拆除红外滤镜)。
全局快门相机
注意
树莓派摄像头模块同所有搭载了 CSI 接口的树莓派计算机均兼容——即仅与树莓派 400 和旧版 Zero 不兼容。
大多数数码相机,包括我们的摄像头模块,都使用 卷帘快门:它们会对正在捕捉的图像逐行扫描,然后输出结果。你可能已经注意到,在某些情况下,这可能会造成失真效果;如果你曾经拍摄过旋转的螺旋桨叶片,你可能已经注意到了,场景在晃动,看起来不像一个正在旋转的物体。螺旋桨叶片有足够的时间在相机扫过和观察场景的瞬间内变更位置。
全局快门 不会这样做,就像我们的全局快门摄像头模块上的那个。它能一次性捕捉场景中每个像素的光线,因此你拍摄的螺旋桨叶片照片不会遇到相同的失真问题。
这有什么用呢?高速移动的物体,比如那些螺旋桨叶片,现在很容易捕捉到;我们还可以同步多台摄像头在同一时刻拍摄照片。这有很多好处,比如在捕捉立体图像时最小化失真。(如果左眼出现的运动尚未出现在右眼中,人类大脑会感到困惑。)树莓派全局快门摄像头还可以在较短的曝光时间内运行——在足够的光线下可达到 30 微秒。而卷帘快门相机则无法做到,这使全局快门在高速摄影中非常有用。
注意
全局快门摄像头的图像传感器带有 6.3 毫米对角线活动感应区域,与树莓派的高质量(HQ)摄像头大小类似。但像素更大,可以收集更多光线。大像素尺寸和低像素计数在机器视觉应用中非常有好处;传感器产生的像素越多,实时处理图像就越困难。为了解决这个问题,许多应用程序会缩小和裁剪图像。使用全局快门摄像头和适当的镜头放大倍率,是无必要的,因为较低的分辨率和较大的像素尺寸意味着可以原生捕捉图像。
警告
摄像头对静电极为敏感。在处理 PCB 之前请先将自己接地。如果没有接地带,水龙头和类似物品大概也行。
将柔性电缆插入到树莓派上标有摄像头的接口中,该接口位于以太网口和 HDMI 口间。电缆必须以银色接触面朝向 HDMI 口插入。要打开接口,请将接口顶部的标签向上拉,然后朝向以太网口。柔性电缆应牢固插入接口中,注意不要使电缆以太锐角度弯曲。要关闭接口,请将接口顶部部分向 HDMI 口推下,同时保持线缆位置固定。
我们制作了一个视频来演示连接摄像头的过程。虽然视频中显示的是旧的树莓派 1 上的旧款摄像头,但对于所有摄像头模块,原理都是相通的。
根据型号而定,摄像头可能会附带一小片半透明蓝色塑料薄膜覆盖镜头。这只是为了在邮寄给你时保护镜头,使用时需将它轻轻剥下来。
注意
高质量(HQ)摄像头上推荐的 6mm、16mm 镜头有其他的文档说明。
在继续之前,我们建议,确保你的内核、GPU 固件和应用程序都是最新版本。请参照保持操作系统最新的说明。
然后,请按照 rpicam-apps 的相关设置说明以及 Picamera2 Python 库。
净价
$25
$25
$25
$35
$50
$50
尺寸
大约 25 × 24 × 9 mm
大约 25 × 24 × 9 mm
大约 25 × 24 × 11.5 mm
大约 25 × 24 × 12.4 mm
38 x 38 x 18.4mm(不含镜头)
38 x 38 x 19.8 mm(搭配适配器和防尘盖则为 29.5 mm)
重量
3 g
3g
4g
4g
30.4 g
34 g(搭配适配器和防尘盖则 41 g)
静态分辨率
500 万像素
800 万像素
1190 万像素
1190 万像素
1230 万像素
1.58 百万像素
视频模式
1080p30,720p60 和 640 × 480p60/90
1080p47,1640 × 1232p41 和 640 × 480p206
2304 × 1296p56,2304 × 1296p30 HDR,1536 × 864p120
2304 × 1296p56,2304 × 1296p30 HDR,1536 × 864p120
2028 × 1080p50,2028 × 1520p40 和 1332 × 990p120
1456 x 1088p60
传感器
OmniVision OV5647
索尼 IMX219
索尼 IMX708
索尼 IMX708
索尼 IMX477
索尼 IMX296
传感器分辨率
2592 × 1944 像素
3280 × 2464 像素
4608 x 2592 像素
4608 x 2592 像素
4056 x 3040 像素
1456 x 1088 像素
传感器图像区域
3.76 × 2.74 mm
3.68 x 2.76 mm(对角线为 4.6 mm)
6.45 x 3.63 mm(对角线 7.4 mm)
6.45 x 3.63 mm(对角线 7.4 mm)
6.287 mm x 4.712 mm(对角线 7.9 mm)
6.3 mm 对角线
像素大小
1.4 µm × 1.4 µm
1.12 µm x 1.12 µm
1.4 µm x 1.4 µm
1.4 µm x 1.4 µm
1.55 µm x 1.55 µm
3.45 µm x 3.45 µm
光学尺寸
1/4 英寸
1/4 英寸
1/2.43 英寸
1/2.43 英寸
1/2.3 英寸
1/2.9 英寸
焦点
固定
可调
电动
电动
可调
可调
景深
大约 1 米到 ∞
大约 10 厘米到 ∞
大约 10 厘米到 ∞
大约 5 厘米到 ∞
不适用
不适用
景深
大约 1 m 到 ∞
大约 10 cm 到 ∞
大约 10 cm 到 ∞
大约 5 cm 到 ∞
不适用
不适用
焦距
3.60 mm +/- 0.01
3.04 mm
4.74 mm
2.75 mm
取决于镜头
取决于镜头
水平视场角(FoV)
53.50 +/- 0.13°
62.2°
66°
102°
取决于镜头
依赖于镜头
垂直视场角(FoV)
41.41 +/- 0.11°
48.8°
41°
67°
取决于镜头
取决于镜头
焦距比(光圈)
F2.9
F2.0
F1.8
F2.2
取决于镜头
取决于镜头
最大曝光时间(秒)
0.97
11.76
112
112
670.74
15.5
镜头卡口
不适用
不适用
无法适用
无法适用
C/CS 和 M12 卡口
C/CS
有无 NoIR(红外夜视)版本?
有
有
有
有
无
无
注意
有证据表明,摄像头模块 3 可能会以 CSI 时钟速率的谐波发射射频干扰。这种射频干扰的范围可能会干扰 GPS L1 频率(1575 MHz)。请参阅 Github 上的主题以获取详细信息和提出的解决方法。
可用的机械图纸;
摄像头模块 2 PDF
摄像头模块 3 PDF
摄像头模块 3 宽幅 PDF
摄像头模块 3 STEP 文件
HQ 摄像头模块(CS 卡口版本)PDF
CS 接口 PDF
HQ 摄像头模块(M12 卡口版本)PDF
GS 摄像头模块 PDF
注意
摄像头模块 3 的主板尺寸和安装孔位置与摄像头模块 2 相同。但是,由于传感器模块尺寸和位置的变化,它与树莓派 Zero Case 的摄像头外壳不具备机械兼容性。
树莓派 CSI 摄像头连接器的原理图。
其他可用的原理图;
摄像头模块 2 PDF
摄像头模块 3 PDF
HQ 摄像头模块 PDF
摄像头模块 3 和 HQ 和 GS 摄像头的一些传输特性可用。
注意
这些图表可用作 PDF 文件。
摄像头模块 3 是基于 IMX708 开发的,具有以下光谱灵敏度特性。
树莓派 HQ 摄像头没有红外切除滤镜。
树莓派 GS 摄像头,无红外切换滤镜。
HQ 和 GS 相机使用 Hoya CM500 红外滤光片。其透射特性如下图所示。
注意
该程序适用于 HQ 和 GS 相机。
警告
该步骤无法逆转:连接滤镜的粘合剂在被揭起并更换后将无法维持,而红外滤镜厚约 1.1 mm,在被移除时可能会破裂。移除它将失去保修。然而,对一些用户来说,移除滤镜是可取的。
高质量摄像头和全局快门摄像头都包含一个红外滤镜,用于降低摄像头对红外光的敏感性。它使得户外照片看起来更自然。然而,可以通过移除此滤镜来增强一些自然摄影;天空、植物和水的颜色可能会受到其移除的影响。在受红外光照明的地方,摄像头也可以在没有滤镜的情况下用于夜视。
警告
在继续之前,请阅读所有步骤并决定是否愿意使保修失效。除非你确定愿意放弃保修,否则不要继续。
要摘掉滤镜:
请在干净无尘的环境中工作,因为传感器将暴露在空气中。
在主电路板底部的两个 1.5 mm 六角锁定键上拧下。小心不要让触点圈滚开。在外壳和 PCB 之间有一层略带粘性的触点片,需要用一点力气才能分开。
将板子抬起并放在特别干净的表面上。确保传感器不会触及表面。
你可以尝试一些方法来溶解粘合剂,例如少量异丙醇、加热(~20-30 °C)。
将镜头底座转过来,使其朝上,并放在桌子上。
使用钢笔盖或类似软塑料物品,仅在玻璃与铝相连接的边缘处施加压力,以最大程度降低破坏滤镜的风险。胶水会断裂,滤镜会从镜头座上脱落。
鉴于更换镜头会暴露传感器,此时你可以固定一个透明滤镜(例如 OHP 塑料)以最小化灰尘进入传感器腔的机会。
将主机壳体放回电路板上。务必将壳体与仍留在电路板上的触点圈重新对齐。
尼龙触点圈可防止电路板受损;先放置这个触点圈。接着,放置钢触点圈,可防止尼龙触点圈受损。
将两个六角锁紧键拧紧。只要触点圈按正确顺序安装,就不需要拧得太紧。
注意
可能很难或压根没法通过将滤镜粘回原位来使设备恢复正常光学相机的功能。
以下镜头建议与我们的 HQ 和 GS 摄像头一起使用。
注意
虽然 HQ 摄像头有 C/CS 和 M12 卡口版本,但 GS 摄像头仅有 C/CS 安装版本。
我们推荐两款镜头,一款 6mm 广角镜头和一款 16mm 远摄镜头。这些镜头应该可以在你最近的授权经销商处购买到。
分辨率
10MP
3MP
图像格式
1"
1/2"
光圈
F1.4 至 F16
F1.2
卡口
C
CS
视场角水平°×垂直°(对角°)
HQ
22.2°×16.7° (27.8°)
GS
17.8°×13.4° (22.3)
45°×34° (56°)
背焦距
17.53 mm
7.53 mm
M.O.D.
0.2 m
0.2 m
尺寸
φ39.00×50.00 mm
φ30×34 mm
我们推荐由高嘉光电制造的三款镜头。这些镜头应该可以从你最近的授权经销商那里购买。
分辨率
12MP
5MP
15MP
图像格式
1/1.7 英寸
1/2 英寸
1/2.3 英寸
光圈
F1.8
F2.4
F2.5
安装
M12
HQ 视场角 H°×V° (D°)
49°×36° (62°)
14.4°×10.9° (17.9)°
140°×102.6° (184.6°)
HQ 摄像头和全局快门摄像头都支持同步捕获。利用 XVS 引脚(垂直同步)使一台摄像头在启动帧捕获时脉冲。另一台摄像头可以监听此同步脉冲,并在另一台摄像头同时捕获帧。
为了正确运行,两个摄像头都需要在 XVS 线上提供 1.65V 的上拉电压,这是通过树莓派上的 3.3V 和 GND 引脚通过电位分压器创建的。
从两个 10kΩ 电阻器到 3.3V 和地(通过有效源阻抗为 5kΩ 制造 1.65V)创建一个电位分压器。这可以连接到任一款树莓派。
将每个 HQ 摄像头板的 GND 和 XVS 测试点焊接在一起。
将 XVS 线连接到 1.65V 电位分压上拉电阻。
文件 /sys/module/imx477/parameters/trigger_mode
可确定哪个板输出脉冲,或等待接收脉冲(接受端和发送端)。此参数只能在超级用户模式下更改。
在接收端运行:
sudo su
echo 2 > /sys/module/imx477/parameters/trigger_mode
exit
在发送端运行:
sudo su
echo 1 > /sys/module/imx477/parameters/trigger_mode
exit
启动接收端,运行:
rpicam-vid --frames 300 --qt-preview -o sink.h264
启动发送端,运行
rpicam-vid --frames 300 --qt-preview -o source.h264
帧应该是同步的。使用 --frames
来确保捕获相同数量的帧,并且录制的长度完全相同。首先运行接收器可以确保不会丢失任何帧。
注意
需要电位分压器将 XVS 引脚拉高,同时源处于空闲状态。这可以确保在启动时不会创建或丢失任何帧。源在初始化时从低电平变为高电平,这可能会触发错误帧。
注意
全局快门(GS)摄像头也可以在同步模式下操作。然而,源摄像头将记录一帧额外的画面。确保两台摄像头捕获相同数量帧的一个更好的替代方法是使用外部触发方法。
要作为源和接收器一起运行,全局快门摄像头还需要将 XHS(水平同步)引脚连接在一起。然而,这些不需要连接到上拉电阻。
与 HQ 摄像头方法相同,接线设置相同,只是你还需要将 XHS 引脚连接在一起。
从两个 10kΩ 电阻器中创建一个电位分压器,连接到 3.3V 和地(以使 1.65V,有效源阻抗为 5kΩ)。这可以连接到任一树莓派。
在每个板上的 XVS 测试点上焊接 2 根导线,并将这两根导线连接到 1.65V 电位分压器。
将每个摄像头板的 GND 焊接在一起。还要在每个板的 XHS 测试点上焊接 2 根导线并连接它们。XHS 引脚不需要上拉。
在你希望作为接收端的板上,将 MAS 焊盘的两半焊接在一起。这告诉传感器要作为接收端,并等待信号来捕获一帧。
启动接收端,运行:
rpicam-vid --frames 300 -o sync.h264
在启动发送之前允许延迟(见下面的说明)。需要大约 > 2 秒。
启动发送端,运行:
rpicam-vid --frames 299 -o sync.h264
ffmpeg -i source.h264 -vf select="gte(n\, 1)" source.h264
全局快门(GS)相机可以通过在板上标记为 XTR 的外部触发(脉冲)连接来进行外部触发。多个相机可以连接到同一个脉冲,从而实现同步两个相机的另一种方式。
曝光时间等于低脉冲宽度时间加上额外的 14.26 微秒。即低脉冲为 10000 微秒时,曝光时间为 10014.26 微秒。帧速率直接受控于脉冲引脚的频率。30Hz 的 PWM 频率将导致帧速率为 30 帧每秒。
警告
此修改包含了对一个 SMD 焊接部件的拆除。除非你觉得你有能力完成此修改,否则请勿尝试。在焊接到摄像头板时,请摘下塑料背盖以避免损坏。
如果你的主板上安装了晶体管 Q2(如下图蓝色所示),那么你需要从主板上移除 R11(如下图红色所示)。这将 GP1 连接到 XTR,如果不移除 R11,则摄像头将无法在外部触发模式下运行。组件的位置如下图所示。
接下来,在 GS 摄像头板的 XTR 和 GND 的触点上焊接一根导线。请注意,XTR 是 1.8V 输入,因此你可能需要电平转换器或电位分压器。
我们可以使用树莓派 Pico 来提供触发信号。将任意 Pico GPIO 引脚(此示例中使用 GP28)通过 1.5kΩ 电阻连接到 XTR。还要在 XTR 和 GND 间连接一个 1.8kΩ 电阻,以将高逻辑电平降低到 1.8V。下面显示了接线图。
通过超级用户模式启用外部触发:
sudo su
echo 1 > /sys/module/imx296/parameters/trigger_mode
exit
from machine import Pin, PWM
from time import sleep
pwm = PWM(Pin(28))
framerate = 30
shutter = 6000 # In microseconds
frame_length = 1000000 / framerate
pwm.freq(framerate)
pwm.duty_u16(int((1 - (shutter - 14) / frame_length) * 65535))
低脉冲宽度等于快门时间,PWM 的频率等于帧速率。
注意
在这个例子中,Pin 28 用于连接到 GS 摄像头板上的 XTR 触点。
在 Pico 上运行代码,并启动摄像头:
rpicam-hello -t 0 --qt-preview --shutter 3000
每次 Pico 脉冲引脚时都应生成一帧。可接受可变帧速率,并且可以通过简单地改变脉冲之间的持续时间来控制。不需要传递什么参数给 rpicam-apps
来启用外部触发器。
注意
在运行工具 libcamera 时,你需要指定固定的快门持续时间(数值无所谓)。这将确保 AGC 不会尝试调整摄像头的快门速度,快门速度由外部触发脉冲控制。
树莓派音频扩展板可为你现有的高保真音响设备或基于树莓派的设备和项目提供高质量音频。我们提供了四种不同硬件的扩展板。适用于使用 40 针 GPIO 引脚的树莓派型号。
每块板都有特定的用途和一组功能。DAC PRO,DAC+ 和 DigiAMP+ 扩展板支持高达全高清音频(192kHz)的最高音质播放;而 Codec Zero 支持高达高清音频(96kHz),并包括内置麦克风,非常适合迷你项目。
线路输出(Line out)
平衡输出(Balanced out)
立体声扬声器
单声道扬声器
耳机
AUX 输入
AUX 输出
外接麦克风
内置麦克风
DAC Pro
✓
✓
✓
DAC+
✓
✓
数字放大器+
✓
编解码器 Zero
✓
✓
✓
✓
✓
线路输出 A 双声道 RCA 连接器,通常为红色和白色。此输出是可变模拟信号(0-2V RMS),可连接到你现有的高保真系统(前置放大器或功放),或用于驱动具有自己内置功放的有源音箱。
平衡输出 XLR 连接器,通常是三针公连接器。这在工作室设置中使用,在一些高端高保真系统中也使用。它也可以用于驱动像那些在俱乐部或舞台上对着 DJ 或表演者的主动监听扬声器。
立体声扬声器两组 2×25W 扬声器的螺钉端子。这些是传统的没有内置放大的高保真扬声器。这些被称为被动扬声器。
单声道扬声器一个单独的 1.2W 扬声器的螺钉端子,如晶体管收音机或类似产品中所找到的。
一个 3.5 mm 插孔插座,为一副耳机提供立体声音频。树莓派 DAC 板上的耳机放大器可驱动高达 80/90Ω 的阻抗耳机。
Aux in 双 Phono/RCA 连接器或 3.5 mm 插孔。可接受高达 1V RMS 的模拟音频输入。这可用于从可变模拟源(如手机,MP3 播放器或类似设备)录制音频。
Aux out 双 Phono/RCA 连接器或 3.5 mm 插孔。提供高达 1V RMS 的模拟音频输出。这可用于将音频馈送到放大器中,与 Line out 相比音量降低。
用于与外部电容麦克风配合使用的外部麦克风 3.5 mm 插孔。当使用外部麦克风插座时,会自动禁用 Codec Zero 上的内置 MEMS 麦克风。
树莓派 DAC Pro HAT 是我们最高保真度的数字模拟转换器(DAC)。
使用 Texas Instruments PCM5242,DAC Pro 提供出色的信噪比(SNR),支持平衡/差分输出,并与留声机/RCA 线级输出并行。它还包括专用耳机放大器。DAC Pro 由树莓派通过 GPIO 排针供电。
作为 DAC Pro 的一部分,两个三针标头(P7/P9)位于树莓派的 USB 和以太网接口上方,供可选的 XLR 板使用,允许差分/平衡输出。
P1
模拟输出(0-2V RMS),携带 GPIO27,静音信号(耳机检测),左右音频和左右地线。
P6
耳机插孔信号(1:左,2:地线,3:右,4:地线,5:检测)。
P7/9
差分(0-4V RMS)输出(P7:左,P9:右)。
P10
替代 5V 输入,与树莓派并联供电。
Pi-DAC PRO 通过一个 6 针头连接器暴露出一个可选的 XLR 板,通过 XLR 插座提供差分/平衡输出,位于树莓派的 USB/以太网接口上方。
XLR 连接器用于工作室和一些高端 hifi 系统。它也可用于驱动在迪斯科或舞台上使用的主动“监视器”扬声器。
树莓派 DAC+ 是一款可提供 24 位 192kHz 数字音频输出的高分辨率音频输出 HAT。
DAC+ 中使用了德州仪器 PCM5122,将模拟音频传输到设备的音频插座。它还支持专用耳机放大器,并通过树莓派 GPIO 引脚头取电。
P1
模拟输出(0-2V RMS),携带 GPIO27,静音信号(耳机检测),左右音频和左右地线。
P6
耳机插孔信号(引脚 1:左,2:地线,3:右,4:地线,5:检测)。
使用树莓派 DigiAMP+,你可连接 2 个无源立体声扬声器,输出功率高达 35W,可变输出,非常适合用于基于树莓派的高保真系统。
DigiAMP+ 使用德州仪器 TAS5756M PowerDAC,必须由外部电源供电。它需要 12-24V 直流电源(建议使用 XP Power VEC65US19 电源适配器)。
DigiAMP+ 的电源桶连接器尺寸为 5.5mm x 2.5mm。
在上电时,默认情况下放大器会被静音(静音 LED 灯亮起)。软件负责静音状态和 LED 控制(树莓派 GPIO22)。
DigiAMP+ 旨在同时并联为树莓派和 DigiAMP+ 提供电源,通过 GPIO 接口为树莓派提供 5.1V 2.5A 的电流。
警告
在使用 DigiAMP+ 时,请勿向树莓派的电源输入接口供电。
P5
用于硬线安装的备用电源输入(必须遵守极性)。
P8
TAS5756m 内部 GPIO1/2/3
树莓派 Codec Zero 是一款树莓派 Zero 尺寸的音频 HAT。它在树莓派和 Codec Zero 的内置 Dialog Semiconductor DA7212 编解码器之间传递双向数字音频信号(I²S)。Codec Zero 支持各种输入和输出设备。
高性能 24 位音频编解码器
支持 8-96kHz 之间的常见音频采样率
内置微机电(MEMS)麦克风(Mic2)
单声道电容式麦克风(Mic2 左)
在检测到 Mic2 插入时自动禁用 MEMS
支持额外的(不适合)单声道电容麦克风(Mic1 右)
立体声辅助输入通道(AUX IN)- PHONO/RCA 连接器
立体声辅助输出通道(耳机/AUX OUT)
灵活的模拟和数字混音路径
自动电平控制(ALC)的数字信号处理器(DSP)
五段均衡器
单声道线路输出/迷你扬声器驱动器:1.2 W @ 5V,THD<10%,R=8Ω
Codec Zero 内置了 EEPROM,必要时可用于自动配置 Linux 环境。它具有集成的 MEMS 麦克风,并可通过 3.5 mm 插孔与立体声麦克风输入和单声道扬声器(1.2 W/8Ω)一起使用。
除了绿色(GPIO23)和红色(GPIO24)LED 灯外,还提供了一个可编程的触觉按钮(GPIO27)。
P1/2
如果需要,支持外部 PHONO/RCA 插座。P1:AUX IN,P2:AUX OUT。
P1
第 1 针是方形的。
Codec Zero 是小型项目的理想设计起点,如对讲机、智能门铃、复古收音机改装或智能音箱。
所有树莓派音频扩展板上都包含了预编程的 EEPROM。树莓派音频扩展板设计为即插即用;树莓派系统可自动检测并配置。在树莓派系统中,用右键单击屏幕右上角的音频设置,可以在板载音频设置和 HAT 音频设置之间切换:
有许多第三方音频软件应用程序适用于树莓派,支持我们音频扩展板的即插即用功能。他们通常无需屏幕。它们可以通过 PC 或 Mac 应用程序控制,也可以通过安装在树莓派上的 Web 服务器控制,并通过网页进行交互。
如果你需要自行配置树莓派系统(也许是因为你正在运行自己的无头系统,无法通过 GUI 进行控制)那么你需要将树莓派音频扩展板设置为树莓派系统的主要音频设备,并禁用树莓派的板载音频设备。这可以通过编辑 /boot/firmware/config.txt 文件来实现。通过 SSH 连接到你的树莓派的终端会话,运行以下命令来编辑文件:
$ sudo nano /boot/firmware/config.txt
在文件中找到 dtparam=audio=on 行,并通过在该行开头放置 #
符号来注释掉它。在任意给定行中 #
符号之后的内容将被程序忽略。你的 /boot/firmware/config.txt 文件现在应包含以下条目:
#dtparam=audio=on
按下 Ctrl + X 键,然后按 Y 键,最后按 回车键 保存。最后,重启你的树莓派以使设置生效。
$ sudo reboot
或者,可以直接在树莓派的 microSD 卡上编辑 /boot/firmware/config.txt 文件,然后将其插入你通常使用的计算机。使用默认文件管理器,在卡上打开 /boot/firmware/ 卷,并使用适当的文本编辑器编辑 config.txt 文件,然后保存文件,弹出 microSD 卡,重新插入到树莓派中。
树莓派音频扩展板连接到树莓派的 40 针引脚头上。它们设计为使用提供的电路板支架和螺丝支撑在树莓派上。除非你在 DAC Pro 上使用硬连线连接器(如 XLR(外部线路返回)连接)需要对树莓派音频扩展板进行常规操作,否则无需焊接。
所提供的全部必要安装硬件包含了间隔柱、螺丝和连接器。在添加音频扩展板之前,应仅用手指将 PCB 间隔柱拧紧到树莓派上。然后,应将剩余的螺丝从上方拧入间隔柱中。
音频卡有多个版本,你拥有的版本决定了所需的配置操作。较老的 IQaudIO 标记的板(黑色 PCB)在电气上等同于树莓派品牌的板(绿色 PCB),但具有不同的 EEPROM 内容。可以使用以下命令确认你拥有的版本:
$ grep -a . /proc/device-tree/hat/*
如果供应商字符串显示为"Raspberry Pi Ltd.",则无需采取进一步操作(但请参阅下文以获取额外的 Codec Zero 配置)。如果显示为"IQaudIO Limited www.iqaudio.com",则需要以下所述的额外 config.txt 设置。如果显示为"找不到文件或目录",则表示 HAT 未被检测到,但这些 config.txt 设置可能仍然使其正常工作。
# Some magic to prevent the normal HAT overlay from being loaded
dtoverlay=
# And then choose one of the following, according to the model:
dtoverlay=rpi-codeczero
dtoverlay=rpi-dacplus
dtoverlay=rpi-dacpro
dtoverlay=rpi-digiampplus
树莓派 Codec Zero 板使用 Dialog Semiconductor DA7212 编解码器。这允许从内置 MEMS 麦克风、立体声磁头插座(AUX IN)或两个单声道外部电容麦克风录制音频。播放通过立体声磁头插座(AUX OUT)或单声道扬声器连接器进行。
每个输入和输出设备都有自己的混音器,允许独立调整音频级别和音量。在编解码器本身内部,还存在其他混音器和开关,允许将输出混合到单声道以用于单扬声器输出。信号也可以被反转;有一个五段均衡器来调整特定频段。这些设置可以通过交互方式使用 AlsaMixer 进行控制,也可以通过编程方式进行控制。
AUX IN 和 AUX OUT 都是 1V RMS。可能需要调整 AUX IN 的混音器,以确保输入信号不会使 ADC 饱和。同样,可以调整输出混音器以获得最佳输出。
在 GitHub 上提供了预配置的脚本(可加载的 ALSA 设置),提供了:
单声道 MEMS 麦克风录制,单声道扬声器播放
单声道 MEMS 麦克风录制,单声道 AUX OUT 播放
立体声 AUX IN 录制,立体声 AUX OUT 播放
立体声 MIC1/MIC2 录音,立体声 AUX OUT 播放
Codec Zero 需要在每次树莓派上电时知道正在使用哪些输入和输出设置。在树莓派上的终端会话中,运行以下命令下载脚本:
$ git clone https://github.com/raspberrypi/Pi-Codec.git
如果未安装 git
,请运行以下命令进行安装:
$ sudo apt install git
以下命令将设置你的设备使用板载 MEMS 麦克风和扬声器进行播放:
$ sudo alsactl restore -f /home/<username>/Pi-Codec/Codec_Zero_OnboardMIC_record_and_SPK_playback.state
为了在项目上电时使用所需的设置,请编辑 /etc/rc.local 文件。该文件的内容在每次引导过程结束时运行,因此非常适合此目的。编辑文件:
$ sudo nano /etc/rc.local
在 exit 0 行上方添加所选脚本命令,然后按 Ctrl X、Y 和 回车键 保存。根据你选择的设置,文件现在应该看起来类似于这样:
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
sudo alsactl restore -f /home/<username>/Pi-Codec/Codec_Zero_OnboardMIC_record_and_SPK_playback.state
exit 0
按 Ctrl + X ,然后按 Y 键,然后按 回车键 保存。重启以使设置生效:
$ sudo reboot
如果你在无头环境中使用你的树莓派和 Codec Zero,则需要执行一个最后步骤,以使 Codec Zero 成为默认音频设备,而无需访问桌面上的 GUI 音频设置。我们需要在你的主文件夹中创建一个小文件:
$ sudo nano .asoundrc
将以下内容添加到文件中:
pcm.!default {
type hw
card Zero
}
按 Ctrl + X ,然后按 Y 键,然后按 回车键 保存。重启一次以完成配置:
$ sudo reboot
树莓派上的 GPIO22 切换 DigiAMP+ 静音状态。最新的音频设备树通过附加参数支持取消 DigiAMP+ 的静音。
首先,在内核模块加载时进行“一次性”静音。
对于树莓派板:
dtoverlay=rpi-digiampplus,unmute_amp
对于 IQaudIO 板:
dtoverlay=iqaudio-digiampplus,unmute_amp
当 ALSA 设备被客户端打开时取消静音。当 ALSA 设备关闭时,延迟五秒后静音。(在五秒关闭窗口内重新打开设备将取消静音。)
对于树莓派板:
dtoverlay=rpi-digiampplus,auto_mute_amp
对于 IQaudIO 板:
dtoverlay=iqaudio-digiampplus,auto_mute_amp
如果你不想通过设备树控制静音状态,也可以编写自己的脚本解决方案。
放大器将以静音状态启动。要取消静音放大器:
$ sudo sh -c "echo 22 > /sys/class/gpio/export"
$ sudo sh -c "echo out >/sys/class/gpio/gpio22/direction"
$ sudo sh -c "echo 1 >/sys/class/gpio/gpio22/value"
再次将放大器静音:
$ sudo sh -c "echo 0 >/sys/class/gpio/gpio22/value"
作为树莓派音频扩展板的一个示例,让我们一起来制作一个玩具聊天盒。其内置麦克风、可编程按钮和扬声器驱动器使 Codec Zero 成为此应用的理想选择。
当按下按钮时,将播放一个随机的预先录制的五秒音频片段。按住十秒后,将发出通知的打嗝声,然后录制一个新的五秒片段。按住按钮超过 20 秒将播放第二个打嗝声,并删除所有先前的录音。
对于这个项目,随便一款小型被动扬声器都应该足够。我们使用了一个在这里可用的扬声器,它在 4Ω 时承载 5W 功率。我们还使用了一个发光的瞬时按键和一个激光切割的盒子来容纳所有组件;但这两者都是完全可选的。这个示例将仅使用 Codec Zero 的板载按钮,该按钮预先连接到 GPIO 27。(或者,你可以使用瞬时按键,比如这里提供的。)
使用小型扁头螺丝刀将扬声器连接到螺丝端子。对于额外的按钮,根据指示将按钮线焊接到 Codec Zero 触点片上,使用 GPIO 引脚 27 和地线作为开关,如果需要,使用 +3.3V 和地线作为 LED。
在此示例中,我们使用精简版树莓派系统。有关更多详细信息,请参考我们的安装树莓派系统指南。
在继续之前,请确保更新你的操作系统,并按照提供的 Codec Zero 配置说明进行操作,包括启用板载麦克风和扬声器输出的命令。
在你的树莓派上打开一个 shell — 例如通过 SSH 连接 — 并运行以下内容来创建我们的 Python 脚本:
$ sudo nano chatter_box.py
将以下内容添加到文件中,将 <username>
替换为你的用户名:
#!/usr/bin/env python3
from gpiozero import Button
from signal import pause
import time
import random
import os
from datetime import datetime
# Print current date
date = datetime.now().strftime("%d_%m_%Y-%H:%M:%S")
print(f"{date}")
# Make sure that the 'sounds' folder exists, and if it does not, create it
path = '/home/<username>/sounds'
isExist = os.path.exists(path)
if not isExist:
os.makedirs(path)
print("The new directory is created!")
os.system('chmod 777 -R /home/<username>/sounds')
# Download a 'burp' sound if it does not already exist
burp = '/home/<username>/burp.wav'
isExist = os.path.exists(burp)
if not isExist:
os.system('wget http://rpf.io/burp -O burp.wav')
print("Burp sound downloaded!")
# Setup button functions - Pin 27 = Button hold time 10 seconds.
button = Button(27, hold_time=10)
def pressed():
global press_time
press_time = time.time()
print("Pressed at %s" % (press_time));
def released():
release_time = time.time()
pressed_for = release_time - press_time
print("Released at %s after %.2f seconds" % (release_time, pressed_for))
if pressed_for < button.hold_time:
print("This is a short press")
randomfile = random.choice(os.listdir("/home/<username>/sounds/"))
file = '/home/<username>/sounds/' + randomfile
os.system('aplay ' + file)
elif pressed_for > 20:
os.system('aplay ' + burp)
print("Erasing all recorded sounds")
os.system('rm /home/<username>/sounds/*');
def held():
print("This is a long press")
os.system('aplay ' + burp)
os.system('arecord --format S16_LE --duration=5 --rate 48000 -c2 /home/<username>/sounds/$(date +"%d_%m_%Y-%H_%M_%S")_voice.m4a');
button.when_pressed = pressed
button.when_released = released
button.when_held = held
pause()
按 Ctrl + X 键,然后按 Y 键,然后按 回车键 保存。要使脚本可执行,请输入以下内容:
$ sudo chmod +x chatter_box.py
输入以下内容以创建一个 crontab 守护程序,每次设备启动时都会自动启动脚本:
$ crontab -e
你将被要求选择一个编辑器;我们建议你使用 nano。通过输入相应的数字进行选择,然后按 回车键 继续。应将以下行添加到文件底部,将 <username>
替换为你的用户名:
@reboot python /home/<username>/chatter_box.py
按 Ctrl X、Y 和 回车键 保存,然后重启你的设备。
最后一步是确保一切都按预期运行。按下按钮,当听到打嗝声时松开按钮。录音现在将开始,持续五秒钟。一旦你松开按钮,请再次简短按下按钮以听取录音。你可以根据需要重复此过程,你的声音将随机播放。你可以通过按住按钮并在第一次打嗝声和录音过程期间保持按钮按下,然后在至少 20 秒后释放按钮来删除所有录音,此时你将听到另一个打嗝声,确认已删除录音。
升级!升级项目总是很有趣,为什么不添加一些额外功能,比如录音时会亮起的 LED?此项目具有制作自己版本的谷歌智能扬声器系统所需的所有零件,或者你可能考虑构建第二个设备,可用于创建一对能够通过 SSH 通过网络传输音频文件的对讲机。
硬件信息:
PCB 螺丝全部为 M2.5。
PCB 支架(用于外壳)为 5mm 公/母。
PCB 支架(用于树莓派到音频扩展板)为 9mm 母/母。
PCB 支架(用于 XLR 到 DAC PRO)为 8mm 母/公。
PCB 支架(用于官方树莓派 7 英寸显示屏)为 5 mm 公母。
我们使用和测试过的旋转编码器包括 Alpha 三针旋转编码器 RE160F-40E3-20A-24P,ALPS EC12E2430804(RS:729-5848),和 Bourns ECW0JB24-AC0006L(RS:263-2839)。
用于为 DigiAMP+ 供电的圆筒连接器为 2.5mm 内径,5.5mm 外径,11mm。
DigiAMP+ 设计为与 12V 至 24V、3A 供应配合使用,例如 XPPower VEC65US19 或类似产品。
DigiAMP+ 使用 CamdenBoss 的两部分连接器。安装在 PCB 上的是 CTBP9350/2AO。
Codec Zero 上使用的扬声器端子可接受 14~26 AWG(直径最大为 1.6mm)之间的线缆。
树莓派音频扩展板利用 GPIO 头上的许多引脚才能正常运行。其中一些引脚仅供扩展板使用,而另一些可与其他外设、传感器等共享。
音频扩展板使用以下树莓派 GPIO 引脚:
所有电源引脚
所有地线引脚
GPIO 2/3 (I²C)
GPIO 18/19/20/21 (I²S)
如果可用,还将使用以下硬件:
GPIO 22(DigiAMP+ 静音/取消静音支持)
用于旋转编码器(物理音量控制)或状态 LED(Codec Zero)的 GPIO 23/24
用于红外传感器的 GPIO 25
用于旋转编码器按键开关/Codec Zero 开关的 GPIO 27
DAC PRO,DAC+ 和 DigiAMP+ 重新公开了树莓派信号,可以轻松添加其他传感器和外围设备。请注意,一些信号是一些我们的主板专用的(如 I²S 和 EEPROM);其他信号如 I²C 可以在多个主板之间共享。
存储 AlsaMixer 设置,请在命令行中添加以下内容:
$ sudo alsactl store
你可以将当前状态保存到文件,然后在启动时重新加载该状态。
要保存,请运行以下命令,将 <username>
替换为你的用户名:
$ sudo alsactl store -f /home/<username>/usecase.state
要恢复保存的文件,请运行以下命令,将 替换为你的用户名:
$ sudo alsactl restore -f /home/<username>/usecase.state
要允许基于音乐播放器守护程序(MPD)的音频软件控制音频扩展板的内置音量,可能需要更改文件 /etc/mpd.conf 以支持正确的 AlsaMixer 名称。
通过确保 /etc/mpd.conf 的“音频输出”部分具有“混音器控制”行,可以实现这一点。以下是德州仪器基于的板卡(DAC PRO/DAC+/DigiAMP+)的示例:
audio_output {
type "alsa"
name "ALSA Device"
mixer_control "Digital"
}
树莓派音频板使用包含信息的 EEPROM,该信息由主机树莓派设备在启动时选择适当的驱动程序时使用。此信息在制造过程中编程到 EEPROM 中。在某些情况下,最终用户可能希望更新 EEPROM 内容:可以通过命令行完成。
重要
在继续之前,你应该将运行在你的树莓派上的树莓派系统更新到最新版本。
在编程过程中,你需要用导线连接红色框中显示的两个焊盘,以拉低 EEPROM 写保护链接。
注意
在某些情况下,两个焊盘上可能已经焊接了一个 0Ω 电阻,用于连接写保护链接,就像上面 Codec Zero 板的图片中所示。
在写保护线被拉低后,EEPROM 就可以被编程。
你应该首先安装实用程序,然后运行管理员权限。打开终端,输入以下内容:
$ sudo apt update
$ sudo apt install rpi-audio-utils
$ sudo rpi-audio-flash
启动后,你将看到一个警告信息。
选择“是”继续,将显示一个菜单,允许你选择你的硬件。
注意
如果没有扩展板,或者连接的扩展板并非树莓派音频扩展板,则会显示错误信息。如果已经更新了主板上的固件,将显示一条消息,告知你无需继续操作。
选择正确的硬件后,屏幕将显示,同时将新固件刷入扩展板。
稍后将显示信息,告诉你已安装新固件。
注意
如果固件安装失败,将在屏幕上显示错误。首先,你应该拔下来并重新插入扩展板,然后尝试重新刷写固件。
树莓派内核托管在 GitHub 上,更新一般滞后于上游的 Linux 内核。上游内核在持续更新着,而树莓派将则会将 long-term releases(长期维护版本) 的 Linux 内核集成到树莓派内核。我们在 raspberrypi/firmware 中会为每个长期维护的 Linux 内核版本生成一个 next
分支。在经过海量的测试和大规模讨论后,我们会将 next
分支合并到我们版本库的主分支(main)中。
日常的树莓派系统更新流程会自动把你的内核更新到最新稳定版本。如果你想尝试最新不稳定版测试内核,你可以手动更新。
操作系统自带的编译器,链接器通常配置为:为能在该系统上运行的可执行文件而进行编译。本地编译(Native builds) 使用上述默认的编译器和链接器。而 交叉编译(Native builds) 是指为与当前编译环境不同的目标系统编译代码的流程。
对树莓派内核的交叉编译能让你在 32 位操作系统上编译 64 位内核,反之亦然。你还可以在非树莓派设备上交叉编译 32 位(或 64 位)的树莓派内核。
以下说明分为本地编译和交叉编译两部分。请选择适合你的那个部分,虽然这两种方式有许多相似步骤,但也有些许明显的差异。
在为特定目标编译之前,你需要内核源码。要下载源码,你需要安装 Git。先在你的设备上安装 Git(如未安装):
$ sudo apt install git
接下来,下载最新的树莓派内核源码:
$ git clone --depth=1 https://github.com/raspberrypi/linux
这可能需要几分钟。
技巧
命令
git clone
用于下载当前活跃分支的代码,我们用这个分支来构建树莓派系统镜像;未包含历史记录。要下载包含全部分支一切历史的完整仓库,请省略参数--depth=1
。这会花费更长时间,占用更多存储空间。如需下载的其他分支(不带历史记录),可在上述命令中添加参数
--branch
,把<分支>
改成你想下载的分支名:$ git clone --depth=1 --branch <分支> https://github.com/raspberrypi/linux
要查看所有可用分支的完整列表,请参见树莓派内核存储库。
现在你已经有了内核源码,可以选择本地编译还是用交叉编译构建新内核。
本指南假设你的树莓派正运行着最新版本的树莓派系统。
先安装编译所需的依赖包:
$ sudo apt install bc bison flex libssl-dev make
本节介绍了如何在编译内核时采用默认配置。你也可以使用以下方式配置你的内核:
要准备默认配置,请根据你的树莓派型号执行下表中的对应命令。
64 位
树莓派 3
$ cd linux
$ KERNEL=kernel8
$ make bcm2711_defconfig
树莓派计算模块 3
树莓派 3+
树莓派计算模块 3+
树莓派 Zero 2 W
树莓派 4
树莓派 400
树莓派计算模块 4
树莓派计算模块 4S
树莓派 5
$ cd linux
$ KERNEL=kernel_2712
$ make bcm2712_defconfig
32 位
树莓派 1
$ cd linux
$ KERNEL=kernel
$ make bcmrpi_defconfig
树莓派计算模块 1
树莓派 Zero
树莓派 Zero W
树莓派 2
$ cd linux
$ KERNEL=kernel7
$ make bcm2709_defconfig
树莓派 3
树莓派计算模块 3
树莓派 3+
树莓派计算模块 3+
树莓派 Zero 2 W
树莓派 4
$ cd linux
$ KERNEL=kernel7l
$ make bcm2711_defconfig
树莓派 400
树莓派计算模块 4
树莓派计算模块 4S
注意
树莓派 4B、5、400,计算模块 4、计算模块 4S 上的 32 位版树莓派系统使用了 32 位用户空间,但运行的是 64 位内核。如果要编译 32 位内核,请设定
ARCH=arm
。若要启动 32 位内核,在config.txt
中设定arm_64bit=0
。
LOCALVERSION
自定义内核版本为了防止内核覆盖 /lib/modules
中的现有模块,并在 uname
输出中明确输出你运行的是自定义内核,请调整 LOCALVERSION
。
要调整 LOCALVERSION
,请修改 .config
文件中的这一行:
CONFIG_LOCALVERSION="-v7l-MY_CUSTOM_KERNEL"
技巧
你还可以通过图形界面的
menuconfig
更改此设置,路径为 General setup > Local version - append to kernel release。更多有关menuconfig
的信息,请参见 内核配置说明。
接下来,编译内核。根据你的树莓派型号,此步骤可能需要很长时间。
运行以下命令可编译 64 位内核:
$ make -j6 Image.gz modules dtbs
运行以下命令可编译 32 位内核:
$ make -j6 zImage modules dtbs
技巧
在多核款树莓派上,参数
make -j<数量>
会把工作分配到多个核心,从而显著提高编译速度。可运行nproc
查看你有多少处理器,我们建议使用的数字为处理器数量的 1.5 倍。
接下来,将内核模块安装到启动介质上:
$ sudo make -j6 modules_install
然后,将内核和设备树二进制文件安装到启动分区中,并备份原有内核。
技巧
如果你不想将新编译的内核安装到运行此命令的树莓派上,请将编译好的内核复制到一个单独启动介质的启动分区中,而非
/boot/firmware/
。
要安装 64 位内核:
运行以下命令可创建当前内核的备份镜像,安装新的内核镜像、叠加层文件、README 文件,再卸载分区:
$ sudo cp /boot/firmware/$KERNEL.img /boot/firmware/$KERNEL-backup.img
$ sudo cp arch/arm64/boot/Image.gz /boot/firmware/$KERNEL.img
$ sudo cp arch/arm64/boot/dts/broadcom/*.dtb /boot/firmware/
$ sudo cp arch/arm64/boot/dts/overlays/*.dtb* /boot/firmware/overlays/
$ sudo cp arch/arm64/boot/dts/overlays/README /boot/firmware/overlays/
要安装 32 位内核:
备份当前内核并安装新的内核镜像:
$ sudo cp /boot/firmware/$KERNEL.img /boot/firmware/$KERNEL-backup.img
$ sudo cp arch/arm/boot/zImage /boot/firmware/$KERNEL.img
根据你的内核版本,可运行以下命令:
对于 6.4 版本及以下的内核:
$ sudo cp arch/arm/boot/dts/*.dtb /boot/firmware/
对于 6.5 版本及以上的内核:
$ sudo cp arch/arm/boot/dts/broadcom/*.dtb /boot/firmware/
最后,复制覆盖文件和 README 文件:
$ sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/firmware/overlays/
$ sudo cp arch/arm/boot/dts/overlays/README /boot/firmware/overlays/
最后,运行以下命令重新启动你的树莓派,并运行新编译的内核:
$ sudo reboot
技巧
还可以使用不同的文件名(例如
kernel-myconfig.img
)复制内核,而不是覆盖文件kernel.img
。然后,在引导分区下编辑config.txt
,选择你的内核:kernel=kernel-myconfig.img
将此方法与自定义
LOCALVERSION
结合使用,可将你的自定义内核与系统管理的默认内核镜像分开。这样一来,如果你的内核无法启动,你可以快速恢复到默认内核。
首先,你需要一台合适的 Linux 交叉编译主机。我们一般用 Ubuntu。由于树莓派系统同样也是一款基于 Debian 的发行版,所以编译命令极为接近。
要通过交叉编译构建源代码,请在设备上安装所需的依赖包。运行以下命令可安装大多数依赖:
$ sudo apt install bc bison flex libssl-dev make libc6-dev libncurses5-dev
然后,安装适用于你要编译的内核架构之工具链:
要安装用于编译 64 位内核的 64 位工具链,请运行以下命令:
$ sudo apt install crossbuild-essential-arm64
要安装用于编译 32 位内核的 32 位工具链,请运行以下命令:
$ sudo apt install crossbuild-essential-armhf
本节介绍了如何在构建内核时采用默认配置。你也可以用下述方式配置内核:
输入以下命令构建源代码和设备树文件:
64 位
树莓派 3
$ cd linux
$ KERNEL=kernel8
$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig
树莓派计算模块 3
树莓派 3+
树莓派计算模块 3+
树莓派 Zero 2 W
树莓派 4
树莓派 400
树莓派计算模块 4
树莓派计算模块 4S
树莓派 5
$ cd linux
$ KERNEL=kernel_2712
$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2712_defconfig
32 位
树莓派 1
$ cd linux
$ KERNEL=kernel
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcmrpi_defconfig
树莓派计算模块 1
树莓派 Zero
树莓派 Zero W
树莓派 2
$ cd linux
$ KERNEL=kernel7
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig
树莓派 3
树莓派计算模块 3
树莓派 3+
树莓派计算模块 3+
树莓派 Zero 2 W
树莓派 4
$ cd linux
$ KERNEL=kernel7l
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2711_defconfig
树莓派 400
树莓派计算模块 4
树莓派计算模块 4S
LOCALVERSION
自定义内核版本为防止内核覆盖现有的 /lib/modules
中的模块,且在 uname
输出中表明你运行的是自定义内核,可以调整 LOCALVERSION
。
要调整 LOCALVERSION
,请修改 .config
文件的这一行:
CONFIG_LOCALVERSION="-v7l-MY_CUSTOM_KERNEL"
技巧
你也可以用
menuconfig
图形化修改此设置,路径为 General setup > Local version - append to kernel release。有关menuconfig
的更多信息,请参阅内核配置说明。
运行以下命令可编译 64 位内核:
$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image modules dtbs
运行以下命令可编译 32 位内核:
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs
内核编译完成后,你需要把内核复制到树莓派的启动介质(一般是存储卡和固态硬盘),然后安装模块。
找到你的启动介质
首先运行 lsblk
。然后接入启动介质,再次运行 lsblk
;新出现的设备就是你的启动介质。你将看到类似如下的输出:
sdb
sdb1
sdb2
如果 sdb
代表你的启动介质,sdb1
代表 启动分区(FAT32
格式),而 sdb2
代表(可能为 ext4
格式)根分区。
先将这些分区分别挂载到 mnt/boot
、mnt/root
,并根据实际的启动介质位置来调整分区字母:
$ mkdir mnt
$ mkdir mnt/boot
$ mkdir mnt/root
$ sudo mount /dev/sdb1 mnt/boot
$ sudo mount /dev/sdb2 mnt/root
安装
接下来,把内核模块安装到启动介质上:
对于 64 位内核:
$ sudo env PATH=$PATH make -j12 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=mnt/root modules_install
对于 32 位内核:
$ sudo env PATH=$PATH make -j12 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=mnt/root modules_install
技巧
在多核设备上,参数
make -j<数量>
会把工作分配到多个核心,从而显著提高编译速度。可运行nproc
查看你有多少处理器,我们建议使用的数字为处理器数量的 1.5 倍。
接下来,把内核和设备树文件安装到启动分区中,并备份下旧内核。
要安装 64 位内核:
运行以下命令可创建当前内核的备份镜像,安装新的内核镜像、叠加层文件、README 文件,然后卸载分区:
$ sudo cp mnt/boot/$KERNEL.img mnt/boot/$KERNEL-backup.img
$ sudo cp arch/arm64/boot/Image mnt/boot/$KERNEL.img
$ sudo cp arch/arm64/boot/dts/broadcom/*.dtb mnt/boot/
$ sudo cp arch/arm64/boot/dts/overlays/*.dtb* mnt/boot/overlays/
$ sudo cp arch/arm64/boot/dts/overlays/README mnt/boot/overlays/
$ sudo umount mnt/boot
$ sudo umount mnt/root
要安装 32 位内核:
运行以下命令可创建当前内核的备份镜像,然后安装新的内核镜像:
$ sudo cp mnt/boot/$KERNEL.img mnt/boot/$KERNEL-backup.img
$ sudo cp arch/arm/boot/zImage mnt/boot/$KERNEL.img
根据你的内核版本,可运行以下命令安装设备树文件:
对于 6.4 及以下版本的内核:
$ sudo cp arch/arm/boot/dts/*.dtb mnt/boot/
对于 6.5 及以上版本的内核:
$ sudo cp arch/arm/boot/dts/broadcom/*.dtb mnt/boot/
最后,安装叠加层文件和 README 文件,然后卸载分区:
$ sudo cp arch/arm/boot/dts/overlays/*.dtb* mnt/boot/overlays/
$ sudo cp arch/arm/boot/dts/overlays/README mnt/boot/overlays/
$ sudo umount mnt/boot
$ sudo umount mnt/root
最后,把启动介质接入你的树莓派,然后接入电源,运行你刚编译的内核。
技巧
你还以使用不同的文件名(例如
kernel-myconfig.img
)来复制内核,而非直接覆盖文件kernel.img
。然后,编辑启动分区中的config.txt
文件来选择你的内核:kernel=kernel-myconfig.img
把这种方法与自定义
LOCALVERSION
结合使用,可将你的自定义内核与系统管理的标准内核镜像分开。在这种安排下,如果你的内核无法启动,你可以快速还原到标准内核。
Linux 内核具有极高的可配置性。专业用户可能希望修改默认配置来满足他们的需求,如启用新的/实验性的网络协议,或支持新硬件。
配置一般通过 make menuconfig
界面进行。你也可以手动修改文件 .config
,但这可能会更复杂。
工具 menuconfig
需要 ncurses
开发头文件才能正确编译。要安装这些头文件,请运行以下命令:
$ sudo apt install libncurses5-dev
接下来,下载内核源代码。特别是,确保你已经安装了默认的本地配置/默认的交叉编译配置。
menuconfig
待一切准备就绪,你可以按如下方式编译和运行实用程序 menuconfig
:
$ make menuconfig
要交叉编译 64 位内核:
$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig
要交叉编译 32 位内核:
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
要使用实用程序 menuconfig
,使用键盘操作:
使用 方向键 进行方向切换
要进入子菜单(由 --->
指示),按 回车键
要返回上一级或退出,按两次 Esc 键
要切换二进制选项的状态,按 空格键
要选择多选项的状态,按 回车键 打开子菜单,使用 方向键 切换子菜单,再按 回车键 选择状态
要获取参数/菜单的帮助,按 H 键
在简短的编译之后,menuconfig
会显示一个带有所有可以配置选项的子菜单列表。参数很多,所以需要花点时间才能读完。请避免在第一次尝试时启用/禁用过多的选项;配置过程相对容易出错,所以从小处开始,以熟悉配置和构建过程。
完成更改后,按 Esc 键 直到出现保存新配置的提示。在默认情况下,会保存到文件 .config
。你可以通过复制此文件来保存和加载配置。
自定义完成后,你现在可以构建内核了。
在构建自定义内核时,你可能希望将补丁/补丁集应用到 Linux 内核。
硬件制造商有时会提供补丁集,作为支持新硬件的临时措施,直到补丁被合并到 Linux 内核和树莓派内核中。然而,还有其他目的的补丁集,例如启用完全抢占的内核以用于实时应用。
要检查当前运行在设备上的内核版本,运行以下命令:
$ uname -r
在应用补丁之前,始终检查你的内核版本。在内核源代码目录中,运行以下命令以查看内核版本:
$ head Makefile -n 4
你应会看到类似如下的输出:
# SPDX-License-Identifier: GPL-2.0
VERSION = 6
PATCHLEVEL = 1
SUBLEVEL = 38
在这个实例中,源代码是针对 6.1.38 内核的。
打补丁的方式取决于补丁的分发格式。
开发人员通常将大多数补丁以单个文件的形式分发。使用工具 patch
来打上这些补丁。以下命令可下载、解压并将实时内核补丁应用到我们的示例内核版本中:
$ wget https://www.kernel.org/pub/linux/kernel/projects/rt/6.1/patch-6.1.38-rt13-rc1.patch.gz
$ gunzip patch-6.1.38-rt13-rc1.patch.gz
$ cat patch-6.1.38-rt13-rc1.patch | patch -p1
有些开发人员以 邮箱格式(mailbox format) 分发补丁,这是一种包含多个补丁文件的文件夹。可使用 Git 来应用这些补丁。
注意
在使用 Git 应用邮箱补丁之前,请为你的本地 Git 安装配置姓名和电子邮件:
$ git config --global user.name "your name" $ git config --global user.email "your email"
要使用 Git 应用邮箱格式的补丁,请运行以下命令:
$ git am -3 /path/to/patches/*
始终按照补丁分发者提供的说明进行操作。例如,一些补丁集要求在特定提交基础上打补丁。
要编译内核模块,你需要 Linux 内核头文件。这些头文件提供了编译与内核接口的代码所需的函数和结构定义。
如果你从 GitHub 克隆了整个内核,头文件已经包含在源代码树中了。如果你不需要其他额外的文件,可以仅使用 apt
安装内核头文件。
技巧
当发布新内核时,你需要与该内核版本匹配的头文件。通过更新
apt
包来获取最新版内核可能需要几周时间。要下载最新版本的头文件,请克隆内核。
如果你使用的是 64 位版本的树莓派系统,请运行以下命令安装内核头文件:
$ sudo apt install linux-headers-rpi-v8
如果你使用的是 32 位版本的树莓派系统,请运行以下命令安装内核头文件:
$ sudo apt install linux-headers-rpi-{v6,v7,v7l}
注意
安装可能需要几分钟,没有进度指示工具。
你可能有很多理由想要将某些内容加入内核:
你编写了一些树莓派的特定代码,希望大家都能受益
你编写了一款通用的 Linux 内核驱动,希望大家都能使用
你修复了一项通用内核 bug
你修复了一项树莓派的特定内核 bug
对于树莓派特定的更改/bug 修复,可向树莓派内核提交一个 pull request。对于一般的 Linux 内核更改(例如新的驱动程序),请先向上游 Linux 内核提交 pull request。待 Linux 内核接受了你的更改,我们方可收到这些更改。
首先,复刻树莓派内核仓库 并将其克隆到你的开发设备上。然后,你可以进行更改、测试,并将更改提交到你的复刻。
接下来,将涉及你更改的 pull request 提交到树莓派内核仓库。树莓派工程师会审查你的贡献并提出改进建议。一旦获得批准,我们就会将你的更改合并,最终这些更改会进入稳定版本的树莓派内核。
首先,将 Linux 内核树克隆到你的开发设备上。然后,你可以进行更改、测试,并将更改提交到你的本地树中。
若你的更改准备就绪,你可以把它提交给 Linux 内核社区。Linux 内核开发是在邮件列表(而非 GitHub)上进行的。为使你的更改成为 Linux 内核的一部分,请通过电子邮件将其作为补丁提交给社区。请遵循文档提交补丁:如何让你的改动进入内核和Linux 内核代码风格。Linux 内核贡献者会审查你的贡献并建议改进。获得批准后,他们会将你的更改合并。最后,这些更改会进入 Linux 内核的长期发布版本。通过树莓派内核的兼容性测试后,你的更改就会进入稳定版本的树莓派内核。
树莓派系统(Raspberry Pi OS)是一款免费的操作系统,基于 Debian,且针对树莓派的硬件进行了适配及优化。树莓派系统拥有 35,000 余款 Debian 软件包。对于大多数树莓派使用需求而言,我们建议使用树莓派系统。
因为树莓派系统源自 Debian,因此树莓派系统基于 Debian 发布周期内的阶段发行版本。大约每 2 年发布一次。
最新版的树莓派系统基于 Debian Bookworm。上个版本基于 Debian Bullseye。
你可在 raspberrypi.com/software/operating-systems/ 下载树莓派系统镜像。
请始终确保你在树莓派系统上运行的软件版本是最新的。这可以使你的设备免受漏洞影响,确保你能及时收到最新补丁。
在树莓派系统中,我们推荐使用 APT(Advanced Package Tool,高级软件包工具) 来安装、更新和卸载软件。你可以用命令行 apt
调用 APT。
apt
会把软件源列表存放在文件 /etc/apt/sources.list
中。在安装软件之前,请运行以下命令,来 刷新(update) 位于 /etc/apt/sources.list
的本地软件源:
$ sudo apt update
运行以下命令,可把所有已安装的软件包 更新(upgrade) 至最新版本:
$ sudo apt full-upgrade
技巧
与 Debian 不同,树莓派系统始终处于开发状态。因此,软件包的依赖关系有时会发生变更,因此你应始终使用
full-upgrade
,而不要用普通的upgrade
。
请定期运行这些命令,确保软件保持最新状态。在使用 apt
维持树莓派系统最新状态时,也会同时把你的 Linux 内核和固件变成最新版本——因为树莓派系统把他们以 Debian 软件包的形式进行分发。
在树莓派官方发布了树莓派系统的大版本更新后,执行上述命令亦不会把你的操作系统更新到这个最新的大版本。要更新到最新的大版本,请按照我们的操作系统更新说明进行操作。
要搜索软件包,请用 apt-cache search
搜索(search)关键字:
$ apt-cache search <关键字>
例如,以下是关键字“raspi”的搜索结果:
$ apt-cache search raspi
raspi3-firmware - Raspberry Pi 2 and 3 GPU firmware and bootloaders
libcamera-apps - libcamera-apps
libcamera-apps-lite - libcamera-apps-lite
python-picamera - Pure Python interface to the Raspberry Pi's camera module.
python-picamera-docs - Documentation for the Python interface to the RPi's camera module.
python3-picamera - Pure Python interface to the Raspberry Pi's camera module.
raspi-config - Raspberry Pi configuration tool
raspi-gpio - Dump the state of the BCM270x GPIOs
raspi-gpio-dbgsym - debug symbols for raspi-gpio
raspinfo - Dump information about the Pi
rc-gui - raspi-config GUI
raspi-copies-and-fills - ARM-accelerated versions of selected functions from string.h
raspi-copies-and-fills-dbgsym - debug symbols for raspi-copies-and-fills
搜索结果返回了多个软件包,他们的名称或简介中均包含关键词(raspi)。
使用以下命令可查看其详细信息:
$ apt-cache show <软件包名>
例如,假设要查询“raspi-config”这个软件包,结果如下:
$ apt-cache show raspi-config
Package: raspi-config
Version: 20210212
Architecture: all
Maintainer: Serge Schneider <[email protected]>
Installed-Size: 121
Depends: whiptail, parted, lua5.1, alsa-utils, psmisc, initramfs-tools
Recommends: triggerhappy, iw
Priority: optional
Section: utils
Filename: pool/main/r/raspi-config/raspi-config_20210212_all.deb
Size: 27976
SHA256: 772d4fd3c6d8c9da47ac56012b74e7828b53c8521ff1c47266bb38ec71750c10
SHA1: 08254c976a8260bde914c2df72f92ffb9317fef6
MD5sum: 80aaac13be6a9b455c822edb91cf8ea2
Description: Raspberry Pi configuration tool
A simple configuration tool for common Raspberry Pi administrative tasks
Description-md5: 19630c04463bfe7193152448b53d85a0
可使用此命令验证维护者、版本和大小是否满足你对软件包的要求。
要在你的树莓派上安装软件包,请把软件包名传给以下命令:
$ sudo apt install <软件包名>
apt
会显示软件包将占用的磁盘容量。输入 Y 并按 回车键 来确认安装。你可以在上述命令中添加参数 -y
,跳过这个确认步骤。
要在树莓派上卸载软件包,请将软件包名传给以下命令:
$ sudo apt remove <软件包名>
技巧
要彻底抹除软件包的全部痕迹(包括配置文件),请把
remove
改成purge
。
apt
将显示:在卸载软件包后,可释放的磁盘容量。输入 Y,再按 回车键 确认卸载。你可以在上述命令中添加参数 -y
,跳过这个确认步骤。
apt
磁盘使用情况在执行之前,sudo apt full-upgrade
将显示完成更新所需的下载及存储会占用的磁盘容量。要查看你的剩余磁盘空间是否充足,请运行以下命令:
$ df -h
apt
会把已下载的软件包(.deb
文件)存储到 /var/cache/apt/archives
。在安装过程中,apt
会下载这些软件包,然后把文件从软件包复制到对应的安装位置。视你安装的软件而定,软件包自身可能会占用大量空间。要删除所有遗留的软件包本体,请运行以下命令:
$ sudo apt clean
警告
在尝试进行大版本更新前,请先行备份。
要把树莓派系统这个操作系统更新至最新大版本,请使用另外一张存储卡,在它上面写入新版本的镜像。从先前安装的旧系统(使用存储卡读卡器或网络存储)复制文件和配置到这张新的存储卡。然后,将这张新的存储卡插进树莓派上的卡槽,再启动。
警告
在尝试固件更新前,请先行备份。
警告
软件的预发布版本能否正常工作,是无法保证的。除非得到了树莓派工程师的建议,否则不要在系统上使用
rpi-update
。这可能导致你的系统不稳定,甚至损坏。不要把rpi-update
视为日常更新流程的一部分。
要把你树莓派的固件更至最新版本,请使用 rpi-update
。
rpi-update
会下载最新的 Linux 内核预发布版本及与其匹配的内核模块、设备树文件和最新的 VideoCore 固件。然后把这些文件安装到树莓派系统中。
rpi-update
使用的所有源数据均来自 rpi-firmware
存储库。该存储库包含来自官方固件存储库的数据子集。
要进行更新,请以 root 身份执行 rpi-update
。更新完成后,需重启你的树莓派以使这些变更生效:
$ sudo rpi-update
$ sudo reboot
这本白皮书记录了如何在树莓派系统中更新 VideoCore 固件。
如果你在把固件更新到最新版本后遇到问题,请使用以下命令把固件回滚到最新稳定版:
$ sudo apt-get update
$ sudo apt install --reinstall raspi-firmware
注意
如果你仍在使用树莓派操作系统 Bullseye,则必须用以下命令重装
raspberrypi-kernel
:$ sudo apt install --reinstall libraspberrypi0 libraspberrypi-{bin,dev,doc} raspberrypi-{kernel,bootloader}
最后,用
sudo reboot
重启你的树莓派以使上述变更生效。
树莓派系统预装了 VLC 媒体播放器。你可以它播放音视频文件。在树莓派系统上,VLC 支持硬件加速,可兼容多种常见的音视频文件格式。
要在树莓派桌面播放音视频文件,请在文件管理器里双击文件。这将自动触发 VLC 播放文件。或者,在菜单“声音和视频(Sound & Video)”中启动 VLC 媒体播放器(VLC Media Player)。然后,从菜单“媒体(Media)”中选择“打开文件...(Open File…)”,然后找到到要播放的文件。
在默认情况下,树莓派系统会通过 HDMI 将音频输出至你的显示器。要把音频输出到其他接口(如耳机插孔、USB 扬声器),请右键单击系统托盘中的扬声器图标,然后按需选用。
vlc
命令行你还可以用命令行启动 VLC。在下面的例子中,我们使用了来自《大雄兔》(Big Buck Bunny)的片段。要在树莓派上下载该片段,请执行以下命令:
$ wget --trust-server-names http://rptl.io/big-buck-bunny
要用命令行 VLC 播放视频,请运行以下命令:
$ vlc big-buck-bunny-1080p.mp4
要在文件播放完成后退出 VLC 的图形界面,请添加参数 --play-and-exit
:
$ vlc --play-and-exit big-buck-bunny-1080p.mp4
要全屏播放视频(在某些情况下播放会更流畅),请添加参数 --fullscreen
:
$ vlc --play-and-exit --fullscreen big-buck-bunny-1080p.mp4
cvlc
播放无图形界面的媒体如果你在以上命令中把 vlc
改成 cvlc
,那么将不会显示 VLC 的图形界面:
$ cvlc --play-and-exit big-buck-bunny-1080p.mp4
同完整版本的树莓派系统(所有 with desktop 版本)相比,精简版树莓派系统上并未预装 VLC。要在精简版树莓派系统上使用 VLC 播放音视频,请安装用于无需桌面播放的软件包:
$ sudo apt install --no-install-recommends vlc-bin vlc-plugin-base
为了下面的示例,我们使用了一个短音频的片段剪辑。要在树莓派上下载该片段,请执行以下命令:
$ wget --trust-server-names http://rptl.io/startup-music
要在命令行让 VLC 播放片段,请执行以下命令:
$ cvlc --play-and-exit computer-startup-music.mp3
要把音频强制输出到特定设备,请使用 ALSA 音频输出:把 alsa
值传给参数 -A
。同时使用参数 --alsa-audio-device
来指定音频输出设备:
$ cvlc --play-and-exit -A alsa --alsa-audio-device <alsa-设备> computer-startup-music.mp3
用以下参数来替换占位符 <alsa-设备>
:
sysdefault:CARD=Headphones
耳机插孔
sysdefault:CARD=vc4hdmi
树莓派 Zero,树莓派 1、2、3 上的 HDMI 输出
sysdefault:CARD=vc4hdmi0
树莓派 4、5、400 和计算模块 4 上的 HDMI0 输出
sysdefault:CARD=vc4hdmi1
树莓派 4、5、400 和计算模块 4 上的 HDMI1 输出
技巧
使用以下命令,可获取树莓派上所有 ALSA 设备列表:
$ aplay -L | grep sysdefault
为了把视频强制输出到特定设备,即指定视频输出设备,请使用参数 --drm-vout-display
:
$ cvlc --play-and-exit --drm-vout-display <drm设备> big-buck-bunny-1080p.mp4
请把其中的文本 <drm设备>
改成以下某设备:
HDMI-A-1
树莓派 Zero、1、2、3 上的 HDMI 输出;树莓派 4、5、400 上的 HDMI0 输出
HDMI-A-2
树莓派 4、5、400 上的 HDMI1 输出
DSI-1
树莓派触摸显示屏
技巧
使用以下命令,可获取树莓派上所有 DRM 设备列表:
$ kmsprint | grep Connector
你可以对音频和视频输出参数进行组合。例如,要把视频定向输出到触摸屏,而把音频定向输出到耳机插孔,根据上述需求,应执行的命令组合为:
$ cvlc --play-and-exit --fullscreen --drm-vout-display DSI-1 -A alsa --alsa-audio-device sysdefault:CARD=Headphones your_video.mp4
如果你有 H.264 原始码流(裸流,raw H.264 stream),比如用树莓派摄像头模块捕获的码流,你可以通过把码流封装成诸如 MP4 之类的文件格式,来提升 VLC 的播放性能。你可以使用 ffmpeg
把码流内容转成容器文件。例如,以下命令可把名为 video.h264
的码流,转成 MP4 文件 video.mp4
(30fps):
$ ffmpeg -r 30 -i video.h264 -c:v copy video.mp4
树莓派系统中预装了几款实用的命令行工具。
kmsprint
工具 kmsprint
能列出已接入树莓派的显示器所支持的分辨率。使用 kmsprint
可查看已接入树莓派的显示器的详细信息,使用 kmsprint -m
能查看显示器支持的所有分辨率列表。你可以在 Github 上找到实用程序 kmsprint
的源代码。
vclog
vclog
能运行在基于 Arm 的 Linux 上,可输出 VideoCore GPU 的日志消息。它需要以 root 权限执行。
sudo vclog --msg
可打印出消息日志,而 sudo vclog --assert
则打印出断言日志。
vcgencmd
vcgencmd
工具用于输出树莓派上有关 VideoCore GPU 的信息。你可以在 GitHub 上找到工具 vcgencmd
的源代码。
要获取 vcgencmd
支持的所有命令列表,请使用 vcgencmd commands
。下面列出了一些实用命令及其所需参数。
vcos
命令 vcos
有两个有用的子命令:
version
可显示 VideoCore 固件的构建日期和版本
log status
可显示 VideoCore 固件所有部分的错误日志状态
version
可显示 VideoCore 固件的构建日期和版本。
get_throttled
将返回系统的限流状态,为位模式。设置位表示以下含义:
0
0x1
已检测到欠压
1
0x2
Arm 频率已受限
2
0x4
当前已被限流
3
0x8
已启用温度软限制
16
0x10000
曾发生欠压
17
0x20000
曾发生 Arm 频率限制
18
0x40000
曾发生限流
19
0x80000
曾发生温度软限制
measure_temp
measure_temp
可返回 SoC 的温度,数据源于其内部温度传感器。在树莓派 4 上,measure_temp pmic
返回的温度来自电源管理芯片(PMIC)。
measure_clock [时钟]
它将返回指定时钟的实时频率。可返回以下时钟值:
arm
ARM 核心
core
GPU 核心
h264
H.264 模块
isp
图像传感器管道
v3d
3D 模块
uart
串口
pwm
PWM 模块(模拟音频输出)
emmc
存储卡接口
pixel
像素阀(Pixel valves)
vec
模拟视频编码器
hdmi
HDMI
dpi
显示并行接口
例如 vcgencmd measure_clock arm
measure_volts [模块]
它可显示特定模块使用的当前电压。可接受以下值:
core
VC4 核心电压
sdram_c
SDRAM 核心电压
sdram_i
SDRAM I/O 电压
sdram_p
SDRAM 物理电压
otp_dump
它将显示 SoC 内部 OTP(一次性可编程,one-time programmable)存储器中的内容。这些是 32 位值,索引范围是 8 到 64。有关更多详细信息,请参阅 OTP 位页面。
get_config [配置项目|int|str]
它将显示指定配置项目的值。或者如要查看给定类型的所有配置项目,可指定参数 int
(整数)、str
(字符串)。例如,以下命令会返回设备上的全部内存大小(单位为 Mb):
$ vcgencmd get_config total_mem
get_mem 类型
get_mem 类型
将报告 Arm 和 GPU 可寻址内存的大小。要显示 Arm 可寻址内存的大小,请使用 vcgencmd get_mem arm
;要显示 GPU 可寻址内存的数量,请使用 vcgencmd get_mem gpu
。若设备内存大于 1GB,arm
参数的返回值将始终用 1GB 减 gpu
显存,因为 GPU 固件仅获取前 1GB 内存。要想准确报告设备上的总内存,请参阅 total_mem
配置项和上述 get_config
部分。
codec_enabled [类型]
可报告是否已启用指定类型的解码器。可支持以下类型:AGIF、FLAC、H263、H264、MJPA、MJPB、MJPG、MPG2、MPG4、MVC0、PCM、THRA、VORB、VP6、VP8、WMV9、WVC1。请注意,由于在树莓派 4、400 上的 H.265 硬件模块并不属于 VideoCore GPU,因此无法用此命令查看状态。
mem_oom
将显示在 VideoCore 内存空间中发生过的所有 OOM(Out of memory,内存溢出)事件的统计信息。
mem_reloc_stats
将显示来自 VideoCore 上可重定位内存分配器的统计信息。
read_ring_osc
用于返回环形振荡器的实时速度、电压和温度。
视障用户能在树莓派系统菜单中“推荐软件(Recommended Software)”找到有用的工具。
我们还提供了 Orca 屏幕阅读器来简化树莓派桌面的访问。此外,我们还提供了屏幕放大器来放大用户界面,提高屏幕内容的可读性。
你可以从树莓派主菜单的 推荐软件(Recommended Software) 处安装 Orca 屏幕阅读器。或者,按 Ctrl + Alt + 空格键 自动安装 Orca。
在安装新系统后,首次启动树莓派系统时,将在 30 秒时播放自动语音提醒。此提醒提供了有关如何安装 Orca 的说明。
树莓派系统预装了 Python 3。对预装的系统级 Python 进行破坏,可能会引发操作系统故障。在安装第三方 Python 库时,请确保正确使用软件包管理工具。
在 Linux 上,你可以用两种方式来安装 python
依赖包:
使用 apt
来安装预配置系统软件包
在 虚拟环境中,使用 pip
,即使用 Python 的依赖管理器安装库
重要
自树莓派系统 Bookworm 以降,若使用
pip
,你只能将其安装至 Python 虚拟环境(venv
)。该变更是由 Python 社区引入的,与树莓派无关:有关更多信息,请参阅 PEP 668。
apt
安装 Python 软件包用 apt
安装的软件包,是专为树莓派系统打包的。这些软件包大都是预编译的,因此安装速度更快。由于 apt
管理能所有软件包的依赖关系,使用此方法,会同时安装运行软件包所需的所有子依赖包。而 apt
能确保你在卸载时免于对其他软件包造成破坏。
例如,要安装使用树莓派 Build 扩展板的 Python 3 库,请运行以下命令:
$ sudo apt install python3-build-hat
要查找使用 apt
分发的 Python 包,请使用 apt search
。在大多数情况下,Python 包使用前缀 python-
和 python3-
:比如,你会发现,名为 python3-numpy
的包,即为 numpy
。
pip
安装 Python 库pip
安装的变更在旧版本的树莓派系统中,你可以用 pip
直接把库安装到系统级 Python 中。自树莓派系统 Bookworm 以降,用户无法直接把库安装到系统级 Python。
应该把库安装到虚拟环境(venv
)。要为所有用户把库安装为系统级,请用 apt
来安装。
若尝试在系统级安装 Python 软件包,将会输出类似以下报错:
$ pip install buildhat
error: externally-managed-environment
× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
python3-xyz, where xyz is the package you are trying to
install.
If you wish to install a non-Debian-packaged Python package,
create a virtual environment using python3 -m venv path/to/venv.
Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make
sure you have python3-full installed.
For more information visit http://rptl.io/venv
note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.
长期以来,Python 用户一直承受着操作系统软件包管理器(apt
)和 Python 特定软件包管理工具(pip
)之间的冲突。这些冲突包括 Python 的 API 不兼容性、文件所有权。
从树莓派系统 Bookworm 开始,用 pip
安装的软件包,只能安装到 Python 虚拟环境(venv
)里面。虚拟环境是个容器,在这儿,你能安全地安装第三方模块,不会干扰系统级 Python。
要使用虚拟环境,请创建容器来存储环境。根据你使用 Python 的打算,有多种方法可以做到这一点。
运行以下命令可创建一个虚拟环境配置文件夹,把 <环境名>
改成你想要的虚拟环境名称(如 env
):
$ python -m venv <环境名>
技巧
要在虚拟环境中,将当前已安装的系统级 Python,所有软件包所在的文件夹,预加载至虚拟环境,请使用参数
--system-site-packages
。
然后,在虚拟环境配置文件夹中执行命令 bin/activate
以进入虚拟环境:
$ source <环境名>/bin/activate
然后,你应该会看到类似如下提示,其内容为:
(<环境名>) $
命令提示符前缀 (<环境名>)
代表当前终端会话位于名为 <环境名>
的虚拟环境中。
要查看当前是否位于虚拟环境,请使用 pip list
,查看已安装软件包的列表:
(<环境名>) $ pip list
Package Version
---------- -------
pip 23.0.1
setuptools 66.1.1
虚拟环境中已安装的输出列表应该要比系统级的 Python 要短得多。你现在可以放心地使用 pip
来安装软件包了。在虚拟环境中,使用 pip
安装的所有软件包都只会安装到这个虚拟环境中。在虚拟环境中,命令 python
和 python3
会自动调用虚拟环境中的 Python 版本和已安装的软件包,而非系统级 Python。
要退出虚拟环境,请运行以下命令:
(<环境名>) $ deactivate
许多用户会为每个 Python 项目都创建一个单独的虚拟环境。然后将虚拟环境放置在每个项目的根目录中(通常使用名称 env
)。在每个项目的根目录下,运行以下命令可创建虚拟环境配置文件夹。
$ python -m venv env
在开始你的项目工作之前,请在项目根目录下运行以下命令,以开始使用虚拟环境:
$ source env/bin/activate
然后,你应该会看到类似提示如下,内容为:
(env) $
当你完成项目工作后,可在任意目录下运行命令,来退出虚拟环境:
(env) $ deactivate
与为每个 Python 项目都创建一个虚拟环境有所不同,你可以为你的用户账户,单独创建一个虚拟环境。在运行其他 Python 程序之前,先激活这个虚拟环境。 这种方法对于在项目之间共享许多库的工作流可能更方便。
当为整个用户账户,跨多个项目创建虚拟环境时,可考虑将虚拟环境配置文件放在你的主目录下。可将其配置存储在一个以点开头的文件夹中,以便在默认情况下,隐藏该文件夹,防止在主目录里弄混。
使用以下命令,在当前用户的主目录中,隐藏文件夹下,创建虚拟环境:
$ python -m venv ~/.env
在其他目录,运行命令,即可开始使用虚拟环境:
$ source ~/.env/bin/activate
然后你应该会看到类似如下提示信息:
(.env) $
在任意目录,运行以下命令即可退出虚拟环境:
(.env) $ deactivate
我们推荐使用 Thonny,来编辑树莓派上的 Python 代码。
在默认情况下,Thonny 会使用系统级 Python。但是,你可以通过单击 Thonny 窗口右下角的 解释器菜单(interpreter menu) 切换使用 Python 虚拟环境。可选择配置好的环境,或使用 配置解释器(Configure interpreter…)
来配置一个新的虚拟环境。
使用 GPIO Zero 库能轻松地控制 GPIO 设备。该库在 gpiozero.readthedocs.io 上有全面的文档。
关于 GPIO 硬件的信息,请参见 GPIO 硬件。
以下示例代码用于控制接入到 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
。
以下示例代码可读取接入 GPIO2 的按钮状态,并在按下按钮时,点亮接入到 GPIO17 的 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
你可以在由树莓派出版社出版的书籍《GPIO Zero 基础电子学》(Simple Electronics with GPIO Zero)中,找到有关如何使用 GPIO Zero Python 库编程,联系你树莓派的更多信息。该书使用 GPIO Zero 库帮助你入门,并通过构建一系列项目来指导你如何使用它。
你可以免费下载这本书的 PDF 文件,它是根据知识共享署名-非商业性使用-相同方式共享 3.0 国际许可(CC BY NC-SA)发布的。
树莓派计算模块是衍生于旗舰级树莓派的嵌入式核心板(system-on-module,SOM)。计算模块在工业和商业应用中极受欢迎,如数字标牌、瘦客户机和自动化流程。上述程序有设计用于旗舰级树莓派的,但许多用户希望拥有更紧凑的设计及内置 eMMC 存储。
计算模块有多款衍生产品,内存和嵌入式多媒体卡(eMMC)闪存容量各不相同。eMMC 类似于 SD 卡,只是焊接在主板上。与 SD 卡不同,eMMC 专门设计用作磁盘,包含增强功能来提高可靠性。Lite 型号未搭载内置存储,并且有时用简写后缀 L 来表示,例如“CM3L”。
计算模块使用以下树莓派 SoC(片上系统):
CM1 采用 BCM2835
CM3, CM3+ 采用 BCM2837
适用于 CM4,CM4S 的 BCM2711
最新款的计算模块是计算模块 4(CM4)。我们建议,现在所有的开发都应使用 CM4。
计算模块 4
计算模块 4(CM4)搭载了树莓派 4 的内部构件(BCM2711 处理器和 1GB、2GB、4GB 或 8GB 的 RAM),以及可选的 0GB(Lite)、8GB、16GB 或 32GB 的 eMMC 闪存存储。
与 CM1、CM3 和 CM3+ 不同,CM4 未使用 DDR2 SODIMM 外形规格。相反,CM4 使用了两个 100 针高密度连接器,有更小的物理空间占用。这种变化帮助增加了以下接口:
额外的第二个 HDMI
PCIe
以太网
旧版的外形规格无法支持这些接口。
计算模块 4S
计算模块 4S(CM4S)搭载了树莓派 4 的内部构件(BCM2711 处理器和 1GB、2GB、4GB 或 8GB 的 RAM),以及可选的 0GB(Lite)、8GB、16GB 或 32GB 的 eMMC 闪存存储。与 CM4 不同,CM4S 采用了与 CM1、CM3 和 CM3+ 相同的 DDR2 SODIMM 外形规格。
计算模块 3+
计算模块 3+(CM3+)搭载了树莓派 3B+(BCM2837 处理器和 1GB 内存)的内部构件,以及可选的 0GB(Lite)、8GB、16GB 或 32GB eMMC 闪存存储。
计算模块 3
计算模块 3(CM3)搭载了树莓派 3 的内部构件(BCM2837 处理器和 1GB 的 RAM),以及可选的 4GB eMMC 闪存存储。
计算模块 1
计算模块 1(CM1)搭载了树莓派的内部构件(BCM2835 处理器和 512MB 内存),以及可选的 4GB eMMC 闪存存储。
树莓派 IO 板提供了一种将单个计算模块连接到各种 I/O(输入/输出)接口的方法。由于计算模块本质上较小,因此它们缺少端口和连接器。IO 板提供了一种将计算模块连接到各种外围设备的方法。
IO 板是旨在开发的分支板;在生产中,你应该使用一个更小的、也许是定制的板——这块板仅提供了你的用例所需的端口和外部设备。
计算模块 4 IO 板
计算模块 4 IO 板提供以下接口:
带有 40 针 GPIO 连接器和 PoE 标头的 HAT 印记
两个 HDMI 端口
两个 USB 2.0 端口
带 PoE 支持的千兆以太网 RJ45
MicroSD 卡槽(仅适用于没有 eMMC 的 Lite 衍生款)
PCIe Gen 2 接口
通过圆形插孔输入 12V(如未使用 PCIe,最高可达 26V)
MIPI DSI × 2 显示 FPC 连接器(22 引脚 0.5 mm 间距电缆)
MIPI CSI-2 × 2 摄像头 FPC 连接器(22 引脚 0.5 mm 间距电缆)
带电池插座的实时时钟
计算模块 IO 板
计算模块 IO 板提供以下接口:
120 个 GPIO 引脚
一个 HDMI 端口
一个 USB-A 端口
MIPI DSI × 2 显示器 FPC 连接器(22 针 0.5 mm 间距电缆)
MIPI CSI-2 × 2 相机 FPC 连接器(22 针 0.5 mm 间距电缆)
计算模块 IO 板有两个衍生:版本 1 和版本 3。版本 1 仅兼容 CM1。版本 3 兼容 CM1、CM3、CM3+ 和 CM4S。计算模块 IO 板版本 3 有时被简写为 CMIO3。
不是所有计算模块 IO 板都适用于所有计算模块型号。以下表格显示了每个 IO 板适用于哪些计算模块:
计算模块 IO 板版本 1 (CMIO)/(CMIO1)
* CM1
计算模块 IO 板版本 3 (CMIO)/(CMIO3)
计算模块 1 计算模块 3 计算模块 3+计算模块 4S
计算模块 4 IO 板 (CM4IO)
计算模块 4
计算模块搭载了连接到主 SD 卡接口的内置 eMMC 设备。本指南解释了如何将操作系统镜像刷写到单个计算模块的 eMMC 存储器。
当向多个计算模块刷写镜像时,请考虑使用计算模块配置工具:
使用计算模块配置器进行大规模配置
计算模块配置器是一款 Web 应用程序,可帮助开发人员同时为多个计算模块设备编程。
它提供了内核镜像数据库和在闪存过程中运行脚本的能力,以及自动标签打印和固件更新。
要刷写计算模块 eMMC,你需要以下物品:
本指南中称为主机设备的其他计算机。你可以使用 Linux(树莓派系统或 Ubuntu)、Windows 和 macOS。
与你的计算模块型号对应的计算模块 IO 板。
一根 Micro USB 线。
要开始,物理设置你的 IO 板。比如将计算模块和主机设备接入 IO 板。
设置计算模块 4 IO 板:
将计算模块连接到 IO 板。连接后,计算模块应该平放。
将 nRPI_BOOT 安装到 IO 板跳线帽 J2( disable eMMC Boot )。
将一根电缆从 IO 板上的 micro USB 从机端口 J11 连接到主机设备。
要设置计算模块 IO 板:
将计算模块连接到 IO 板。连接后,计算模块应平行于板放置,使接合夹牢固地卡入位。
将 J4(启用 USB SLAVE BOOT)设置为 1-2 =
(启用 USB BOOT)
将一根电缆从 IO 板上的 micro USB 从机端口 J15 连接到主机设备。
接下来,在主机设备上配置软件。
在 Linux 主机设备上配置软件:
运行以下命令安装 rpiboot
:
$ sudo apt install rpiboot
将 IO 板接入电源。
然后运行 rpiboot
:
$ sudo rpiboot
几秒钟后,计算模块应该会显示成一个大容量存储设备。查看 /dev/
目录,可能是 /dev/sda
或 /dev/sdb
,查找该设备。或者,运行 lsblk
并搜索一个存储容量与你的计算模块容量相匹配的设备。
技巧
你还可以从源代码编译
rpiboot
。
在 macOS 主机设备上配置软件:
首先,从源代码编译 rpiboot
。
将 IO 板连接到电源。
然后,使用以下命令运行 rpiboot
可执行文件:
$ sudo ./rpiboot
在命令运行完成后,你应该会看到一条消息,宣称“The disk you inserted was not readable by this computer.(你插入的磁盘无法被此计算机读取)” 点击“Ignore(忽略)”。你的计算模块现在应该显示成了一个大容量存储设备。
在 Windows 主机设备上配置软件:
下载 Windows 安装程序
双击安装程序运行。这将安装驱动程序和引导工具。
将 IO 板连接到电源。Windows 应该会发现硬件并配置所需的驱动程序。
双击运行 RPiBoot.exe
。几秒钟后,计算模块 eMMC 应该会显示为 USB 大容量存储设备。
技巧
或者,你可以从源代码编译
rpiboot
。
你可以使用树莓派启动盘制作工具把操作系统镜像刷写到计算模块上。
还可使用 dd
来将裸操作系统镜像(例如树莓派系统)写入你的计算模块。运行以下命令,请把 /dev/sdX
替换成你的计算模块的大容量存储设备代表形式的路径,并把 raw_os_image.img
替换为你的原始操作系统镜像的路径:
$ sudo dd if=raw_os_image.img of=/dev/sdX bs=4MiB
镜像写入后,断开计算模块,然后重新接入。现在应该能看到两个分区(用于树莓派系统):
/dev/sdX <- 设备
/dev/sdX1 <- 第一个分区(FAT)
/dev/sdX2 <- 第二个分区(Linux 文件系统)
你可以正常挂载分区 /dev/sdX1
和 /dev/sdX2
。
从 IO 板跳线上的 J2 (禁用 eMMC Boot) 断开 nRPI_BOOT
。
将 J4(启用 USB SLAVE BOOT)设置为 2-3
(禁用 USB BOOT)。
断开 USB 从属端口。重启 IO 板,从你刚刚写入 eMMC 的新镜像引导计算模块。
小部分 CM3 存在启动问题。我们已经认识到这些问题与创建 FAT32 分区的方法有关;我们认为问题是由于 CPU 和 eMMC 之间的时序差异造成的。如果你在启动 CM3 时遇到问题,请使用以下命令手动创建分区:
$ sudo parted /dev/<设备>
(parted) mkpart primary fat32 4MiB 64MiB
(parted) q
$ sudo mkfs.vfat -F32 /dev/<设备>
$ sudo cp -r <文件>/* <挂载点>
CM1 引导加载程序会向主机返回一个略有错误的 USB 数据包。大多数 USB 主机会忽略它,但由于该问题,某些 USB 接口无法工作。CM3 已修复该错误。
CM4 上的默认引导加载程序配置旨在支持在计算模块 4 IO 板上启动和开发,并且在制造时刷写的软件版本可能比最新版本要旧。对于最终产品,请考虑:
选择并验证特定的引导加载程序版本。usbboot 存储库中的版本始终是最新稳定版本。
配置引导设备(例如网络引导)。请参阅引导加载程序配置指南中的 BOOT_ORDER 部分。
启用引导加载程序 EEPROM 上的硬件写保护,可确保在无法触及的产品(如远程和嵌入式设备)上的引导加载程序无法被篡改。
注意
计算模块 4 ROM 不从 SD/EMMC 运行
recovery.bin
,在默认情况下,服务rpi-eeprom-update
未启用。这是必要的,因为 EMMC 不可拆卸,无效的recovery.bin
文件将妨碍系统启动。这可以被覆盖,与self-update
模式一同使用,其中引导加载程序可以从 USB 大容量存储设备和网络引导进行更新。但是,在更新 EEPROM 时发生断电后,self-update
模式不是原子更新,所以不安全。
基于 Linux 的大容量存储设备支持 NVMe、EMMC 和 USB 设备的闪存存储。这通常比使用 rpiboot
固件驱动程序更快,还为设备提供串口控制台,可更容易地进行调试。
另请参阅:CM4 rpiboot
扩展。
要修改 CM4 引导加载程序配置:
切换到目录 usbboot/recovery
如果需要特定的引导加载程序版本,请替换 pieeprom.original.bin
编辑默认的引导加载程序配置文件 boot.conf
;通常至少需要更新 BOOT_ORDER:
若使用网络启动,请使用 BOOT_ORDER=0xf2
若使用 SD/EMMC 启动,请使用 BOOT_ORDER=0xf1
若要在 USB 启动失败后切换到 EMMC,请使用 BOOT_ORDER=0xf15
运行 ./update-pieeprom.sh
可更新用于 EEPROM 镜像的镜像文件 pieeprom.bin
如果需要 EEPROM 写保护,请编辑 config.txt
,添加 eeprom_write_protect=1
。硬件写保护必须通过软件启用,然后通过将 EEPROM_nWP
引脚拉低进行锁定
运行 ../rpiboot -d .
可使用用于更新的 EEPROM 镜像的 pieeprom.bin
更新引导加载程序
文件 pieeprom.bin
现在已准备好刷写到计算模块 4 了。
要刷写引导加载程序 EEPROM,请遵循与刷写 EMMC 相同的硬件设置,但还要确保 EEPROM_nWP
未被拉低。完成后,EEPROM_nWP
可以再次被拉低。运行以下命令将 recovery/pieeprom.bin
写入引导加载程序 EEPROM:
$ ./rpiboot -d recovery
本指南帮助开发人员将外围设备连接到计算模块引脚。此外,本指南解释了如何更改软件以启用这些外围设备。
SoC 的大多数引脚(GPIO、两个 CSI 摄像头接口、两个 DSI 显示接口、HDMI 等)可用于连接。通常可以将未使用的引脚保持未连接状态。
带有 DDR2 SODIMM 外形规格的计算模块能插入 DDR2 SODIMM 插槽。但是,引脚分配与 SODIMM 内存模块不同。
要使用计算模块,用户设计的主板必须满足:
为计算模块供电(3.3V,最低 1.8V)
将引脚连接到用户应用程序所需的外围设备
树莓派的 IO 板提供以下功能:
为模块供电
将 GPIO 引线连接到引脚排
将摄像头和显示接口引线连接到 FFC 连接器
将 HDMI 引线连接到 HDMI 端口
将 USB 线连接到 USB 端口
将活动监视器连接到“ACT” LED
通过 USB 进行 eMMC 编程
本指南首先解释了引导过程以及设备树如何描述连接的硬件。
然后,我们将解释如何将 I²C 和 SPI 外围设备连接到 IO 板。最后,我们将创建使用这两个外围设备所需的设备树文件,以便在树莓派系统上使用。
BCM283x 带有三个通用输入/输出(GPIO)引脚组:BANK0 上有 28 个引脚,BANK1 上有 18 个引脚,BANK2 上有 8 个引脚,总共 54 个引脚。这些引脚可以用作真正的 GPIO 引脚:软件可以将它们设置为输入或输出,读取和/或设置状态,并将它们用作中断。它们还可以运行诸如 I²C、SPI、I²S、UART、SD 卡等其他功能。
所有计算模块上都可以使用 BANK0 和 BANK1。不要使用 BANK2:它控制 eMMC、HDMI 热插拔检测和 ACT LED/USB 引导控制。
使用 pinctrl
来检查 GPIO 引脚的电压和功能,以查看你的设备树是否按预期工作。
BCM283x 设备搭载了 VideoCore GPU 和 Arm CPU 核心。GPU 包括 DSP 处理器和用于图像处理、视频编解码、3D 图形和图像合成的硬件加速器。
在 BCM283x 设备中,首先启动了 GPU 中的 DSP 核心。它在启动主 Arm 处理器之前处理设置。
树莓派 BCM283x 设备有三阶段引导过程:
GPU DSP 退出复位并从小型内部引导 ROM 执行代码。此代码通过外部接口加载第二阶段引导加载程序。此代码首先在称为 bootcode.bin
的引导分区上查找第二阶段引导加载程序。如果未找到引导设备或未找到 bootcode.bin
,引导 ROM 将在 USB 引导模式下等待主机提供第二阶段引导加载程序(usbbootcode.bin
)。
第二阶段引导加载程序负责设置 LPDDR2 SDRAM 接口和其他关键系统功能。设置完成后,第二阶段引导加载程序加载并执行主 GPU 固件(start.elf
)。
start.elf
处理额外的系统设置并启动 Arm 处理器子系统。它包含 GPU 固件。GPU 固件首先读取 dt-blob.bin
以确定初始 GPIO 引脚状态和 GPU 特定接口和时钟,然后解析 config.txt
。然后加载特定于模型的 Arm 设备树文件和在 config.txt
中指定的任意设备树叠加,然后启动 Arm 子系统并将设备树数据传递给正在引导的 Linux 内核。
树莓派的 Linux 设备树编码了连接到系统的硬件信息以及用于与该硬件通信的驱动程序。
引导分区包含几个二进制设备树(.dtb
)文件。设备树编译器使用可读的设备树描述(.dts
)创建这些二进制文件。
引导分区包含两种不同类型的设备树文件。一种仅供 GPU 使用;其余是针对每个基于 BCM283x 的树莓派产品的标准 Arm 设备树文件:
dt-blob.bin
(供 GPU 使用)
bcm2708-rpi-b.dtb
(用于树莓派 1B 和 B)
bcm2708-rpi-b-plus.dtb
(用于树莓派 i 1B+ 和 A+)
bcm2709-rpi-2-b.dtb
(用于树莓派 2B)
bcm2710-rpi-3-b.dtb
(用于树莓派 3B)
bcm2708-rpi-cm.dtb
(用于树莓派计算模块 1)
bcm2710-rpi-cm3.dtb
(用于树莓派计算模块 3)
在启动过程中,用户可以通过 device_tree
参数在 config.txt
中指定了要使用的特定 Arm 设备树。例如,config.txt
中的 device_tree=mydt.dtb
这行指定了一个名为 mydt.dtb
文件中的 Arm 设备树。
你可以为计算模块产品创建完整的设备树,但我们建议改用叠加层。叠加层向基本设备树添加非特定于板的硬件描述。这包括使用的 GPIO 引脚及其功能,以及连接的设备,以便正确加载驱动程序。引导加载程序在将设备树传递给 Linux 内核之前将叠加层与基本设备树合并。基本设备树偶尔会更改,通常不会破坏叠加层。
使用 dtoverlay 参数在 config.txt 中加载设备树叠加层。树莓派系统假定所有叠加层位于目录 /overlays
中,使用后缀 -overlay.dtb
。例如,dtoverlay=myoverlay
这行加载了叠加层 /overlays/myoverlay-overlay.dtb
。
要将外围设备连接到计算模块,请在叠加层中描述连接到 BANK0 和 BANK1 GPIO 的所有硬件。这样你就可以使用标准的树莓派系统镜像,因为叠加层已合并到标准基础设备树中。或者,你还可以为你的应用程序定义自定义设备树,但你将无法使用标准的树莓派系统镜像。因此,你必须创建一个包含你自定义设备树的修改后的树莓派系统镜像,以便分发你想分发的每个操作系统更新。如果基础叠加层发生更改,则可能需要更新你的定制设备树。
dt-blob.bin
当 start.elf
运行时,它首先读取 dt-blob.bin
。这是一种特殊形式的设备树 blob,告诉 GPU 如何设置 GPIO 引脚状态。
dt-blob.bin 包含由 GPU 而不是 SoC 控制的 GPIO 和外围设备的信息。例如,GPU 管理摄像头模块。GPU 需要独占访问 I²C 接口和一些引脚,以便与摄像头模块通信。
在大多数树莓派型号上,I2C0 专为 GPU 独占使用。dt-blob.bin
定义了用于 I2C0 的 GPIO 引脚。
默认情况下,dt-blob.bin
不存在。作为替代,start.elf
是此文件的内置版本。许多计算模块项目提供了一个自定义 dt-blob.bin
,该文件覆盖了默认的内置文件。
dt-blob.bin
指定了:
用于 HDMI 热插拔检测的引脚
用作 GPCLK 输出的 GPIO 引脚
GPU 在引导过程中可以使用的 ACT LED
minimal-cm-dt-blob.dts
是一个示例 .dts
设备树文件。它设置了 HDMI 热插拔检测,ACT LED,并将所有其他 GPIO 设置为带有默认拉电的输入。
要将 minimal-cm-dt-blob.dts
编译为 dt-blob.bin
,请使用设备树编译器 dtc
。要在树莓派上安装 dtc
,请运行以下命令:
$ sudo apt install device-tree-compiler
然后,运行以下命令将 minimal-cm-dt-blob.dts
编译为 dt-blob.bin
:
$ dtc -I dts -O dtb -o dt-blob.bin minimal-cm-dt-blob.dts
获取更多信息,请参阅我们的创建指南 dt-blob.bin。
在 start.elf
读取 dt-blob.bin
,设置初始引脚状态和时钟后,它就会读取 config.txt
,其中包含许多其他系统设置选项。
在读取 config.txt
后,start.elf
会读取一个特定于模型的设备树文件。例如,计算模块 3 使用 bcm2710-rpi-cm.dtb
。该文件是一个标准的 Arm Linux 设备树文件,详细说明连接到处理器的硬件。它枚举了:
外围设备的种类和位置
使用了哪些 GPIO
这些 GPIO 有什么功能
连接了哪些物理设备
如果与 dt-blob.bin
不同,此文件将通过覆盖引脚状态来设置 GPIO,并尝试为特定设备加载驱动程序。
特定型号的设备树文件包含了对外围设备的禁用条目。除了 eMMC/SD 卡外设备的 GPIO 引脚定义外,它不包含其他 GPIO 引脚定义,并且始终使用相同的引脚。
树莓派系统镜像提供了预编译的 dtb 文件,但源 dts 文件位于树莓派 Linux 内核分支中。在文件名中查找 rpi
。
默认叠加层 dts 文件位于 arch/arm/boot/dts/overlays
。这些叠加层文件是创建自己的叠加层的好起点。要将这些 dts 文件编译为 dtb 文件,请使用设备树编译器 dtc。
在编译自己的内核时,构建主机需要 scripts/dtc
中的设备树编译器。要自动构建叠加层,请将它们添加到 dtbs 中的 make
目标中 arch/arm/boot/dts/overlays/Makefile
。
当启动 Linux 内核时,GPU 使用基础 dts 和任意叠加层创建完整的设备树。这个完整的树可以通过 Linux proc 接口在 /proc/device-tree
中浏览。节点变成目录,属性变成文件。
你可以使用 dtc
将其写成可供人类阅读的 dts 文件以进行调试。要查看完整的组装设备树,请运行以下命令:
$ dtc -I fs -O dts -o proc-dt.dts /proc/device-tree
pinctrl
提供了 GPIO 引脚的状态。如果出现问题,请尝试转储 GPU 日志消息:
$ sudo vclog --msg
技巧
要在输出中包含更多诊断信息,请将
dtdebug=1
添加到config.txt
。
使用设备树树莓派论坛提出设备树相关问题或报告问题。
以下示例使用带有通过跳线连接的外围设备的 IO 板。我们假设使用了旧版的精简版树莓派系统运行 CM1+CMIO 或 CM3+CMIO3。这里的示例需要互联网连接,因此我们建议将 USB 集线器、键盘和无线局域网或以太网转接器插入 IO 板的 USB 端口。
在这个示例中,我们将 NXP PCF8523 实时时钟(RTC)连接到 IO 板的 BANK1 GPIO 引脚:3V3、GND、GPIO44 上的 I2C1_SDA
和 GPIO45 上的 I2C1_SCL
。
下载 minimal-cm-dt-blob.dts
,将其复制到 /boot/firmware/
的引导分区中。
编辑 minimal-cm-dt-blob.dts
,将 GPIO44 和 45 的引脚状态更改为带上拉的 I2C1:
$ sudo nano /boot/firmware/minimal-cm-dt-blob.dts
替换以下行:
pin@p44 { function = "input"; termination = "pull_down"; }; // 默认状态为输入无拉取
pin@p45 { function = "input"; termination = "pull_down"; }; // 默认状态为输入无拉取
使用以下上拉定义:
pin@p44 { function = "i2c1"; termination = "pull_up"; }; // SDA1
pin@p45 { function = "i2c1"; termination = "pull_up"; }; // SCL1
我们可以在不进行任何改动的情况下使用此 dt-blob.dts
,因为 Linux 设备树在特定驱动程序加载时重新配置这些引脚。但是,如果配置了 dt-blob.dts
,GPIO 在 GPU 引导阶段尽快达到最终状态。在某些情况下,必须在 GPU 引导时配置引脚,以便在加载 Linux 驱动程序时处于特定状态。例如,重置线可能需要保持在正确的方向上。
运行以下命令编译 dt-blob.bin
:
$ sudo dtc -I dts -O dtb -o /boot/firmware/dt-blob.bin /boot/firmware/minimal-cm-dt-blob.dts
下载 example1-overlay.dts
,将其复制到 /boot/firmware/
中的引导分区,然后使用以下命令编译:
$ sudo dtc -@ -I dts -O dtb -o /boot/firmware/overlays/example1.dtbo /boot/firmware/example1-overlay.dts
参数 -@
编译具有外部引用的 dts 文件。一般是必要的。
将以下行添加到 /boot/firmware/config.txt
中:
dtoverlay=example1
最后,使用 sudo reboot
重启。
重启后,你将在 /dev
中看到一项 rtc0
。运行以下命令查看硬件时钟时间:
$ sudo hwclock
在这个示例中,我们使用已在 /boot/firmware/overlays
中定义的叠加层,将以太网控制器 ENC28J60 SPI 添加到 BANK0。以太网控制器使用 SPI 引脚 CE0、MISO、MOSI 和 SCLK(分别为 GPIO8-11),GPIO25 用于下降沿中断,另外还有 GND 和 3.3V。
在本示例中,我们不会更改 dt-blob.bin
。而是将以下行添加到 /boot/firmware/config.txt
中:
dtoverlay=enc28j60
使用 sudo reboot 重启。
你将在 /dev
中看到一项 rtc0
。运行以下命令查看硬件时钟时间:
$ sudo hwclock
你还应该具有以太网连接性。运行以下命令测试你的连接性:
$ ping 8.8.8.8
运行以下命令显示 GPIO 功能;GPIO8-11 现在应提供 ALT0(SPI)功能:
$ pinctrl
计算模块具有两个 CSI-2 摄像头接口:CAM1 和 CAM0。本节将说明如何使用计算模块 I/O 板将一个或两个树莓派摄像头连接到计算模块的 CAM1 和 CAM0 接口。
在配置摄像头之前,请确保你树莓派的固件是最新的。
$ sudo apt update
$ sudo apt full-upgrade
要将单个摄像头连接到计算模块,请完成以下步骤:
断开计算模块的电源。
使用 RPI-CAMERA 板/树莓派 Zero 摄像头电缆将摄像头模块连接到 CAM1 接口。
(仅限 CM1、CM3、CM3+ 和 CM4S):使用跳线电缆连接以下 GPIO 引脚:
0 到 CD1_SDA
1 到 CD1_SCL
2 到 CAM1_I01
3 到 CAM1_I00
重新连接计算模块到电源。
在 /boot/firmware/config.txt
中删除(或使用前缀 #
注释掉)以下行,如果存在的话:
camera_auto_detect=1
dtparam=i2c_arm=on
(仅适用于 CM1、CM3、CM3+ 和 CM4S):向 /boot/firmware/config.txt 添加以下指令,以适应 I/O 板上 GPIO 引脚分配的交换:
dtoverlay=cm-swap-i2c0
(仅适用于 CM1、CM3、CM3+ 和 CM4S):向 /boot/firmware/config.txt 添加以下指令,将 GPIO 3 分配为 CAM1 稳压器:
dtparam=cam1_reg
向 /boot/firmware/config.txt 添加适当的指令,手动配置相机型号的驱动程序:
摄像头模块 1
dtoverlay=ov5647,cam1
摄像头模块 2
dtoverlay=imx219,cam1
摄像头模块 3
dtoverlay=imx708,cam1
HQ 相机
dtoverlay=imx477,cam1
GS 相机
dtoverlay=imx296,cam1
使用 sudo reboot 重启你的计算模块。
运行以下命令以检查检测到的相机列表:
$ rpicam-hello --list
你应该能在上表中由驱动程序指令引用的摄像头型号中看到输出。
要将两台摄像头连接到计算模块,请完成以下步骤:
按照上述单摄像头说明操作。
断开计算模块的电源。
使用 RPI-CAMERA 板/树莓派 Zero 摄像头电缆将摄像头模块连接到 CAM0 接口。
(仅适用于 CM1、CM3、CM3+ 和 CM4S):使用跳线连接以下 GPIO 引脚:
28 到 CD0_SDA
29 到 CD0_SCL
30 到 CAM0_I01
31 到 CAM0_I00
(仅限 CM4):使用两根垂直方向的跳线连接 J6 GPIO 引脚。
重新连接计算模块到电源。
(仅适用于 CM1、CM3、CM3+ 和 CM4S):向 /boot/firmware/config.txt
添加以下指令,将 GPIO 31 分配为 CAM0 调节器:
dtparam=cam0_reg
向 /boot/firmware/config.txt
添加对应的参数,手动配置相机型号的驱动程序:
摄像头模块 1
dtoverlay=ov5647,cam0
摄像头模块 2
dtoverlay=imx219,cam0
摄像头模块 3
dtoverlay=imx708,cam0
HQ 相机
dtoverlay=imx477,cam0
GS 相机
dtoverlay=imx296,cam0
使用 sudo reboot
重启你的计算模块。
运行以下命令以检查检测到的相机列表:
$ rpicam-hello --list
你应该在上表中的驱动命令中看到两款摄像头型号的输出。
树莓派系统内置了 libcamera 库,可帮助你使用树莓派拍摄图像。
使用以下命令即时拍照,并将其保存成 PNG 编码的文件,文件名使用日期格式为 MMDDhhmmss:
$ rpicam-still --datetime -e png
使用参数 -t
添加毫秒级延迟。使用参数 --width
和 --height
可指定图像的宽度和高度。
使用以下命令立即开始录制十秒钟的视频,并将其保存到一个名为 video.h264
,带有 h264 编解码器的文件中:
$ rpicam-vid -t 10000 -o video.h264
默认情况下,libcamera
总是使用 --list-cameras
列表中编号为 0
的相机。要指定相机参数,请从以下命令获取每个相机的编号值:
$ rpicam-hello --list-cameras
Available cameras
-----------------
0 : imx477 [4056x3040] (/base/soc/i2c0mux/i2c@1/imx477@1a)
Modes: 'SRGGB10_CSI2P' : 1332x990 [120.05 fps - (696, 528)/2664x1980 crop]
'SRGGB12_CSI2P' : 2028x1080 [50.03 fps - (0, 440)/4056x2160 crop]
2028x1520 [40.01 fps - (0, 0)/4056x3040 crop]
4056x3040 [10.00 fps - (0, 0)/4056x3040 crop]
1 : imx708 [4608x2592] (/base/soc/i2c0mux/i2c@0/imx708@1a)
Modes: 'SRGGB10_CSI2P' : 1536x864 [120.13 fps - (768, 432)/3072x1728 crop]
2304x1296 [56.03 fps - (0, 0)/4608x2592 crop]
4608x2592 [14.35 fps - (0, 0)/4608x2592 crop]
在上述输出中:
imx477 指的是编号为 0
的 HQ 相机
imx708 指的是具有编号 1
的摄像头模块 3
要使用 HQ 摄像头,请将其编号(0
) 传给参数 --camera libcamera
:
$ rpicam-hello --camera 0
要使用摄像头模块 3,请将其编号 (1
) 传给参数 --camera libcamera
:
$ rpicam-hello --camera 1
在默认情况下,提供的摄像头驱动程序假定 CAM1 使用 i2c-10
,CAM0 使用 i2c-0
。计算模块 I/O 板将以下 GPIO 引脚映射到 i2c-10
和 i2c-0
:
CM4 I/O 板
GPIOs 44,45
GPIOs 0,1
计算模块 1、3、3+,计算模块 4S I/O 板
GPIO 0,1
GPIO 28,29
要连接相机到计算模块 1、计算模块 3、计算模块 3+和计算模块 4S I/O 板,添加以下参数到 /boot/firmware/config.txt
可匹配交换的引脚分配:
dtoverlay=cm-swap-i2c0
替代板可能使用其他引脚分配。查阅你板子的文档,并根据你的布局使用以下替代叠加层:
使用 GPIO 0、1 进行 i2c0
i2c0-gpio0
使用 GPIO 28、29 进行 i2c0(默认)
i2c0-gpio28
使用 GPIO 44 和 45 进行 i2c0
i2c0-gpio44
使用 GPIO 0&1 进行 i2c10 (默认)
i2c10-gpio0
使用 GPIO 28&29 进行 i2c10
i2c10-gpio28
使用 GPIO 44&45 进行 i2c10
i2c10-gpio44
对于相机关机,设备树使用叠加层 cam1_reg
和 cam0_reg
分配的引脚。
CM4 IO 板为两个别名提供单个 GPIO 引脚,因此两个相机共享同一个调节器。
CM1、CM3、CM3+ 和 CM4S I/O 板未提供 cam1_reg
和 cam0_reg
的 GPIO 引脚,因此这些板上的稳压器已禁用。但是,你可以通过在 /boot/firmware/config.txt
中使用以下指令来启用它们:
dtparam=cam1_reg
dtparam=cam0_reg
要将 cam1_reg
和 cam0_reg
分配到自定义板上的特定引脚,请在 /boot/firmware/config.txt
中加入以下参数:
dtparam=cam1_reg_gpio=<pin 值>
dtparam=cam0_reg_gpio=<pin 值>
例如,要将引脚 42 用作 CAM1 的稳压器,请将指令 dtparam=cam1_reg_gpio=42
添加到 /boot/firmware/config.txt
。
这些指令仅适用于直连 SoC 的 GPIO 引脚,而不适用于扩展的 GPIO 引脚。
在开始之前,请将系统软件和固件更新到最新版本。计算模块大多使用相同的流程,但有时物理差异会迫使针对特定型号进行更改。
注意
树莓派 Zero 相机线不能作为 RPI-DISPLAY 适配器的替代品。这两款线的布线不同。
要连接显示器到 DISP1:
断开计算模块的电源。
通过 22W 至 15W 显示适配器,将显示器连接到计算模块 IO 板上的 DISP1 接口。
(仅限 CM1、CM3、CM3+和 CM4S):使用跳线电缆连接以下 GPIO 引脚:
0 到 CD1_SDA
1 到 CD1_SCL
重新连接计算模块到电源。
将以下行添加到 /boot/firmware/config.txt
:
dtoverlay=vc4-kms-dsi-7inch
使用 sudo reboot
重启你的计算模块。你的设备应该能检测到显示器并开始显示输出。
连接显示器到 DISP0:
通过 15w-22W 电源适配器将显示器连接到计算模块 IO 板上的 DISP0
接口。
(仅适用于 CM1、CM3、CM3+和 CM4S):使用跳线电缆连接以下 GPIO 引脚:
28 到 CD0_SDA
29 到 CD0_SCL
重新连接计算模块到电源。
将以下行添加到 /boot/firmware/config.txt
:
dtoverlay=vc4-kms-dsi-7inch
使用 sudo reboot
重启你的计算模块。你的设备应该检测到显示器,然后开始显示输出。
触摸屏不需要额外配置。将其连接到你的计算模块,如果成功检测到,触摸屏元素和显示器都应该正常工作。
要禁用触摸功能,但仍使用显示器,请在 /boot/firmware/config.txt
中添加以下行:
disable_touchscreen=1
在连接时完全忽略显示器,请将以下行添加到 /boot/firmware/config.txt
:
ignore_lcd=1
了解有关计算模块 4(CM4)及其相应 IO 板的更多信息,请参阅以下文档:
配置计算模块 4
计算模块 4 有多种不同的硬件配置。一些用例禁用不需要的某些功能。
本文档描述了如何禁用各种硬件和软件接口。
设计数据可以在计算模块 4 IO 板(CM4IO)的数据表中找到:
我们还为 CM4 IO 板提供 KiCad PCB 设计套件:
计算模块 4S(CM4S)在 CM1、CM3 和 CM3+的 DDR2-SODIMM 尺寸中提供了 CM4 的内部组件。要了解有关 CM4S 的更多信息,请参阅以下文档:
计算模块 3+ (CM3+) 是一款受支持的产品,其终止生命周期(EOL)日期不早于 2028 年 1 月。要了解有关 CM3+及其对应 IO 板的更多信息,请参阅以下文档:
树莓派计算模块 1 (CM1) 和计算模块 3 (CM3) 是支持的产品,其终止生命周期 (EOL) 日期不早于 2026 年 1 月。要了解有关 CM1 和 CM3 的更多信息,请参阅以下文档:
从计算模块 1 和计算模块 3 过渡到计算模块 4
这份白皮书帮助开发人员从计算模块 1 和计算模块 3 迁移到计算模块 4。
计算模块 IO 板(CMIO)为 CM1、CM3、CM3L 和 CM3+提供各种接口。计算模块 IO 板有两个衍生版本:版本 1 和版本 3。版本 1 仅兼容 CM1。版本 3 兼容 CM1、CM3、CM3+和 CM4S。计算模块 IO 板版本 3 有时被简写为 CMIO3。要了解有关 CMIO1 和 CMIO3 的更多信息,请参阅以下文档:
计算模块摄像头/显示适配板(CMCDA)为计算模块提供摄像头和显示接口。要了解有关 CMCDA 的更多信息,请参阅以下文档:
以下原理图描述了用于旧款树莓派的欠压检测电路:
树莓派 Build 扩展板是一块附加板,可连接到树莓派的 40 引脚 GPIO 排针,同乐高®教育(LEGO® Education)合作设计,可轻松使用树莓派计算机控制乐高®机械组(LEGO® Technic™)电机和传感器。
注意
可在设备兼容性部分找到受支持设备的完整列表。
它为乐高®机械组电机和科创基础(SPIKE™)套装中的传感器提供了四个连接器。可用的传感器包括距离传感器、颜色传感器和多功能力传感器。角度电机有各种尺寸,并包括集成编码器,可查询其位置。
Build 扩展板适用于所有带有 40 引脚 GPIO 排针的树莓派计算机,包括通过连接排线或其他扩展设备的树莓派 400。可以轻松在 Python 中进行控制连接的乐高®机械组设备,同时还可以连接标准的树莓派配件,如摄像头模块。
树莓派 Build 扩展板的电源适配器(PSU)单独出售,旨在为 Build 扩展板、树莓派计算机以及所有连接的乐高®机械组设备供电。
从乐高®教育经销商单独提供的 SPIKE™ 科创基础套装 45678 和 SPIKE™ 科创基础扩展套装 45681 中,包含一组由 Build 扩展板支持的实用元件。
受支持设备的完整列表
注意
该 HAT 与所有 40 针 GPIO 树莓派开发板兼容,包括树莓派 4 和树莓派 Zero。通过添加排线电缆和其他扩展设备,也可与树莓派 400 一起使用。
控制 SPIKE™ Portfolio 中包含的 4 个 LEGO® Technic™ 电机和传感器。
控制你的乐高®机械组设备的易于使用的 Python 库
适用于带有 40 针 GPIO 引脚的所有树莓派计算机
Onboard RP2040 微控制器管理乐高®机械组设备的低级控制
单独提供的外部 8V 电源适配器,可为 Build 扩展板和树莓派供电
注意
由于树莓派 400 不支持通过 GPIO 引脚供电,Build 扩展板不能为其供电。
注意
在开始使用你的树莓派 Build 扩展板之前,你应该设置你的树莓派,使用树莓派启动盘制作工具安装最新版本的操作系统。
将 9mm 的间隔柱连接到板的底部。将树莓派 Build 扩展板安装到你的树莓派上。确保将其正确放置。与其他扩展板不同,所有组件都在底部,为顶部的面包板和乐高®元件留出空间。
如果你想使用树莓派的 GPIO 引脚,你可以添加一个可选的长排针并使用 15 mm 间隔柱。
下面的引脚是 Build 扩展板本身使用的,你不应该连接其他东西到这些引脚上。
GPIO0/1
ID 识别器
GPIO4
重置
GPIO14
发送
GPIO15
接收
GPIO16
RTS
未使用
GPIO17
CTS
未使用
树莓派启动后,通过单击 Raspberry 菜单按钮,然后选择“首选项”,再选择“Raspberry Pi 配置”来打开 Raspberry Pi 配置工具。
单击“接口”选项卡,并按照下面所示调整串口设置:
如果你正在无头运行你的树莓派并使用 raspi-config
,请从第一个菜单中选择“接口选项”。
然后选择“P6 Serial Port”。
禁用串口控制台:
然后启用串口。
最终设置应该看起来像这样。
如果你已经进行了一些更改,此时需要重启。
连接外部电源:推荐使用官方树莓派 Build 扩展板电源。但是凡是可靠的 +8V±10% 电源,能够通过 DC 5521 中心正枪形连接器(5.5mm × 2.1mm × 11mm)提供 48W 的电源,都可以为 Build 扩展板供电。除非你正在使用树莓派 400,否则无需再将树莓派接入电源。
注意
旧款扩展板无法为树莓派 400 供电,因为它不支持通过 GPIO 引脚取电。
注意
乐高®机械组电机非常强大;因此,为了驱动它们,你需要外部的 8V 电源。如果你想从电机编码器和 SPIKE™ 力传感器读取数据,你可以通过你树莓派的 USB 电源接口以平常的方式为你的树莓派和 Build 扩展板供电。与电机一样,SPIKE™ 颜色和距离传感器需要外部电源供应。
你可以选择使用 Python 和 .NET 与 Build 扩展板一起使用。
安装 Build 扩展板 Python 库。打开终端,然后输入,
$ sudo apt install python3-build-hat
有关 Build 扩展板 Python 库的更多信息,请参阅 ReadTheDocs。
有许多电机可以与 Build 扩展板一起使用
将电机连接到 Build 扩展板上的接口 A。LPF2 连接器需要正确插入。如果连接器无法轻松滑入,请旋转 180 度后重试。
启动 Thonny IDE。添加以下代码:
from buildhat import Motor
motor_a = Motor('A')
motor_a.run_for_seconds(5)
通过单击播放/运行按钮来运行程序。如果这是自树莓派启动以来首次运行 Build 扩展板程序,那么在固件复制到板上时会有几秒钟的暂停。你应该看到红色 LED 熄灭,绿色 LED 点亮。以后再执行 Python 程序就不会有这种暂停了。
你的电机应该顺时针转动 5 秒钟。
更改代码的最后一行并重新运行。
motor_a.run_for_seconds(5, speed=50)
电机现在应该转得更快。再做一个改变:
motor_a.run_for_seconds(5, speed=-50)
电机应该向相反方向(逆时针)转动
点击 Thonny 中的加号按钮创建一个新程序。添加以下代码:
from buildhat import Motor
motor_a = Motor('A')
while True:
print("Position: ", motor_a.get_aposition())
运行程序。拿起电机并转动轴。你应该看到在 Thonny REPL 中打印的数字在变化。
有许多传感器可与 Build 扩展板一起使用。
将彩色传感器连接到 Build 扩展板的 B 接口,将力传感器连接到 C 端口。
注意
如果你不打算驱动电机,则无需外部电源,可以使用标准 USB 电源为你的树莓派供电。
创建另一个新程序:
from signal import pause
from buildhat import ForceSensor, ColorSensor
button = ForceSensor('C')
cs = ColorSensor('B')
def handle_pressed(force):
cs.on()
print(cs.get_color())
def handle_released(force):
cs.off()
button.when_pressed = handle_pressed
button.when_released = handle_released
pause()
运行它,并将一个彩色物体(LEGO®元素最理想)放在颜色传感器前,然后按下力传感器压杆。传感器的 LED 应该亮起,并且最接近的颜色名称应该显示在 thonny REPL 中。
在树莓派上无法用 APT 安装从微软获取的 .NET 框架。但是,你可以参照微软的官方说明来安装 .NET 框架。这还有一个简化的第三方途径可以将 .NET 工具链安装到你的树莓派上。
警告
安装脚本以 APT 运行。你应该先阅读它,并确保你理解它在做什么。如果你有什么疑问,应该按照官方说明手动操作。
$ wget -O - https://raw.githubusercontent.com/pjgpetecodes/dotnet5pi/master/install.sh | sudo bash
安装 .NET 框架后,你可以创建你的项目:
$ dotnet new console --name buildhat
这将在 buildhat 子目录中创建一个默认程序,我们需要在该目录中才能继续:
$ cd buildhat
你现在需要安装以下 NuGet 软件包:
$ dotnet add package System.Device.Gpio --version 2.1.0
$ dotnet add package Iot.Device.Bindings --version 2.1.0
你可以使用 dotnet run 命令运行程序。现在让我们试一下,确保一切正常。它应该打印出 "Hello World!"
$ dotnet run
Hello World!
(在接下来的说明中,当指示“运行程序”时,你只需重新运行 dotnet run )
在下面的说明中,你将编辑生成的 C# 程序文件 buildhat/Program.cs,该文件是在运行上述命令时生成的。
所有文本编辑器都可能用来编辑 C# 代码,包括预装的 Geany IDE/文本编辑器。Visual Studio Code(通常称为 "VS Code")也是一个流行的替代方案。
树莓派 Build 扩展板在乐高®术语中被称为"Brick(积木)",你可以使用 Build 扩展板串行协议直接与之通信
你可以按照以下方式创建一个积木对象
Brick brick = new("/dev/serial0");
但是你需要记住在代码结尾处处理积木。
brick.Dispose();
警告
如果你不调用
brick.Dispose()
,你的程序将不会停止。
如果你想避免在最后调用 brick.Dispose,那么请使用 using 语句创建你的模块:
using Brick brick = new("/dev/serial0");
在这种情况下,当程序结束时,你的砖将被自动处理。
你可以收集各种软件版本、签名和输入电压:
var info = brick.BuildHatInformation;
Console.WriteLine($"version: {info.Version}, firmware date: {info.FirmwareDate}, signature:");
Console.WriteLine($"{BitConverter.ToString(info.Signature)}");
Console.WriteLine($"Vin = {brick.InputVoltage.Volts} V");
注意
输入电压仅在启动时读取一次,之后就不再读取。
函数 GetSensorType,GetSensor 将允许你检索连接传感器上的所有信息。
SensorType sensor = brick.GetSensorType((SensorPort)i);
Console.Write($"Port: {i} {(Brick.IsMotor(sensor) ? "Sensor" : "Motor")} type: {sensor} Connected: ");
在这个例子中,你也可以使用 IsMotor 静态函数来检查连接的元素是传感器还是电机。
if (Brick.IsActiveSensor(sensor))
{
ActiveSensor activeSensor = brick.GetActiveSensor((SensorPort)i);
}
else
{
var passive = (Sensor)brick.GetSensor((SensorPort)i);
Console.WriteLine(passive.IsConnected);
}
ActiveSensor 具有一系列高级属性和功能,可以帮助理解传感器的每个元素。还可以从砖块中调用原始功能。这将允许你选择特定模式并执行高级场景。虽然这是可能的,但电机和传感器类已经被创建,以使你的生活更轻松。
大多数传感器在其特殊属性上实现事件。你可以简单地订阅 PropertyChanged 和 PropertyUpdated。当值发生变化时,将触发更改的事件,而在成功更新属性时将触发更新的事件。根据使用的模式,一些属性可能会一直在后台更新,而另一些则偶尔更新。
当颜色变化或电机位置变化时,你可能只对此感兴趣,将其用作转速表。在这种情况下,PropertyChanged 就是你需要的!
Console.WriteLine("Move motor on Port A to more than position 100 to stop this test.");
brick.WaitForSensorToConnect(SensorPort.PortA);
var active = (ActiveMotor)brick.GetMotor(SensorPort.PortA);
bool continueToRun = true;
active.PropertyChanged += MotorPropertyEvent;
while (continueToRun)
{
Thread.Sleep(50);
}
active.PropertyChanged -= MotorPropertyEvent;
Console.WriteLine($"Current position: {active.Position}, eventing stopped.");
void MotorPropertyEvent(object? sender, PropertyChangedEventArgs e)
{
Console.WriteLine($"Property changed: {e.PropertyName}");
if (e.PropertyName == nameof(ActiveMotor.Position))
{
if (((ActiveMotor)brick.GetMotor(SensorPort.PortA)).Position > 100)
{
continueToRun = false;
}
}
}
砖块在初始化之前可能需要很长时间。已实现等待连接传感器的功能。
brick.WaitForSensorToConnect(SensorPort.PortB);
如果要实现诸如在一段时间后警告用户并重试等高级功能,也需要一段 CancellationToken 时间。
有两种类型的电机,被动电机和主动电机。主动电机将提供详细位置、绝对位置和速度,而被动电机只能通过速度来控制。
有一组常见的函数可用于控制电机的速度。有两个重要的函数: SetPowerLimit 和 SetBias :
train.SetPowerLimit(1.0);
train.SetBias(0.2);
只接受从 0.0 到 1.0 的值。功率限制是一种方便的方法,可以按比例减少最大功率。
添加到正电机驱动值并从负电机驱动值中减去的当前端口的偏置值集。这可以用来补偿大多数直流电机在完全转动之前需要一定量驱动的事实。
当创建电机时,默认值为功率限制为 0.7,偏置为 0.3。
火车电机,来自 Bricklink 的图片
典型的被动电机是火车和较旧的 Powered Up 电机。Speed 属性可以设置和读取。它既是目标,也是同时测量速度的传感器,因为这些传感器没有测量它们的方法。该值范围为 -100 到 +100。
控制 Start、Stop 和 SetSpeed 的功能也可用。以下是如何使用它的示例:
Console.WriteLine("This will run the motor for 20 secondes incrementing the PWM");
train.SetPowerLimit(1.0);
train.Start();
for (int i = 0; i < 100; i++)
{
train.SetSpeed(i);
Thread.Sleep(250);
}
Console.WriteLine("Stop the train for 2 seconds");
train.Stop();
Thread.Sleep(2000);
Console.WriteLine("Full speed backward for 2 seconds");
train.Start(-100);
Thread.Sleep(2000);
Console.WriteLine("Full speed forward for 2 seconds");
train.Start(100);
Thread.Sleep(2000);
Console.WriteLine("Stop the train");
train.Stop();
注意
在火车启动后,你可以调整速度,电机会相应调整。
主动电机,来自 Bricklink 的图片
主动电机具有 Speed,AbsolutePosition,Position 和 TargetSpeed 作为特殊属性。即使马达停止运行,它们也会持续读取。
代码片段显示了如何获取马达,启动它们并读取属性:
brick.WaitForSensorToConnect(SensorPort.PortA);
brick.WaitForSensorToConnect(SensorPort.PortD);
var active = (ActiveMotor)brick.GetMotor(SensorPort.PortA);
var active2 = (ActiveMotor)brick.GetMotor(SensorPort.PortD);
active.Start(50);
active2.Start(50);
// Make sure you have an active motor plug in the port A and D
while (!Console.KeyAvailable)
{
Console.CursorTop = 1;
Console.CursorLeft = 0;
Console.WriteLine($"Absolute: {active.AbsolutePosition} ");
Console.WriteLine($"Position: {active.Position} ");
Console.WriteLine($"Speed: {active.Speed} ");
Console.WriteLine();
Console.WriteLine($"Absolute: {active2.AbsolutePosition} ");
Console.WriteLine($"Position: {active2.Position} ");
Console.WriteLine($"Speed: {active2.Speed} ");
}
active.Stop();
active2.Stop();
注意
在需要时不要忘记启停你的马达。
高级功能适用于活动电机。你可以请求移动几秒钟,到特定位置,到特定绝对位置。以下是一些示例:
// 根据前面的示例,这将使电机回到初始位置:
active.TargetSpeed = 100;
active2.TargetSpeed = 100;
// 首先是这台电机,将堵塞线程
active.MoveToPosition(0, true);
// 然后是这台电机,将阻塞该线程
active2.MoveToPosition(0, true);
每个功能都允许你阻塞或不阻塞线程,直到操作完成。请注意,对于绝对位置和相对位置移动,存在几度的容差。
brick.WaitForSensorToConnect(SensorPort.PortA);
var active = (ActiveMotor)brick.GetMotor(SensorPort.PortA);
active.TargetSpeed = 70;
Console.WriteLine("Moving motor to position 0");
active.MoveToPosition(0, true);
Console.WriteLine("Moving motor to position 3600 (10 turns)");
active.MoveToPosition(3600, true);
Console.WriteLine("Moving motor to position -3600 (so 20 turns the other way");
active.MoveToPosition(-3600, true);
Console.WriteLine("Moving motor to absolute position 0, should rotate by 90°");
active.MoveToAbsolutePosition(0, PositionWay.Shortest, true);
Console.WriteLine("Moving motor to position 90");
active.MoveToAbsolutePosition(90, PositionWay.Shortest, true);
Console.WriteLine("Moving motor to position 179");
active.MoveToAbsolutePosition(179, PositionWay.Shortest, true);
Console.WriteLine("Moving motor to position -180");
active.MoveToAbsolutePosition(-180, PositionWay.Shortest, true);
active.Float();
你可以将电机放置在浮动位置,意味着它不再受任何约束。这是一种模式,你可以在将电机用作转速计时使用,移动它并读取位置。如果电机仍受约束,你可能无法移动它。
就像对于电机一样,你有主动和被动传感器。最近的传感器是主动的。被动的是灯光和简单按钮。主动传感器包括距离或颜色传感器,以及小型的 3x3 像素显示屏。
按钮/触摸被动传感器具有一个特定属性 IsPressed。当按钮被按下时,该属性设置为 true。这里是一个带有事件的完整示例:
brick.WaitForSensorToConnect(SensorPort.PortA);
var button = (ButtonSensor)brick.GetSensor(SensorPort.PortA);
bool continueToRun = true;
button.PropertyChanged += ButtonPropertyEvent;
while (continueToRun)
{
// 你还可以在这里做很多其他事情
Thread.Sleep(50);
}
button.PropertyChanged -= ButtonPropertyEvent;
Console.WriteLine($"Button has been pressed, we're stopping the program.");
brick.Dispose();
void ButtonPropertyEvent(object? sender, PropertyChangedEventArgs e)
{
Console.WriteLine($"Property changed: {e.PropertyName}");
if (e.PropertyName == nameof(ButtonSensor.IsPressed))
{
continueToRun = false;
}
}
被动光,来自 Bricklink 的图片
被动光是火车灯。它们可以打开,你可以控制它们的亮度。
brick.WaitForSensorToConnect(SensorPort.PortA);
var light = (PassiveLight)brick.GetSensor(SensorPort.PortA);
// 亮度 50%
light.On(50);
Thread.Sleep(2000);
// 亮度 70%
light.Brightness = 70;
Thread.Sleep(2000);
// 关灯
light.Off()
主动传感器类是一个通用类,所有主动传感器都继承自它,包括主动马达。它们包含一组关于它们如何连接到 Build 扩展板、模式、详细组合模式、硬件、软件版本以及一个名为 ValueAsString 的特定属性。字符串值包含最后一次测量的字符串集合。测量到达时,枚举将包含 P0C0:,+23,-42
和 0。这样做是为了如果你正在使用高级模式并自行管理组合模式和命令,你将能够获得测量值。
所有活动传感器都可以运行特定的测量模式或组合模式。你可以通过高级模式使用 SelectModeAndRead 和 SelectCombiModesAndRead 功能设置一个你想要持续拥有的特定模式。重要的是要理解更改模式或设置新模式将停止先前的模式。
可以在组合模式中组合的模式列在 CombiModes 属性中。当你设置其中一个模式时,传感器的所有属性将自动更新。
倾斜传感器,来自 Bricklink 的图片
倾斜传感器具有特殊 Tilt 属性。类型是一个点,其中 X 是 X 倾斜,Y 是 Y 倾斜。数值范围从 -45 到 +45,它们被限制在这些值并表示度数。
你可以使用 ContinuousMeasurement 属性为该传感器设置连续测量。
brick.WaitForSensorToConnect(SensorPort.PortA);
var tilt = (WeDoTiltSensor)brick.GetSensor(SensorPort.PortA);
tilt.ContinuousMeasurement = true;
Point tiltValue;
while(!console.KeyAvailable)
{
tiltValue = tilt.Tilt;
console.WriteLine($"Tilt X: {tiltValue.X}, Tilt Y: {tiltValue.Y}");
Thread.Sleep(200);
}
WeDo 距离传感器,来自 Bricklink 的图片
WeDo 距离传感器通过 Distance 属性以毫米为单位提供距离
brick.WaitForSensorToConnect(SensorPort.PortA);
var distance = (WeDoDistanceSensor)brick.GetSensor(SensorPort.PortA);
distance.ContinuousMeasurement = true;
while(!console.KeyAvailable)
{
console.WriteLine($"Distance: {distance.Distance} mm");
Thread.Sleep(200);
}
Spike 力传感器,来自 Bricklink 的图片
这个力传感器测量施加在其上的压力,以及是否被按下。这两个属性可以通过 Force 和 IsPressed 属性访问。
brick.WaitForSensorToConnect(SensorPort.PortA);
var force = (ForceSensor)brick.GetSensor(SensorPort.PortA);
force.ContinuousMeasurement = true;
while(!force.IsPressed)
{
console.WriteLine($"Force: {force.Force} N");
Thread.Sleep(200);
}
SPIKE 科创基础 3x3 彩色矩阵灯 图片来自 Bricklink
这是一个带有 9 个不同 LED 的小型 3x3 显示屏,可以单独控制。该类公开了控制屏幕的功能。以下是一个使用它们的示例:
brick.WaitForSensorToConnect(SensorPort.PortA);
var matrix = (ColorLightMatrix)brick.GetSensor(SensorPort.PortA);
for(byte i = 0; i < 10; i++)
{
// 会像进度条一样逐个点亮每个 LED 灯
matrix.DisplayProgressBar(i);
Thread.Sleep(1000);
}
for(byte i = 0; i < 11; i++)
{
// 将显示相同颜色的矩阵,并依次显示所有矩阵
matrix.DisplayColor((LedColor)i);
Thread.Sleep(1000);
}
Span<byte> brg = stackalloc byte[9] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Span<LedColor> col = stackalloc LedColor[9] { LedColor.White, LedColor.White, LedColor.White,
LedColor.White, LedColor.White, LedColor.White, LedColor.White, LedColor.White, LedColor.White };
// 关灯
matrix.DisplayColorPerPixel(brg, col);
SPIKE 颜色传感器:
SPIKE 颜色传感器,来自 Bricklink 的图片
颜色和距离传感器:
颜色距离传感器,来自 Bricklink 的图片
这些颜色传感器具有多种属性和功能。你可以获得 Color,ReflectedLight 和 AmbiantLight。
除此之外,颜色和距离传感器可以测量 Distance,并具有物体 Counter。它将自动计算进出范围的物体数量。这可以用来计算通过传感器前方的物体。距离限制在 0 到 10 厘米之间。
brick.WaitForSensorToConnect(SensorPort.PortC);
var colorSensor = (ColorAndDistanceSensor)brick.GetActiveSensor(SensorPort.PortC);
while (!Console.KeyAvailable)
{
var colorRead = colorSensor.GetColor();
Console.WriteLine($"Color: {colorRead}");
var reflected = colorSensor.GetReflectedLight();
Console.WriteLine($"Reflected: {reflected}");
var ambiant = colorSensor.GetAmbiantLight();
Console.WriteLine($"Ambiant: {ambiant}");
var distance = colorSensor.GetDistance();
Console.WriteLine($"Distance: {distance}");
var counter = colorSensor.GetCounter();
Console.WriteLine($"Counter: {counter}");
Thread.Sleep(200);
}
注意
为了更好地测量,不建议以非常快的方式更改测量模式,颜色集成可能无法正确完成。此示例为你展示了可以使用传感器做什么。此类不实现连续测量模式。你可以通过高级模式使用 SelectModeAndRead 函数设置一个连续拥有的特定模式。重要的是要理解更改模式或设置新模式将停止先前的模式。
超声波距离传感器,来自 Bricklink 的图标
这是一个距离传感器,它实现了一个 Distance 属性,可以提供 mm 距离。这个还有一个 ContinuousMeasurement 模式可用。
brick.WaitForSensorToConnect(SensorPort.PortA);
var distance = (UltrasonicDistanceSensor)brick.GetSensor(SensorPort.PortA);
distance.ContinuousMeasurement = true;
while(!console.KeyAvailable)
{
console.WriteLine($"Distance: {distance.Distance} mm");
Thread.Sleep(200);
}
你可以下载有关文档
Python 库文档的详细信息也可以在 ReadTheDocs 上找到。你可以在 .NET IoT Github 存储库中找到有关 .NET 库的更多信息。
你还可以关注树莓派基金会的项目,
Build 扩展板库支持 SPIKE™组合中包含的所有乐高® Technic™设备,以及来自乐高® Mindstorms 机器人发明家套件和其他使用 PoweredUp 连接器的设备。
重要
包含 Maker Plate 的 SPIKE™ Prime Expansion Set 的产品代码为 45681。原始 Expansion Set 为 45680,不包括 Maker Plate。
大角度电机
白色/青色
45602
是的
是的
45602
SPIKE Prime Set, SPIKE Prime Expansion Set
45678, 45680
电机
活动
31
中型角度电机
白色/青色
45603
是
是的
45603
SPIKE Prime Set
45678
电机
主动
30
中等角度电机
白色/灰色
6299646, 6359216, 6386708
是
是
436655
Mindstorms 机器人发明家
51515
电机
主动的
4B
小型角动力电机
白色/青色
45607, 6296520
是的
是的
SPIKE Essentials Set
电机
主动
41
光/颜色传感器
白色/黑色
6217705
是的
是的
SPIKE Prime Set, SPIKE Prime Expansion Set, Mindstorms Robot Inventor, SPIKE Essentials
45678, 45680, 51515
颜色传感器
主动
3D
距离传感器
白色/黑色
6302968
是
是
SPIKE Prime Set, Mindstorms Robot Inventor
45678, 51515
DistanceSensor
主动
3E
系统中型电机
白色/灰色
45303, 6138854, 6290182, 6127110
是的
是的
Wedo 2.0,乐高点子钢琴,应用程序控制的蝙蝠车
76112
被动
1
力传感器
白/黑
6254354
是的
是的
45606
SPIKE Prime Set
45678
力传感器
主动
3F
3×3 LED
白色/青色
45608, 6297023
是
是的
SPIKE Essentials
矩阵
主动
40
系统列车电机
黑色
88011
是的
是的
28740, 88011-1
货运火车,迪士尼火车和车站,客运列车
被动
2
供电 LED 灯
黑色
88005
是的
被动
8
中等线性电机
白色/灰色
88008
是
是
26913, 88008-1
提升, 机器人指挥官
电机
主动
26
Technic 大电机
灰色/灰色
88013
是的
是的
22169
主动
2E
Technic XL 电机
灰色/灰色
88014
是的
是的
22172, 88014
主动
2F
颜色 + 距离传感器
白色/灰色
88007
部分
?
26912
主动
25
WeDo 2.0 运动传感器
白色/灰色
45304, 6138855
5003423-1
主动
35
WeDo 2.0 倾斜传感器
白色/灰色
45305, 6138856
5003423-1
主动
34
树莓派 Build 扩展板的机械图纸。
config.txt
是什么?树莓派设备采用了配置文件——config.txt
,来代替普通 PC 上的 BIOS 。GPU 会先读取 config.txt
,然后再初始化 Arm CPU 及 Linux。树莓派系统(Raspberry Pi OS)会把 config.txt
放在 boot 分区(/boot/firmware/
)中。
注意
树莓派 Bookworm 之前的旧系统,会把 boot 分区放在
/boot/
。
你可以直接在你当前的树莓派系统上编辑 config.txt
。你也可弹出存储设备,在其他计算机上,编辑启动分区中的文件(含 config.txt
)。
所有对 config.txt
的修改,均仅在重启后生效。你可使用以下命令,获取当下使用的设置:
vcgencmd get_config <参数>
打印指定参数的值,如 vcgencmd get_config arm_freq
vcgencmd get_config int
列出所有非零(0
)的整数参数
vcgencmd get_config str
列出所有非空字符串参数
注意
vcgencmd
仅能获取到部分配置设置。
config.txt
文件会由早期启动固件读取,因此所采取的文件格式非常简单:每行一条语句:属性=值
,其中 值
可以是整数、字符串。 可以在行首添加字符 #
来插入注释,或注释掉现有配置值以禁用。
每行条目的最大长度为 98 个字符。树莓派系统会忽略掉所有溢出此限制的字符。
示例文件如下:
# 开启音频(加载 snd_bcm2835)
dtparam=audio=on
# 自动检测新加摄像头叠加层
camera_auto_detect=1
# 自动检测新加 DSI 显示器
display_auto_detect=1
# 开启 DRM VC4 V3D 驱动
dtoverlay=vc4-kms-v3d
include
在当前文件引用指定文件的内容。
比如:把 include extraconfig.txt
这行添加到 config.txt
,就会在 config.txt
文件中引用 extraconfig.txt
文件的内容。
注意
bootcode.bin
、EEPROM 引导加载程序均不支持 include 指令。以下由引导加载程序控制的设置,仅在
config.txt
(而非其他附带文件)中指定时才能生效:
bootcode_delay
、
gpu_mem
、gpu_mem_256
、gpu_mem_512
、gpu_mem_1024
、
total_mem
、
sdram_freq
、
start_x
、start_debug
、start_file
、fixup_file
、
uart_2ndstage
。
条件筛选器位于条件部分。
autoboot.txt
autoboot.txt
是可选配置文件,用于指定 boot_partition
的编号。
亦可与 tryboot
功能一同使用,实现系统更新的 A/B 启动。
autoboot.txt
被限制为 512 字节,支持条件筛选器 [all]
、[none]
和 [tryboot]
。
另见 TRYBOOT 启动流程。
boot_partition
指定启动的分区号。也可以直接把分区号作为参数传给 reboot
(如 sudo reboot 2
)命令来实现。
分区号从 1
开始,MBR 分区号为 1
到 4
。指定分区 0
意味着从 默认 分区启动,默认分区是首个可引导的 FAT 分区。
作为启动分区,其文件系统仅支持 FAT12、FAT16 和 FAT32,并包含了 start.elf
文件(若为树莓派 5,则改为文件 config.txt
),以便引导程序将其视为可引导。
[tryboot]
如果在启动时系统已设置标志位 tryboot
,则将激活此筛选器。
$ sudo reboot "0 tryboot"
tryboot_a_b
当标志位 tryboot
被激活后,若将属性 tryboot_a_b
置为 1
,会加载通常的文件 config.txt
、boot.img
,而不会加载文件 tryboot.txt
、tryboot.img
。
这样就可以在分区级(而非在文件级)上控制 tryboot
的开关,且无需修改 A/B 分区中的配置文件。
以下伪代码:假设了操作系统更新服务在 autoboot.txt
中使用 tryboot
执行安全的操作系统更新。
简单的 autoboot.txt
:
[all]
tryboot_a_b=1
boot_partition=2
[tryboot]
boot_partition=3
安装更新
设备上电,然后从默认分区 2 启动
Update service(更新服务)
下载新版操作系统到分区 3
重启到 tryboot
模式:用 reboot "0 tryboot"
来测试更新,其中 0
意味着默认分区
进行、取消更新
系统将从分区 3 启动,因为在 tryboot mode
中,筛选器 [tryboot]
的结果为真(true)
如果 tryboot
处于激活状态 ( /proc/device-tree/chosen/bootloader/tryboot == 1
)
如果当前的启动分区( /proc/device-tree/chosen/bootloader/partition
)与 autoboot.txt
部分的 [tryboot]
(boot_partition
)相匹配
Update service(更新服务)
验证系统以确保更新成功
如果更新成功
替换 autoboot.txt
以交换 boot_partition
配置
正常重启:当前默认启动分区是分区 3
如果更新失败
Update service(更新服务)
将更新标记为失败(如删除更新文件)。
正常重启:默认的启动分区仍是分区 2,因为标志位 tryboot
会被自动清除
结束更新
结束更新
结束更新
更新 autoboot.txt
:
[all]
tryboot_a_b=1
boot_partition=3
[tryboot]
boot_partition=2
注意
autoboot.txt
修改后并不必须重启。然而,必须小心不要让Update service(更新服务)
覆盖当前分区:因为已经修改了autoboot.txt
,执行了最后的更新。有关更多信息,请参阅设备树参数。
hdmi_enable_4kp60
(仅适用于树莓派 4)在默认情况下,当接入 4K 显示器时,树莓派 4B、400 和 CM4 将输出 30Hz 的刷新率。使用此参数可输出 60Hz 的刷新率。树莓派 4 无法在两个 micro HDMI 接口上同时输出 4Kp60。设置 hdmi_enable_4kp60
将增加功耗和温度。
camera_auto_detect
启用此设置(树莓派系统默认已启用),固件将自动加载所识别的 CSI 摄像头叠加层。如 camera_auto_detect=0
则意味着禁用该设置。
display_auto_detect
启用此设置(树莓派系统默认已启用),固件将自动加载所识别的 DSI 显示屏的叠加层。设置 display_auto_detect=0
可禁用。
dtoverlay
dtoverlay
参数将要求固件加载指定的设备树覆盖层——这是个配置文件,可启用内、外围硬件的内核支持。例如,dtoverlay=vc4-kms-v3d
会加载叠加层,启用内核图形驱动程序。
作为例外,如果在调用时未赋值(即 dtoverlay=
),则表示直接覆盖至参数列表的末尾。如果定义在一切 dtoverlay
、dtparam
参数之前,那么所有的扩展板叠加层均不会加载。
更多有关信息,请参阅 DTB、叠加层和 config.txt
。
dtparam
树莓派的设备树配置文件支持多种参数,如启用 I²C、SPI 接口。大部分 DT 叠加层也都能用参数进行配置。这两类的参数都可以用 dtparam
进行配置。此外,还可以把叠加层参数添加到参数 dtoverlay
里:以逗号分隔,但请注意,字符长度限制为 98 个字符。
欲了解更多详情,请查阅 DTB、叠加层和 config.txt
。
arm_boost
(仅适用于树莓派 4)所有树莓派 400 系列和修订版树莓派 4B 均搭载了额外的开关电源(SMPS)(用于 SoC 电压轨),这使默认超频状态下的主频,从 1.5GHz 提升到 1.8GHz。此更改在树莓派系统下默认已生效。设置 arm_boost=0
可禁用。
power_force_3v3_pwm
(仅适用于树莓派 5)使用 3.3V 电源时强制 PWM。设置 power_force_3v3_pwm=0
可禁用。
使用配置参数可以修改板载音频输出的模拟音频驱动方式,以及是否启用某些固件功能。
audio_pwm_mode
audio_pwm_mode=1
选择传统低质量模拟音频,基于 3.5 mm AV 端子。
audio_pwm_mode=2
选择使用高级调制方案的高质量模拟音频。(默认)
注意
此参数将占用更多的 GPU 计算资源,可能会对某些型号的特定用例造成影响。
disable_audio_dither
在默认情况下,如果音频流路由输出到了模拟音频,则会应用 1.0LSB 抖动。在某些情况下(如 ALSA 音量处于较低水平),就有可能产生可感的背景噪音。将 disable_audio_dither
置为 1
可禁用抖动功能。
enable_audio_dither
当音频样本大于 16 位时,通常就会禁用音频抖动(请参阅上述 disable_audio_dither
)。将此参数置为 1
可强制对所有位深度都应用抖动。
pwm_sample_bits
命令 pwm_sample_bits
能调整模拟音频输出的位深度。默认位深度为 11
。如果位深度设置低于 8
,音频将无法正常工作。因为低于 8
的值会导致 PLL 频率过低:对于设备来说,是不可能的。该参数通常仅用于演示位深度对量化噪声的影响。
在默认情况下,所有搭载了 HDMI 输出接口的树莓派型号,均启用了 HDMI 音频输出。
要禁用 HDMI 音频输出,请在 /boot/firmware/config.txt
中的 dtoverlay=vc4-kms-v3d
这行末尾添加 ,noaudio
:
dtoverlay=vc4-kms-v3d,noaudio
start_file
、fixup_file
这些参数指可指定:在启动前传给 VideoCore GPU 的固件文件。
start_file
指定要使用的 VideoCore 固件文件。fixup_file
用于修正 start_file
所使用的内存位置,以匹配 GPU 内存分配。
start_file
和 fixup_file
是一对关联文件:错误搭配将导致开发板无法启动。这是个专业参数,因此我们不建议你使用,你应该用 start_x
和 start_debug
。
注意
使用配置参数
start*cd.elf
、fixup*cd.dat
无法调用精简固件,只会导致系统无法启动。唯一能启用精简固件的方法是指定gpu_mem=16
。精简固件删除了对编解码器、3D 和调试日志的支持,以及把初始早期引导帧缓冲区限制成 1080p @16bpp——正如同其他固件,KMS 在后续阶段可使用高达 32bpp 4K 帧缓冲区代替之。
注意
树莓派 5 的固件内置在 EEPROM 引导加载程序中。
cmdline
cmdline
是启动分区中的一个可选文件名(默认值为 cmdline.txt
),用于读取内核命令行字符串。
kernel
kernel
是用于加载内核的启动分区上的一个可选文件名。树莓派 1,树莓派 Zero、Zero W 和计算模块 1 的默认值为 kernel.img
。树莓派 2、3、3+,树莓派 Zero 2 W,计算模块 3、3+ 的默认值为 kernel7.img
。树莓派 4、400 和计算模块 4 的默认值为 kernel8.img
;如将 arm_64bit
设置为 0,则默认值为 kernel7l.img
。
树莓派 5 固件默认加载 kernel_2712.img
,因为此镜像为树莓派 5 进行了优化(例如 16K 页面大小)。如果此文件不存在,则会加载 64 位通用内核( kernel8.img
)。
arm_64bit
如果置为 1,则内核将以 64 位模式启动。设置为 0 会选择 32 位模式。
在 64 位模式下,固件将选择合适的内核(例如 kernel8.img
)。如未显式设置参数 kernel
,则将使用该参数。
在树莓派 4 系列(4B、400、CM4 和 CM4S)上默认值为 1,在其他所有平台上默认值为 0。但是,如果显式设置的参数 kernel
中给定的名称与已知的任一内核匹配,则 arm_64bit
将应用相应设置。
注意
64 位内核可以是未压缩的镜像文件,也可以是 gzip 压缩的镜像文件(仍可称为作 kernel8.img。引导加载程序能从开头的签名字节识别压缩文件)。64 位内核仅适用于树莓派 3、3+、4、400,树莓派 Zero 2 W,树莓派 2B 修订版 1.2,树莓派计算模块 3、3+、4。树莓派 5 仅支持 64 位内核,因此对树莓派 5 来说,该参数无效。
ramfsfile
ramfsfile
是引导分区上的 ramfs
的一个可选文件名。
注意
新版固件可加载多个
ramfs
文件。请注意:多个文件名需以逗号分隔,不要超过 80 个字符的行长限制。所有已加载的文件在内存中拼接在一起,被视为单个ramfs
二进制块。有关更多信息,请参阅论坛。
ramfsaddr
ramfsaddr
指定 ramfsfile
将加载的内存地址。
initramfs
命令 initramfs
同时指定了 ramfs 的文件名 和 ramfs 将加载的内存地址。它在一个参数中同时执行了操作 ramfsfile
和 ramfsaddr
。地址也可以是 followkernel
(或 0
),将其放在内核镜像之后的内存中。示例值为:initramfs initramf.gz 0x00800000
、initramfs init.gz followkernel
。同 ramfsfile
一样,新版固件可加载多个文件,多个文件名以逗号分隔。
注意
参数
initramfs
使用的语法与其他参数有所不同,你不能在此处使用字符=
。
auto_initramfs
如果把 auto_initramfs
置为 1
,将按照所选内核的匹配规则查找文件 initramfs
。
disable_poe_fan
在默认情况下,启动时,会在 I²C 总线上进行探测(哪怕并未接入 PoE 扩展板)。将此参数置为 1,可禁用在 I²C(在 ID_SD&ID_SC
引脚)上对 PoE 扩展板风扇的检测行为。如果你不打算使用 PoE 扩展板,那么这是最大程度上缩短启动时间的有效方式。
disable_splash
如果将 disable_splash
置为 1,启动时将不会出现彩虹屏。默认值为 0
。
enable_uart
enable_uart=1
(与 console=serial0
在 cmdline.txt
中联合使用)能让内核创建串口控制台——可使用 GPIO 14 和 15(40 脚排针上的引脚 8 和引脚 10)访问。编辑 cmdline.txt
,删除 quiet
字段,就能把内核的启动消息也输出到这个串口上。另请参阅 uart_2ndstage
。
force_eeprom_read
将此参数置为 0
可禁止:固件在上电时读取 I²C 扩展板的 EEPROM(连接至 ID_SD
和 ID_SC
引脚)。另请参阅 disable_poe_fan
。
os_prefix
os_prefix
是可选配置,能让你在同一张卡上,安装多个版本的内核和设备树文件,并进行切换。os_prefix
中的一切值都会被前置到固件加载的所有操作系统文件的名称之前,其中“操作系统文件”的定义是指内核、initramfs
、cmdline.txt
、.dtbs
和叠加层。该前缀通常是目录名称,但也可以是文件名的一部分,比如“test-”。因此,目录前缀必须以字符 /
结尾。
为了提高系统启动的几率,固件首先会测试所提供的前缀值是否可行——除非在新位置/新名称下能够找到对应的内核和文件 .dtb,否则将忽略前缀(置为“”)。对叠加层可行性测试的特例是:如果存在 ${os_prefix}${overlay_prefix}README
,将仅从 ${os_prefix}${overlay_prefix}
(其中 overlay_prefix
的默认值为 "overlays/")加载覆盖层;否则,它将忽略 os_prefix
,并将叠加层视为共享。
(固件在检查前缀时,是判断关键文件(而非目录)的存在与否。原因有二:前缀可能不是目录,并非所有启动方法都支持使用测试目录。)
注意
所有操作系统文件都可以通过用户指定使用的绝对路径(相对于启动分区)来修改前缀——只需以
/
开头:如kernel=/my_common_kernel.img
。
另请参阅 overlay_prefix
和 upstream_kernel
。
otg_mode
(仅适用于树莓派 4)。USB On-The-Go(通常缩写为 OTG)是一项功能,它能让受支持的 USB 设备通过相应的 OTG 线把自己配置成 USB 主机。在旧款树莓派系列上,单个 USB2 控制器可同时作为 USB 主机模式和 USB 设备模式。
树莓派 4B 和 400(不含 CM4、CM4IO)添加了一个连接至 PCIe 的高性能 USB 3 控制器,用于驱动主要的 USB 端口。传统的 USB 2 控制器仍然可用:它通过 Type-C 电源接口,以设备模式进行连接。(otg_mode=0
为默认)。
otg_mode=1
可将 Type-C 接口的主控制器切换成更为强大的 XHCI USB 2 控制器。
注意
由于 CM4 和 CM4IO 未搭载单独的 USB 3 控制器,在树莓派操作系统镜像上,为 CM4 上设置了
otg_mode=1
,以实现最佳性能。
overlay_prefix
指定从哪个子目录/前缀加载叠加层,默认为 overlays/
(注意末尾的 /
)。如果同时使用了 os_prefix
,则 os_prefix
将位于 overlay_prefix
之前。即 dtoverlay=disable-bt
将会加载 ${os_prefix}${overlay_prefix}disable-bt.dtbo
。
注意
除非存在
${os_prefix}${overlay_prefix}README
,否则叠加层将与主操作系统复用(即无视os_prefix
)。
树莓派 5 需要一个文件 config.txt
来标识分区可启动。
boot_ramdisk
如果此属性置为 1
,则引导程序将尝试加载名为 boot.img
的 ramdisk 文件(其中包含引导文件系统)。随后的文件(例如 start4.elf
)将从 ramdisk 中读取,而非原始引导文件系统。
boot_ramdisk
的主要目的是支持安全启动(secure-boot
),但未签名的 boot.img
文件也可用于网络引导或配置 RPIBOOT
。
RAM 磁盘文件的最大值为 96MB。
boot.img
文件是裸磁盘的 .img
文件。推荐格式是不带 MBR 的普通 FAT32 分区。
在操作系统启动之前从内存中释放 RAM 磁盘文件系统。
如果触发 TRYBOOT,则引导加载程序将搜索 tryboot.img
而非 boot.img
。
另请参阅 autoboot.txt。
更多有关安全启动(secure-boot
)和创建 boot.img
文件的信息,请参阅 USBBOOT。
默认值: 0
boot_load_flags
定制固件(裸金属)的实验性属性。
位 0 (0x1) 表示 .elf
文件为定制固件。这将禁用一切兼容性检查(如是否支持 USB MSD 启动),并在加载可执行文件之前重置 PCIe。
对于树莓派 5 无关紧要,因为它就没有 start.elf
这个文件。
默认值: 0x0
pciex4_reset
仅适用于树莓派 5。
默认情况下,在启动操作系统之前,会对 RP1
使用的 PCIe x4 控制器进行复位。如果此参数置为 0
,则将禁用复位,以实现操作系统或裸金属代码继承来自引导加载程序的 PCIe 配置设置。
默认值: 1
uart_2ndstage
如果 uart_2ndstage
为 1
,则将启用串口调试日志记录。此参数还会自动启用 start.elf
中的串口日志记录。这也在启动参数页上有描述。
属性 BOOT_UART
也会启用引导加载程序的串口日志记录,但不会启用 start.elf
的串口日志记录——除非同时设置了 uart_2ndstage=1
。
默认值: 0
erase_eeprom
如果 erase_eeprom
置为 1
,那么 recovery.bin
将擦除整个 SPI EEPROM,而非刷新引导加载程序镜像。此属性在正常启动期间无效。
默认值:0
eeprom_write_protect
配置 EEPROM 写状态寄存器(write status register
)。可将整个 EEPROM 标记为写保护,或清除写保护。
该参数必须与控制 EEPROM 写入状态寄存器更新的 EEPROM /WP
引脚一同使用。将 /WP
的引脚拉低(CM4 为 EEPROM_nWP
、树莓派 4 为 TP5
)——但若仅如此,并不会对 EEPROM 写保护,除非同时对写入状态寄存器进行了配置。
可查看 Winbond W25x40cl、Winbond W25Q16JV 的数据手册以获取更多详细信息。
config.txt
中的 eeprom_write_protect
设置用于 recovery.bin
。
1
将整个 EEPROM 配置为写保护区域。
0
清除写保护区域。
-1
什么也不做。
注意
flashrom 不能清除写保护区域,如果定义了写保护区域,将无法更新 EEPROM。
对于树莓派 5,在默认情况下,/WP
已拉低,因此只要配置了写状态寄存器,就会启用写保护。要清除写保护,请将 /WP
引脚拉高,方法是连接 TP14
和 TP1
。
默认值: -1
os_check
对于树莓派 5,在从当前分区引导之前,固件默认会自动检查适配的设备树文件。如果没有找到,将加载旧的不兼容的内核,然后可能会卡住。要禁用此检查(如用于裸机开发),请在 config.txt
中设置 os_check=0
。
默认值: 1
bootloader_update
可将此参数置为 0
以关闭自动更新(无需刷新 EEPROM 配置)。在通过网络引导更新多个树莓派时,有时会很有用,因为可以针对不同的树莓派控制此参数(例如,通过 config.txt
中的串号筛选器)。
默认值: 1
白皮书
本白皮书介了如何在基于树莓派 4 的设备上实现安全启动。有关我们实施安全启动方法的概述,请参阅树莓派 4 启动安全白皮书。安全启动系统被设计成与基于
buildroot
的操作系统镜像搭配使用;不建议、或者说不支持将其与树莓派系统(Raspberry Pi O)一同使用。
以下 config.txt
属性用于编程安全启动的 OTP 设置。这些更改是不可逆的,只能在刷写引导加载程序 EEPROM 镜像时通过 RPIBOOT
进行编程。这阻止了使用远程设置或通过意外插入陈旧的存储卡镜像进行安全启动。
更多有关启用安全启动的信息,请参阅安全启动 readme 文件和 USBBOOT 存储库中的安全启动教程。
program_pubkey
如果将此属性置为 1,则 recovery.bin
将把 EEPROM 镜像中的公钥哈希值写入 OTP。一旦设置,启动加载程序将拒绝使用其他 RSA 密钥签名的 EEPROM 镜像及未签名的镜像。
默认值: 0
revoke_devkey
如果将此属性置为 1,则 recovery.bin
将向 OTP 写入一个值,以阻止 ROM 加载不支持安全启动的旧版第二阶段的启动加载程序。这可以阻止通过回滚到旧版启动加载程序以绕过安全启动的行为。
默认值: 0
program_rpiboot_gpio
由于树莓派 4B 和树莓派 400 上没有专用的 nRPIBOOT
跳线,因此必须使用别的 GPIO 配置 RPIBOOT
模式,可通过拉低 GPIO 来实现。请从以下参数中选择这个 GPIO:
2
4
5
6
7
8
此属性不要求安全启动,但要确认该 GPIO 配置不会与其他扩展板冲突,因为扩展板可能会在启动期间将 GPIO 拉低。
出于安全考量,此属性仅可通过 RPIBOOT
进行编程,因此必须首先用 erase_eeprom
擦除 EEPROM 引导加载程序。这将触发 BCM2711 ROM 故障转移到 RPIBOOT
模式,然后才能设置此参数。
默认值:
program_jtag_lock
如果将此属性置为 1
,则 recovery.bin
将编程一个 OTP 值,来禁用 VideoCore JTAG(调试接口)。此参数必须与 program_pubkey
和 revoke_devkey
同时使用。启用此参数可禁用故障诊断,应仅在设备经过全面测试后设置此参数。
默认值: 0
gpio
gpio
指令能在启动时把 GPIO 引脚设置为特定模式、特定值,这种方式在以前需要一个自定义文件 dt-blob.bin
。每一行都将相同的设置(或至少相同的更改)应用到一组引脚,可处理单个引脚(3
)、某区间内的引脚(3-4
)或以逗号分隔的列表(3-4,6,8
)。
引脚设置后跟一个 =
和此列表中的一个或多个逗号分隔属性:
ip
——输入
op
——输出
a0-a5
——Alt0-Alt5
dh
——驱动高电平(用于输出)
dl
——驱动低电平(用于输出)
pu
——上拉
pd
——下拉
pn/np
——无拉取
gpio
设置将按顺序应用,因此后面出现的设置会覆盖先前出现的设置。
示例:
# 将 GPIO 引脚 0-27 配置成 Alt2 模式(用于 DPI24)
gpio=0-27=a2
# 将 GPIO12 设置为输出模式,并将其状态设为 1
gpio=12=op,dh
# 更改引脚 18、引脚 20 的上拉、下拉配置(引脚为输入)。
gpio=18,20=pu
# 将引脚 17-21 设置为输入。
gpio=17-21=ip
config.txt
中的条件筛选器“[...]” 兼容该 gpio
指令,因此可以根据型号、序列号和 EDID 使用不同的设置。
通过该机制进行的 GPIO 修改不会直接干预内核。它们不会把 GPIO 引脚暴露到 sysfs
接口,并且可被设备树中的 pinctrl
条目以及像 pinctrl
这样的工具所覆盖。
还请注意,从上电到修改生效会有几秒钟的延迟——如果通过网络启动或从 USB 大容量存储设备启动,那么延迟会更大。
内核会默认启用驱动程序 CPUFreq:安装 raspi-config 后,在启动时会把调度程序从 powersave 切换到 ondemand。通过调度程序 ondemand,CPU 频率将随处理器负载而变化。如果你把配置参数 *_min
调整为最小值、使用了静态缩放调度程序(powersave、performance),亦或使用 force_turbo=1
——他们都会禁用动态频率调整。
当 SoC 在运行时达到 temp_limit
(见下文,默认为 85°C)时,就会禁用超频和过压功能,以降低 SoC 温度。你不大可能在树莓派 1、2 上受到此限制。在树莓派 3 及更新款上才有可能。当检测到欠电压时,也会禁用超频和过压功能。
注意
更多信息请参阅频率管理和热控制部分。
警告
将任意超频参数设置为非
raspi-config
使用的值可能会导致在 SoC 内部置一个永久位。这将使你的树莓派以往的超频情况变得可检测。当将force_turbo
置为1
且任一over_voltage_*
参数置为大于0
的值时,就会应用超频位设置。详细信息请查看有关超频模式的博客文章。
arm_freq
ARM CPU 的频率(MHz)。
arm_boost
将 arm_freq
提升到主板和固件所支持的最高主频。置为 1 启用。
gpu_freq
与 core_freq
、h264_freq
、isp_freq
、v3d_freq
和 hevc_freq
一同设置。
core_freq
GPU 处理器主频(MHz)。将影响 CPU 性能,因为它驱动着 L2 缓存和内存总线;只有树莓派 Zero、Zero W,树莓派 1 能从 L2 缓存中受益;对树莓派 2、3 上的内存(SDRAM)来说,有好处但不大。请参见下文关于在树莓派 4 上如何使用的章节。
h264_freq
硬件视频模块的频率(MHz);对个别 gpu_freq
设置的覆盖。
isp_freq
图像传感器管道模块的频率(MHz);对个别 gpu_freq
设置的覆盖。
v3d_freq
3D 模块的频率(MHz);对个别 gpu_freq
设置的覆盖。在树莓派 5 上,V3D 独立于 core_freq
、isp_freq
和 hevc_freq
。
hevc_freq
高效视频编解码器模块的频率(MHz);对个别 gpu_freq
设置的覆盖。仅适用于树莓派 4。
sdram_freq
内存(SDRAM)的频率(MHz)。在树莓派 4 及后续新款设备上无法对内存(SDRAM)超频。
over_voltage
CPU/GPU 核心的电压上限。数值应位于区间 [-16,8],这相当于区间 [0.95V,1.55V](树莓派 1 为 [0.8V,1.4V]),步长为 0.025V。换言之,设定 -16 将把 CPU/GPU 核心电压的最大值变成为 0.95V(树莓派 1 为 0.8V);设定为 8 将高达 1.55V(树莓派 1 为 1.4V)。有关默认值,请参见下表。仅当指定 force_turbo=1
时,才能允许高于 6 的值:如果同时设定 over_voltage_*
大于 0
,则会设置保修位。
over_voltage_sdram
与 over_voltage_sdram_c
,over_voltage_sdram_i
和 over_voltage_sdram_p
一同设置。
over_voltage_sdram_c
调整内存(SDRAM)控制器电压。[-16,8] 等同于 [0.8V,1.4V],步长为 0.025V。不支持树莓派 4 及后续新款设备。
over_voltage_sdram_i
调整内存(SDRAM)I/O 电压。[-16,8] 等同于 [0.8V,1.4V],步长为 0.025V。不支持树莓派 4 及后续新款设备。
over_voltage_sdram_p
调整内存(SDRAM)物理电压。[-16,8] 等同于 [0.8V,1.4V],步长为 0.025V。不支持树莓派 4 及后续新款设备。
force_turbo
无论 ARM 处理器是否空闲,均强制使用超频模式的频率。如同时设定 over_voltage_*
,启用该参数可能导致设置保修位。
initial_turbo
启用,持续给定的秒数,或直至设置 cpufreq 频率。最大值为 60
。
arm_freq_min
动态频率时钟 arm_freq
的最小值。请注意,将该值降低至低于默认值的数值并不会触发任何实质上的节能,且当前并不支持。
core_freq_min
动态频率时钟 core_freq
的最小值。
gpu_freq_min
动态频率调节 gpu_freq
的最小值。
h264_freq_min
动态频率调节 h264_freq
的最小值。
isp_freq_min
动态频率调节 isp_freq
的最小值。
v3d_freq_min
动态频率时钟 v3d_freq
的最小值。
hevc_freq_min
动态频率时钟 hevc_freq
的最小值。
sdram_freq_min
动态频率时钟 sdram_freq
的最小值。
over_voltage_min
动态频率时钟 over_voltage
的最小值。该值应位于区间 [-16,8] 内,等同于 [0.8V,1.4V],步进为 0.025V。换言之,指定 -16 将使 CPU/GPU 核心空闲电压变为 0.8V;设定为 8 将把最低电压变为 1.4V。在树莓派 4、5 上,该参数已弃用。
over_voltage_delta
在树莓派 4、5 上,参数 over_voltage_delta
会将给定的偏移量(µV)添加到 DVFS 算法计算的数值中。
temp_limit
过热保护。当 SoC 达到设定值(°C)时,会将时钟和电压设置为默认值。超过 85 的值仍为 85。
temp_soft_limit
仅适用于 3A+、3B+。 CPU 频率节流控制。它设定了启用 CPU 时钟速度节流系统时的温度。在此温度下,时钟速度将从 1400MHz 降至 1200MHz。默认值为 60
,最大可升至 70
,但可能会不大稳定。
下表提供了各种树莓派型号参数的默认值,所有频率均以 MHz 表示。
arm_freq
1000
700
900
1200
1400
1500
1500、1800(若 arm_boost = 1
)
1800
1000
2400
core_freq
400
250
250
400
400
500
500
500
400
910
h264_freq
300
250
250
400
400
500
500
500
300
不适用
isp_freq
300
250
250
400
400
500
500
500
300
910
v3d_freq
300
250
250
400
400
500
500
500
300
910
hevc_freq
不适用
不适用
不适用
不适用
不适用
500
500
500
不适用
910
sdram_freq
450
400
450
450
500
3200
3200
3200
450
4267
arm_freq_min
700
700
600
600
600
600
600
600
600
1500
core_freq_min
250
250
250
250
250
200
200
200
250
500
gpu_freq_min
250
250
250
250
250
250
250
250
250
500
h264_freq_min
250
250
250
250
250
250
250
250
250
不适用
isp_freq_min
250
250
250
250
250
250
250
250
250
500
v3d_freq_min
250
250
250
250
250
250
250
250
250
500
sdram_freq_min
400
400
400
400
400
3200
3200
3200
400
4267
下表提供了所有通用参数默认值。
initial_turbo
0(秒)
temp_limit
85(°C)
over_voltage
0(1.35V、树莓派 1 为 1.2V)
over_voltage_min
0(1.2V)
over_voltage_sdram
0(1.2V)
over_voltage_sdram_c
0 (1.2 V)
over_voltage_sdram_i
0 (1.2 V)
over_voltage_sdram_p
0 (1.2 V)
固件使用自适应电压调节(AVS)来确定最佳的 CPU/GPU 核心电压(由 over_voltage
和 over_voltage_min
定义的区间内)。
当系统处于空闲状态时,最低主频必须保持在一定的速度,以支持显示器的最高像素时钟(忽略 blanking)。因此,如果信号格式为 4Kp60,则将把 core_freq
提升到 500 MHz 以上。
显示参数
core_freq
最大值
默认值
500
hdmi_enable_4kp60
550
注意
无需使用
hdmi_enable_4kp60
,树莓派 5 默认即支持双 4Kp60 显示屏。
超频需要最新版本的固件。
最新的固件在系统超频时会自动提高电压。手动设定 over_voltage
会禁用超频时的自动电压调节。
建议在超频时对单个参数(isp_freq
、v3d_freq
等)的频率进行设定。不建议设定 gpu_freq
,因为 ISP、V3D、HEVC 等的最大稳定频率不同。
树莓派 4 及更新款设备上的内存(SDRAM)频率不可设定。
force_turbo
在默认情况下(force_turbo=0
),按需的 CPU 频率驱动程序会在 ARM 核心繁忙时把时钟提升到最大频率,并在 ARM 核心空闲时将其降至最低频率。
force_turbo=1
可覆盖上述行为,即使 ARM 核心负载并不大,也会强制使用最大频率。
GPU 核心、CPU、内存(SDRAM)和 GPU 各自拥有自己的锁相环(PLL),且频率可互相独立。h264、v3d 和 ISP 模块则使用相同的锁相环(PLL)。
要查看树莓派当前的频率(KHz),请输入: cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
。将结果除以 1000 可获得以 MHz 为单位的值。请注意,此频率是内核请求的频率,若在有限制的情况下(如高温)CPU 的实际运行速度可能比报告的要慢。使用 vcgencmd
——vcgencmd measure_clock arm
可获取 ARM CPU 实际频率的瞬时测量值 。该频率以赫兹为单位显示。
白皮书
本白皮书详细介绍了你的树莓派会发热的可能性原因,以及为何你可能想要对其进行降温,并提供了有关冷却过程的参数。
要查看树莓派的温度,请运行以下命令:
$ cat /sys/class/thermal/thermal_zone0/temp
通过将结果除以 1000 可获得摄氏度的值。或者,你可以使用 vcgencmd measure_temp
报告的 GPU 温度。
达到温度极限不会对 SoC 造成伤害,只会导致 CPU 降频。散热器可以帮助控制核心温度,从而提高性能。如果给树莓派安装了外壳,则极为有用。散热器上的空气流动会使冷却效果更好。
当核心温度位于 80°C 和 85°C 之间时 ARM 核心将被限速。若温度超过 85°C,ARM 核心、GPU 均将被限速。
对于树莓派 3B+ 来说,其印刷电路板(PCB)技术有所改良,提供了更佳的散热性能,及更高的热质量。此外,还引入了软温度限制,旨在在设备达到 85°C 的硬限制之前,尽可能延长其“高性能”运行时间。当达到软限制时,时钟速度会从 1.4GHz 降至 1.2GHz,并略微降低工作电压。这减少了温度的上升速率:我们用更长时间的 1.2GHz,替代了短时间的 1.4GHz。在默认情况下,软限制为 60°C。可用 config.txt
设置中的 temp_soft_limit
更改此设置。
维持供电电压大于 4.8V 才能确保可靠性能。请注意,某些 USB 充电器(电源)电压可能会降至 4.2V。这是因为它们通常设计用于为 3.7V 的锂聚合物电池充电,而非为计算机提供 5V 电源供应。
要监测树莓派的电源供电电压,你需要用万用表测量 GPIO 排针的 VCC 引脚和 GND 引脚。有关更多信息,请查看文档的电源部分。
如电压降至 4.63V(±5%)以下,ARM 核心、GPU 将降频,并将在内核日志中打印标识低电压状态的信息。
树莓派 5 的电源管理芯片(PMIC)内置了模数转换器(ADC),可测量供电电压。要查看当前供电电压,请运行以下命令:
$ vcgencmd pmic_read_adc EXT5V_V
大多数超频问题会实时反应为启动失败。如果发生了这种情况,请在下次启动时按住 shift 键。将临时禁用所有超频,你即可成功启动,然后再修改你的设置。
当单张存储卡(SD 卡镜像)与一块树莓派和一台显示器搭配使用时,很轻松地,就能根据所需的特定组合设置 config.txt
。可维持这种方式,仅在发生变化时才进行修改。
但是,如果一块树莓派在不同显示器之间交换使用,或一张存储卡(SD 卡镜像)在多块开发板间交换使用,那么单套设置可能就不大够用了。条件筛选器能让你定义配置文件的某些部分仅适用于特定情况,从而让不同硬件在读取相同的 config.txt
时能创建不同的配置。
[all]
筛选器 [all]
是最基本的筛选器。它会重置所有先前设置的筛选器,并能将任意下表列出设置应用于所有硬件。通常,最好在筛选设置组的末尾添加筛选器[all]
,以避免意外组合筛选器(另见下文)。
型号条件筛选器的适用的型号如下表所示。
[pi1]
1A、1B、1A+、1B+,计算模块 1
[pi2]
2B(基于 BCM2836、BCM2837)
[pi3]
3B、3B+、3A+,计算模块 3、3+
[pi3+]
3A+、3B+(同时引用 [pi3]
的内容)
[pi4]
4B、400,计算模块 4、4S
[pi5]
树莓派 5
[pi400]
Pi 400(同时引用 [pi4]
内容)
[cm4]
计算模块 4(同时引用 [pi4]
内容)
[cm4s]
计算模块 4S(同时引用 [pi4]
内容)
[pi0]
Zero、Zero W、Zero 2 W
[pi0w]
Zero W(同时引用 [pi0]
内容)
[pi02]
Zero 2W(同时引用 [pi0w]
、[pi0]
的内容)
[board-type=Type]
按 Type
值筛选——参见。如 [board-type=0x14]
将匹配 CM4。
对于设置不同的 kernel
、initramfs
和 cmdline
设置极为有用,因为树莓派 1、2 所需内核不同。它们还有助于定义不同的超频设置,因为树莓派 1、2 默认的主频各异。比如,为每块树莓派设置不同的 initramfs
映像:
[pi1]
initramfs initrd.img-3.18.7+ followkernel
[pi2]
initramfs initrd.img-3.18.7-v7+ followkernel
[all]
记得在最后使用筛选器 [all]
, 这样后续设置就不会仅限于树莓派 2 硬件。
注意
某些型号的树莓派(Zero W、Zero 2 W,树莓派 3B+、400,计算模块 4、4S)会引用多个筛选器的设置(如上表所述)。这意味着如果你想让某个设置仅用于(例如)4B,且不把该设置应用于树莓派 400,那么
[pi4]
部分中的设置需要在随后的[pi400]
部分中通过替代设置来还原——此部分的顺序很重要。或者,你可以使用筛选器[board-type=0x11]
,这个筛选器与不同的硬件产品之间有一对一的映射关系。
[none]
该 [none] 筛选器会阻止一切随后的设置应用于所有的硬件。尽管没有什么是你不能没有 [none] 做的,但它可以是一个有用的方法,可以在不必注释掉每一行的情况下,在 config.txt 中保留未使用设置的组。
[tryboot]
如果为 reboot 设置了参数 tryboot
,则此筛选器为真。
筛选器 [tryboot]
的用于 autoboot.txt
,以便在 tryboot
模式下选择不同的引导分区,进行操作系统的安全失败(fail-safe)式更新。
[EDID=*]
在树莓派上使用单张存储卡切换多台显示器时,并且空白配置不足以自动选择每台显示器所需的分辨率时,可根据显示器的 EDID 名称选择特定设置。
要查看已连接显示器的 EDID 名称,你需按照以下步骤操作。运行以下命令,查看你的树莓派上有哪些输出设备:
$ ls -1 /sys/class/drm/card?-HDMI-A-?/edid
在树莓派 4 上,打印类似如下输出:
/sys/class/drm/card1-HDMI-A-1/edid
/sys/class/drm/card1-HDMI-A-2/edid
然后,你需要以每个这些文件名运行 edid-decode
,比如:
$ edid-decode /sys/class/drm/card1-HDMI-A-1/edid
如果没有显示器连接为输出设备,它将告诉你 EDID 为空;若已连接显示器,将为你提供有关显示器功能的丰富信息。你需查找Manufacturer
、Display Product Name
所在行。然后,“EDID 名称”为 <Manufacturer>-<Display Product Name>
,并将字符串中的所有空格都将换成下划线。比如,如果你的 edid-decode
输出为:
....
Vendor & Product Identification:
Manufacturer: DEL
....
Display Product Name: 'DELL U2422H'
....
此显示器的 EDID 名称将是 DEL-DELL_U2422H
。
然后,你可以将其用作条件筛选器,指定仅在连接此特定显示器时才适用的设置:
[EDID=DEL-DELL_U2422H]
cmdline=cmdline_U2422H.txt
[all]
这些设置仅适用于启动时。必须在启动前接入显示器,=且树莓派必须能够读取其 EDID 信息以找到正确的名称。在启动后,若热插拔不同的显示器,在树莓派上也不会选择其他设定。
在树莓派 4 上,如果同时使用了两个 HDMI 端口,则 EDID 筛选器将与两者进行匹配,并将应用所有匹配条件筛选器的配置。
注意
在树莓派 5 上未提供此设置。
有时候需将设置设定为仅适用于单块特定的树莓派——即使你将存储卡更换为另一张也如此。下面的示例涉及了许可证密钥和超频设置(虽然许可证密钥可以其他方式支持不同的存储卡交换)。你还可以使用此功能来设定不同的显示设置(即使无法识别上述 EDID),只要你不在树莓派之间切换显示器就行。例如,如果你的显示器没有提供能用的 EDID 名称(或你正在使用复合输出(亦无法读取 EDID))。
要查看你树莓派的串号,请运行以下命令:
$ cat /proc/cpuinfo
尾部输出将打印一个 16 位十六进制值。你树莓派的串号是最后八位数字(十六进制)。比如,若你看到:
Serial : 0000000012345678
则串号为 12345678。
注意
在某些树莓派型号上,前 8 位数字(十六进制)会包含
0
以外的数值。即使在这种情况下,也只使用最后八位数字(十六进制)作为串号。
你可以定义仅用于特定树莓派的设置:
[0x12345678]
# 此处设置仅适用于符合该序列号的树莓派
[all]
# 此处设置用于所有硬件
你还可以根据 GPIO 的状态进行筛选。例如:
[gpio4=1]
# 此处设置在 GPIO 4 为高电平时生效
[gpio2=0]
# 此处设置在 GPIO 2 为低电平时生效
[all]
# 此处设置用于所有硬件
相同类型的筛选器会互相取代,因此 [pi2]
会覆盖 [pi1]
,因为两者不可能同时为真。
不同类型的筛选器可通过逐个列出筛选器来进行组合,例如:
# 此处设置用于所有硬件
[EDID=VSC-TD2220]
# 这些设置仅在接入 VSC-TD2220 显示器时生效
[pi2]
# 这些设置仅在树莓派 2 上接入了 VSC-TD2220 显示器时生效
[all]
# 此处设置用于所有硬件
使用筛选器 [all]
可重置先前所有筛选器,避免意外地组合不同类型的筛选器。
total_mem
此参数可用于强制限制树莓派的内存容量:指定你想要让树莓派使用的总内存量(MB)。如,要让 4GB 的树莓派 4B 表现为 1GB 款,请使用以下内容:
total_mem=1024
此值最小值为 128MB,最大值为板载的总内存量。
可通过购买许可证来激活硬件编解码器解码:树莓派 3 及其早期型号上的附带了编解码器。许可证绑定了你树莓派的 CPU 序列号。
树莓派 4 已永久禁用了 MPEG2、VC1 硬件解码器。无法启用这些编解码器,故无需硬件编解码器许可证密钥。对于典型用例,MPEG2、VC1 文件的软解性能已足矣。
树莓派 5 搭载了 H.265(HEVC)硬件解码器。该解码器默认已启用,因此亦无需硬件解码许可密钥。
decode_MPG2
decode_MPG2
是用于激活 MPEG-2 硬件解码器的许可密钥,类似 decode_MPG2=0x12345678
。
decode_WVC1
decode_WVC1
是用于激活 VC-1 硬件解码器的许可密钥,类似 decode_WVC1=0x12345678
。
如果你有多块树莓派,并为每块树莓派都购买了编解码器许可证,你可以在一个 config.txt
中写入多达八个许可证密钥——如 decode_MPG2=0x12345678,0xabcdabcd,0x87654321
。这让你可以在不必每次都编辑 config.txt
,就能在不同的树莓派间交换同张存储卡。
要控制 HDMI 设置,请使用cmdline.txt
中的 屏幕配置实用程序、KMS 视频设置。
为了支持双显示器和最高 4Kp60 的分辨率,树莓派 4 每个时钟周期会产生 2 个输出像素。
每种 HDMI 信号格式都有一个时序列表,用于控制同步脉冲持续时间周围的所有参数。这些时序通常通过像素时钟、活动像素数量、上沿、同步脉冲以及水平和垂直方向的下沿来定义。
树莓派 4 以每时钟 2 像素的速度运行一切,意味着树莓派 4 不能支持无法被 2 整除的水平时序。
在 CEA 和 DMT 标准中的信号格式,仅有一种无法兼容:DMT mode 81, 1366x768 @ 60Hz
。该信号格式的水平同步和下沿时序值为奇数,宽度无法被 8 整除。
如果你的显示器是这种信号格式,树莓派 4 会自动降到下个显示器标称的信号格式,通常为 1280x720。
虽然树莓派 5 亦可在每个时钟周期输出 2 个像素,但它对奇异时序有特殊处理,可以直接处理这些分辨率。
每款树莓派计算机上都能找到复合视频输出。
树莓派 1A、1B
RCA 端子
树莓派 Zero
未焊接的 TV
接口
树莓派 Zero 2 W
主板底部的测试点
树莓派 5
HDMI 插口旁的 J7 触点
其他型号
3.5 mm AV 端子
注意
树莓派 400 未提供复合视频输出。
enable_tvout
置为 1
将启用复合视频输出,置为 0
将禁用复合视频输出。在树莓派 4、5 上,仅当你将其置为 1
时,才可使用复合输出(同时亦会禁用 HDMI 输出)。树莓派 400 不支持复合输出。
树莓派 4, 5、400
0
其他
1
除了树莓派 4、5 以外,均须禁用 HDMI 输出才能启用复合输出。当未连接(或未检测到)HDMI 显示器时,将禁用 HDMI 输出。设置 enable_tvout=0
可阻止在 HDMI 禁用时启用复合输出。
要启用复合输出,请在 /boot/firmware/config.txt
的 dtoverlay=vc4-kms-v3d
这行末尾添加 ,composite
:
dtoverlay=vc4-kms-v3d,composite
在默认情况下,会输出复合视频(NTSC)。要选择其他信号格式,请将以下内容添加到 /boot/firmware/cmdline.txt
中这一行:
vc4.tv_norm=<视频信号格式>
请用以下值替换占位符 <视频信号格式>
:
NTSC
NTSC-J
NTSC-443
PAL
PAL-M
PAL-N
PAL60
SECAM
ignore_lcd
在默认情况下,会在 I²C 总线上检测树莓派触摸显示屏。ignore_lcd=1
可跳过这个检测阶段,以禁用 LCD 显示屏。
disable_touchscreen
启用和禁用触摸屏。
disable_touchscreen=1
可禁用树莓派官方触摸显示屏的触摸屏组件。
disable_fw_kms_setup
在默认情况下,固件会解析所有接入 HDMI 显示器的 EDID,并选择适当的信号格式,然后通过内核命令行上的设置将显示的分辨率和帧率(以及过扫描参数)传给 Linux 内核。在极少数情况下,固件可能会选择 EDID 中不存在的信号格式,可能并不兼容该设备。使用 disable_fw_kms_setup=1
可以禁用传递的视频信号格式,从而避免此问题。Linux 视频模式系统(KMS)会自己解析 EDID 并选择适当的信号格式。
注意
在树莓派 5 上,此参数默认为
1
。
disable_camera_led
将 disable_camera_led
置为 1
可在录制视频、拍摄照片时关闭摄像机的红色 LED 指示灯。这对于防止反光(如摄像机正对着窗户时)极其有用。
awb_auto_is_greyworld
将 awb_auto_is_greyworld
置为 1
,可让自身不带灰度世界算法的库和应用程序使用夜视(NoIR)摄像头捕捉到有效的图像、视频。它将自动 awb 信号格式切换使用灰度世界算法。仅适用于夜视 NoIR 摄像机、移除了红外滤光片的高质量(HQ)摄像机。
有时候你需要不依赖于显示器、键盘和鼠标,直接访问树莓派。也许树莓派被嵌在机器人中或安装在难以触及的地方、或者你可能也没有多余的显示器。
要在局域网上的另其他设备远程控制你的树莓派,请使用以下若干服务:
SSH(Secure SHell)提供了对树莓派上终端会话的安全访问。VNC(Virtual Network Computing,虚拟网络计算)提供了对树莓派桌面屏幕共享的安全访问。你仅需一台其他计算机、局域网和树莓派的局域网 IP 地址。树莓派 Connect 可安全地共享你的树莓派屏幕,且无需查阅树莓派的 IP 地址。
无需直接控制远程设备,NFS(网络文件系统)、SCP(Secure Copy Protocol,安全复制协议)、Samba 和 rsync
等服务能让你在局域网的设备间共享文件。当你需要从其他设备访问存储在一台设备上的数据时,这些服务可能会很有用。
要从接入互联网的任意设备远程控制你的树莓派,你需要:
在树莓派上放开 SSH/VNC,可通过互联网、内部 VPN,或使用 RealVNC 的云 VNC Viewer 等外部服务。
使用树莓派 Connect,这是由树莓派提供的免费屏幕共享服务。
许多连接到树莓派的方法都需要你知道树莓派的局域网 IP 地址。
接入局域网的所有设备都会被分配一个 IP 地址。要使用 SSH/VNC 从别的机器连接到树莓派,你需要知道树莓派的 IP 地址。如果接入了显示器,这很容易。但还有许多方法可从网络上的其他机器远程查找它。
要查找树莓派的局域网 IP 地址,请使用以下若干方法。
将鼠标悬停在系统托盘中的网络图标上,将显示工具的提示信息。该工具提示会显示你当前连接的网络名称及 IP 地址。
运行以下命令,可将你的局域网 IP 地址打印到命令行:
$ hostname -I
如果你的树莓派接入了显示器,并且启动到了命令行而非桌面,则可在引导顺序(boot sequence)于登录提示符之前的最后几条输出信息中,找到你的 IP 地址。
你可以使用内置的网络管理器命令行(nmcli
)来获取有关你的网络的详细信息。请运行以下命令:
$ nmcli device show
你应看到类似如下输出:
GENERAL.DEVICE: wlan0
GENERAL.TYPE: wifi
GENERAL.HWADDR: D0:3B:FF:41:AB:8A
GENERAL.MTU: 1500
GENERAL.STATE: 100 (connected)
GENERAL.CONNECTION: exampleNetworkName
GENERAL.CON-PATH: /org/freedesktop/NetworkManager/ActiveConnection/2
IP4.ADDRESS[1]: 192.168.1.42/24
IP4.GATEWAY: 192.168.1.1
IP4.ROUTE[1]: dst = 192.168.1.0/24, nh = 0.0.0.0, mt = 600
IP4.ROUTE[2]: dst = 0.0.0.0/0, nh = 192.168.1.1, mt = 600
IP4.DNS[1]: 192.168.1.3
IP6.ADDRESS[1]: ab80::11ab:b1fc:bb7e:a8a5/64
IP6.GATEWAY: --
IP6.ROUTE[1]: dst = ab80::/64, nh = ::, mt = 1024
GENERAL.DEVICE: lo
GENERAL.TYPE: loopback
GENERAL.HWADDR: 00:00:00:00:00:00
GENERAL.MTU: 65536
GENERAL.STATE: 100 (connected (externally))
GENERAL.CONNECTION: lo
GENERAL.CON-PATH: /org/freedesktop/NetworkManager/ActiveConnection/1
IP4.ADDRESS[1]: 127.0.0.1/8
IP4.GATEWAY: --
IP6.ADDRESS[1]: ::1/128
IP6.GATEWAY: --
GENERAL.DEVICE: p2p-dev-wlan0
GENERAL.TYPE: wifi-p2p
GENERAL.HWADDR: (unknown)
GENERAL.MTU: 0
GENERAL.STATE: 30 (disconnected)
GENERAL.CONNECTION: --
GENERAL.CON-PATH: --
GENERAL.DEVICE: eth0
GENERAL.TYPE: ethernet
GENERAL.HWADDR: D0:3B:FF:41:AB:89
GENERAL.MTU: 1500
GENERAL.STATE: 20 (unavailable)
GENERAL.CONNECTION: --
GENERAL.CON-PATH: --
WIRED-PROPERTIES.CARRIER: off
IP4.GATEWAY: --
IP6.GATEWAY: --
此命令将输出树莓派上各种可访问的网络接口的相关信息。查看 GENERAL.TYPE
这行,可查看各个部分描述的网络接口类型。例如,“ethernet”是设备上的以太网端口,“wifi”是一些设备内置的 WiFi 芯片。根据设备访问互联网的方式,你将看到不同的输出块,可查找你的 IP 地址:
如果你的设备使用 WiFi 连接到互联网,请检查“wifi”这部分
如果你的设备使用以太网端口连接到互联网,请检查“ethernet”这部分
在确定了正确的网络接口部分后,请查找字段 IP4.ADDRESS[1]
来获取 IPv4 地址,或者查找字段 IP6.ADDRESS[1]
来获取 IPv6 地址。你可以忽略这些字段中的斜杠和数字(如 /24
)。
在以上示例中,树莓派使用 WiFi 访问互联网。查看 GENERAL.TYPE
字段的“wifi”部分,来查找 IP 地址。在这种情况下,你可以使用 IP4.ADDRESS[1]
字段中的 IPv4 地址访问此设备:192.168.1.42
。
raspberrypi.local
。树莓派系统支持 Avahi 服务的多播 DNS。
如果你的设备支持 mDNS,你可以通过使用其主机名和后缀 .local
来访问你的树莓派。在新安装的树莓派系统上,默认主机名为 raspberrypi
,因此在默认情况下,所有运行树莓派系统的树莓派都会响应:
$ ping raspberrypi.local
如果能访问树莓派,则 ping
会显示树莓派的 IP 地址:
PING raspberrypi.local (192.168.1.131): 56 data bytes
64 bytes from 192.168.1.131: icmp_seq=0 ttl=255 time=2.618 ms
技巧
如果你使用树莓派配置(Raspberry Pi Configuration)、
raspi-config
、/etc/hostname
修改了树莓派的系统主机名,Avahi 会更新.local
的 mDNS 地址。如果你忘记了树莓派的主机名,你可以在另一台设备上安装 Avahi,然后用avahi-browse
浏览本地网络上的所有主机和服务。
在网页浏览器中,键入你路由器的 IP 地址。然后,使用你的凭据登录。
技巧
你路由器的 IP 地址通常为
http://192.168.1.1
,但并非总是如此。你也许会在路由器的标签上找到路由器的地址和凭据。
这将指引你进入控制面板。浏览到连接设备列表或类似内容(所有路由器都不同),你能看到一些你认识的设备。某些设备被检测为 PC、平板电脑、手机、打印机等,因此你应该能识别一部分,并排除它们,找出哪个是你的树莓派。
技巧
如果你用网线将你的树莓派接入网络,请尝试在列表中筛选有线设备。应该仅有为数不多的设备需要判断。
nmap
查找设备nmap
(Network Mapper,网络映射器)命令是用于网络发现的免费开源工具。适用于 Linux、macOS 和 Windows。
要在 Linux 上安装,请安装软件包 nmap
,如 apt install nmap
。
要在 macOS、Windows 上安装,请参阅 nmap.org 下载页。
要用 nmap
扫描你网络上的设备,你需要知道你接入的子网。先找到你正在使用的计算机局域网 IP 地址:
在 Linux 上,将 hostname -I
输入到终端窗口中。
在 macOS 上,转到系统设置 > 网络,选择你的活动网络连接,然后单击按钮“详细信息……”
在 Windows 上,打开控制面板,然后在“网络和共享中心”下,单击“查看网络状态和链接”,选择你的活动网络连接,然后单击“查看此连接的状态”
接下来,扫描整个子网(subnet),来查找其他设备。大多数局域网使用 IPv4,它使用四位数值:1 到 255 之间的数字来标识每个 IP 地址。你的子网设备使用的前三个数字都是相同的。如,若你的 IP 地址是 192.168.1.5
,那么其他设备使用的地址类似于 192.168.1.2
、192.168.1.6
和 192.168.1.200
。要使用 nmap 扫描这个子网,请传参字符串 192.168.1.0/24
,该字符串覆盖子网范围为 192.168.1.0
到 192.168.1.255
。使用参数 -sn
将在整个子网范围上运行 ping
扫描:
$ sudo nmap -sn 192.168.1.0/24
技巧
取决于你的局域网速度,也许需要一分钟左右。
ping 扫描会查询所有范围内的 IP 地址是否有响应。对于每个响应 ping 的设备,输出显示主机名和 IP 地址如下:
Starting Nmap 6.40 ( http://nmap.org ) at 2014-03-10 12:46 GMT
Nmap scan report for hpprinter (192.168.1.2)
Host is up (0.00044s latency).
Nmap scan report for Gordons-MBP (192.168.1.4)
Host is up (0.0010s latency).
Nmap scan report for ubuntu (192.168.1.5)
Host is up (0.0010s latency).
Nmap scan report for raspberrypi (192.168.1.8)
Host is up (0.0030s latency).
Nmap done: 256 IP addresses (4 hosts up) scanned in 2.41 seconds
上述输出主机名为 raspberrypi
的设备具有 IP 地址 192.168.1.8
。
应用程序 Fing 是一款免费的智能手机网络扫描器。它适用于 Android 和 iOS。
将手机接入与你树莓派的所在网络。
当你打开软件 Fing 后,请触摸屏幕右上角的刷新按钮。
在几秒钟后,你会看到列出所有已接入你网络的设备列表。
滑动到制造商为"Raspberry Pi"的条目。IP 地址显示在条目的左下角,MAC 地址显示在条目的右下角。
你可以使用安全外壳(Secure Shell,SSH)协议从同一网络上的其他计算机远程访问树莓派的终端。
在默认情况下,树莓派系统已禁用 SSH 服务器。可通过以下若干方式启用 SSH:
在“首选项”菜单中打开树莓派配置。
切换到“接口”选项卡。
选择“SSH”旁边的“已启用(Enabled)”。
单击“确定”。
在全新安装的树莓派系统上配置 SSH:
按照树莓派启动盘制作工具指南中的说明进行安装。
在 自定义系统配置 这个步骤中,切换到 服务 选项卡。
选中复选框 开启 SSH。
选择 使用密码登录,使用与在物理上使用树莓派时相同的用户名和密码登录。选择 仅允许公钥登录 配置用于无密码登录的 SSH 密钥。
在终端窗口中输入 sudo raspi-config
。
选择 Interfacing Options。
切换到并选择 SSH。
选择 Yes。
选择 Ok。
选择 Finish。
在引导分区中创建一个叫做 ssh
的空文件:
$ sudo touch /boot/firmware/ssh
重启计算机:
$ sudo reboot
在你的计算机上打开一个终端窗口,输入以下命令。把占位符 <ip 地址>
替换成你要接入的树莓派 IP 地址,再把 <用户名>
替换为你的用户名:
$ ssh <用户名>@<ip 地址>
当成功连接后,你会看到一个安全警告。请输入 yes
继续。你仅会在首次连接时收到该警告。
在出现提示时输入你的账户密码。
你现在应该能看到树莓派的命令提示符:
<用户名>@<主机名> ~ $
现在你已远程接入至树莓派,可以执行命令了。
注意
如果你收到报错
connection timed out
,则可能输入的树莓派 IP 地址错误。请检查树莓派的 IP 地址。
注意
在树莓派 4 和 5 上,树莓派系统 Bookworm 默认使用 Wayland 窗口服务器。仅在使用 X 窗口服务器时才能转发 X11。要在 X11 上启用窗口转发,请在 Raspberry Pi Configuration 中把桌面切换到 X 窗口服务器。
注意
许多桌面环境都不再预装 X11。可安装第三方 X 服务器(如 XQuartz)来使用 X11 转发。
X11 可通过 SSH 启用图形应用程序。传参 -Y
可通过 SSH 转发 X 会话:
$ ssh -Y <用户名>@<ip 地址>
在经过身份验证后,你会像往常一样看到命令行。但是,你仍可打开图形窗口,X 服务器会为你渲染。例如,键入以下命令会启动 Geany 窗口:
$ geany &
要远程访问你的树莓派而无需每次连接时提供密码,请使用 SSH 密钥对。
在使用启动盘制作工具配置启动镜像时,你可以预配置 SSH 密钥。你可以生成新的 SSH 密钥对或使用现有的 SSH 密钥。
按照使用启动盘制作工具指南安装来配置你的启动镜像。
在 自定义系统配置 这个步骤中,切换到 服务 选项卡,选中 开启 SSH 复选框。
选择 仅允许公钥登录 单选按钮。如果你已经在 ~/.ssh/id_rsa.pub
中存储了一个 SSH 公钥,树莓派启动盘制作工具会自动使用该公钥来预填文本框。如果启动盘制作工具未找到 SSH 公钥,你可单击“运行 SSH-KEYGEN”按钮生成新的密钥对。
如果你已经安装了树莓派系统,你可以更新现有配置来使用 SSH 密钥认证。
要检查远程连接到树莓派的计算机上是否存在现有的 SSH 公钥,请运行以下命令:
$ ls ~/.ssh
如果看到了文件 id_ed25519.pub
、id_rsa.pub
或 id_dsa.pub
,则你已经拥有一个 SSH 密钥。可跳过 SSH 密钥对生成,将 SSH 密钥添加到你的 SSH 身份列表中。
技巧
本指南提供了新 RSA 密钥的生成说明。为了增加安全性,你可以选择生成 Ed25519 密钥。要使用 Ed25519 密钥:在引用你的公钥和私钥文件名称时,把
-t ed25519
传参给ssh-keygen
;并把rsa
替换为ed25519
。
要生成新的 SSH 密钥对,请输入以下命令:
$ ssh-keygen
当询问要将密钥保存在哪里时,请按 回车键 使用默认位置 ~/.ssh/id_rsa
。
当询问是否要使用可选密语时,请按 回车键 不使用密语。
运行以下命令以检查 .ssh
目录中的内容:
$ ls ~/.ssh
你将看到文件 id_rsa
和 id_rsa.pub
:
authorized_keys id_rsa id_rsa.pub known_hosts
id_rsa
文件包含你的私钥。请将其安全保存在用于远程接入树莓派的计算机上。
id_rsa.pub
文件包含你的公钥。你将同你的树莓派共享此密钥。当你远程接入树莓派时,将使用此密钥来验证你的身份。
启动 SSH 代理:
$ eval "$(ssh-agent -s)"
接下来,使用以下命令将你的关键标识添加到 ssh-agent:
$ ssh-add ~/.ssh/id_rsa
在你用于远程接入树莓派的计算机上,使用以下命令将你的公钥安全地复制到树莓派:
$ ssh-copy-id <用户名>@<ip 地址>
当出现提示后,在树莓派上输入用户账户的密码。现在你可以接入树莓派而无需输入密码。
如果你的操作系统不支持 ssh-copy-id
,你可以用 scp
来复制你的公钥。
首先,在你的树莓派上,创建 Linux 将查找密钥的目录:
$ mkdir .ssh
然后,为 .ssh
目录配置适当的权限:
$ chmod 700 .ssh
在你的常用计算机上,使用 scp
把你的公钥复制成文件 .ssh/authorized_keys
,存储至你的树莓派上:
$ scp .ssh/id_rsa.pub <用户名>@<ip 地址>:.ssh/authorized_keys
技巧
上面的命令假定你以前从未授权过任何密钥访问你的树莓派。如果你之前添加过密钥,你应在
authorized_keys
文件的末尾添加包含公钥的新行,可保留现有密钥。
在提示后,在树莓派上输入你用户账户的密码。
然后,在你的树莓派上,配置 authorized_keys 的文件权限:
$ chmod 644 .ssh/authorized_keys
你现在可以在不输入密码的情况下连接到你的树莓派。
有时候在物理上操作设备并不方便。虚拟网络计算(VNC)可让你通过别的设备操控某台设备的桌面。
VNC 依赖于客户端和服务器。客户端运行在你可直接与之交互的设备上,如个人笔记本电脑、台式机、平板电脑或手机。服务器运行在你的树莓派上。当你使用 VNC 时,客户端会把键盘和鼠标事件传输到服务器。服务器在你的树莓派上执行这些事件,再将屏幕更新返回给客户端。
VNC 客户端在窗口中显示你的树莓派的桌面。你可以像在树莓派本身上工作一样同桌面交互。
树莓派系统内置了 wayvnc。它提供了一个 VNC 服务器,你可以在设备首选项中启用它。
在使用 VNC 之前,必须先在你的树莓派上启用 VNC 服务器。
树莓派系统能以图形界面和命令行两种方式启用 VNC 服务器。
技巧
启用后,你可在
/etc/wayvnc/
编辑你的 WayVNC 配置。
在树莓派上启动图形桌面。
单击桌面系统托盘中的树莓派图标。
从菜单中选择 首选项(Preferences) > 树莓派配置(Raspberry Pi Configuration)。
切换到选项卡 接口(Interfaces)。
单击 VNC 旁边的单选按钮,将其改为活动状态。。
单击“确定(OK)”按钮以保存配置更改。
可使用命令行 raspi-config 启用 VNC 服务器。
打开 raspi-config
,输入以下内容:
$ sudo raspi-config
切换到 接口选项(Interface Option)。按 回车键 选择。
选择 VNC。按 回车键 选择。
在“Would you like the VNC Server to be enabled?(你想要启用 VNC 服务器吗? )”使 <Yes>
高亮并按 回车键。
按 回车键 返回菜单。按 Esc 键 退出 raspi-config
。
要接入你的树莓派,你需要满足如下条件:
你的树莓派和运行 VNC 客户端的设备接入到同一网络(如家庭无线网络/VPN)
你的树莓派的主机名/IP 地址
树莓派上账户的有效用户名和对应的密码
如果你不知道设备的 IP 地址,请参阅有关查找 IP 地址的说明。
下载 TigerVNC。你可以从其 GitHub 存储库的 Releases 页面安装最新版本。单击最新版本中的链接,找到适用于你平台的二进制文件。Windows 用户应下载 exe
;macOS 用户应下载 dmg
;Linux 用户应下载 jar
。
在你的客户端设备上启动 TigerVNC。在 macOS 和 Windows 上,你可以双击二进制文件。在 Linux 上,安装 java,然后运行 java -jar VncViewer-<版本号>.jar
,将占位符 <版本号>
替换为你下载的版本。
在“VNC 服务器”字段中输入你树莓派的 IP 地址。
单击按钮“Options”。切换到选项卡“输入”。选中“无光标时显示一个点”,可确保你始终可以在 TigerVNC 中看到光标。
单击“连接”按钮,与服务器建立连接。
如果 TigerVNC 警告“主机名与服务器证书不匹配”,请单击按钮“是”继续。
如果 TigerVNC 警告你“证书由未知机构签署”,请单击按钮“是”以为你的树莓派授予异常。
在提示输入用户名和密码后,请输入你的凭据。
单击“确定”按钮以与 VNC 服务器进行身份验证。如果你的凭据正确,TigerVNC 将打开一个包含与树莓派上你账户对应的桌面的窗口。你应该能够移动鼠标和键盘以输入文本并与桌面交互。
你可以使用树莓派 Connect 从别的设备的浏览器远程访问树莓派的桌面。树莓派 Connect 会自动处理配置,因此你无需查找树莓派的本地 IP 地址或更改局域网。
欲了解更多信息,请参阅 Connect 文档。
安全复制协议(scp
)通过 SSH 发送文件。你可以使用 scp 在你的树莓派和另一台计算机间复制文件。
要使用 scp
,请查找你树莓派的 IP 地址。
要将名为 myfile.txt
的文件从你的个人计算机复制到树莓派上用户的主文件夹,请在 myfile.txt
所在目录下运行以下命令,把占位符 <用户名>
替换成你用于登录到树莓派的用户名,把占位符 <树莓派IP地址>
替换成你的树莓派的 IP 地址:
$ scp myfile.txt <用户名>@<树莓派IP地址>:
要把文件复制到特定目录,请在 scp
命令中的 :
后附带目录路径。请在运行 scp
之前创建文件夹,因为 scp
不会自动创建文件夹。例如,以下命令将名为 myfile.txt
的文件复制到用户主文件夹中的目录 project/
下:
$ scp myfile.txt <用户名>@<树莓派IP地址>:project/
要将名为 myfile.txt
的文件从树莓派上的用户主目录复制到其他计算机的当前目录,请运行以下命令:
$ scp <用户名>@<树莓派IP地址>:myfile.txt .
复制多个文件,请在单个命令中列出以空格分隔的文件名:
$ scp myfile.txt myfile2.txt <用户名>@<树莓派IP地址>:
还可以使用通配符复制所有匹配特定筛选器的文件。以下命令将复制所有以 .txt
结尾的文件:
$ scp *.txt <用户名>@<树莓派IP地址>:
以下命令可复制所有以 m
开头的文件:
$ scp m* <用户名>@<树莓派IP地址>:
以下命令能复制所有以 m
开头且以 .txt
结尾的文件:
$ scp m*.txt <用户名>@<树莓派IP地址>:
注意
如果要复制的文件包含空格,请把文件用双引号括起来:
$ scp "my file.txt" <用户名>@<树莓派IP地址>:
要复制文件夹及其所有内容,请传参文件夹名称及参数 -r
(递归):
$ scp -r project/ <用户名>@<树莓派IP地址>:
rsync
在计算机间同步文件夹你可以使用 rsync
在计算机之间同步文件夹。例如,你可以使用 rsync
将树莓派拍摄的新照片自动传输到个人电脑。
在配置 rsync
之前,请确定如下信息:
<树莓派IP地址>
:你树莓派的局域网 IP 地址:更多有关信息,请参阅查找你的树莓派的 IP 地址
<树莓派用户名>
:你用于登录到树莓派的用户名
<树莓派文件夹名>
:你要从树莓派复制文件的文件夹名称
<个人计算机文件夹名>
:你想要在个人计算机上同步的文件夹名称
要配置 rsync
以同步文件,请在个人计算机上完成以下步骤,并使用上面确定的值替换命令中的占位符:
创建你想要同步到的文件夹:
$ mkdir <个人计算机文件夹名>
将文件同步到带有 rsync
的文件夹:
$ rsync -avz -e ssh <树莓派用户名>@<树莓派IP地址>:<树莓派文件夹名>/ <个人计算机文件夹名>/
此命令将所有文件从你的树莓派上的选定文件夹复制到个人计算机上的选定文件夹。若反复运行该命令,rsync
会跟踪你已经下载的文件并跳过它们。如果你在树莓派上删除/修改已同步的文件,rsync
会相应地更新个人计算机上的文件。
网络文件系统(Network File System,NFS)能让你在一台网络计算机上共享一个目录,该目录与同一网络上的其他计算机和设备共享。目录所在的计算机称为服务器,连接到该服务器的计算机和设备被称为客户端。客户端通常被挂载(mount
)为共享目录,使其成为其自身目录结构的一部分。共享目录就是共享资源/网络共享的一个例子。
NFS 是在 Linux/Unix 环境中创建简单 NAS(网络附加存储)的通行方法。
NFS 也许更适用于相对固定的网络挂载目录,例如目录 /home
等经常访问的共享资源。如果你想让一位让访客用户能轻松连接到网络共享,Samba 更为适合。在各种操作系统中,用于临时挂载和卸载 Samba 共享的工具更易获取。
在部署 NFS 之前,你应该熟悉:
Linux 文件和目录权限
挂载/卸载文件系统
使用以下命令安装所需的软件包:
$ sudo apt install nfs-kernel-server
为了方便维护,我们将所有的 NFS export 隔离在单个目录中,在该目录中,使用参数 --bind
挂载真实目录。
假设我们想要 export 用户的家目录,该目录位于 /home/users
。首先,我们创建 export 文件系统:
$ sudo mkdir -p /export/users
技巧
如果你计划配置 LDAP/NIS 身份验证,请跳过下面的
chmod
步骤。
授予 /export
和 /export/users
读取、写入和执行权限(777
),这样你就可以在没有 LDAP/NIS 身份验证的情况下从客户端访问 NFS 共享:
$ chmod -R 777 /export
接下来,使用以下命令挂载真实的 users 目录:
$ sudo mount --bind /home/users /export/users
为了避免在每次重启后重复操作,我们把以下行添加到 /etc/fstab
:
/home/users /export/users none bind 0 0
有三个与 NFS 服务器相关的配置文件:
/etc/default/nfs-kernel-server
/etc/default/nfs-common
/etc/exports
现在,/etc/default/nfs-kernel-server
里唯一重要的参数是 NEED_SVCGSSD
。默认设置为"no"
,这没有问题,因为这次我们不会启用 NFSv4 安全功能。
为了自动映射 ID 名称,文件 /etc/idmapd.conf
必须同时存在于客户端和服务器上,并且内容一致且带有正确的域名。此外,该文件应在 Mapping
部分中包含以下行:
[Mapping]
Nobody-User = nobody
Nobody-Group = nogroup
但请注意,客户端可能对 Nobody-User
和 Nobody-Group
有不同的要求。例如,在 RedHat 的衍生版上,它们都是 nfsnobody
。如果不确定,请通过以下命令检查是否存在 nobody
和 nogroup
:
$ cat /etc/passwd
$ cat /etc/group
这样,服务器和客户端就无需用户共享相同的 UID/GUID。对于使用基于 LDAP 的身份验证的用户,在你的客户端中添加以下行:
[Translation]
Method = nsswitch
这将触发 idmapd
查看 nsswitch.conf
,以确定其应该查找凭据信息的位置。如果你已经使用 LDAP 身份验证,nsswitch
无需进一步解释。
要将我们的目录 export 到本地网络 192.168.1.0/24
,请在 /etc/exports
中添加以下两行:
/export 192.168.1.0/24(rw,fsid=0,insecure,no_subtree_check,async)
/export/users 192.168.1.0/24(rw,nohide,insecure,no_subtree_check,async)
你 NFS 上的文件对网络上的所有人都是开放的。作为安全措施,你可以限制对指定客户端的访问。
将以下行添加到 /etc/hosts.deny
:
rpcbind mountd nfsd statd lockd rquotad : ALL
首先,阻止所有客户端,仅在下面添加的 /etc/hosts.allow
中的客户端才能访问服务器。
现在把以下行添加到 /etc/hosts.allow
中:
rpcbind mountd nfsd statd lockd rquotad : <IPv4地址列表>
其中 <IPv4地址列表>
是服务器和所有客户端的 IP 地址列表(由于 rpcbind
中的限制不支持主机名,他们必须是 IP 地址)。请注意,如果你设置了 NIS,你可以将这些添加到同一行里。
请确保授权 IP 地址列表包含地址 localhost
(127.0.0.1
),因为最新版本的 Ubuntu 中启动脚本使用命令 rpcinfo
来发现 NFSv3 支持,如果 localhost
无法连接,将被禁用。
最后,要使更改生效,请重启服务:
$ sudo systemctl restart nfs-kernel-server
现在你的服务器正运行着,你需要设置客户端,就能够访问它了。首先,安装所需的软件包:
$ sudo apt install nfs-common
在客户端上,我们可以使用一个命令挂载完整的 export 树:
$ mount -t nfs -o proto=tcp,port=2049 <nfs服务器IP>:/ /mnt
你还可以指定 NFS 服务器主机名,而非 IP 地址,但在这种情况下,你需要确保主机名可以在客户端上被解析为 IP。确保能始终被解析的一种稳健方法是使用 /etc/hosts
文件。
请注意,在 NFSv4 中,<nfs服务器IP>:/export
非必需,就像在 NFSv3 中一样。根 export 为 :/
默认 export 为 fsid=0。
我们还可以挂载 export 的子树:
$ mount -t nfs -o proto=tcp,port=2049 <nfs服务器IP>:/users /home/users
为了确保在每次重启时都挂载这个,请把以下行添加到 /etc/fstab
:
<nfs服务器IP>:/ /mnt nfs auto 0 0
如在挂载后,/proc/mounts appears
中的条目为 <nfs服务器IP>://
(带有两个斜杠),那么你可能需要在 /etc/fstab
中指定两个斜杠,否则 umount
可能会报错找不到该挂载点。
将以下行添加到 /etc/hosts.deny
:
rpcbind : ALL
先阻止所有客户端,仅在下面添加的 /etc/hosts.allow
中的客户端才能访问服务器。
现在将以下行添加到 /etc/hosts.allow
:
rpcbind : <NFS服务器IP>
其中 <NFS服务器IP>
是服务器的 IP 地址。
NFS 用户权限基于用户 ID(UID)。客户端上所有用户的 UID 必须与服务器上的 UID 匹配,以便用户能够访问。通常的做法有:
手动同步密码文件
使用 LDAP
使用 DNS
使用 NIS
请注意,在持有 root 访问权限的系统上,你必须小心:该用户可以更改系统上的 UID 以允许自己访问任何人的文件。本页面假定管理团队是唯一具有 root 访问权限的群组,并且他们都是可信的。其他任何情况都代表着更高级的配置,这里不会涉及。
用户的文件访问权限取决于他们在客户端组中的成员资格,而不是在服务器上。但是,有一个重要的限制:从客户端传递给服务器的最多有 16 个组,如果用户在客户端是超过 16 个组的成员,则某些文件或目录可能会意外地无法访问。
将客户端名称和 IP 地址添加到 /etc/hosts
(服务器的 IP 地址应该已经存在。)这样即使 DNS 出现问题,NFS 仍然可以正常工作。或者你可以选择依赖 DNS - 这取决于你。
这适用于使用 NIS 的客户端。否则,你将无法使用 netgroups,并且应在 /etc/exports
中指定单独的 IP 或主机名。阅读 man netgroup
中的 BUG 部分以获取更多信息。
首先,编辑 /etc/netgroup
并添加一行来对你的客户端进行分类(此步骤不是必需的,但为方便起见):
myclients (client1,,) (client2,,) ...
其中,myclients
是 netgroup
的名称。
运行此命令以重建 NIS 数据库:
$ sudo make -C /var/yp
文件名 yp
指的是 Yellow Pages(黄页),即 NIS 的前身。
将以下行添加到 /etc/hosts.deny
:
rpcbind mountd nfsd statd lockd rquotad : ALL
首先阻止所有客户端,只有在 /etc/hosts.allow
(下面添加)中的客户端才能访问服务器。
考虑添加以下行到 /etc/hosts.allow
:
rpcbind mountd nfsd statd lockd rquotad : <IP地址列>
其中 <IP地址列表>
是服务器和所有客户端的 IP 地址列表。由于 rpcbind 的限制,这些必须是 IP 地址。请注意,如果你设置了 NIS,可以将这些添加到同一行。
安装必要的软件包:
$ sudo apt install rpcbind nfs-kernel-server
编辑 /etc/exports
添加共享:
/home @myclients(rw,sync,no_subtree_check)
/usr/local @myclients(rw,sync,no_subtree_check)
上面的示例共享 /home
和 /usr/local
给 myclients netgroup 中的所有客户端。
/home 192.168.0.10(rw,sync,no_subtree_check) 192.168.0.11(rw,sync,no_subtree_check)
/usr/local 192.168.0.10(rw,sync,no_subtree_check) 192.168.0.11(rw,sync,no_subtree_check)
上面的示例将 /home
和 /usr/local
共享给具有静态 IP 地址的两个客户端。如果你希望改为允许私有网络中指定 IP 地址范围内的所有客户端访问,请考虑以下内容:
/home 192.168.0.0/255.255.255.0(rw,sync,no_subtree_check)
/usr/local 192.168.0.0/255.255.255.0(rw,sync,no_subtree_check)
在这里,rw
使共享变为读/写模式,而 sync
要求服务器只在全部更改已刷新到磁盘后才回复请求。这是最安全的选项;async
更快,但有风险。强烈建议你阅读 man exports
,如果你正在考虑其他选项。
设置完 /etc/exports
后,导出共享:
$ sudo exportfs -ra
每当修改 /etc/exports
后,你都需要运行此命令。
重启 rpcbind
和 NFS 以使更改生效:
$ sudo systemctl restart rpcbind
$ sudo systemctl restart nfs-kernel-server
除了上面讨论的 UID 问题之外,还应注意到攻击者可能会冒充允许映射共享的机器,从而允许他们创建任意 UID 以访问你的文件。解决此问题的可选方案是 IPSec。你可以设置所有域成员仅通过 IPSec 相互通信,这将有效地验证你的客户端是否为其所说的那个。
IPSec 通过使用服务器的公钥加密到服务器的流量,服务器用客户端的公钥发送回所有回复。流量使用各自的私钥解密。如果客户端没有应该拥有的密钥,它就无法发送或接收数据。
IPSec 的替代方案是物理上分离的网络。这需要一个单独的网络交换机和单独的以太网卡,并且需要对该网络进行物理安全保护。
在加密的主目录中挂载 NFS 共享只有在成功登录并解密主目录后才能正常工作。这意味着,在启动时使用 /etc/fstab
挂载 NFS 共享是行不通的,因为在挂载时主目录尚未解密。有一种简单的方法可以解决这个问题,即使用符号链接:
创建一个替代目录来挂载 NFS 共享:
$ sudo mkdir /nfs
$ sudo mkdir /nfs/music
编辑 /etc/fstab
,将 NFS 共享挂载到该目录中:
nfsServer:music /nfs/music nfs auto 0 0
在你的主目录下创建一个符号链接,指向实际的挂载位置。在上述情况下,首先删除已经存在的 Music
目录:
$ rmdir /home/user/Music
$ ln -s /nfs/music/ /home/user/Music
Samba 是 Server Message Block(SMB,服务器消息块)网络协议的自由软件之重新实现。使用 Samba,你可以在 Windows、macOS 和 Linux 机器间共享文件夹。
在默认情况下,树莓派系统未安装 Samba。要在你的树莓派上安装 Samba,请运行以下命令,该命令会安装你运行 Samba 服务器/客户端所需的全部依赖项:
$ sudo apt update
$ sudo apt install samba samba-common-bin smbclient cifs-utils
首先,你需要在 Windows 设备上共享一个文件夹。
单击系统托盘,从菜单中选择“网络和共享中心”。
选择“更改高级共享设置”。
选择“网络发现”。
选择“文件和打印机共享”。
单击 保存 按钮以保存更改。
跟随这些步骤在 Windows 上共享文件夹:
右键单击要共享的文件夹,然后选择属性。
选择 共享 选项卡。
单击“高级共享”按钮。
选择“共享此文件夹”;在默认情况下,Windows 会使用文件夹名称作为共享名称。
单击“权限”按钮。
配置“Everyone”和“完全控制”权限。
单击“确定”按钮以离开 权限 页面。
再次单击“确定”按钮以离开 高级共享 页面。
选择“安全”选项卡。
配置“Everyone”和“完全控制”权限。
单击“确定”按钮。
现在应该共享文件夹了。你可以通过在权限和安全性页面上更改权限来修改共享文件夹权限。
在 Windows 10 上有一个共享向导,可以帮助完成其中某些步骤。
从“开始”菜单中运行 计算机管理 应用程序。
选择“共享文件夹” > “共享”。
单击鼠标右键,选择“新建共享”以开始共享向导。
单击“下一步”按钮。
选择要共享的文件夹,然后单击“下一步”按钮。
单击“下一步”以使用共享默认设置,或选择“自定义”并设置所需权限。
点击“确定”按钮。
点击“完成”按钮以共享文件夹。
在 Linux 中,挂载 即是将文件夹添加到某位置的过程,因此我们首先需要该位置。
$ mkdir windowshare
现在,我们需要将远程文件夹挂载到该位置。远程文件夹是 Windows PC 的主机名/IP 地址,以及在共享时使用的共享名称。我们还需要提供将用于访问远程计算机的 Windows 用户名。不要忘记用你的树莓派系统用户名替换占位符 <用户名>
。
$ sudo mount.cifs //<主机名或IP地址>/<Windows 共享文件夹> /home/<用户名>/windowshare -o user=<用户名>
你现在应该能够在树莓派上查看 Windows 共享的内容。
$ ls windowshare/
当 SMB 协议版本不匹配且 Linux Samba 客户端返回误导性错误消息时会发生此错误。在默认情况下,树莓派系统使用 2.1 及以上版本,兼容 Windows 7 及更高版本。某些 NAS 在内的旧款设备可能需要 1.0 版本。要解决此错误,请在你的挂载命令中添加一个版本条目(例如 ,vers=1.0
):
$ sudo mount.cifs //IP/share /mnt/挂载点 -o user=<用户名>,vers=1.0
你可能需要尝试不同的版本以与服务器版本匹配。可用的值有:
1.0
旧版的 CIFS/SMBv1 协议
2.0
SMBv2.002 协议。Windows Vista Service Pack 1 和 Windows Server 2008
2.1
SMBv2.1 协议。Microsoft Windows 7 和 Windows Server 2008R2
3.0
SMBv3.0 协议。Microsoft Windows 8 和 Windows Server 2012
3.02
SMBv3.0.2 协议。Microsoft Windows 8.1 和 Windows Server 2012R2
3.11
SMBv3.1.1 协议。Microsoft Windows 10 和 Windows Server 2016
3
SMBv3.0 协议版本及以上
先创建一个要共享的文件夹。此例在当前用户的 home
文件夹中创建了一个名为 shared
的文件夹:
$ cd ~
$ mkdir shared
$ chmod 0740 shared
现在我们需要告诉 Samba,你的默认用户账户,在访问该文件夹时,在出现提示后,请输入你的密码,并用你的主用户账户的用户名替换占位符 <用户名>
:
$ sudo smbpasswd -a <用户名>
现在我们需要告诉 Samba 共享这个文件夹,使用 Samba 配置文件。
sudo nano /etc/samba/smb.conf
在文件末尾,添加以下内容以共享文件夹,为远程用户提供读写权限。用你的树莓派上主用户账户的用户名替换占位符 <用户名>
:
[share]
path = /home/<用户名>/shared
read only = no
public = yes
writable = yes
在同一文件中,找到 workgroup
这一行,如有必要,将其更改为本地 Windows 网络工作组的名称。
workgroup = <你的workgroup工作组名称>
共享文件夹现在应该会出现在网络上的 Windows/macOS 设备上。输入你的树莓派用户名和密码挂载文件夹。
Apache 是一款流行的 Web 服务器应用程序,你可以在树莓派上安装它,使其提供网页。
若单独使用,Apache 可以通过 HTTP 提供 HTML 文件,且通过附加模块可以使用脚本语言(如 PHP)提供动态网页。
先通过在终端中输入以下命令来更新可用软件包:
sudo apt update
然后,使用此命令安装软件包 apache2 :
sudo apt install apache2 -y
在默认情况下,Apache 会在 Web 文件夹中放置一个用于测试的 HTML 文件。当你在树莓派本体上访问 http://localhost/
,或者在网络中的其他计算机上访问 http://192.168.1.10
(无论树莓派的 IP 地址是什么)时,将提供该默认网页。要查找树莓派的 IP 地址,请在命令行中键入 hostname -I
(或阅读更多来查找 IP 地址的有关信息)。
在树莓派上或网络中的其他计算机上浏览默认网页,你将看到以下内容:
这意味着 Apache 正在运行!
此默认网页仅是文件系统上的一个 HTML 文件。它位于 /var/www/html/index.html
。
在终端窗口中切换到此目录,并查看其中的内容:
cd /var/www/html
ls -al
这将向你展示:
total 12
drwxr-xr-x 2 root root 4096 Jan 8 01:29 .
drwxr-xr-x 12 root root 4096 Jan 8 01:28 ..
-rw-r--r-- 1 root root 177 Jan 8 01:29 index.html
这表明默认情况下,/var/www/html/
中有一个名为 index.html
的文件,由 root 用户拥有(就像包含文件的文件夹一样)。要编辑该文件,你需要将其所有权更改为你自己的用户名。使用以下命令更改文件的所有者,将占位符 <用户名>
替换为你的主用户账户的用户名:
$ sudo chown <用户名>: index.html
现在你可以尝试编辑此文件,然后刷新浏览器来查看网页变更。若你了解 HTML,可把自己的 HTML 文件和其他内容放入此目录,以将它们作为网站在局域网提供。
要让你的 Apache 服务器处理 PHP 文件,你需要安装最新版本的 PHP 及 Apache 的 PHP 模块。键入以下命令来安装他们:
sudo apt install php libapache2-mod-php -y
现在,删除文件 index.html
:
sudo rm index.html
创建文件 index.php
:
sudo nano index.php
把一些 PHP 内容放入其中:
<?php echo "hello world"; ?>
现在保存,刷新你的浏览器。你应该会看到“hello world”。这不是动态的,但仍由 PHP 提供。尝试一些动态内容:
<?php echo date('Y-m-d H:i:s'); ?>
还可以显示你的 PHP 信息:
<?php phpinfo(); ?>
你可以设置一台 DHCP/TFTP 服务器,这能让你从网络引导树莓派 3、4。
现在,假定你有一个既有的家庭网络,并且你想要使用树莓派作为服务器。你还需要其他树莓派 3、4 作为客户端进行引导。仅需一张存储卡,因为在初始客户端配置后,客户端将从服务器引导。
注意
由于网络设备和路由器的种类繁多,我们无法保证网络引导能在所有设备上都正常工作。我们收到报告称,若无法使网络引导正常工作,可尝试在网络上禁用 STP 帧来帮助排除故障。
注意
此部分仅适用于树莓派 3B,因为在出厂时树莓派 3B+ 已启用网络启动。
在树莓派 3B 进行网络启动之前,需要从带有已配置参数的存储卡启动,启用 USB 启动模式。这会在树莓派 SoC 的 OTP(一次可编程)存储器中设置一个位,从而启用网络引导。完成此操作后,如果树莓派 3B 无法从存储卡启动,将尝试 USB 启动和网络启动。
通常,在存储卡上安装精简版树莓派系统/带桌面的树莓派系统。接下来,使用以下命令启用 USB 启动模式:
$ echo program_usb_boot_mode=1 | sudo tee -a /boot/firmware/config.txt
将 program_usb_boot_mode=1
添加到 /boot/firmware/config.txt
的末尾。使用 sudo reboot
重启树莓派。在客户端树莓派重启后,请检查 OTP 是否已编程为:
$ vcgencmd otp_dump | grep 17:
17:3020000a
确保正确输出 0x3020000a
。
客户端配置几乎完成。作为最后一步,禁用 USB 启动。运行以下命令:
$ sudo nano /boot/firmware/config.txt
删除包含文本 program_usb_boot_mode=1
这行。最后,使用 sudo poweroff
关闭客户端树莓派。
可以使用工具 raspi-config 在树莓派 4 上启用网络启动。首先,按照以下方式运行 raspi-config :
$ sudo raspi-config
在 raspi-config 中,选择 Advanced Options,然后选择 Boot Order,最后选择 Network Boot。然后必须重启设备,以将引导顺序更改编程到引导加载程序 EEPROM 中。在树莓派重启后,请检查现在的启动顺序是否为 0xf21
:
$ vcgencmd bootloader_config
要了解如何配置树莓派 4 启动加载程序的更多详细信息,请参阅树莓派引导加载程序配置。
在配置网络引导之前,请记下序列号和 MAC 地址,以便 TFTP/DHCP 服务器可以识别开发板。
在树莓派 4 上,MAC 地址是在制造时编程的,MAC 地址和序列号之间没有关联。MAC 地址和序列号都显示在启动加载程序的 HDMI 诊断屏幕上。
要查找以太网 MAC 地址:
$ ethtool -P eth0
查找序列号:
$ grep Serial /proc/cpuinfo | cut -d ' ' -f 2 | cut -c 9-16
将存储卡插入服务器的树莓派,然后启动服务器。客户端的树莓派需要一个用于启动的根文件系统:我们将使用服务器的根文件系统的副本,并将其放置在 /nfs/client1
:
$ sudo mkdir -p /nfs/client1
$ sudo apt install rsync
$ sudo rsync -xa --progress --exclude /nfs / /nfs/client1
在客户端文件系统中通过 chroot
重新生成 SSH 主机密钥:
$ cd /nfs/client1
$ sudo mount --bind /dev dev
$ sudo mount --bind /sys sys
$ sudo mount --bind /proc proc
$ sudo chroot .
$ rm /etc/ssh/ssh_host_*
$ dpkg-reconfigure openssh-server
$ exit
$ sudo umount dev sys proc
查找本地网络的设置。你需要找到路由器(或网关)的地址,可以通过以下方式完成:
$ ip route | awk '/default/ {print $3}'
然后运行:
$ ip -4 addr show dev eth0 | grep inet
你将看到类似以下内容的输出:
inet 10.42.0.211/24 brd 10.42.0.255 scope global eth0
第一个地址是你的服务器树莓派在网络上的 IP 地址,斜杠后面的部分是网络大小。很可能你的是一个 /24
。还要注意网络的 brd (广播)地址。记下前一个命令的输出,其中包含了树莓派的 IP 地址和网络的广播地址。
最后,记下你的 DNS 服务器地址,这与你的网关地址相同。你可以使用以下命令找到这个地址:
$ cat /etc/resolv.conf
通过 systemd 网络配置在你的服务器树莓派上配置静态网络地址,该网络作为网络处理程序和 DHCP 服务器。
为此,你需要创建一个 10-eth0.netdev
和一个 11-eth0.network
,如下所示:
$ sudo nano /etc/systemd/network/10-eth0.netdev
添加以下行:
[Match]
Name=eth0
[Network]
DHCP=no
然后创建一个网络文件:
$ sudo nano /etc/systemd/network/11-eth0.network
添加以下内容:
[Match]
Name=eth0
[Network]
Address=10.42.0.211/24
DNS=10.42.0.1
[Route]
Gateway=10.42.0.1
此时,你没有工作中的 DNS,因此你需要将之前记录的服务器添加到 systemd/resolved.conf
。在此示例中,网关地址为 10.42.0.1
。
$ sudo nano /etc/systemd/resolved.conf
取消注释 DNS 那一行,并在那里添加 DNS IP 地址。另外,如果你有备用 DNS 服务器,请也添加在那里。
[Resolve]
DNS=10.42.0.1
#FallbackDNS=
启用 systemd-networkd,然后重启以使更改生效:
$ sudo systemctl enable systemd-networkd
$ sudo reboot
现在启动 tcpdump,这样你就可以从客户端树莓派搜索 DHCP 数据包。
$ sudo apt install tcpdump dnsmasq
$ sudo systemctl enable dnsmasq
$ sudo tcpdump -i eth0 port bootpc
把客户端树莓派接入你的网络,再打开电源。检查客户端的 LED 是否在大约 10 秒后亮起,然后你应该从客户端收到一个数据包“DHCP/BOOTP, Request from …”。
IP 0.0.0.0.bootpc > 255.255.255.255.bootps: BOOTP/DHCP, Request from b8:27:eb...
现在你需要修改 dnsmasq 配置以使 DHCP 能够回复设备。按下 Ctrl + C 退出 tcpdump
程序,然后输入以下内容:
$ echo | sudo tee /etc/dnsmasq.conf
$ sudo nano /etc/dnsmasq.conf
然后用以下内容替换 dnsmasq.conf
的内容:
# 注意:如果你希望网络上的系统使用 DNS 服务,请注释掉端口。
port=0
dhcp-range=10.42.0.255,proxy
log-dhcp
enable-tftp
tftp-root=/tftpboot
pxe-service=0,"Raspberry Pi Boot"
在 dhcp-range
行的第一个地址处,使用你之前记录的广播地址。
现在创建一个目录 /tftpboot
:
$ sudo mkdir /tftpboot
$ sudo chmod 777 /tftpboot
$ sudo systemctl enable dnsmasq.service
$ sudo systemctl restart dnsmasq.service
现在监视 dnsmasq 日志:
$ journalctl -f
你应该看到类似这样的内容:
raspberrypi dnsmasq-tftp[1903]: file /tftpboot/bootcode.bin not found
接下来,你需要将 boot 文件夹的内容复制到目录 /tftpboot
中。
首先,按下 Ctrl + C 退出监控状态。然后输入以下内容:
$ cp -r /boot/firmware/* /tftpboot
由于 tftp 位置已更改,请重启 dnsmasq :
$ sudo systemctl restart dnsmasq
现在,这应该允许你的树莓派客户端尝试启动,直到尝试加载根文件系统(它没有)。
在这一点上,export 之前创建的 /nfs/client1
文件系统和 TFTP 引导文件夹。
$ sudo apt install nfs-kernel-server
$ echo "/nfs/client1 *(rw,sync,no_subtree_check,no_root_squash)" | sudo tee -a /etc/exports
$ echo "/tftpboot *(rw,sync,no_subtree_check,no_root_squash)" | sudo tee -a /etc/exports
重启 RPC-Bind 和 NFS 服务器,以便它们检测到新文件。
$ sudo systemctl enable rpcbind
$ sudo systemctl restart rpcbind
$ sudo systemctl enable nfs-kernel-server
$ sudo systemctl restart nfs-kernel-server
编辑 /tftpboot/cmdline.txt
,并以 root=
打头,将其替换为:
root=/dev/nfs nfsroot=10.42.0.211:/nfs/client1,vers=3 rw ip=dhcp rootwait
在这里用你记录下的 IP 地址替换 IP 地址。还要删除命令行中所有以 init=
开头的部分。
最后,编辑 /nfs/client1/etc/fstab
,删除 /dev/mmcblk0p1
和第 2 行(只留下 proc
)。然后,将引导分区添加回去:
$ echo "10.42.0.211:/tftpboot /boot/firmware/ nfs defaults,vers=3 0 0" | sudo tee -a /nfs/client1/etc/fstab
如果第一次尝试无法启动,请继续尝试。树莓派启动可能需要一分钟左右,所以请耐心等待。
通过网络启动树莓派有 4 个阶段:
引导加载程序使用 DHCP 协商获取 IP 地址和 TFTP 服务器的详细信息。
引导加载程序通过 TFTP 加载固件,并将引导过程交给固件,将网络详细信息传递给它。
固件通过 TFTP 加载内核和命令行。
内核引导系统的其余部分,通过 NFS 或其他机制加载根文件系统(rootfs)。
引导加载程序和固件(阶段 1 到 3)已经得到增强,以支持通过 IPv6 引导。
重要
IPv6 网络启动是一项 实验性的阿尔法 功能,根据反馈意见,我们可能需要在将来更改其工作方式。这仅适用于树莓派 4 和计算模块 4。
要通过 IPv6 启动,你需要一个更新的固件版本(例如 start4.elf
)和引导加载程序。使用最新版本的树莓派系统和最新的稳定引导加载程序应该足够了。
注意
目前常用的 DHCP 服务器
dnsmasq
不支持 IPv6 网络启动所需的网络启动参数,因此在当下,你只能使用其他 DHCP 服务器,如 ISC DHCP。
要通过网络挂载 rootfs
,IPv4 网络引导教程建议使用 nfsroot
。它不支持 IPv6,因此需要其他方法来通过网络挂载 rootfs
。
如果你的 ISP 和路由器不支持 IPv6,你将受到限制。
引导加载程序要做的第一件事是发送路由器请求,以获取网络的详细信息。路由器会以通告数据包回应,标识其以太网地址,如果 TFTP 服务器位于不同的网络上,引导加载程序可能会需要这些信息。
路由器通告包含一个标志,告诉它是否使用有状态(托管)或无状态(非托管)配置来获取其 IP 地址。无状态配置意味着设备配置自己的 IP 地址。目前,引导加载程序生成一个从其以太网 MAC 地址和路由器提供的网络前缀派生的地址。
如果路由器指示启用了有状态配置,则使用 DHCP 来获取设备的 IP 地址。这涉及设备向 DHCP 服务器发送一个请求,服务器响应一个通告。然后客户端请求地址,然后从服务器获得回复确认。
DHCP 服务器和客户端使用可变长度的 DUID(设备唯一 ID)来标识自己。在树莓派上,这是从 MAC 地址(DUID_LL)派生的。
无论使用无状态还是有状态配置,DHCP 服务器用于获取 TFTP 服务器地址。这是在 BOOTFILE-URL 参数中编码的。我们发送客户端架构类型值 0x29
以识别设备。
请参阅 RFC 5970 和 IANA IPv6 动态主机配置协议文档。
设备现在应该有一个 IP 地址和 TFTP 详细信息。它从 TFTP 服务器下载固件二进制 start4.elf,然后继续使用此固件运行。固件传递了 IP 地址和 TFTP 服务器详细信息,以便它可以下载内核并引导系统的其余部分。
使用 IPv4 网络启动时,nfsroot 用于在网络上挂载 rootfs。这不支持 IPv6,因此需要另一种解决方案。可能涉及一个可以在切换到适当的 rootfs 内容之前挂载适当网络位置的小型 RAM 文件系统。
注意
通过 IPv6 利用 NFS 启动 Linux 内核的机制仍有待演示。
如果你想尝试这个,你将需要另一个树莓派作为 TFTP 和 DHCP 服务器。
理论上,TFTP 服务器可以位于任意可路由的网络上,但 DHCP 服务器必须位于将要提供服务的设备相同的网络上。
如果你有一个工作的 IPv4 网络启动设置,你可以重用 dnsmasq 中的 TFTP 服务器提供文件(它可以与 IPv4 和 IPv6 通信)。
或者你可以使用一个独立的 TFTP 服务器,比如 tftpd-hpa。
$ sudo apt-get install tftpd-hpa
$ sudo systemctl start tftpd-hpa
IPv6 中的 DHCP 发生了很大变化。我们至少需要 DHCP 告诉我们 TFTP 服务器的地址,在这种情况下是同一台机器。
$ sudo apt-get install isc-dhcp-server
修改 /etc/default/isc-dhcp-server
中的配置:
DHCPDv6_CONF=/etc/dhcp/dhcpd6.conf
INTERFACESv6="eth0"
在 /etc/dhcp/dhcpd6.conf
中,你需要指定 TFTP 服务器地址并设置子网。这里 DHCP 服务器配置为提供一些虚构的唯一本地地址(ULA)。host test-rpi4
行告诉 DHCP 为测试设备提供固定地址。
not authoritative;
# 检查客户端是否像个树莓派
if option dhcp6.client-arch-type = 00:29 {
option dhcp6.bootfile-url "tftp://[fd49:869:6f93::1]/";
}
subnet6 fd49:869:6f93::/64 {
host test-rpi4 {
host-identifier option dhcp6.client-id 00:03:00:01:e4:5f:01:20:24:0b;
fixed-address6 fd49:869:6f93::1000;
}
}
你的服务器必须在 /etc/dhcpcd.conf
中分配 IPv6 地址
interface eth0
static ip6_address=fd49:869:6f93::1/64
现在启动 DHCP 服务器。
$ sudo systemctl restart isc-dhcp-server.service
修改配置以通过 IPv6 尝试网络启动,而非 IPv4。
BOOT_ORDER=0xf21 # 2=网络启动
USE_IPV6=1 # 启用 IPv6 网络启动
BOOT_UART=1 # 调试
要恢复到 IPv4 网络启动,只需从 boot.conf
中删除 USE_IPV6
行。
要使用 IPv6,你真的需要支持 IPv6 的路由器和 ISP。互联网上有一些网站可以为你检查这一点,或者运行以下命令。
sudo apt-get install ndisc6
rdisc6 -1 eth0
这会向你的路由器发送路由器请求,请求你的网络详细信息,如网络前缀、路由器以太网地址以及是否使用 DHCP 进行寻址。如未响应此命令,很可能是你的网络及 ISP 仅支持 IPv4。如果支持 IPv6,很可能会配置为使用无状态配置,其中客户端生成自己的地址。
Soliciting ff02::2 (ff02::2) on eth0...
Hop limit : 64 ( 0x40)
Stateful address conf. : No
Stateful other conf. : Yes
Mobile home agent : No
Router preference : medium
Neighbor discovery proxy : No
Router lifetime : 180 (0x000000b4) seconds
Reachable time : unspecified (0x00000000)
Retransmit time : unspecified (0x00000000)
你可能能够为有状态配置配置你的路由器,这意味着它将使用 DHCP 获取 IP 地址。
Hop limit : 64 ( 0x40)
Stateful address conf. : Yes
Stateful other conf. : Yes
Mobile home agent : No
Router preference : medium
Neighbor discovery proxy : No
Router lifetime : 180 (0x000000b4) seconds
Reachable time : unspecified (0x00000000)
Retransmit time : unspecified (0x00000000)
如果启用了引导串口,则应该从串口看到类似以下内容。以 RX6 开头的行表示正在使用 IPv6。
这里 dc:a6:32:6f:73:f4
是 TFTP 服务器的 MAC 地址,它具有一个 IPv6 地址 fd49:869:6f93::1
。设备本身具有一个 MAC 地址 e4:5f:01:20:24:0b
和一个 IPv6 地址 fd49:869:6f93::1000
Boot mode: NETWORK (02) order f
GENET: RESET_PHY
PHY ID 600d 84a2
NET_BOOT: e4:5f:01:20:24:0b wait for link TFTP6: (null)
LINK STATUS: speed: 100 full duplex
Link ready
GENET START: 64 16 32
GENET: UMAC_START 0xe45f0120 0x240b0000
RX6: 12 IP: 1 MAC: 1 ICMP: 1/1 UDP: 0/0 ICMP_CSUM_ERR: 0 UDP_CSUM_ERR: 0
NET fd49:869:6f93::1000 tftp fd49:869:6f93::1
RX6: 17 IP: 4 MAC: 4 ICMP: 2/2 UDP: 2/2 ICMP_CSUM_ERR: 0 UDP_CSUM_ERR: 0
TFTP_GET: dc:a6:32:6f:73:f4 fd49:869:6f93::1 ab5a4158/start4.elf
RX6: 17 IP: 4 MAC: 4 ICMP: 2/2 UDP: 2/2 ICMP_CSUM_ERR: 0 UDP_CSUM_ERR: 0
RX6: 18 IP: 5 MAC: 5 ICMP: 2/2 UDP: 3/3 ICMP_CSUM_ERR: 0 UDP_CSUM_ERR: 0
TFTP_GET: dc:a6:32:6f:73:f4 fd49:869:6f93::1 ab5a4158/config.txt
最后,引导加载程序将控制权交给应该加载内核的固件。
你可以使用 tcpdump
检查网络活动。
$ sudo tcpdump -i eth0 -e ip6 -XX -l -v -vv
下面是一个 TCP 转储的摘录,其中路由器配置为使用有状态(DHCP)网络配置。
设备发送路由器请求。
12:23:35.387046 e4:5f:01:20:24:0b (oui Unknown) > 33:33:00:00:00:02 (oui Unknown), ethertype IPv6 (0x86dd), length 70: (hlim 255, next-header ICMPv6 (58) payload length: 16) fe80::e65f:1ff:fe20:240b > ip6-allrouters: [icmp6 sum ok] ICMP6, router solicitation, length 16
source link-address option (1), length 8 (1): e4:5f:01:20:24:0b
0x0000: e45f 0120 240b
路由器发送响应,告知设备使用有状态配置。
12:23:35.498902 60:8d:26:a7:c1:88 (oui Unknown) > 33:33:00:00:00:01 (oui Unknown), ethertype IPv6 (0x86dd), length 110: (hlim 255, next-header ICMPv6 (58) payload length: 56) bthub.home > ip6-allnodes: [icmp6 sum ok] ICMP6, router advertisement, length 56
hop limit 64, Flags [managed, other stateful], pref medium, router lifetime 180s, reachable time 0ms, retrans timer 0ms
rdnss option (25), length 24 (3): lifetime 60s, addr: bthub.home
0x0000: 0000 0000 003c fe80 0000 0000 0000 628d
0x0010: 26ff fea7 c188
mtu option (5), length 8 (1): 1492
0x0000: 0000 0000 05d4
source link-address option (1), length 8 (1): 60:8d:26:a7:c1:88
0x0000: 608d 26a7 c188
设备发送 DHCP 请求。
12:23:35.502517 e4:5f:01:20:24:0b (oui Unknown) > 33:33:00:01:00:02 (oui Unknown), ethertype IPv6 (0x86dd), length 114: (hlim 255, next-header UDP (17) payload length: 60) fe80::e65f:1ff:fe20:240b.dhcpv6-client > ff02::1:2.dhcpv6-server: [udp sum ok] dhcp6 solicit (xid=8cdd56 (client-ID hwaddr type 1 e45f0120240b) (IA_NA IAID:0 T1:0 T2:0) (option-request opt_59) (opt_61) (elapsed-time 0))
DHCP 服务器回复通告。
12:23:35.510478 dc:a6:32:6f:73:f4 (oui Unknown) > e4:5f:01:20:24:0b (oui Unknown), ethertype IPv6 (0x86dd), length 172: (flowlabel 0xad54d, hlim 64, next-header UDP (17) payload length: 118) fe80::537a:52c:c647:b184.dhcpv6-server > fe80::e65f:1ff:fe20:240b.dhcpv6-client: [bad udp cksum 0xd886 -> 0x6d26!] dhcp6 advertise (xid=8cdd56 (IA_NA IAID:0 T1:3600 T2:7200 (IA_ADDR fd49:869:6f93::1000 pltime:604800 vltime:2592000)) (client-ID hwaddr type 1 e45f0120240b) (server-ID hwaddr/time type 1 time 671211709 dca6326f73f4) (opt_59))
设备向 DHCP 服务器发送地址和 TFTP 详细信息的请求。
12:23:35.510763 e4:5f:01:20:24:0b (oui Unknown) > 33:33:00:01:00:02 (oui Unknown), ethertype IPv6 (0x86dd), length 132: (hlim 255, next-header UDP (17) payload length: 78) fe80::e65f:1ff:fe20:240b.dhcpv6-client > ff02::1:2.dhcpv6-server: [udp sum ok] dhcp6 request (xid=8cdd56 (client-ID hwaddr type 1 e45f0120240b) (server-ID hwaddr/time type 1 time 671211709 dca6326f73f4) (IA_NA IAID:0 T1:0 T2:0) (option-request opt_59) (opt_61) (elapsed-time 1))
DHCP 服务器回复,opt_59
用于传递 TFTP 服务器的地址。
12:23:35.512122 dc:a6:32:6f:73:f4 (oui Unknown) > e4:5f:01:20:24:0b (oui Unknown), ethertype IPv6 (0x86dd), length 172: (flowlabel 0xad54d, hlim 64, next-header UDP (17) payload length: 118) fe80::537a:52c:c647:b184.dhcpv6-server > fe80::e65f:1ff:fe20:240b.dhcpv6-client: [bad udp cksum 0xd886 -> 0x6826!] dhcp6 reply (xid=8cdd56 (IA_NA IAID:0 T1:3600 T2:7200 (IA_ADDR fd49:869:6f93::1000 pltime:604800 vltime:2592000)) (client-ID hwaddr type 1 e45f0120240b) (server-ID hwaddr/time type 1 time 671211709 dca6326f73f4) (opt_59))
设备向 FTP 服务器发送邻居请求,因为它需要其 MAC 地址。
12:23:36.510768 e4:5f:01:20:24:0b (oui Unknown) > 33:33:ff:00:00:01 (oui Unknown), ethertype IPv6 (0x86dd), length 86: (hlim 255, next-header ICMPv6 (58) payload length: 32) fe80::e65f:1ff:fe20:240b > ff02::1:ff00:1: [icmp6 sum ok] ICMP6, neighbor solicitation, length 32, who has fd49:869:6f93::1
source link-address option (1), length 8 (1): e4:5f:01:20:24:0b
0x0000: e45f 0120 240b
FTP 服务器将以其 MAC 地址回复。
12:23:36.510854 dc:a6:32:6f:73:f4 (oui Unknown) > e4:5f:01:20:24:0b (oui Unknown), ethertype IPv6 (0x86dd), length 86: (hlim 255, next-header ICMPv6 (58) payload length: 32) fd49:869:6f93::1 > fe80::e65f:1ff:fe20:240b: [icmp6 sum ok] ICMP6, neighbor advertisement, length 32, tgt is fd49:869:6f93::1, Flags [solicited, override]
destination link-address option (2), length 8 (1): dc:a6:32:6f:73:f4
0x0000: dca6 326f 73f4
TFTP 请求由应该现在通过网络引导的设备发出。
12:23:36.530820 e4:5f:01:20:24:0b (oui Unknown) > dc:a6:32:6f:73:f4 (oui Unknown), ethertype IPv6 (0x86dd), length 111: (hlim 255, next-header UDP (17) payload length: 57) fd49:869:6f93::1000.61785 > fd49:869:6f93::1.tftp: [udp sum ok] 49 RRQ "ab5a4158/start4.elf" octet tsize 0 blksize 1024
下面是一个用于无状态(非 DHCP)网络配置的 tcp 转储的摘录。
设备发送路由器请求。
12:55:27.541909 e4:5f:01:20:24:0b (oui Unknown) > 33:33:00:00:00:02 (oui Unknown), ethertype IPv6 (0x86dd), length 70: (hlim 255, next-header ICMPv6 (58) payload length: 16) fe80::e65f:1ff:fe20:240b > ip6-allrouters: [icmp6 sum ok] ICMP6, router solicitation, length 16
source link-address option (1), length 8 (1): e4:5f:01:20:24:0b
0x0000: e45f 0120 240b
路由器回复网络详细信息。
12:55:27.834684 60:8d:26:a7:c1:88 (oui Unknown) > 33:33:00:00:00:01 (oui Unknown), ethertype IPv6 (0x86dd), length 174: (hlim 255, next-header ICMPv6 (58) payload length: 120) bthub.home > ip6-allnodes: [icmp6 sum ok] ICMP6, router advertisement, length 120
hop limit 64, Flags [other stateful], pref medium, router lifetime 180s, reachable time 0ms, retrans timer 0ms
prefix info option (3), length 32 (4): 2a00:23c5:ee00:5001::/64, Flags [onlink, auto, router], valid time 300s, pref. time 120s
0x0000: 40e0 0000 012c 0000 0078 0000 0000 2a00
0x0010: 23c5 ee00 5001 0000 0000 0000 0000
prefix info option (3), length 32 (4): fd4d:869:6f93::/64, Flags [onlink, auto, router], valid time 10080s, pref. time 2880s
0x0000: 40e0 0000 2760 0000 0b40 0000 0000 fd4d
0x0010: 0869 6f93 0000 0000 0000 0000 0000
rdnss option (25), length 24 (3): lifetime 60s, addr: bthub.home
0x0000: 0000 0000 003c fe80 0000 0000 0000 628d
0x0010: 26ff fea7 c188
mtu option (5), length 8 (1): 1492
0x0000: 0000 0000 05d4
source link-address option (1), length 8 (1): 60:8d:26:a7:c1:88
0x0000: 608d 26a7 c188
设备向 DHCP 组播地址发送信息请求,请求 TFTP 详细信息。
12:55:27.838300 e4:5f:01:20:24:0b (oui Unknown) > 33:33:00:01:00:02 (oui Unknown), ethertype IPv6 (0x86dd), length 98: (hlim 255, next-header UDP (17) payload length: 44) fe80::e65f:1ff:fe20:240b.dhcpv6-client > ff02::1:2.dhcpv6-server: [udp sum ok] dhcp6 inf-req (xid=e5e0a4 (client-ID hwaddr type 1 e45f0120240b) (option-request opt_59) (opt_61) (elapsed-time 0))
DHCP 服务器回复 TFTP 服务器详细信息(opt_59
)。
12:55:27.838898 dc:a6:32:6f:73:f4 (oui Unknown) > e4:5f:01:20:24:0b (oui Unknown), ethertype IPv6 (0x86dd), length 150: (flowlabel 0xd1248, hlim 64, next-header UDP (17) payload length: 96) fe80::537a:52c:c647:b184.dhcpv6-server > fe80::e65f:1ff:fe20:240b.dhcpv6-client: [bad udp cksum 0xd870 -> 0x78bb!] dhcp6 reply (xid=e5e0a4 (client-ID hwaddr type 1 e45f0120240b) (server-ID hwaddr/time type 1 time 671211709 dca6326f73f4) (opt_59))
设备请求 TFTP 服务器 MAC 地址,因为它可以知道它在同一网络上。
12:55:28.834796 e4:5f:01:20:24:0b (oui Unknown) > 33:33:ff:1d:fe:2a (oui Unknown), ethertype IPv6 (0x86dd), length 86: (hlim 255, next-header ICMPv6 (58) payload length: 32) fe80::e65f:1ff:fe20:240b > ff02::1:ff1d:fe2a: [icmp6 sum ok] ICMP6, neighbor solicitation, length 32, who has 2a00:23c5:ee00:5001:57f1:7523:2f1d:fe2a
source link-address option (1), length 8 (1): e4:5f:01:20:24:0b
0x0000: e45f 0120 240b
FTP 服务器将以其 MAC 地址回复。
12:55:28.834875 dc:a6:32:6f:73:f4 (oui Unknown) > e4:5f:01:20:24:0b (oui Unknown), ethertype IPv6 (0x86dd), length 86: (hlim 255, next-header ICMPv6 (58) payload length: 32) 2a00:23c5:ee00:5001:57f1:7523:2f1d:fe2a > fe80::e65f:1ff:fe20:240b: [icmp6 sum ok] ICMP6, neighbor advertisement, length 32, tgt is 2a00:23c5:ee00:5001:57f1:7523:2f1d:fe2a, Flags [solicited, override]
destination link-address option (2), length 8 (1): dc:a6:32:6f:73:f4
0x0000: dca6 326f 73f4
设备开始发出 TFTP 请求。
12:55:28.861097 e4:5f:01:20:24:0b (oui Unknown) > dc:a6:32:6f:73:f4 (oui Unknown), ethertype IPv6 (0x86dd), length 111: (hlim 255, next-header UDP (17) payload length: 57) 2a00:23c5:ee00:5001:e65f:1ff:fe20:240b.46930 > 2a00:23c5:ee00:5001:57f1:7523:2f1d:fe2a.tftp: [udp sum ok] 49 RRQ "ab5a4158/start4.elf" octet tsize 0 blksize 1024
此处所述的 config.txt
参数被视为陈旧设置,树莓派 Bookworm 系统不再使用,亦无官方支持。它们要么涉及旧软件(如固件中的图形驱动程序)、要么已弃用、要么几乎无人使用。然而,它们仍被记录在此,因为它们对于那些使用旧操作系统的用户,及进行裸机开发的人来说,可能仍有用。
(另请参阅 config.txt 启动参数。)
start_x
、start_debug
这里提供了代替参数 start_file
、fixup_file
的简单方法。这是选定固件配置的建议方法。
start_x=1
意味着
start_file=start_x.elf
fixup_file=fixup_x.dat
对于树莓派 4,如果存在文件 start4x.elf
、fixup4x.dat
,则会使用之。
start_debug=1
意味着
start_file=start_db.elf
fixup_file=fixup_db.dat
disable_commandline_tags
若将参数 disable_commandline_tags
置为 1
,会在启动内核之前禁止 start.elf
覆盖 ATAGS(从 0x100
开始的内存)。
arm_control
警告
此参数已弃用。请改用
arm_64bit
来启用 64 位内核。
此设置特定于主板的控制位。
armstub
armstub
位于启动分区,是用于加载 ARM stub(存根)的文件名。默认的 ARM 存根存储在固件中,会根据树莓派型号及各种设置自动选定。
存根是在内核运行之前被执行的一小段 ARM 代码。它的任务是设置诸如中断控制器等底层硬件,然后再将控制权移交给内核。
arm_peri_high
若将 arm_peri_high
置为 1
:可在树莓派 4 上启用高性能外设模式。若加载了恰当的 DTB,将会自动设定该参数。
注意
若在缺失兼容设备树(DTB)的情况下,启用高性能外设模式,将导致系统无法启动。目前的 ARM 存根支持尚不完善,因此你还需使用
armstub
加载对应的文件。
kernel_address
kernel_address
是加载内核镜像的内存地址。在默认情况下,32 位内核会加载到地址 0x8000
,64 位内核会加载到地址 0x200000
。若设置了 kernel_old
,内核会被加载到地址 0x0
。
kernel_old
若将 kernel_old
置为 1
,可将内核加载至内存地址 0x0
。
init_uart_baud
init_uart_baud
是串口的初始化波特率。默认值为 115200
。
init_uart_clock
init_uart_clock
是串口的初始化时钟频率。默认值为 48000000
(48MHz)。请注意,此时钟仅适用于 UART0(Linux 为 ttyAMA0),且串口的最大波特率受限为时钟的 1/16。树莓派 3 和树莓派 Zero 的默认串口是 UART1(Linux 为 ttyS0),其时钟等同于核心 VPU 时钟——至少为 250MHz。
bootcode_delay
参数 bootcode_delay
设定了在 bootcode.bin
阶段的延迟(秒),然后再加载 start.elf
——默认值为 0
。
这在读取显示器 EDID 前插入延迟极有用。比如,树莓派和显示器共用一部电源,但显示器的启动时间长于树莓派。如果显示器在初始启动时会检测到错误,但在不断电的情况下重启树莓派后就检测正确了,那么请尝试设置此参数。
boot_delay
参数 boot_delay
意味着在加载内核之前,会在 start.elf
阶段等待给定的时间(秒)。总延迟计算公式为 (1000 x boot_delay) + boot_delay_ms
,单位为毫秒。如果你的存储卡需要一些时间才能准备好,继而才能启动 Linux,这可能极有用。
boot_delay_ms
参数 boot_delay_ms
意味着在加载内核之前,会在 start.elf
阶段(含 boot_delay
)等待给定的时间(毫秒)。默认值为 0
。
enable_gic
(仅适用于树莓派 4)在树莓派 4B 上,如果将此值置为 0
,则中断将从旧的中断控制器(而非 GIC-400)路由到 Arm 处理器。默认值为 1
。
sha256
如果设置为非 0
值,则将:为加载的文件(内核、initramfs、设备树 .dtb 文件和叠加层)记录 SHA256 哈希值日志,哈希值由工具 sha256sum
生成。如启用,日志输出将发送到串口,亦可通过 sudo vclog --msg
获取。在调试启动故障时,此参数可能极有用,但可能会使启动时间增加数秒。在所有平台上,默认值均为 0
。
uart_2ndstage
设置 uart_2ndstage=1
会触发第二阶段加载程序(树莓派 4 之前的设备为 bootcode.bin
、树莓派 4 设备为 EEPROM 中的引导代码)和主固件(start*.elf
)把诊断信息输出到 UART0。
请注意,输出可能会干扰蓝牙正常工作,除非禁用蓝牙(dtoverlay=disable-bt
)或把蓝牙切换到别的串口(dtoverlay=miniuart-bt
),如串口同时被用于输出 Linux 数据,则可能会导致数据丢失,从而导致输出故障。此功能应仅在诊断早期引导加载故障时使用。
upstream_kernel
如果设定 upstream_kernel=1
,固件会将 os_prefix
设置为"upstream/"——除非已明确将其设置为其他值。但就像其他 os_prefix
值一样,如果在使用前缀时无法找到所需的内核和 .dtb 文件,则会忽略该值。
固件还会优先使用上游 Linux 的 DTB 名称(bcm2837-rpi-3-b.dtb
先于 bcm2710-rpi-3-b.dtb
)。如果找不到上游文件,则固件将加载下游衍生文件,并自动加载"upstream"叠加层来进行调整。请注意,此过程发生在 os_prefix
最终确定后。
(另请参阅 config.txt GPIO 控制。)
enable_jtag_gpio
设置 enable_jtag_gpio=1
:会把 GPIO 引脚 22-27 设为 Alt4 模式,并在 SoC 内部进行相关配置,从而启用 Arm CPU 的 JTAG 接口。此设置适用于所有型号的树莓派。
GPIO22
ARM_TRST
GPIO23
ARM_RTCK
GPIO24
ARM_TDO
GPIO25
ARM_TCK
GPIO26
ARM_TDI
GPIO27
ARM_TMS
(另请参阅 config.txt 超频参数。)
never_over_voltage
会在一次性可编程(OTP)存储器中置一个位,防止设备过压。旨在锁定树莓派,以防止无意、或恶意地使用无效过电压篡改保修位。
disable_auto_turbo
对于树莓派 2、3,设置此参数将禁止 GPU 超频。而在特定负载下,GPU 原本可进入超频模式。
(另请参阅 config.txt 条件筛选器。)
[HDMI:*]
注意
此筛选器仅适用于树莓派 4。
树莓派 4 有两个 HDMI 端口,有许多个同 HDMI 相关的 config.txt
参数,有必要指明所选定的 HDMI 端口。HDMI 条件筛选器将后续 HDMI 配置限定到特定端口。
[HDMI:0]
hdmi_group=2
hdmi_mode=45
[HDMI:1]
hdmi_group=2
hdmi_mode=67
所有特定于端口的 HDMI 参数都提供了另外一种语法:变量:值
。你可以使用以下内容,这与前面的示例相同:
hdmi_group:0=2
hdmi_mode:0=45
hdmi_group:1=2
hdmi_mode:1=67
(另请参阅 config.txt 内存参数)
注意
树莓派 5 不会为操作系统分配 GPU 内存(显存),故以下参数无效。
gpu_mem
指定要为 GPU 保留多少专用内存(MB):剩余内存分配给 Arm CPU 供操作系统使用。对于内存小于 1GB 的树莓派来说,默认值为 64
;对于内存为 1GB 及更大容量的树莓派,默认值为 76
。
重要
与 x86 平台(增大显存可提高 3D 性能)上的 GPU 不同。VideoCore 的架构意味着:指定比必要值更大的值不仅无法带来性能优势,相反还可能会降低性能。
为了确保 Linux 呈最佳性能,你应把 gpu_mem
设置成尽可能低的值。如果某个特定的图形功能无法正常工作,可尝试提高 gpu_mem
的值,但请注意下面展示的建议最大值。
在树莓派 4 上,GPU 的 3D 组件有自己的内存管理单元(MMU),故不使用 gpu_mem
分配的内存,而是使用 Linux 动态分配的内存。这使得树莓派 4 可指定比先前型号还小的 gpu_mem
值。
由旧款内核分配给 GPU 的内存,可用于显示器、3D、编解码器和摄像头等用途,以及一些基本固件管理。下面指定的最大值,假定你正使用着上述所有功能。如无,则应使用较小的 gpu_mem
值。
建议最大值如下:
总内存
建议的 gpu_mem
最大值
256MB
128
512MB
384
1GB 及更大
512
、树莓派 4 为 76
重要
树莓派系统上的相机堆栈(libcamera)使用 Linux CMA(连续内存分配器)的内存分配缓冲区,并不占用 GPU 显存,所以增大 GPU 显存没有任何好处可言。
能把 gpu_mem
设置成更大的值,但不建议这么做,因为可能会引发故障(可能妨碍 Linux 启动)。gpu_mem
的最小值为 16
——但此值会禁用某些 GPU 功能。
你还可以使用 gpu_mem_256
、gpu_mem_512
、gpu_mem_1024
,以便在不同内存容量间的树莓派交换同一张存储卡,无需每次都编辑 config.txt
:
gpu_mem_256
参数 gpu_mem_256
可为搭载 256MB 内存的树莓派设置 GPU 内存(MB)。如果内存容量不是 256MB,则会被忽略。该参数会覆盖 gpu_mem
。
gpu_mem_512
参数 gpu_mem_512
可为搭载 512MB 内存的树莓派设置 GPU 内存(MB)。如果内存容量不是 512MB,则会被忽略。该参数会覆盖 gpu_mem
。
gpu_mem_1024
参数 gpu_mem_1024
可为搭载 1GB(及更大容量)内存的树莓派设置 GPU 内存(MB)。如果内存容量小于 1GB,则会被忽略。该参数会覆盖 gpu_mem
。
disable_l2cache
若将该参数置为 1
(并同时禁用 L2 缓存的相关内核),会禁止 CPU 使用 GPU 的 L2 缓存。BCM2835 的默认值为 0
。基于 BCM2836、BCM2837、BCM2711 和 BCM2712 的 ARM 有自己的 L2 缓存,故默认值为 1
。标准版本的树莓派 kernel.img
和 kernel7.img
对应了缓存设置的差异。
(另请参阅 config.txt
视频参数。)
注意
因为树莓派 4、400 搭载了两个 HDMI 端口,故某些 HDMI 参数可以应用于特定接口。你可以使用语法
<参数>:<端口>
,其中端口值为0
或1
,用来指定此设置应用于哪个端口。如未指定端口,则默认为0
。如果在不支持端口号的参数上指定了端口号,则端口将被忽略。更多有关语法和可选机制的详细信息,请参阅文档的条件部分中的 HDMI 章节。
hdmi_safe
若将 hdmi_safe
置为 1
,将触发使用“safe mode(安全模式)”,尝试以最大化 HDMI 兼容性启动。等同于设定以下参数:
hdmi_force_hotplug=1
hdmi_ignore_edid=0xa5000080
config_hdmi_boost=4
hdmi_group=2
hdmi_mode=4
disable_overscan=0
overscan_left=24
overscan_right=24
overscan_top=24
overscan_bottom=24
hdmi_ignore_edid
如果你的显示器没有准确的 EDID。可将 hdmi_ignore_edid
置为 0xa5000080
,以忽略显示器的 EDID(扩展显示识别数据)信息。它需要此异常值来避免触发故障。
hdmi_edid_file
若将 hdmi_edid_file
置为 1
,将使 GPU 从启动分区中的 edid.dat
文件(而非显示器)中读取 EDID 数据。
hdmi_edid_filename
在树莓派 4B 上,你可以使用参数 hdmi_edid_filename
指定要使用的 EDID 文件的文件名,并指定文件要应用的 HDMI 端口。同时还需要 hdmi_edid_file=1
来启用 EDID 文件。
例如:
hdmi_edid_file=1
hdmi_edid_filename:0=FileForPortZero.edid
hdmi_edid_filename:1=FileForPortOne.edid
hdmi_force_edid_audio
若将 hdmi_force_edid_audio
置为 1
,会把显示器伪装成支持一切音频格式,即使实际上不支持 DTS/AC3,也能进行音频透传。
hdmi_ignore_edid_audio
若将 hdmi_ignore_edid_audio
置为 1
,会把显示器伪装成不支持一切音频格式。这意味着 ALSA 将默认使用模拟音频(耳机)插孔。
hdmi_force_edid_3d
若将 hdmi_force_edid_3d
置为 1
,会将所有的 CEA 信号格式伪装成支持 3D,即使 EDID 信息并未标称支持。
hdmi_ignore_cec_init
若将 hdmi_ignore_cec_init
置为 1
,可在启动过程中禁止发送初始化活动源信息。这可以防止:在重启树莓派时,带 CEC 支持的电视机因从待机状态中唤醒而切换频道。
hdmi_ignore_cec
若将 hdmi_ignore_cec
置为 1
,会把显示器伪装成不支持 CEC。将不支持一切 CEC 功能。
cec_osd_name
参数 cec_osd_name
可为设备设置初始化 CEC 名称。默认为 Raspberry Pi
。
hdmi_pixel_encoding
参数 hdmi_pixel_encoding
将强制使用像素编码模式。在默认情况下,它使用从 EDID 请求的信号格式,因此你不大需要更改此参数。
hdmi_pixel_encoding
意义
0
默认值(CEA 为有限 RGB,DMT 为全 RGB)
1
有限 RGB(16-235)
2
全 RGB(0-255)
3
有限 YCbCr(16-235)
4
全 YCbCr(0-255)
hdmi_max_pixel_freq
固件和 KMS 使用像素时钟来选定 HDMI 信号格式。请注意,这与帧率不同。它指定了有效信号格式可以具有的最大频率,从而剔除了更高频率的信号格式。因此,如果你希望彻底禁用 4K 信号格式,你可以指定最大频率为 200000000,因为所有的 4K 信号格式频率均大于此值。
hdmi_blanking
参数 hdmi_blanking
可控制该过程:操作系统为节省电源,要求使用 DPMS(Display Power Management Signaling,显示电源管理信号)让显示器置于待机模式。如果未设置此参数或将其置为 0
,则 HDMI 输出将被清空但不会关闭。为了模仿其他计算机的行为,你可以同时把 HDMI 输出也设置为关闭,方法是将此参数置为 1
:已连接的显示器将进入低功耗待机模式。
注意
在树莓派 4 上,设置
hdmi_blanking=1
不会停止 HDMI 输出,因为该功能未实现。当使用不使用 framebuffer(帧缓冲器)的应用程序(如 omxplayer)时,此功能可能会引发问题。
hdmi_blanking
说明
0
清空 HDMI 输出
1
清空并关闭 HDMI 输出
hdmi_drive
hdmi_drive
参数能让你在输出信号格式 HDMI 和 DVI 间进行切换。
hdmi_drive
说明
1
普通 DVI 信号格式(无声音)
2
普通 HDMI 信号格式(如果支持且已启用,则有声音)
config_hdmi_boost
配置 HDMI 端口的信号强度。最小值为 0
,最大值为 11
。
早期型号的 B、A 默认值为 2
。B+ 及所有后续型号的默认值为 5
。
如果你遇到了 HDMI 故障(雪花等干扰),请尝试 7
。特别长的 HDMI 线缆可能需要 11
这么大才行——但除非绝对必要,否则不应使用这么高的值。
旧款树莓派 4 会忽略此参数。
hdmi_group
hdmi_group
参数定义了 HDMI 输出组,可以是 CEA(美国消费电子协会标准,一般由电视使用)和 DMT(显示监视器时序标准,一般由显示器使用)。此设置应与 hdmi_mode
联合使用。
hdmi_group
说明
0
自动检测 EDID
1
CEA
2
DMT
hdmi_mode
与 hdmi_group
一道,hdmi_mode
定义了 HDMI 输出格式。信号格式编号符合 CTA 规范。
注意
并非全部型号都能使用以下所有信号格式。
以下值仅在 hdmi_group=1
(CEA)下有效:
hdmi_mode
分辨率
刷新率
屏幕比例
备注
1
VGA(640x480)
60Hz
4:3
2
480p
60Hz
4:3
3
480p
60Hz
16:9
4
720p
60Hz
16:9
5
1080i
60Hz
16:9
6
480i
60Hz
4:3
7
480i
60Hz
16:9
8
240p
60Hz
4:3
9
240p
60Hz
16:9
10
480i
60Hz
4:3
四倍像素
11
480i
60Hz
16:9
四倍像素
12
240p
60Hz
4:3
四倍像素
13
240p
60Hz
16:9
四倍像素
14
480p
60Hz
4:3
双倍像素
15
480p
60Hz
16:9
双倍像素
16
1080p
60Hz
16:9
17
576p
50Hz
4:3
18
576p
50Hz
16:9
19
720p
50Hz
16:9
20
1080i
50Hz
16:9
21
576i
50Hz
4:3
22
576i
50Hz
16:9
23
288p
50Hz
4:3
24
288p
50Hz
16:9
25
576i
50Hz
4:3
四倍像素
26
576i
50Hz
16:9
四倍像素
27
288p
50Hz
4:3
四倍像素
28
288p
50Hz
16:9
四倍像素
29
576p
50Hz
4:3
双倍像素
30
576p
50Hz
16:9
双倍像素
31
1080p
50Hz
16:9
32
1080p
24Hz
16:9
33
1080p
25Hz
16:9
34
1080p
30Hz
16:9
35
480p
60Hz
4:3
四倍像素
36
480p
60Hz
16:9
四倍像素
37
576p
50Hz
4:3
四倍像素
38
576p
50Hz
16:9
四倍像素
39
1080i
50Hz
16:9
降低清屏时间
40
1080i
100Hz
16:9
41
720p
100Hz
16:9
42
576p
100Hz
4:3
43
576p
100Hz
16:9
44
576i
100Hz
4:3
45
576i
100Hz
16:9
46
1080i
120Hz
16:9
47
720p
120Hz
16:9
48
480p
120Hz
4:3
49
480p
120Hz
16:9
50
480i
120Hz
4:3
51
480i
120Hz
16:9
52
576p
200Hz
4:3
53
576p
200Hz
16:9
54
576i
200Hz
4:3
55
576i
200Hz
16:9
56
480p
240Hz
4:3
57
480p
240Hz
16:9
58
480i
240Hz
4:3
59
480i
240Hz
16:9
60
720p
24Hz
16:9
61
720p
25Hz
16:9
62
720p
30Hz
16:9
63
1080p
120Hz
16:9
64
1080p
100Hz
16:9
65
自定义
66
720p
25Hz
64:27
树莓派 4
67
720p
30Hz
64:27
树莓派 4
68
720p
50Hz
64:27
树莓派 4
69
720p
60Hz
64:27
树莓派 4
70
720p
100Hz
64:27
树莓派 4
71
720p
120Hz
64:27
树莓派 4
72
1080p
24Hz
64:27
树莓派 4
73
1080p
25Hz
64:27
树莓派 4
74
1080p
30Hz
64:27
树莓派 4
75
1080p
50Hz
64:27
树莓派 4
76
1080p
60Hz
64:27
树莓派 4
77
1080p
100Hz
64:27
树莓派 4
78
1080p
120Hz
64:27
树莓派 4
79
1680x720
24Hz
64:27
树莓派 4
80
1680x720
25z
64:27
树莓派 4
81
1680x720
30Hz
64:27
树莓派 4
82
1680x720
50Hz
64:27
树莓派 4
83
1680x720
60Hz
64:27
树莓派 4
84
1680x720
100Hz
64:27
树莓派 4
85
1680x720
120Hz
64:27
树莓派 4
86
2560x720
24Hz
64:27
树莓派 4
87
2560x720
25Hz
64:27
树莓派 4
88
2560x720
30Hz
64:27
树莓派 4
89
2560x720
50Hz
64:27
树莓派 4
90
2560x720
60Hz
64:27
树莓派 4
91
2560x720
100Hz
64:27
树莓派 4
92
2560x720
120Hz
64:27
树莓派 4
93
2160p
24Hz
16:9
树莓派 4
94
2160p
25Hz
16:9
树莓派 4
95
2160p
30Hz
16:9
树莓派 4
96
2160p
50Hz
16:9
树莓派 4
97
2160p
60Hz
16:9
树莓派 4
98
4096x2160
24Hz
256:135
树莓派 4
99
4096x2160
25Hz
256:135
树莓派 4
100
4096x2160
30Hz
256:135
树莓派 4
101
4096x2160
50Hz
256:135
树莓派 4 ①
102
4096x2160
60Hz
256:135
树莓派 4 ①
103
2160p
24Hz
64:27
树莓派 4
104
2160p
25Hz
64:27
树莓派 4
105
2160p
30Hz
64:27
树莓派 4
106
2160p
50Hz
64:27
树莓派 4
107
2160p
60Hz
64:27
树莓派 4
① 仅在处理器超频主频下可用:须设置 core_freq_min=600
和 core_freq=600
。请参阅超频。
双倍像素、四倍像素意味着更高的时钟主频,每个像素各重复两次、四次。
以下值仅在 hdmi_group=2
(DMT)下有效:
hdmi_mode
分辨率
刷新率
屏幕比例
备注
1
640x350
85Hz
2
640x400
85Hz
16:10
3
720x400
85Hz
4
640x480
60Hz
4:3
5
640x480
72Hz
4:3
6
640x480
75Hz
4:3
7
640x480
85Hz
4:3
8
800x600
56Hz
4:3
9
800x600
60Hz
4:3
10
800x600
72Hz
4:3
11
800x600
75Hz
4:3
12
800x600
85Hz
4:3
13
800x600
120Hz
4:3
14
848x480
60Hz
16:9
15
1024x768
43Hz
4:3
树莓派不兼容
16
1024x768
60Hz
4:3
17
1024x768
70Hz
4:3
18
1024x768
75Hz
4:3
19
1024x768
85Hz
4:3
20
1024x768
120Hz
4:3
21
1152x864
75Hz
4:3
22
1280x768
60Hz
15:9
降低清屏时间
23
1280x768
60Hz
15:9
24
1280x768
75Hz
15:9
25
1280x768
85Hz
15:9
26
1280x768
120Hz
15:9
降低清屏时间
27
1280x800
60
16:10
降低清屏时间
28
1280x800
60Hz
16:10
29
1280x800
75Hz
16:10
30
1280x800
85Hz
16:10
31
1280x800
120Hz
16:10
降低清屏时间
32
1280x960
60Hz
4:3
33
1280x960
85Hz
4:3
34
1280x960
120Hz
4:3
降低清屏时间
35
1280x1024
60Hz
5:4
36
1280x1024
75Hz
5:4
37
1280x1024
85Hz
5:4
38
1280x1024
120Hz
5:4
降低清屏时间
39
1360x768
60Hz
16:9
40
1360x768
120Hz
16:9
降低清屏时间
41
1400x1050
60Hz
4:3
降低清屏时间
42
1400x1050
60Hz
4:3
43
1400x1050
75Hz
4:3
44
1400x1050
85Hz
4:3
45
1400x1050
120Hz
4:3
降低清屏时间
46
1440x900
60Hz
16:10
降低清屏时间
47
1440x900
60Hz
16:10
48
1440x900
75Hz
16:10
49
1440x900
85Hz
16:10
50
1440x900
120Hz
16:10
降低清屏时间
51
1600x1200
60Hz
4:3
52
1600x1200
65Hz
4:3
53
1600x1200
70Hz
4:3
54
1600x1200
75Hz
4:3
55
1600x1200
85Hz
4:3
56
1600x1200
120Hz
4:3
降低清屏时间
57
1680x1050
60Hz
16:10
降低清屏时间
58
1680x1050
60Hz
16:10
59
1680x1050
75Hz
16:10
60
1680x1050
85Hz
16:10
61
1680x1050
120Hz
16:10
降低清屏时间
62
1792x1344
60Hz
4:3
63
1792x1344
75Hz
4:3
64
1792x1344
120Hz
4:3
降低清屏时间
65
1856x1392
60Hz
4:3
66
1856x1392
75Hz
4:3
67
1856x1392
120Hz
4:3
降低清屏时间
68
1920x1200
60Hz
16:10
降低清屏时间
69
1920x1200
60Hz
16:10
70
1920x1200
75Hz
16:10
71
1920x1200
85Hz
16:10
72
1920x1200
120Hz
16:10
降低清屏时间
73
1920x1440
60Hz
4:3
74
1920x1440
75Hz
4:3
75
1920x1440
120Hz
4:3
降低清屏时间
76
2560x1600
60Hz
16:10
降低清屏时间
77
2560x1600
60Hz
16:10
78
2560x1600
75Hz
16:10
79
2560x1600
85Hz
16:10
80
2560x1600
120Hz
16:10
降低清屏时间
81
1366x768
60Hz
16:9
82
1920x1080
60Hz
16:9
1080p
83
1600x900
60Hz
16:9
降低清屏时间
84
2048x1152
60Hz
16:9
降低清屏时间
85
1280x720
60Hz
16:9
720p
86
1366x768
60Hz
16:9
降低清屏时间
注意
像素时钟有限制。树莓派 4 之前的型号支持的最高信号格式为 1920×1200 60Hz,带降低清屏(reduced blanking)时间,而树莓派 4 可以支持高达 4096×2160(俗称 4k)60Hz。还请注意,如果你正在使用树莓派 4 的两个 HDMI 端口进行 4k 输出,则两者都将被限制至 30Hz。
hdmi_timings
可自定义原始 HDMI 时序值:用 hdmi_group=2
和 hdmi_mode=87
可自定义信号格式。
hdmi_timings=<水平有效像素> <水平同步极性> <水平前沿填充> <水平同步脉冲> <水平后沿填充> <垂直有效行数> <垂直同步极性> <垂直前沿填充> <垂直同步脉冲> <垂直后沿填充> <垂直同步偏移量A> <垂直同步偏移量B> <像素复制> <帧率> <隔行> <像素频率> <宽高比>
<水平有效像素> = 水平像素(宽度)
<水平同步极性> = 反转水平同步信号极性
<水平上沿填充> = 从数据使能(DE)信号激活后的水平上沿填充
<水平同步脉冲> = 水平同步信号脉冲宽度(以像素时钟为单位)
<水平下沿填充> = 从数据使能(DE)信号激活后的水平下沿填充
<垂直有效行数> = 垂直像素高度(行数)
<垂直同步极性> = 反转垂直同步信号极性
<垂直上沿填充> = 从数据使能(DE)信号激活后的垂直上沿填充
<垂直同步脉冲> = 垂直同步信号脉冲宽度(以像素时钟为单位)
<垂直下沿填充> = 从数据使能(DE)信号激活后的垂直下沿填充
<垂直同步偏移量 A> = 保持为零
<垂直同步偏移量 B> = 保持为零
<像素复制> = 保持为零
<帧率> = 屏幕刷新率(以赫兹为单位)
<隔行> = 保持为零
<像素频率> = 时钟频率(水平有效像素 + 水平前沿填充 + 水平同步脉冲 + 水平后沿填充)
*(垂直有效行数 + 垂直前沿填充 + 垂直同步脉冲 + 垂直后沿填充)
* 刷新率
<宽高比> = [参见脚注]
可将宽高比设置为以下八个值之一。请从以下选项中,选择一个与你屏幕的宽高比最相近的值:
4:3
HDMI_ASPECT_4_3
1
14:9
HDMI_ASPECT_14_9
2
16:9
HDMI_ASPECT_16_9
3
5:4
HDMI_ASPECT_5_4
4
16:10
HDMI_ASPECT_16_10
5
15:9
HDMI_ASPECT_15_9
6
21:9
HDMI_ASPECT_21_9
7
64:27
HDMI_ASPECT_64_27
8
hdmi_force_mode
若置为 1
,将从内部列表中删除所有除 hdmi_mode
和 hdmi_group
指定外的其他信号格式,这意味着它们不会出现在一切信号格式的枚举列表中。如果显示器似乎无视 hdmi_mode
和 hdmi_group
配置,此参数可能有用。
edid_content_type
强制将 EDID 的内容类型设置为特定值。
参数如下:
0 = EDID_ContentType_NODATA
,内容类型为无
1 = EDID_ContentType_Graphics
,内容类型为图形,必须把 ITC 置为 1
2 = EDID_ContentType_Photo
,内容类型为照片
3 = EDID_ContentType_Cinema
,内容类型为电影
4 = EDID_ContentType_Game
,内容类型游戏
你的 HDMI 显示器可能仅支持有限的信号格式。要找出受支持的格式,请使用以下方法:
将输出格式设置为 VGA 60Hz ( hdmi_group=1
和 hdmi_mode=1
) ,然后启动你的树莓派
输入以下参数可列出受支持的 CEA 信号格式: /opt/vc/bin/tvservice -m CEA
输入以下参数可列出受支持的 DMT 信号格式: /opt/vc/bin/tvservice -m DMT
输入以下参数可显示当前状态: /opt/vc/bin/tvservice -s
输入以下参数可从你的显示器中获取更详细的信息: /opt/vc/bin/tvservice -d edid.dat; /opt/vc/bin/edidparser edid.dat
在排除默认 HDMI 信号格式的故障时,也应附带 edid.dat
。
如果你的显示器所需的信号格式未列在上述表格中,那么可以为其自定义一种 CVT 信号格式:
hdmi_cvt=<宽> <高> <帧率> <宽高比> <边距> <交错> <降低清屏时间>
宽
(必填)
像素宽度
高
(必填)
像素高度
帧率
(必填)
每秒帧数
宽高比
3
宽高比 1=4:3、2=14:9、3=16:9、4=5:4、5=16:10、6=15:9
边距
0
0=禁用边距、1=启用边距
交错
0
0=逐行扫描、1=隔行扫描
降低清屏时间
0
0=正常、1=降低清屏时间
可省略末尾的字段,使用默认值。
请注意,这仅 创建了 信号格式(group 2 mode 87)。要使树莓派默认应用该信号格式,你需要进行一些额外设置。例如,要选择分辨率 800×480 并启用音频驱动:
hdmi_cvt=800 480 60 6
hdmi_group=2
hdmi_mode=87
hdmi_drive=2
如果你的显示器不支持标准 CVT 时序,则可能无法正常工作。
sdtv_mode
参数 sdtv_mode
定义了用于复合视频输出的电视标准。
sdtv_mode
意义
0
(默认)
普通 NTSC
1
日式 NTSC ——无黑电平(pedestal)
2
普通 PAL
3
巴西式 PAL:使用 525/60 而非 625/50,副载波不同
16
逐行扫描的 NTSC
18
逐行扫描的 PAL
sdtv_aspect
sdtv_aspect
参数定义了复合视频输出的纵横比。默认值为 1
。
sdtv_aspect
意义
1
4:3
2
14:9
3
16:9
sdtv_disable_colourburst
若将 sdtv_disable_colourburst
置为 1
,会禁用复合视频输出上的彩色突发信号。图片将以单色显示,但可能会更清晰。
display_default_lcd
如果检测到了树莓派触摸显示屏,它将被用作默认显示器,并显示帧缓冲区。设置 display_default_lcd=0
可确保液晶显示屏并非是默认显示器,这通常意味着使用 HDMI 的默认输出。仍可通过在受支持的应用程序(如 omxplayer)中选择显示器编号来使用液晶显示屏。
lcd_framerate
可指定树莓派触摸显示屏的帧率(Hz/fps)。默认为 60Hz。
lcd_rotate
将使用 LCD 内置的旋转功能调整显示方向,这比使用基于 GPU 的旋转操作更节省计算资源。
如,lcd_rotate=2
可回正倒立的显示界面。
enable_dpi_lcd
启用连接到 DPI GPIO 的 LCD 显示器。将允许使用并行显示接口的第三方 LCD 显示器。
dpi_group
, dpi_mode
, dpi_output_format
参数 dpi_group
和 dpi_mode config.txt
用于设置预定信号格式(在 HDMI 中使用的 DMT、CEA 信号格式,如上所述)。用户可以以与 HDMI 相同的方式生成自定义信号格式(请参阅 dpi_timings
部分)。
dpi_output_format
是个位掩码,可指定用于设置显示格式的各种参数。
dpi_timings
可设置原始 DPI 时序值,用于自定义信号格式,通过 dpi_group=2
和 dpi_mode=87
选定。
dpi_timings=<水平有效像素> <水平同步极性> <水平前沿填充> <水平同步脉冲> <水平后沿填充> <垂直有效行数> <垂直同步极性> <垂直前沿填充> <垂直同步脉冲> <垂直后沿填充> <垂直同步偏移量 A> <垂直同步偏移量 B> <像素复制> <帧率> <隔行> <像素频率> <宽高比>
<水平有效像素> = 水平像素(宽度)
<水平同步极性> = 反转水平同步信号极性
<水平上沿填充> = 从数据使能(DE)信号激活后的水平上沿填充
<水平同步脉冲> = 水平同步信号脉冲宽度(以像素时钟为单位)
<水平下沿填充> = 从数据使能(DE)信号激活后的水平下沿填充
<垂直有效行数> = 垂直像素高度(行数)
<垂直同步极性> = 反转垂直同步信号极性
<垂直上沿填充> = 从数据使能(DE)信号激活后的垂直上沿填充
<垂直同步脉冲> = 垂直同步信号脉冲宽度(以像素时钟为单位)
<垂直下沿填充> = 从数据使能(DE)信号激活后的垂直下沿填充
<垂直同步偏移量 A> = 保持为零
<垂直同步偏移量 B> = 保持为零
<像素复制> = 保持为零
<帧率> = 屏幕刷新率(Hz)
<隔行> = 保持为零
<像素频率> = 时钟频率(水平有效像素 + 水平前沿填充 + 水平同步脉冲 + 水平后沿填充)
*(垂直有效行数 + 垂直前沿填充 + 垂直同步脉冲 + 垂直后沿填充)
* 刷新率
<宽高比> = [参见脚注]
可将宽高比设置为以下八个值之一。请从以下选项中,选择一个与你屏幕的宽高比最相近的值:
4:3
HDMI_ASPECT_4_3
1
14:9
HDMI_ASPECT_14_9
2
16:9
HDMI_ASPECT_16_9
3
5:4
HDMI_ASPECT_5_4
4
16:10
HDMI_ASPECT_16_10
5
15:9
HDMI_ASPECT_15_9
6
21:9
HDMI_ASPECT_21_9
7
64:27
HDMI_ASPECT_64_27
8
hdmi_force_hotplug
若将 hdmi_force_hotplug
置为 1
,会把 HDMI 热插拔信号伪装已触发,使系统认为已接入了 HDMI 显示器。换句话说,即使未检测到 HDMI 显示器,也会使用 HDMI 信号输出。
hdmi_ignore_hotplug
若将 hdmi_ignore_hotplug
置为 1
,会把 HDMI 热插拔信号伪装成未被触发,因此看起来好似没有连接 HDMI 显示器一样。因此,即使连接了显示器,HDMI 输出也将被禁用。
disable_overscan
disable_overscan
的默认值为 0
,将为左右上下四周边缘设置默认的过扫描值:CEA 高清信号为 48
、对于 CEA 标清信号格式为 32
、DMT 信号格式为 0
。
若将 disable_overscan
置为 1
,将禁用固件设置的默认的过扫描值。
overscan_left
参数 overscan_left
可指定将添加到屏幕左边缘的固件默认过扫描值的像素数。默认值为 0
。
若文本溢出屏幕左边缘,请增加此值;若屏幕左边缘和文本之间有黑色边框,请调低此值。
overscan_right
参数 overscan_right
可指定将添加到屏幕右边缘过扫描的固件默认值的像素数。默认值为 0
。
若文本溢出屏幕右边缘,请增加此值;若屏幕右边缘和文本之间有黑色边框,请减少此值。
overscan_top
overscan_top
参数可指定将添加到屏幕顶部过扫描的固件默认值的像素数。默认值为 0
。
若文本溢出屏幕顶部边缘,请增加此值;若屏幕顶部边缘和文本之间有黑色边框,请减少此值。
overscan_bottom
overscan_bottom
参数可指定将添加到屏幕底部边缘过扫描的像素数。默认值为 0
。
若文本溢出屏幕底部边缘,请增加此值;若屏幕底部边缘和文本之间有黑色边框,请减少此值。
overscan_scale
若将 overscan_scale
置为 1
,可强制所有非帧缓冲层遵守过扫描设置。默认值为 0
。
注意
通常不建议使用此功能:若这样做,显示器上的所有图层都将由 GPU 缩放,可能会降低图像质量。建议针对显示器自身禁用过扫描,以避免图像被 GPU 和显示器缩放两回。
framebuffer_width
参数 framebuffer_width
可指定像素中的控制台帧缓冲区宽度。默认值为显示宽度减去总水平过扫描量。
framebuffer_height
参数 framebuffer_height
可指定控制台帧缓冲区的像素高度。默认值为显示高度减去总垂直过扫描量。
max_framebuffer_height
、max_framebuffer_width
可指定内部帧缓冲区的最大尺寸。
framebuffer_depth
使用 framebuffer_depth
来指定每像素位的控制台帧缓冲区深度。默认值为 16
。
framebuffer_depth
结果
注解
8
8 位帧缓冲区
默认的 RGB 调色板使屏幕难以看清
16
16 位帧缓冲区
24
24 位帧缓冲区
可能导致显示器损坏
32
32 位帧缓冲区
可能需要与 framebuffer_ignore_alpha=1
联合使用
framebuffer_ignore_alpha
若将 framebuffer_ignore_alpha
置为 1
,会禁用 alpha 管道。可以改善 32 位 framebuffer_depth
显示。
framebuffer_priority
如设备接入了多个显示器,若此时使用旧款(KMS 之前)图形驱动程序,回强制特定的内部显示设备成为首个 Linux 帧缓冲区(即 /dev/fb0
)。
可设置的参数有:
主 LCD
0
次 LCD
1
HDMI 0
2
复合视频输出
3
HDMI 1
7
max_framebuffers
此配置条目将设置可创建的固件帧缓冲区的最大数量。有效值为 0
、1
和 2
。在旧设备上,默认设置为 1
,因此当使用多个显示器时(如 HDMI、DSI、DPI 显示器)时,需要将其增加到 2
。树莓派 4 的默认配置即是 2
,因为它有两个 HDMI 端口。
在大多数情况下,将其设置为 2
是安全的,因为只有在实际检测到已连接的设备后才会创建帧缓冲区。
若将此值置为 0
,可在无头模式下减少内存需求,因为这将阻止分配帧缓冲区。
test_mode
参数 test_mode
可在启动过程中,以持续给定的时间(秒),显示测试图像和声音(仅输出至复合视频输出和模拟音频),然后继续正常启动操作系统。用作工厂测试。默认值为 0
。
display_hdmi_rotate
使用 display_hdmi_rotate
旋转、镜像 HDMI 显示方向。默认值为 0
。
display_hdmi_rotate
意义
0
不改变屏幕方向
1
顺时针旋转 90 度
2
顺时针旋转 180 度
3
顺时针旋转 270 度
65536
水平镜像
131072
垂直镜像
请注意,旋转 90 度、270 度需要更多的 GPU 内存,因此这些参数在 16MB GPU 分配下不可用。
你可以组合旋转、镜像将其叠加。你也可以用相同的方式同时进行水平镜像和垂直镜像。例如,旋转 180 度,再加上垂直镜像、水平镜像为 0x20000 + 0x10000 + 2 = 0x30002
。
display_lcd_rotate
对于旧款图形驱动程序(适用于树莓派 4 先前的型号),请使用 display_lcd_rotate
来旋转和镜像 LCD 方向。参数与 display_hdmi_rotate
相同。另请参阅 lcd_rotate
。
display_rotate
在最新款固件中,display_rotate
已弃用。仅保留用于向下兼容。请改用 display_lcd_rotate
、display_hdmi_rotate
。
使用 display_rotate
可旋转和镜像屏幕方向。参数与 display_hdmi_rotate
相同。
dispmanx_offline
可强制在两个离屏帧缓冲区中离线完成 dispmanx
合成。这样可以合成更多的 dispmanx
元素,但速度较慢,可能会将屏幕帧率限制在约 30fps 左右。
重要
当使用图形驱动程序 VC4 KMS 时,完整的显示管道由 Linux 管理——包括 HDMI 输出。这些设置仅兼容于旧的 FKMS 和基于固件的图形驱动程序。
树莓派 4 无法在 HDMI 输出 1366×768 @ 60Hz
。对于这些显示器,可配置其使用 1360×768 @ 60Hz
。它们通常未通过 EDID 广播此信号格式,因此无法自动选定,但可以手动添加来选定:
hdmi_group=2
hdmi_mode=87
hdmi_cvt=1360 768 60
……到 config.txt。
在 hdmi_timings=
这一行,手动指定的时间也需要遵守限制:所有水平时序参数必须为 2 的倍数。
dpi_timings=
不受相同限制,因为该管道在每个时钟周期仍然仅运行一个像素。
avoid_warnings
avoid_warnings=2
:允许在低电压下进入超频模式。
logging_level
设置 VideoCore 的日志级别。该值是 VideoCore 的一个特定的位掩码。
本文档说明了如何使用树莓派的软件工具和受支持的摄像头模块。所有的树莓派摄像头都可以使用我们的软件工具,来拍摄高分辨率照片,录制全高清 1080p(及更高)视频。
树莓派官方生产了多款摄像头模块,包括:
摄像头模块 1。搭载 500 万像素(最早,已停产)
摄像头模块 2。搭载 800 万像素,红外滤镜可选
摄像头模块 3。搭载 1200 万像素,标准镜头、广角镜头可选,红外滤镜可选
高质量(High Quality)相机,配有 CS 和 M12 卡口,搭载 1200 万像素,可同外部镜头搭配使用
全局快门(Global Shutter)相机,搭载 160 万像素,用于高速运动摄影
有关摄像头硬件的更多信息,请参阅摄像头硬件文档。
首先安装你的摄像头模块。然后,依此部分的指南,使用摄像头模块。
rpicam-apps
注意
树莓派系统 Bookworm 把相机捕获应用程序从
libcamera-*
重命名为rpicam-*
。用户可暂时以符号链接使用旧名称。请尽快采用新的软件名。之前的旧版树莓派系统仍使用libcamera-*
这个名称。
树莓派提供了一小组示例 rpicam-apps
。这些命令行应用程序基于 libcamera
,从相机捕获图像和视频。这些应用程序包括:
rpicam-hello
:相机版“hello world”,将启动相机预览流并在屏幕上显示它。
rpicam-jpeg
:打开预览窗口,随后捕获高分辨率的静止图像。
rpicam-still
:模拟了旧软件 raspistill
的许多功能。
rpicam-vid
:捕获视频。
rpicam-raw
:直接从传感器捕获原始(未经处理的 Bayer)帧。
rpicam-detect
:在默认情况下未构建,但如果用户在其树莓派上安装了 TensorFlow Lite,则可构建。当检测到特定对象后,可捕获 JPEG 图像。
最新版的树莓派系统内置了五款基本的 rpicam-apps
,因此即使在全新安装的树莓派系统上,你也可以使用摄像头记录图像和视频。
用户可创建基于 rpicam
的应用程序,定制其功能,足以满足用户需求。rpicam-apps
的源代码在 BSD-2-Clause 许可下自由提供。
libcamera
libcamera
是一款开源软件库,旨在直接在基于 Arm 处理器上运行的 Linux 操作系统来使用相机设备。在博通 GPU 上运行的私有代码已被最小化。有关 libcamera
的更多信息,请参阅 libcamera
网站。
libcamera
提供了 C++ API,用于配置相机,能让应用程序请求图像帧。这些图像缓冲区驻留在系统内存中,并可以直接传参给静态图像编码器(如 JPEG)/视频编码器(如 H.264)。libcamera
不会对图像进行编码和显示:要使用该功能,请使用 rpicam-apps
。
你可以在 libcamera
官方存储库中找到源代码。树莓派系统发行版使用分支控制更新。
在 libcamera
核心下,我们提供了自定义的管道流来处理程序。libcamera
使用这层来驱动树莓派上的传感器和图像信号处理器(ISP)。libcamera
包含了一系列图像处理算法(IPA),包括自动曝光/增益控制(AEC/AGC)、自动白平衡(AWB)和自动镜头阴影校正(ALSC)。
树莓派的 libcamera
实现可支持以下摄像头:
官方摄像头:
OV5647 (V1)
IMX219 (V2)
IMX477(HQ)
IMX296(GS)
IMX708(V3)
第三方传感器:
IMX290
IMX327
IMX378
IMX519
OV9281
要增加对新传感器的支持,请贡献至 libcamera
。
rpicam-hello
rpicam-hello
能在简单的预览窗口中,显示来自接入摄像头的视频源。要让 rpicam-hello
在终端里显示 5 秒钟的预览窗口,请运行以下命令:
$ rpicam-hello
你可以使用参数 timeout
指定可选的持续时间(毫秒)。值为 0
会无限期运行预览:
$ rpicam-hello --timeout 0
要结束 rpicam-hello
,可在终端中按 Ctrl + C,或在预览窗口上点击关闭按钮。
大多数 rpicam-apps
都在窗口中显示预览图像。如果没有正在运行的桌面环境,则将直接使用 Linux Direct Rendering Manager(DRM,直接渲染管理器)把预览绘制到显示器。如果都没有,rpicam-apps
会尝试使用桌面环境。这两种路径都使用零拷贝 GPU 缓冲区共享:即导致不支持 X 转发。
如果你运行着 X 窗口服务器,想要使用 X 转发,请使用参数 qt-preview
,可在 Qt 窗口中渲染预览窗口。与其他方案相比,用 Qt 预览窗口将消耗更多资源。
注意
使用 Gtk2 的旧版系统在与 OpenCV 链接时,可能会产生
Glib-GObject
报错,且无法显示 Qt 预览窗口。在这种情况下,请以 root 身份,编辑文件/etc/xdg/qt5ct/qt5ct.conf
,把style=gtk2
这行改成style=gtk3
。
要彻底禁止预览窗口,请使用参数 nopreview
:
$ rpicam-hello -n
参数 info-text
使用可指令 %
在窗口标题栏上显示图像信息。例如,以下命令会显示当前的红色和蓝色增益值:
$ rpicam-hello --info-text "red gain %rg, blue gain %bg"
要查看指令的完整列表,请参阅 info-text
参考。
rpicam-jpeg
rpicam-jpeg
可帮助你在树莓派设备上捕获图像。
要捕获全分辨率 JPEG 图像并将其保存成名为 test.jpg
的文件,请运行以下命令:
$ rpicam-jpeg --output test.jpg
你将在五秒内看到预览窗口。然后,rpicam-jpeg
会捕获保存全分辨率的 JPEG 图像。
可使用参数 timeout
来修改预览窗口的显示时间。参数 width
和 height
可更改保存图像的分辨率。例如,以下命令显示预览窗口 2 秒,然后捕获并保存分辨率为 640×480 像素的图像:
$ rpicam-jpeg --output test.jpg --timeout 2000 --width 640 --height 480
rpicam-still
rpicam-still
,同 rpicam-jpeg
一样,帮助你在树莓派设备上捕获图像。与 rpicam-jpeg
不同,rpicam-still
能兼容许多旧版应用程序中提供的参数。
要捕获全分辨率的 JPEG 图像并将其保存成名为 test.jpg
的文件,请运行以下命令:
$ rpicam-still --output test.jpg
rpicam-still
可以多种格式保存图像,包括 png、bmp、RGB 和 YUV 二进制像素转储。要读取这些二进制转储,用于读取文件的应用程序都必须兼容像素排列。
使用参数 encoding
能指定输出格式。传参给 output
的文件名不会影响输出文件类型。
要捕获全分辨率的 PNG 图像并将其保存成名为 test.png
的文件,请运行以下命令:
$ rpicam-still --encoding png --output test.png
要了解有关指定图像格式的更多信息,请参阅 encoding 参数参考。
原始图像是直接由图像传感器生成的图像,未经图像信号处理器(ISP)和 CPU 的处理。彩色图像传感器通常使用 Bayer 格式。使用参数 raw
来捕获原始图像。
要捕获图像,并将其保存成名为 test.jpg
的文件,再把图像的原始版本保存成名为 test.dng
的文件,请运行以下命令:
$ rpicam-still --raw --output test.jpg
rpicam-still
以 DNG(Adobe 数字负片)格式保存原始图像。要确定原始图像的文件名,rpicam-still
使用与输出文件相同的文件名,但将其扩展名更改为 .dng
。要处理 DNG 图像,请使用类似于 Dcraw、RawTherapee 的应用程序。
DNG 文件包含了有关图像捕获的元数据,包括黑电平、白平衡信息以及 ISP 用于生成 JPEG 的色彩矩阵。使用 ExifTool 查看 DNG 元数据。以下输出显示了通过使用 HQ 相机捕获的原始图像中存储的典型元数据:
File Name : test.dng
Directory : .
File Size : 24 MB
File Modification Date/Time : 2021:08:17 16:36:18+01:00
File Access Date/Time : 2021:08:17 16:36:18+01:00
File Inode Change Date/Time : 2021:08:17 16:36:18+01:00
File Permissions : rw-r--r--
File Type : DNG
File Type Extension : dng
MIME Type : image/x-adobe-dng
Exif Byte Order : Little-endian (Intel, II)
Make : Raspberry Pi
Camera Model Name : /base/soc/i2c0mux/i2c@1/imx477@1a
Orientation : Horizontal (normal)
Software : rpicam-still
Subfile Type : Full-resolution Image
Image Width : 4056
Image Height : 3040
Bits Per Sample : 16
Compression : Uncompressed
Photometric Interpretation : Color Filter Array
Samples Per Pixel : 1
Planar Configuration : Chunky
CFA Repeat Pattern Dim : 2 2
CFA Pattern 2 : 2 1 1 0
Black Level Repeat Dim : 2 2
Black Level : 256 256 256 256
White Level : 4095
DNG Version : 1.1.0.0
DNG Backward Version : 1.0.0.0
Unique Camera Model : /base/soc/i2c0mux/i2c@1/imx477@1a
Color Matrix 1 : 0.8545269369 -0.2382823821 -0.09044229197 -0.1890484985 1.063961506 0.1062747385 -0.01334283455 0.1440163847 0.2593136724
As Shot Neutral : 0.4754476844 1 0.413686484
Calibration Illuminant 1 : D65
Strip Offsets : 0
Strip Byte Counts : 0
Exposure Time : 1/20
ISO : 400
CFA Pattern : [Blue,Green][Green,Red]
Image Size : 4056x3040
Megapixels : 12.3
Shutter Speed : 1/20
要找到模拟增益,请将 ISO 数除以 100。自动白平衡(AWB)算法确定一个始终标记为 D65 的单个校准光源。
要拍摄非常长时间的曝光照片,请禁用自动曝光/增益控制(AEC/AGC)和自动白平衡(AWB)。否则,这些算法会强制用户等待一定数量的帧数,直到它们收敛。
要禁用这些算法,请为增益和 AWB 提供明确的值。因为长时间曝光本身就需要很多时间,通常最好完全跳过预览阶段,使用参数 immediate
。
运行以下命令执行 100 秒曝光捕捉:
$ rpicam-still -o long_exposure.jpg --shutter 100000000 --gain 1 --awbgains 1,1 --immediate
要查找官方树莓派相机的最大曝光时间,请参阅相机硬件规格。
创建延时摄影视频,定期拍摄静止图像,例如每分钟一次,然后使用应用程序将图片拼接成视频。
通过 rpicam-still
延时模式
要使用 rpicam-still
的内置延时模式,请使用 timelapse 功能。此参数需要一个值,代表你希望树莓派在捕获之间等待的时间间隔,单位为毫秒。
首先,创建一个目录,用于存储你的延时摄影照片:
$ mkdir timelapse
运行以下命令,将创建一项 30 秒的延时摄影,每两秒记录一张照片,将输出保存为 image0000.jpg
至 image0013.jpg
:
$ rpicam-still --timeout 30000 --timelapse 2000 -o timelapse/image%04d.jpg
通过 cron
你还可以使用 cron 自动化延时摄影。首先,创建一个脚本,命名为 timelapse.sh
,包含以下指令。把占位符 <用户名>
改成你树莓派上的用户账户名:
#!/bin/bash
DATE=$(date +"%Y-%m-%d_%H%M")
rpicam-still -o /home/<用户名>/timelapse/$DATE.jpg
然后,使脚本可执行:
$ chmod +x timelapse.sh
创建目录 timelapse
,你将在其中保存延时摄影图片:
$ mkdir timelapse
打开你的 crontab 进行编辑:
$ crontab -e
请你在编辑器中打开文件后,添加以下行以安排每分钟捕获图像,把占位符 <用户名>
换成你主用户账户的用户名:
* * * * * /home/<用户名>/timelapse.sh 2>&1
保存退出,你应看到此信息:
crontab: installing new crontab
技巧
停止录制图像以进行延时摄影,请再次运行
crontab -e
并从你的crontab
中删除上述行。
拼接图像
如果你拥有一系列延时摄影照片,你可能希望将它们合并成视频。在树莓派上使用 ffmpeg
来完成这个操作。
首先,安装 ffmpeg
:
$ sudo apt install ffmpeg
从包含目录 timelapse
的目录中运行以下命令,将你的 JPEG 文件转换为 mp4 视频:
$ ffmpeg -r 10 -f image2 -pattern_type glob -i 'timelapse/*.jpg' -s 1280x720 -vcodec libx264 timelapse.mp4
上述命令使用以下参数:
-r 10
:将帧率(Hz)设置为每秒十帧的输出视频
-f image2
:设置 ffmpeg
以从由模式指定的图像文件列表中读取
-pattern_type glob
:使用正则模式(globbing)来解释带有 -i
的文件名输入
-i 'timelapse/*.jpg'
:指定要匹配 timelapse 目录中的 JPG 文件的输入文件
-s 1280x720
:缩放至 720p
-vcodec libx264
:使用软件 x264 编码器
timelapse.mp4
:输出视频文件的文件名。
要了解有关 ffmpeg 参数的更多信息,请在终端中运行 ffmpeg --help
。
rpicam-vid
rpicam-vid
可帮助你在树莓派设备上捕获视频。rpicam-vid
将显示一个预览窗口并将编码比特流写入指定的输出。这会产生未打包的视频比特流,不含容器(如 mp4 文件)格式。
注意
在可用时,
rpicam-vid
使用硬件 H.264 编码。
例如,以下命令将十秒钟的视频写入名为 test.h264
的文件:
$ rpicam-vid -t 10s -o test.h264
你可以使用 VLC 和其他视频播放器播放生成的文件:
$ vlc test.h264
在树莓派 5 上,你可以通过为输出文件指定 mp4 文件扩展名,直接输出到 MP4 容器格式:
$ rpicam-vid -t 10s -o test.mp4
rpicam-vid
支持运动 JPEG 以及未压缩和未格式化的 YUV420:
$ rpicam-vid -t 10000 --codec mjpeg -o test.mjpeg
$ rpicam-vid -t 10000 --codec yuv420 -o test.data
codec
参数决定输出格式,而不是输出文件的扩展名。
segment
参数将输出文件分成以毫秒为单位的段。这对于通过指定非常短的(1 毫秒)段来将运动 JPEG 流分解为单独的 JPEG 文件非常方便。例如,以下命令将 1 毫秒的段与输出文件名中的计数器结合起来,为每个段生成一个新的文件名:
$ rpicam-vid -t 10000 --codec mjpeg --segment 1 -o test%05d.jpeg
为了减少高帧率(> 60fps)视频的帧丢失,请尝试以下配置调整:
使用 --level 4.2
将 H.264 目标级别设置为 4.2
。
通过将参数 denoise
设置为 cdn_off
来禁用软件颜色去噪处理。
使用 nopreview
禁用显示窗口,以释放一些额外的 CPU 循环。
在 /boot/firmware/config.txt
中设置 force_turbo=1
以确保在视频捕获过程中 CPU 时钟不会降频。有关更多信息,请参阅 force_turbo
文档。
使用 --width 1280 --height 720
或更低的分辨率调整 ISP 输出,以实现你的帧率目标。
在树莓派 4 上,你可以在 /boot/firmware/config.txt
中添加 gpu_freq=550
及更高的值来超频 GPU,提高性能。有关更多详细信息,请参阅超频文档。
以下命令演示了如何实现 1280×720 120fps 视频:
$ rpicam-vid --level 4.2 --framerate 120 --width 1280 --height 720 --save-pts timestamp.pts -o video.264 -t 10000 --denoise cdn_off -n
rpicam-vid
与 libav 的集成rpicam-vid
可以使用 ffmpeg / libav 编解码后端来对音频和视频流进行编码。你可以将这些流保存到文件,也可以通过网络进行流传输。当存在时,libav 使用硬件 H.264 视频编码。
要启用 libav 后端,请将 libav
传参给参数 codec
:
$ rpicam-vid --codec libav --libav-format avi --libav-audio --output example.avi
rpicam-raw
rpicam-raw
直接从传感器以原始 Bayer 帧记录视频。它不显示预览窗口。要将两秒的原始剪辑记录到名为 test.raw
的文件中,请运行以下命令:
$ rpicam-raw -t 2000 -o test.raw
rpicam-raw
以原始帧的形式输出,没有格式信息,直接一个接一个。应用程序会在终端窗口打印像素格式和图像尺寸,以帮助用户解释像素数据。
默认情况下,rpicam-raw
将原始帧输出到单个、可能非常大的文件中。使用参数 segment
将每个原始帧定向到单独的文件,使用 %05d
指令使每个帧文件名唯一:
$ rpicam-raw -t 2000 --segment 1 -o test%05d.raw
使用快速存储设备,rpicam-raw
可以以 10fps 的速度将 18MB 1200 万像素 HQ 相机帧写入磁盘。rpicam-raw
无法将输出帧格式化为 DNG 文件;要使用该功能,请使用 rpicam-still
。使用低于参数 10
的级别 framerate
以避免丢帧:
$ rpicam-raw -t 5000 --width 4056 --height 3040 -o test.raw --framerate 8
有关原始格式的更多信息,请参阅 mode 文档。
rpicam-detect
注意
树莓派系统不包括
rpicam-detect
。但是,如果你已安装了 TensorFlow Lite,可以编译rpicam-detect
。有关更多信息,请参阅 rpicam-apps 编译说明。运行cmake
时,请不要忘记参数-DENABLE_TFLITE=1
。
rpicam-detect
显示一个预览窗口,并使用经过训练的 Google MobileNet v1 SSD(Single Shot Detector)神经网络监视内容,以识别大约 80 种对象类别,使用 Coco 数据集。rpicam-detect
可以识别人、汽车、猫和许多其他对象。
每当 rpicam-detect
检测到目标物体时,它会拍摄全分辨率的 JPEG。然后返回监视预览模式。
查看 TensorFlow Lite 对象检测器部分,了解有关模型使用的一般信息。例如,你可以在离开时秘密监视你的猫。
$ rpicam-detect -t 0 -o cat%04d.jpg --lores-width 400 --lores-height 300 --post-process-file object_detect_tf.json --object cat
大多数用例无需更改摄像头配置即可自动工作。但是,某些常见用例确实需要进行配置调整,包括:
第三方摄像头(制造商的说明应进行的必要配置更改,如果有)
使用官方树莓派摄像头的非标准驱动程序或叠加物
树莓派系统在 /boot/firmware/config.txt
中识别以下叠加层。
摄像头模块
/boot/firmware/config.txt
V1 相机 (OV5647)
dtoverlay=ov5647
V2 相机 (IMX219)
dtoverlay=imx219
HQ 相机 (IMX477)
dtoverlay=imx477
GS 相机(IMX296)
dtoverlay=imx296
摄像头模块 3(IMX708)
dtoverlay=imx708
IMX290、IMX327
dtoverlay=imx290,clock-frequency=74250000
或 dtoverlay=imx290,clock-frequency=37125000
(两个模块共享 imx290 内核驱动程序;请参考模块供应商的说明以获取正确的频率)
IMX378
dtoverlay=imx378
OV9281
dtoverlay=ov9281
要使用这些叠加层,你必须禁用自动摄像头检测。要禁用自动检测,请在 /boot/firmware/config.txt
中设置 camera_auto_detect=0
。如果 config.txt
已包含分配 camera_auto_detect
值的行,请将该值更改为 0
。使用 sudo reboot
重启你的树莓派以加载更改。
树莓派的 libcamera
实现包括每个摄像头的调整文件。该文件控制算法和硬件以产生最佳图像质量。libcamera 只能确定正在使用的传感器,而不能确定模块。因此,一些模块需要调整文件覆盖。使用参数 tuning-file
指定覆盖。你还可以复制和修改现有的调整文件以定制摄像头行为。
例如,传感器的无红外滤光片(NoIR)版本使用与标准版本不同的自动白平衡(AWB)设置。在树莓派 5 及更高版本上,你可以使用以下命令为 IMX219 传感器指定夜视红外调整文件:
$ rpicam-hello --tuning-file /usr/share/libcamera/ipa/rpi/pisp/imx219_noir.json
注意
旧版树莓派型号使用其他的调整文件。在这些设备上,请改用
/usr/share/libcamera/ipa/rpi/vc4/
中存储的文件。
libcamera 维护着多种摄像头的调整文件,包括第三方型号。例如,你可以在 se327m12.json
找到 Soho Enterprises SE327M12 的调整文件。
rpicam-apps
对多个摄像头有基本支持。你可以通过以下方式将多个摄像头连接到树莓派:
对于树莓派计算模块,你可以直接连接两个摄像头到树莓派计算模块 I/O 板。有关详细信息,请参阅摄像头模块文档。使用此方法,你可以同时使用两个摄像头。
对于树莓派 5,你可以使用双 MIPI 连接器直接将两个摄像头连接到主板上。
对于带有摄像头接口的其余树莓派设备,你可以使用 Video Mux 板连接两个或更多摄像头,例如这种第三方产品。由于两个摄像头连接到单个 Unicam 端口,因此一次只能使用一个摄像头。
要列出平台上所有可用的摄像头,请使用参数 list-cameras
。要选择要使用的摄像头,请将摄像头索引传参给参数 camera
。
注意
libcamera 尚不支持立体摄像头。当同时运行两个摄像头时,它们必须在单独的进程中运行。这意味着它们之间没有同步传感器帧及 3A 操作的方法。一种解决方法是,你可以通过外部同步信号同步摄像头,对于 HQ(IMX477)摄像头,如果需要,就将 3A 切换到手动模式。
树莓派提供了两种 rpicam-apps
包:
rpicam-apps
包含完整的应用程序,支持使用桌面环境进行预览。此软件包已预装在树莓派系统中。
rpicam-apps-lite
不支持桌面环境,仅提供 DRM 预览。此软件包已预装在精简版树莓派系统中。
rpicam-apps
依赖于名为 library-名称<版本>
的库,其中 <版本>
是 ABI 版本。这些你的软件包管理器应能自动安装。
你可以重新构建 rpicam-apps
而无需从头开始构建 libcamera
和 libepoxy
。有关更多信息,请参阅在不重新构建 libcamera
的情况下构建 rpicam-apps
。
rpicam-apps
在网络上进行视频流传输本节说明了使用 rpicam-vid
进行本地流传输。你还可以使用 libav 后端进行网络流传输。
使用以下命令在树莓派作为服务器上通过 UDP 流式传输视频,把占位符 <IP地址>
换成客户端的 IP 地址(或组播地址),并把占位符 <端口>
换成你想要用于流式传输的端口:
$ rpicam-vid -t 0 --inline -o udp://<IP地址>:<端口>
使用以下命令在树莓派作为客户端上查看通过 UDP 流式传输的视频,替换 <端口>
占位符为你想要从中流式传输的端口:
$ vlc udp://@:<端口> :demux=h264
或者,在客户端上使用以下命令来使用 ffplay 进行流媒体传输:
$ ffplay udp://<服务器IP>:<端口> -fflags nobuffer -flags low_delay -framedrop
你还可以通过 TCP 进行视频流传输。要将树莓派用作服务器:
$ rpicam-vid -t 0 --inline --listen -o tcp://0.0.0.0:<端口>
使用以下命令在树莓派作为客户端查看通过 TCP 流式传输的视频:
$ vlc tcp/h264://<服务器IP>:<端口>
或者,在客户端使用以下命令以 30 帧每秒使用 ffplay 进行流式传输:
$ ffplay tcp://<服务器IP>:<端口> -vf "setpts=N/30" -fflags nobuffer -flags low_delay -framedrop
使用以下命令将 VLC 用作服务器通过 RTSP 流式传输视频时,请使用树莓派:
$ rpicam-vid -t 0 --inline -o - | cvlc stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/stream1}' :demux=h264
使用以下命令将 VLC 用作客户端查看通过 RTSP 流式传输的视频时,请使用树莓派:
$ ffplay rtsp://<服务器IP>:8554/stream1 -vf "setpts=N/30" -fflags nobuffer -flags low_delay -framedrop
或者,使用以下命令在客户端上使用 VLC 进行流式传输:
$ vlc rtsp://<服务器IP>:8554/stream1
在服务器上禁止预览窗口,请使用 nopreview
。
使用参数 inline
强制将流头信息注入每个帧内,这有助于客户端了解流,即使它们错过了开头。
libav
你可以将 libav
后端用作音视频的网络流源。要使用树莓派作为服务器通过 TCP 流式传输视频,请使用以下命令,把占位符 <IP地址>
改成客户端的 IP 地址/组播地址,并把占位符 <端口>
改成要用于流式传输的端口:
$ rpicam-vid -t 0 --codec libav --libav-format mpegts --libav-audio -o "tcp://<IP地址>:<端口>?listen=1"
你可以使用类似的命令通过 UDP 进行流式传输:
$ rpicam-vid -t 0 --codec libav --libav-format mpegts --libav-audio -o "udp://<IP地址>:<端口>"
GStreamer 是用于读取、处理和播放多媒体文件的 Linux 框架。本节展示了如何使用 rpicam-vid
来通过网络进行视频流传输。
此设置使用 rpicam-vid
将编码的 h.264 比特流输出到标准输出。然后,我们使用 GStreamer fdsrc 元素接收比特流,并使用额外的 GStreamer 元素将其发送到网络上。在服务器上,运行以下命令以启动流,把占位符 <IP地址>
改为客户端的 IP 地址(或组播地址),并把占位符 <端口>
改为用于流式传输的端口:
$ rpicam-vid -t 0 -n --inline -o - | gst-launch-1.0 fdsrc fd=0 ! udpsink host=<IP地址> port=<端口>
在客户端上,运行以下命令以接收流,把占位符 <IP地址>
改成客户端的 IP 地址/组播地址,并将占位符 <端口>
改成用于流式传输的端口:
$ gst-launch-1.0 udpsrc address=<IP地址> port=<端口> ! h264parse ! v4l2h264dec ! autovideosink
技巧
要测试此配置,请在同一设备的不同终端上运行服务器和客户端命令,使用
localhost
作为地址。
要使用 RTP 进行流媒体传输,请在服务器上运行以下命令,把占位符 <IP地址>
换成客户端的 IP 地址/组播地址,并把占位符 <端口>
换成要用于流媒体传输的端口:
$ rpicam-vid -t 0 -n --inline -o - | gst-launch-1.0 fdsrc fd=0 ! h264parse ! rtph264pay ! udpsink host=<IP地址> port=<端口>
要接收 RTP,请在客户端上运行以下命令,把占位符 <IP地址>
换为客户端的 IP 地址/组播地址,并把占位符 <端口>
换为要用于流媒体传输的端口:
$ gst-launch-1.0 udpsrc address=<IP地址> port=<端口> caps=application/x-rtp ! rtph264depay ! h264parse ! v4l2h264dec ! autovideosink
如果客户端不是树莓派,则可能有不同的 GStreamer 元素可用。在运行 Linux 的 x86 设备上,你可能会运行以下命令:
$ gst-launch-1.0 udpsrc address=<IP地址> port=<端口> caps=application/x-rtp ! rtph264depay ! h264parse ! avdec_h264 ! autovideosink
libcamera 提供了一个 libcamerasrc GStreamer 元素,可以直接替代 rpicam-vid。要使用此元素,请在服务器上运行以下命令,把占位符 <IP地址>
换为客户端的 IP 地址/多播地址,并把占位符 <端口>
换为你希望用于流式传输的端口:
$ gst-launch-1.0 libcamerasrc ! capsfilter caps=video/x-raw,width=1280,height=720,format=NV12 ! v4l2convert ! v4l2h264enc extra-controls="controls,repeat_sequence_header=1" ! 'video/x-h264,level=(string)4.1' ! h264parse ! rtph264pay ! udpsink host=<IP地址> port=<端口>
在客户端上,我们使用与以前相同的播放管道。
适用于所有具有相似/相同语义的 rpicam-apps
的以下参数,除非另有说明。
要将以下参数之一传参给应用程序,请在参数名称前加上 --
。如果参数需要一个值,请在参数名称后立即传参该值,用单个空格分隔。如果值包含空格,请用引号括起来。
一些参数具有速记别名,例如 -h
可代替 --help
。使用这些速记别名代替完整的参数名称,以节省空间和时间,但牺牲可读性。
help
别名: -h
打印完整的参数集,以及每个参数的简要概述。不接受值。
version
以字符串打印出 libcamera
和 rpicam-apps
的版本。不接受值。
示例输出:
rpicam-apps build: ca559f46a97a 27-09-2021 (14:10:24)
libcamera build: v0.0.0+3058-c29143f7
list-cameras
列出连接到你的树莓派的检测到的摄像头及其可用的传感器模式。不接受值。
传感器模式标识符具有以下形式: S<Bayer order><Bit-depth>_<Optional packing> : <Resolution list>
在传感器阵列中,即使在像素合并模式下,裁剪也以本机传感器像素指定为(<x>, <y>)/<宽>×<高>
。(x, y)
指定了传感器阵列中尺寸为宽 × 高的裁剪窗口的位置。
例如,以下输出显示有关索引为 0 处的 IMX219 传感器和索引为 1 处的 IMX477 传感器的信息:
Available cameras
-----------------
0 : imx219 [3280x2464] (/base/soc/i2c0mux/i2c@1/imx219@10)
Modes: 'SRGGB10_CSI2P' : 640x480 [206.65 fps - (1000, 752)/1280x960 crop]
1640x1232 [41.85 fps - (0, 0)/3280x2464 crop]
1920x1080 [47.57 fps - (680, 692)/1920x1080 crop]
3280x2464 [21.19 fps - (0, 0)/3280x2464 crop]
'SRGGB8' : 640x480 [206.65 fps - (1000, 752)/1280x960 crop]
1640x1232 [41.85 fps - (0, 0)/3280x2464 crop]
1920x1080 [47.57 fps - (680, 692)/1920x1080 crop]
3280x2464 [21.19 fps - (0, 0)/3280x2464 crop]
1 : imx477 [4056x3040] (/base/soc/i2c0mux/i2c@1/imx477@1a)
Modes: 'SRGGB10_CSI2P' : 1332x990 [120.05 fps - (696, 528)/2664x1980 crop]
'SRGGB12_CSI2P' : 2028x1080 [50.03 fps - (0, 440)/4056x2160 crop]
2028x1520 [40.01 fps - (0, 0)/4056x3040 crop]
4056x3040 [10.00 fps - (0, 0)/4056x3040 crop]
对于上述示例中的 IMX219 传感器:
所有模式都具有 RGGB Bayer 排序
所有模式在所列分辨率上提供 8 位或 10 位 CSI2 打包读出
camera
选择要使用的摄像头。指定从可用摄像头列表中的索引。
config
别名: -c
指定包含命令行参数和值的文件。设想一个名为 example_configuration.txt
的文件,其中包含以下文本,将参数和值指定为键值对,每行一个参数,只使用长(非别名)参数名称:
timeout=99000
verbose=
技巧
省略通常在命令行上传参的
--
开头。对于缺少值的标志,例如上面示例中的verbose
,必须包含尾随=
。
然后,你可以运行以下命令来指定超时时间为 99000 毫秒并输出详细信息:
$ rpicam-hello --config example_configuration.txt
timeout
别名: -t
默认值:5000 毫秒(5 秒)
指定应用程序在关闭之前运行的时间长度。这适用于视频录制和预览窗口。在捕获静态图像时,应用程序在捕获输出图像之前显示预览窗口 timeout
(毫秒)。
要无限期运行应用程序,请指定值 0
。
preview
别名: -p
设置桌面或 DRM 预览窗口的位置(x,y 坐标)和大小(w,h 尺寸)。不影响从摄像头请求的图像的分辨率或宽高比。将图像大小缩放并将图像宽高比裁剪或填充以适应预览窗口。
以以下逗号分隔的形式传参预览窗口尺寸: x,y,w,h
示例: rpicam-hello --preview 100,100,500,500
fullscreen
别名: -f
强制预览窗口使用整个屏幕,无边框或标题栏。调整图像大小并在整个屏幕内按比例缩放图像纵横比以适应。不接受值。
qt-preview
使用 Qt 预览窗口,消耗的资源比其他参数多,但支持 X 窗口转发。同参数 fullscreen 不兼容。不接受值。
nopreview
别名: -n
使应用程序不显示预览窗口。不接受值。
info-text
默认值:"#%frame (%fps fps) exp %exp ag %ag dg %dg"
将提供的字符串设置为在桌面环境中运行时预览窗口的标题。支持以下图像元数据替换:
%frame
帧的序列号。
%fps
瞬时帧速率。
%exp
用于捕捉图像的快门速度,单位为微秒。
%ag
在传感器中应用的模拟增益。
%dg
由 ISP 应用于图像的数字增益。
%rg
应用于每个像素的红色分量的增益。
%bg
每个像素的蓝色分量增益。
%focus
图像的焦点度量,较大的值表示图像更清晰。
%lp
以屈光度表示的当前镜头位置(1 / 米数)。
%afstate
自动对焦算法状态( idle
、scanning
、focused
或 failed
)。
width
和 height
每个都接受一个定义为像素的捕获图像尺寸的单个数字。
对于 rpicam-still
,rpicam-jpeg
和 rpicam-vid
,指定输出分辨率。
对于 rpicam-raw
,指定原始帧分辨率。对于具有 2×2 倍频读出模式的相机,指定分辨率等于或小于倍频模式的捕获 2×2 倍频原始帧。
对 rpicam-hello
无效。
示例:
rpicam-vid -o test.h264 --width 1920 --height 1080
拍摄 1080p 视频。
rpicam-still -r -o test.jpg --width 2028 --height 1520
拍摄 2028×1520 分辨率的 JPEG。如果与 HQ 相机一起使用,则使用 2×2 二次取样模式,因此原始文件( test.dng )包含 2028×1520 的原始 Bayer 图像。
viewfinder-width
和 viewfinder-height
每个都接受一个定义图像在预览窗口中显示的尺寸(以像素为单位)的单个数字。不影响预览窗口尺寸,因为图像会被调整大小以适应。不影响捕获的静止图像或视频。
mode
能让你用以下以冒号分隔的格式指定相机模式: <宽>:<高>:<位深度>:<打包参数>
。如果提供的值没有完全匹配项,系统将选择最接近的可用参数以用于传感器。你可以使用打包( P
)或未打包( U
)的打包格式。影响存储的视频和静止图像的格式,但不影响传参到预览窗口的帧的格式。
位深度和打包是可选的。默认位深度为 12
。默认打包为 P
(打包)。
有关传感器可用的位深度、分辨率和打包参数的信息,请参阅 list-cameras
。
例子:
4056:3040:12:P
- 4056×3040 分辨率,每像素 12 位,打包。
1632:1224:10
- 1632×1224 分辨率,每像素 10 位。
2592:1944:10:U
- 2592×1944 分辨率,每像素 10 位,未压缩。
3264:2448
- 3264×2448 分辨率。
打包格式详细信息
打包格式使用更少的存储空间来存储像素数据。
在树莓派 4 和早期设备上,打包格式使用 MIPI CSI-2 标准来打包像素。这意味着:
10 位相机模式将 4 个像素打包成 5 个字节。前 4 个字节包含每个像素的 8 个最高有效位(MSB),最后一个字节包含 4 对最低有效位(LSB)。
12 位相机模式将 2 个像素打包成 3 个字节。前 2 个字节包含每个像素的 8 个最高有效位(MSB),最后一个字节包含两个像素的 4 个最低有效位(LSB)。
在树莓派 5 及更高版本设备上,打包格式使用视觉无损压缩方案将像素值压缩为每像素 8 位(1 B)。
未打包格式详细信息
未打包格式提供的像素值更容易手动操作,但会以使用更多存储空间来存储像素数据为代价。
在所有设备上,未打包格式每像素使用 2 字节。
在树莓派 4 及旧款设备上,应用程序在最高有效端应用零填充。在未打包格式中,来自 10 位相机模式的像素不能超过值 1023
。
在树莓派 5 和更新设备上,应用程序在最低有效端应用零填充,因此图像使用传感器提供的像素深度的完整 16 位动态范围。
viewfinder-mode
与 mode
参数相同,但它适用于传参到预览窗口的数据。有关更多信息,请参阅 mode
文档。
lores-width
和 lores-height
从摄像头传送第二个、分辨率较低的图像流,缩小到指定的尺寸。
每个都接受一个定义较低分辨率流的像素尺寸的数字。
可用于预览和视频模式。不适用于静态捕获。如果你指定与正常分辨率流不同的宽高比,则会生成非方形像素。
对于 rpicam-vid
,可禁用额外的色彩去噪处理。
与图像后处理结合使用时,用于图像分析。
hflip
水平翻转图像。不接受值。
vflip
垂直翻转图像。不接受值。
rotation
旋转从传感器提取的图像。仅接受值 0
或 180
。
roi
从传感器的整个场景中裁剪图像。接受四个小数值,范围为 0 到 1,格式如下: <x>,<y>,<宽>,<高>
。这些值中的每一个代表可用宽度和高度的百分比,介于 0
和 1
之间的小数。
这些值定义了以下比例:
<x>
:提取图像前要跳过的 X 坐标
<y>
:提取图像前要跳过的 Y 坐标
<宽>
:要提取的图像宽度
<高>
:要提取的图像高度
默认为 0,0,1,1
(从第一个 X 坐标和第一个 Y 坐标开始,使用图像宽度的 100%,使用图像高度的 100%)。
示例:
rpicam-hello --roi 0.25,0.25,0.5,0.5
从图像中心裁剪出总像素数量的一半(跳过 X 坐标的前 25%,跳过 Y 坐标的前 25%,使用总图像宽度的 50%,使用总图像高度的 50%)。
rpicam-hello --roi 0,0,0.25,0.25
选择从图像左上角裁剪的像素总数的四分之一(跳过 X 坐标的前 0%,跳过 Y 坐标的前 0%,使用图像宽度的 25%,使用图像高度的 25%)。
hdr
默认值: off
以 HDR 模式运行相机。如果未传参值,则假定 auto。接受以下值之一:
off
- 禁用 HDR。
auto
- 在支持的设备上启用 HDR。如果可用,使用传感器的内置 HDR 模式。如果传感器缺乏内置 HDR 模式,则使用板载 HDR 模式(如果可用)。
single-exp
- 使用板载 HDR 模式(如果可用),即使传感器具有内置 HDR 模式。如果板载 HDR 模式不可用,则禁用 HDR。
树莓派 5 及更高版本设备内置了 HDR 模式。
要检查传感器中的内置 HDR 模式,请在 list-cameras 中添加此参数。
控制图像处理和影响相机图像质量的算法的参数。
sharpness
设置图像锐度。接受以下光谱范围内的数值:
0.0
不应用锐化。
大于 0.0
的值,但小于 1.0
的值应用比默认锐化量少的值
1.0
应用默认锐化量
大于 1.0
的值应用额外的锐化
contrast
指定图像对比度。接受沿以下光谱的数值。
0.0
应用最小对比度
大于 0.0
但小于 1.0
的值应用少于默认对比度量。
1.0
应用默认对比度量
大于 1.0
的值会应用额外对比度
brightness
指定图像亮度,作为输出图像中所有像素的偏移量。接受以下光谱范围内的数值。
-1.0
应用最低亮度(黑色)
0.0
应用标准亮度
1.0
应用最大亮度(白色)
对于许多用例,更喜欢 ev。
saturation
指定图像的颜色饱和度。接受沿以下光谱的数值:
0.0
应用最小饱和度(灰度)
大于 0.0
但小于 1.0
的值应用比默认饱和度少的量
1.0
应用默认饱和度
大于 1.0
的值应用额外饱和度
ev
指定图像的曝光值(EV)补偿,以光圈为单位。接受一个数值,控制传参给自动曝光/增益控制(AEC/AGC)处理算法的目标值,沿以下光谱:
-10.0
应用最小目标值
0.0
应用标准目标值
10.0
应用最大目标值
shutter
使用快门指定曝光时间(以微秒为单位)。在使用此参数时,增益仍可能变化。如果相机以太快的帧速率运行,不允许指定的曝光时间(例如,帧速率为 1fps,曝光时间为 10000 微秒),则传感器将使用帧速率允许的最大曝光时间。
有关官方相机的最小和最大快门时间列表,请参阅相机硬件文档。超过最大值的数值会导致未定义行为。
gain
别名: --analoggain
设置组合模拟和数字增益。当传感器驱动程序可以提供请求的增益时,仅使用模拟增益。当模拟增益达到最大值时,ISP 应用数字增益。接受数值。
对于官方摄像头的模拟增益限制列表,请参阅摄像头硬件文档。
有时,数字增益可以超过 1.0,即使模拟增益限制没有超过。这可能发生在以下情况下:
任一颜色增益低于 1.0,这将导致数字增益稳定为 1.0/min(red_gain,blue_gain)
。这可以保持应用于所有颜色通道的总数字增益高于 1.0,以避免出现变色伪影。
在自动曝光/增益控制(AEC/AGC)变化期间出现轻微差异。
metering
默认值: centre
设置自动曝光/增益控制(AEC/AGC)算法的测光模式。接受以下数值:
centre
- 中央加权测光
spot
- 点测光
average
- 平均或整体测光
custom
- 相机调校文件中定义的自定义测光模式
有关在树莓派相机和 libcamera 的调整指南中定义自定义测光模式和调整区域权重的更多信息。
exposure
设置曝光配置文件。更改曝光配置文件不应影响图像曝光。相反,不同模式会调整增益设置以实现相同的净结果。接受以下值:
sport
:短曝光,更大增益
normal
:正常曝光,正常增益
long
:长曝光,较小增益
你可以使用调整文件编辑曝光配置文件。有关更多信息,请参阅树莓派相机和 libcamera 的调整指南。
awb
设置自动白平衡(AWB)模式。接受以下数值:
auto
2500K 到 8000K
incandescent
2500K 到 3000K
tungsten
3000K 到 3500K
fluorescent
4000K 到 4700K
indoor
3000K 到 5000K
daylight
5500K 到 6500K
cloudy
从 7000K 到 8500K
custom
在调整文件中自定义的范围。
这些值仅为近似值:根据相机调整,值可能会有所变化。
未设置模式会完全禁用 AWB。相反,你可以使用 awbgains 来固定颜色增益。
有关 AWB 模式的更多信息,包括如何定义自定义模式,请参阅树莓派摄像头和 libcamera 的调整指南。
awbgains
设置固定的红色和蓝色增益值,以替代自动白平衡(AWB)算法。设置非零值以禁用 AWB。接受以逗号分隔的数字输入,格式如下: <red_gain>,<blue_gain>
denoise
默认值: auto
设置去噪模式。接受以下数值:
auto
:启用标准空间去噪。视频使用超快速色彩去噪,图像使用高质量色彩去噪。在预览窗口中不启用额外的色彩去噪。
off
:禁用空间和颜色去噪。
cdn_off
:禁用颜色去噪。
cdn_fast
:使用快速颜色去噪。
cdn_hq
:使用高质量的彩色降噪。由于吞吐量降低,不适合视频/取景器。
即使快速彩色降噪也会降低帧率。高质量的彩色降噪会显著降低帧率。
tuning-file
指定相机调整文件。调整文件允许你控制图像处理的许多方面,包括自动曝光/增益控制(AEC/AGC)、自动白平衡(AWB)、颜色阴影校正、颜色处理、降噪等。接受调整文件路径作为输入。
有关调整文件的更多信息,请参阅调整文件。
autofocus-mode
默认值: default
指定自动对焦模式。接受以下值:
default
:除非 lens-position 或 autofocus-on-capture 覆盖手动模式,否则将相机置于连续自动对焦模式
manual
:除非使用 lens-position 手动配置,否则根本不移动镜头
auto
:仅当相机启动时或在捕获之前使用 autofocus-on-capture 时,镜头才会进行自动对焦扫描
continuous
:随着场景变化自动调整镜头位置
该参数仅适用于某些摄像头模块。
autofocus-window
默认值: normal
指定自动对焦范围。接受以下数值:
normal
:从相当近的地方对焦到无限远
macro
:仅对近距离物体进行对焦,包括相机支持的最近对焦距离
full
:专注于整个范围,从最接近的物体到无限远
该参数仅适用于某些摄像头模块。
autofocus-speed
默认值: normal
指定自动对焦速度。接受以下值:
normal
:以正常速度改变镜头位置
fast
:快速改变镜头位置
该参数仅适用于某些摄像头模块。
autofocus-range
指定传感器全视场角内的自动对焦窗口。接受四个小数值,范围为 0 到 1,格式如下: <x>,<y>,<宽>,<高>
。每个值代表可用宽度和高度的百分比,为 0 到 1 之间的小数。
这些值定义了以下比例:
<x>
:应用自动对焦前要跳过的 X 坐标
<y>
:应用自动对焦前要跳过的 Y 坐标
<宽>
:自动对焦区域宽度
<高>
:自动对焦区域高度
默认值在两个维度上使用输出图像的中间三分之一(总图像面积的 1/9)。
例子:
rpicam-hello --autofocus-window 0.25,0.25,0.5,0.5
选择从图像中心裁剪的像素总数的一半(跳过 X 坐标的前 25%,跳过 Y 坐标的前 25%,使用总图像宽度的 50%,使用总图像高度的 50%)。
rpicam-hello --autofocus-window 0,0,0.25,0.25
选择从图像左上角裁剪的像素总数的四分之一(跳过 X 坐标的前 0%,跳过 Y 坐标的前 0%,使用图像宽度的 25%,使用图像高度的 25%)。
该参数仅适用于某些摄像头模块。
lens-position
默认值: default
将镜头移动到固定的焦距,通常以屈光度(米的倒数单位)表示。接受以下数值范围:
0.0
:将镜头移动到“无穷远”位置
其他数值
:将镜头移动到 1/ 其他数值 位置。例如,数值 2.0
将对焦在大约 0.5m 处
default
:将镜头移动到与镜头的超焦点位置相对应的默认位置
镜头校准不完美,因此同一型号的不同相机模块可能会有所不同。
verbose
别名: -v
默认值: 1
设置详细级别。接受以下值:
0
:无输出
1
:正常输出
2
:详细输出
output
别名: -o
设置用于记录图像或视频的文件的名称。除了纯文本文件名外,还接受以下特殊值:
-
:写入标准输出。
udp://
(前缀):用于 UDP 流媒体的网络地址。
tcp://
(前缀):用于 TCP 流媒体的网络地址。
在文件名中包含指令 %d
,以将指令替换为递增的计数,每打开一个文件计数递增。该指令支持标准 C 格式指令修饰符。
例子:
rpicam-vid -t 100000 --segment 10000 -o chunk%04d.h264
记录一个 100 秒的文件,每 10 秒划分一个段,每个文件包含一个递增的四位数计数器,前面补零:例如 chunk0001.h264,chunk0002.h264 等。
rpicam-vid -t 0 --inline -o udp://192.168.1.13:5000
使用 UDP 在端口 5000 上将 H.264 视频流传输到网络地址 192.168.1.13。
wrap
为 output %d
指令使用的计数器设置最大值。计数器在达到此值后将重置为零。接受数值。
flush
在帧完成写入后立即将输出文件刷新到磁盘,而不是等待系统处理。不接受数值。
post-process-file
指定配置图像管道应用的后处理的 JSON 文件。这适用于相机图像在到达应用程序之前。这类似于旧版 raspicam“图像效果”。接受文件名路径作为输入。
后处理是一个广泛的主题,允许使用第三方软件如 OpenCV 和 TensorFlowLite 来分析和操作图像。有关更多信息,请参阅后处理。
本节中指定的命令行参数仅适用于静态图像输出。
要将以下参数之一传参给应用程序,请在参数名称前加上 --
。如果参数需要一个值,请在参数名称后立即传参该值,用单个空格分隔。如果值包含空格,请用引号括起来。
一些参数具有速记别名,例如 -h
而不是 --help
。使用这些速记别名而不是完整的参数名称,以节省空间和时间,但牺牲可读性。
quality
别名: -q
默认值: 93
设置 JPEG 质量。接受介于 1
和 100
之间的值。
exif
在 JPEG 输出文件中保存额外的 EXIF 标签。仅适用于 JPEG 输出。由于 libexif 库的限制,许多标签当前(错误地)格式化为 ASCII 并在终端中打印警告。
此参数是添加与相机设置相关的某些 EXIF 标签所必需的。你可以在使用 ExifTool 录制后将与相机设置无关的标签添加到输出 JPEG 中。
示例: rpicam-still -o test.jpg --exif IDO0.Artist=Someone
timelapse
按指定间隔记录图像。接受以毫秒为单位的间隔。将此设置与 timeout 结合使用,以随时间捕获重复图像。
你可以使用字符串格式设置为每个输出文件指定单独的文件名,例如 --output test%d.jpg
。
示例: rpicam-still -t 100000 -o test%d.jpg --timelapse 10000
每隔 10 秒捕获一次图像,持续 100 秒。
framestart
配置输出文件名中作为 %d 访问的帧计数的起始值。接受整数起始值。
datetime
在输出文件名中使用当前日期和时间,格式为 MMDDhhmmss.jpg
:
MM
= 2 位数字月份编号
DD
= 2 位数字的日期
hh
= 2 位数字的 24 小时小时数
mm
= 2 位数字的分钟数
ss
= 2 位数的第二个数字
不接受值。
timestamp
使用当前系统 Unix 时间作为输出文件名。不接受值。
restart
默认值: 0
配置 JPEG 输出的重启标记间隔。JPEG 重启标记有助于限制对 JPEG 图像的损坏影响,并且还可以启用多线程 JPEG 编码和解码。接受整数值。
immediate
当应用程序运行时立即捕获图像。
keypress
在超时或按下 回车键 时捕获图像,以先发生者为准。按 x 键,然后按 回车键 可以退出而不捕获图像。此选项不接受值。
signal
在超时或收到 SIGUSR1
信号时捕获图像。使用 SIGUSR2
信号可以退出而不捕获图像。此选项不接受值。
thumb
默认值: 320:240:70
使用以下格式配置缩略图的尺寸和质量: <w:h:q>
(或 none
,省略缩略图)。
encoding
别名: -e
默认值: jpg
设置要用于图像输出的编码器。接受以下值:
jpg
- JPEG
png
- PNG
bmp
- BMP
rgb
- 未压缩的 RGB 像素的二进制转储
yuv420
- 未压缩 YUV420 像素的二进制转储
此参数始终确定编码,覆盖传参给 output
的扩展名。
在使用参数 datetime
和 timestamp
时,此参数确定输出文件扩展名。
raw
别名: -r
除了输出图像外,还以 DNG 格式保存原始 Bayer 文件。将输出文件名扩展名替换为 .dng
。你可以使用 dcraw 或 RawTherapee 等工具处理这些标准 DNG 文件。不接受值。
原始文件中的图像数据完全是从传感器输出的,未经 ISP 或其他处理。文件中保存的 EXIF 数据包括:
曝光时间
模拟增益(ISO 标记是模拟增益的 100 倍)
白平衡增益(它们是“拍摄中性”值的倒数)
ISP 使用的颜色矩阵
latest
创建指向最近保存文件的符号链接。接受符号链接名称作为输入。
autofocus-on-capture
如果设置,会在捕获图像之前运行自动对焦循环。与以下 autofocus_mode
值交互:
default
或 manual
:仅运行捕获时自动对焦循环。
auto
:在预览窗口加载时运行额外的自动对焦循环。
continuous
:忽略此参数,而是在整个预览过程中持续对焦。
不需要值,但你可以传参 1
以启用,传参 0
以禁用。不传参值相当于传参 1
。
仅受某些摄像头模块支持(例如树莓派摄像头模块 3)。
本节中指定的命令行参数仅适用于视频输出。
要将以下参数之一传参给应用程序,请在参数名称前加上 --
。如果参数需要值,请在参数名称后立即传参值,用单个空格分隔。如果值包含空格,请用引号括起来。
一些参数具有速记别名,例如 -h
而不是 --help
。使用这些速记别名而不是完整的参数名称,以节省空间和时间,但牺牲可读性。
quality
别名: -q
默认值: 50
接受介于 1
和 100
之间的 MJPEG 质量级别。仅适用于以 MJPEG 格式编码的视频。
bitrate
别名: -b
控制 H.264 编码器使用的目标比特率,单位为每秒比特数。仅适用于以 H.264 格式编码的视频。影响输出视频的大小。
例子: rpicam-vid -b 10000000 --width 1920 --height 1080 -o test.h264
intra
别名: -g
默认值: 60
设置 H.264 比特流中 I 帧(intra frames)的频率。接受帧数。仅适用于以 H.264 格式编码的视频。
profile
设置 H.264 配置文件。接受以下数值:
baseline
main
high
仅适用于以 H.264 格式编码的视频。
level
设置 H.264 级别。接受以下数值:
4
4.1
4.2
仅适用于以 H.264 格式编码的视频。
codec
设置用于视频输出的编码器。接受以下值:
h264
- 使用 H.264 编码器(默认值)
mjpeg
- 使用 MJPEG 编码器
yuv420
- 输出未压缩的 YUV420 帧。
libav
- 使用 libav 后端来编码音频和视频(有关更多信息,请参见 libav )
save-pts
警告
树莓派 5 不支持参数
save-pts
。请改用 libav 自动生成时间戳以替代。
启用帧时间戳输出,允许你使用类似 mkvmerge 的工具将比特流转换为容器格式。接受时间戳输出文件的纯文本文件名。
示例: rpicam-vid -o test.h264 --save-pts timestamps.txt
你可以使用以下命令从比特流和时间戳文件生成一个 MKV 容器文件:
$ mkvmerge -o test.mkv --timecodes 0:timestamps.txt test.h264
keypress
别名: -k
允许 CLI 使用回车键启用和禁用视频输出。始终以录制状态启动,除非使用 initial
另行指定。键入 x 键 并按 回车键 退出。不接受值。
signal
别名: -s
允许 CLI 使用 SIGUSR1
启用和禁用视频输出。使用 SIGUSR2
退出。除非使用 initial 指定,始终以录制状态启动。不接受值。
initial
默认值: record
指定是否启动应用程序时启用或禁用视频输出。接受以下值:
record
:启用视频输出启动。
pause
:禁用视频输出启动。
使用此参数与 keypress
/signal
一起,以在两种状态之间切换。
split
当使用 keypress
、signal
切换录制时,将来自单独录制会话的视频输出写入单独的文件中。不接受值。除非与 output 结合使用以为每个文件指定唯一名称,否则每次写入文件时都会覆盖。
segment
将视频输出剪切成传参持续时间的多个文件。接受以毫秒为单位的持续时间。如果传参一个非常小的持续时间(例如,1 ),则将每帧记录到单独的输出文件中以模拟突发捕获。
你可以使用字符串格式化为每个文件指定单独的文件名,例如 --output test%04d.h264
。
circular
默认值: 4
将视频录制写入内存中的循环缓冲区。当应用程序退出时,将循环缓冲区记录到磁盘。可接受以 MB 为单位的可选大小。
inline
在每个 I 帧(帧内)中写入序列头。这可以帮助客户端从视频的任何点解码视频序列,而不仅仅是从开头。建议与 segment
,split
,circular
和流媒体参数一起使用。
仅适用于以 H.264 格式编码的视频。不接受值。
listen
在对视频进行编码之前等待传入的客户端连接。用于通过 TCP/IP 进行网络流式传输。不接受值。
frames
记录完全指定数量的帧。任何非零值都会覆盖 timeout
。接受非零整数。
framerate
记录完全指定的帧速率。接受非零整数。
libav
参数本节中指定的命令行参数仅适用于 libav
视频后端。
要启用 libav
后端,请传参 codec
参数值为 libav
。
要将以下参数之一传参给应用程序,请在参数名称前加上 --
。如果参数需要值,请在参数名称后立即传参值,用单个空格分隔。如果值包含空格,请用引号括起来。
一些参数具有速记别名,例如 -h
而不是 --help
。使用这些速记别名而不是完整的参数名称,以节省空间和时间,但牺牲可读性。
libav-format
设置 libav 输出格式。接受以下值:
mkv
编码
mp4
编码
avi
编码
h264
流式传输
mpegts
流式传输
如果你未提供此参数,则传参给 output
参数的文件扩展名将确定文件格式。
libav-audio
启用音频录制。启用后,你还必须指定 audio-codec
。不接受值。
audio-codec
默认值: aac
选择用于输出的音频编解码器。要查看可用编解码器的列表,请运行 ffmpeg -codecs
。
audio-bitrate
设置音频编码的比特率,单位为每秒比特数。接受数字输入。
示例: rpicam-vid --codec libav -o test.mp4 --audio_codec mp2 --audio-bitrate 16384
(以 mp2 编解码器以 16 千位/秒记录音频)
audio-samplerate
默认值: 0
设置音频采样率(单位 Hz)。接受数字输入。0
使用输入采样率。
audio-device
为音频录制选择一个 ALSA 输入设备。要查看可用设备的列表,请运行以下命令:
$ pactl list | grep -A2 'Source #' | grep 'Name: '
你应该看到类似以下内容的输出:
Name: alsa_output.platform-bcm2835_audio.analog-stereo.monitor
Name: alsa_output.platform-fef00700.hdmi.hdmi-stereo.monitor
Name: alsa_output.usb-GN_Netcom_A_S_Jabra_EVOLVE_LINK_000736B1214E0A-00.analog-stereo.monitor
Name: alsa_input.usb-GN_Netcom_A_S_Jabra_EVOLVE_LINK_000736B1214E0A-00.mono-fallback
av-sync
将音频样本时间戳按微秒值移动。接受正数和负数数值。
本节中指定的命令行参数仅适用于使用 rpicam-detect
进行目标检测。
要将以下参数之一传参给 rpicam-detect
,请在参数名称前加上 --
。如果参数需要一个值,请在参数名称后立即传参该值,用单个空格分隔。如果值包含空格,请用引号括起来。
一些参数具有速记别名,例如 -h
而不是 --help
。请使用这些速记别名,以节省空间和时间,但牺牲可读性。
object
从模型的标签文件中检测具有给定名称的对象。接受纯文本文件名作为输入。
gap
在捕获之间至少等待这么多帧。接受数值。
rpicam-apps
进行后处理rpicam-apps 共享一个通用的后处理框架。这使它们能够通
过一系列自定义图像处理和图像分析例程传参从相机系统接收到的图像。每个这样的例程被称为一个阶段。要运行后处理阶段,请提供一个 JSON 文件,指示应用程序应用哪些阶段和参数。你可以在 rpicam-apps 存储库的 assets 文件夹中找到使用内置后处理阶段的示例 JSON 文件。
例如,否定阶段将亮像素变暗,暗像素变亮。由于否定阶段是基本的,不需要配置,negate.json 只是命名该阶段:
{
"negate": {}
}
要将否定阶段应用于图像,请将 negate.json
传参给 post-process-file
参数:
$ rpicam-hello --post-process-file negate.json
要运行多个后处理阶段,请创建一个包含多个阶段作为顶级键的 JSON 文件。例如,以下配置运行 Sobel 阶段,然后是否定阶段:
{
"sobel_cv":
{
"ksize": 5
},
"negate": {}
}
Sobel 阶段使用 OpenCV,因此具有 cv 后缀。它具有一个可由用户配置的参数,ksize,指定要使用的滤波器的内核大小。在这种情况下,Sobel 滤波器在黑色背景上产生明亮边缘,否定阶段将其转换为白色背景上的暗边缘。
一个否定的 Sobel 滤波器。
一些阶段,如 negate,以某种方式改变图像。其他阶段分析图像以生成元数据。后处理阶段可以将此元数据传参给其他阶段甚至应用程序。
为了提高性能,图像分析通常使用降低的分辨率。rpicam-apps
直接从 ISP 提供专用的低分辨率馈送。
注意
使用树莓派系统附带的
rpicam-apps
未包含 OpenCV 和 TensorFlow Lite。因此,依赖于它们的某些后处理阶段被禁用。要使用这些阶段,请重新编译rpicam-apps
。在运行 32 位内核的树莓派 3、4 上,使用参数-DENABLE_COMPILE_FLAGS_FOR_TARGET=armv8-neon
进行编译能加快某些阶段的速度。
此阶段将亮像素变暗,暗像素变亮。
negate 阶段没有用户可配置的参数。
默认的 negate.json
文件:
{
"negate" : {}
}
运行以下命令以在 rpicam-hello
中使用此阶段文件:
$ rpicam-hello --post-process-file negate.json
示例输出:
一个否定的图像。
本阶段强调使用高动态范围(HDR)和动态范围压缩(DRC)来突出图像中的细节。DRC 使用单个图像,而 HDR 结合多个图像以获得类似的结果。
参数分为三组:LP 滤波器、全局色调映射和局部对比度。
该阶段对完全处理过的输入图像应用平滑滤波器,生成低通(LP)图像。然后从原始图像和 LP 图像的差异中生成高通(HP)图像。然后,对 LP 图像应用全局色调映射,并将其添加回 HP 图像。该过程有助于保留局部对比度。
你可以使用以下参数配置此阶段:
| num_frames
| 累积帧数;对于 DRC,请使用 1
;对于 HDR,请尝试 8| | | :--: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | |
lp_filter_strength| 低通 IIR 滤波器的系数。 | |
lp_filter_threshold| 将像素级别与有意义细节的阈值相关联的分段线性函数。 | |
global_tonemap_points| 输入图像直方图中的点映射到输出范围中的目标,我们希望将它们移动到那里。使用以下子配置:<br /> 一个在
q和
width之间的分位均值,作为完整输出范围的一部分(
target),最大(
max_up)和最小(
max_down)增益,用于移动测量的分位均值,以防止图像变化过于剧烈 | |
global_tonemap_strength| 全局色调映射应用强度 | |
local_pos_strength| 一个分段线性函数,定义了添加回色调映射 LP 图像时应用于局部对比度的增益,用于正(亮)细节 | |
local_neg_strength| 定义将应用于局部对比度的增益的分段线性函数,当添加回色调映射的 LP 图像时,用于负(暗)细节 | |
local_tonemap_strength| 应用于所有局部对比度的整体增益,然后添加回去 | |
local_colour_scale` | 一个因子,允许输出颜色受到更强烈或更弱的影响 |
控制处理强度,更改 global_tonemap_strength
和 local_tonemap_strength
参数。
在树莓派 4 上,处理单个图像需要 2 到 3 秒的时间。在累积多个帧时,此阶段仅将处理后的图像发送到应用程序。
DRC 的默认 drc.json
文件:
{
"hdr" : {
"num_frames" : 1,
"lp_filter_strength" : 0.2,
"lp_filter_threshold" : [ 0, 10.0 , 2048, 205.0, 4095, 205.0 ],
"global_tonemap_points" :
[
{ "q": 0.1, "width": 0.05, "target": 0.15, "max_up": 1.5, "max_down": 0.7 },
{ "q": 0.5, "width": 0.05, "target": 0.5, "max_up": 1.5, "max_down": 0.7 },
{ "q": 0.8, "width": 0.05, "target": 0.8, "max_up": 1.5, "max_down": 0.7 }
],
"global_tonemap_strength" : 1.0,
"local_pos_strength" : [ 0, 6.0, 1024, 2.0, 4095, 2.0 ],
"local_neg_strength" : [ 0, 4.0, 1024, 1.5, 4095, 1.5 ],
"local_tonemap_strength" : 1.0,
"local_colour_scale" : 0.9
}
}
示例:
没有 DRC 处理的图像
运行以下命令以在 rpicam-still
中使用此阶段文件
$ rpicam-still -o test.jpg --post-process-file drc.json
DRC 处理过的图像
HDR 的默认 hdr.json
文件:
{
"hdr" : {
"num_frames" : 8,
"lp_filter_strength" : 0.2,
"lp_filter_threshold" : [ 0, 10.0 , 2048, 205.0, 4095, 205.0 ],
"global_tonemap_points" :
[
{ "q": 0.1, "width": 0.05, "target": 0.15, "max_up": 5.0, "max_down": 0.5 },
{ "q": 0.5, "width": 0.05, "target": 0.45, "max_up": 5.0, "max_down": 0.5 },
{ "q": 0.8, "width": 0.05, "target": 0.7, "max_up": 5.0, "max_down": 0.5 }
],
"global_tonemap_strength" : 1.0,
"local_pos_strength" : [ 0, 6.0, 1024, 2.0, 4095, 2.0 ],
"local_neg_strength" : [ 0, 4.0, 1024, 1.5, 4095, 1.5 ],
"local_tonemap_strength" : 1.0,
"local_colour_scale" : 0.8
}
}
例子:
没有 HDR 处理的图像
运行以下命令以在 rpicam-still 中使用此阶段文件:
$ rpicam-still -o test.jpg --ev -2 --denoise cdn_off --post-process-file hdr.json
带有 HDR 处理的图像
motion_detect
阶段motion_detect
阶段分析来自低分辨率图像流的帧。你必须配置低分辨率流以使用此阶段。该阶段通过比较帧中感兴趣区域(ROI)与先前帧中相应部分来检测运动。如果帧之间的像素变化足够多,此阶段将在元数据下的 motion_detect.result
键中指示运动。
此阶段不依赖第三方库。
你可以使用以下参数配置此阶段,将尺寸传参为低分辨率图像尺寸的比例,介于 0
和 1
之间:
roi_x
感兴趣区域的 x 偏移量用于比较(比例介于 0
和 1
之间)
roi_y
感兴趣区域的 y 偏移量用于比较(比例介于 0
和 1
之间)
roi_width
用于比较的感兴趣区域的宽度(比例介于 0
和 1
之间)
roi_height
用于比较的感兴趣区域的高度(比例介于 0
和 1
之间)
difference_m
用于构建像素差异阈值的线性系数
difference_c
用于根据 threshold = difference_m * pixel_value + difference_c
构建像素阈值的恒定系数
frame_period
运行此数量帧的运动检测器
hskip
像素水平下采样的数量
vksip
垂直方向按此比例进行像素子采样
region_threshold
必须将多少比例的像素(区域)归类为不同,才能算作运动
verbose
将消息打印到控制台,包括运动状态发生变化时
默认 motion_detect.json
配置文件:
{
"motion_detect" : {
"roi_x" : 0.1,
"roi_y" : 0.1,
"roi_width" : 0.8,
"roi_height" : 0.8,
"difference_m" : 0.1,
"difference_c" : 10,
"region_threshold" : 0.005,
"frame_period" : 5,
"hskip" : 2,
"vskip" : 2,
"verbose" : 0
}
}
调整差异和阈值,使算法更加敏感或不那么敏感。为了提高性能,请使用参数 hskip
和 vskip
。
运行以下命令以使用此阶段文件与 rpicam-hello
:
$ rpicam-hello --lores-width 128 --lores-height 96 --post-process-file motion_detect.json
注意
这些阶段需要安装 OpenCV。你可能需要重新构建带有 OpenCV 支持的
rpicam-apps
。
该阶段将 Sobel 滤波器应用于图像,以突出边缘。
你可以使用以下参数配置此阶段:
ksize
Sobel 滤波器的内核大小
默认 sobel_cv.json
文件:
{
"sobel_cv" : {
"ksize": 5
}
}
例子:
使用 Sobel 滤波器来强调边缘。
此阶段使用 OpenCV Haar 分类器来检测图像中的人脸。它返回人脸位置元数据,键为 face_detect.results
,并可选择在图像上绘制位置。
你可以使用以下参数配置此阶段:
cascade_name
可找到 Haar 级联的文件名
scaling_factor
确定搜索人脸图像的比例范围
min_neighbors
需要重叠邻居的最小数量才能算作人脸
min_size
最小人脸尺寸
max_size
最大人脸尺寸
refresh_rate
在尝试重新运行人脸检测器之前等待多少帧
draw_features
是否在返回的图像上绘制面部位置
face_detect_cv
阶段仅在预览和视频捕获期间运行。它会忽略静态图像捕获。它在分辨率为 320×240 和 640×480 像素之间的低分辨率流上运行。
默认 face_detect_cv.json
文件:
{
"face_detect_cv" : {
"cascade_name" : "/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml",
"scaling_factor" : 1.1,
"min_neighbors" : 2,
"min_size" : 32,
"max_size" : 256,
"refresh_rate" : 1,
"draw_features" : 1
}
}
示例:
在图像上检测到的面部绘制。
annotate_cv
阶段该阶段使用与 info-text
参数相同的 %
替换,将文本写入图像的右上角。
首先解释指令 info-text
,然后将剩余的标记传参给 strftime
。
例如,要在视频上实现日期时间戳,请传参 %F %T %z
:
%F
显示 ISO-8601 日期 (2023-03-07)
%T
显示 24 小时本地时间 (例如 "09:57:12")
%z
显示相对于 UTC 的时区 (例如 "-0800")
此阶段不会输出任何元数据,但会将在 JSON 配置文件中找到的元数据写入 annotate.text
的位置。这样,其他后处理阶段就可以将文本写入图像。
你可以使用以下参数配置此阶段:
text
要写入的文本字符串
fg
前景颜色
bg
背景颜色
scale
与文本大小成比例的数字
thickness
决定文本厚度的数字
alpha
覆盖背景像素时应用的 alpha 量
默认 annotate_cv.json
文件:
{
"annotate_cv" : {
"text" : "Frame %frame exp %exp ag %ag dg %dg",
"fg" : 255,
"bg" : 0,
"scale" : 1.0,
"thickness" : 2,
"alpha" : 0.3
}
}
示例:
使用注释将相机和日期信息写入图像。
这些阶段需要导出 C++ API 的 TensorFlow Lite(TFLite)库。TFLite 不以这种形式分发库,但你可以从 lindevs.com 下载并安装一个导出 API 的版本。
安装后,你必须重新编译 rpicam-apps
以支持 TensorFlow Lite。
object_classify_tf
阶段object_classify_tf
使用 Google MobileNet v1 模型对摄像头图像中的对象进行分类。此阶段需要一个 labels.txt
文件。
你可以使用以下参数配置此阶段:
top_n_results
要显示的结果数量
refresh_rate
模型运行之间必须经过的帧数
threshold_high
对象被视为存在的置信度阈值(介于 0 和 1 之间)
threshold_low
对象必须下降到以下阈值以下才能被丢弃为匹配项
model_file
TFLite 模型文件的文件路径
labels_file
包含对象标签的文件路径
display_labels
是否在图像上显示对象标签;为 annotate_cv
阶段插入 annotate.text
元数据以渲染
verbose
在控制台输出更多信息
示例 object_classify_tf.json
文件:
{
"object_classify_tf" : {
"top_n_results" : 2,
"refresh_rate" : 30,
"threshold_high" : 0.6,
"threshold_low" : 0.4,
"model_file" : "/home/<用户名>/models/mobilenet_v1_1.0_224_quant.tflite",
"labels_file" : "/home/<用户名>/models/labels.txt",
"display_labels" : 1
},
"annotate_cv" : {
"text" : "",
"fg" : 255,
"bg" : 0,
"scale" : 1.0,
"thickness" : 2,
"alpha" : 0.3
}
}
舞台使用尺寸为 224×224 的低分辨率流图像。运行以下命令以使用此舞台文件与 rpicam-hello
:
$ rpicam-hello --post-process-file object_classify_tf.json --lores-width 224 --lores-height 224
桌面电脑和显示器的对象分类。
pose_estimation_tf
阶段下载:https://github.com/Qengineering/TensorFlow_Lite_Pose_RPi_32-bits
pose_estimation_tf
使用 Google MobileNet v1 模型来检测姿势信息。
你可以使用以下参数配置此阶段:
refresh_rate
模型运行之间必须经过的帧数
model_file
TFLite 模型文件的文件路径
verbose
将额外信息输出到控制台
使用单独的 plot_pose_cv
阶段将检测到的姿势绘制到主图像上。
你可以使用以下参数配置 plot_pose_cv
阶段:
confidence_threshold
确定绘制程度的置信阈值;可以小于零
示例 pose_estimation_tf.json
文件:
{
"pose_estimation_tf" : {
"refresh_rate" : 5,
"model_file" : "posenet_mobilenet_v1_100_257x257_multi_kpt_stripped.tflite"
},
"plot_pose_cv" : {
"confidence_threshold" : -0.5
}
}
该阶段在尺寸为 257×257 的低分辨率流图像上运行。因为 YUV420 图像必须具有偶数尺寸,所以对于 YUV420 图像,将尺寸四舍五入为 258×258
。
运行以下命令以在 rpicam-hello
中使用此阶段文件:
$ rpicam-hello --post-process-file pose_estimation_tf.json --lores-width 258 --lores-height 258
成年男性人体姿势检测。
object_detect_tf
阶段object_detect_tf
使用 Google MobileNet v1 SSD(Single Shot Detector)模型来检测和标记对象。
你可以使用以下参数配置此阶段:
refresh_rate
必须在模型运行之间经过的帧数
model_file
TFLite 模型文件的文件路径
labels_file
包含标签列表的文件的文件路径
confidence_threshold
在接受匹配之前的置信阈值
overlap_threshold
确定匹配之间重叠的量,以便将它们合并为单个匹配
verbose
将额外信息输出到控制台
使用单独的 object_detect_draw_cv
阶段将检测到的对象绘制到主图像上。
你可以使用以下参数配置 object_detect_draw_cv
阶段:
line_thickness
边界框线条的粗细
font_size
用于标签的字体大小
示例 object_detect_tf.json
文件:
{
"object_detect_tf" : {
"number_of_threads" : 2,
"refresh_rate" : 10,
"confidence_threshold" : 0.5,
"overlap_threshold" : 0.5,
"model_file" : "/home/<用户名>/models/coco_ssd_mobilenet_v1_1.0_quant_2018_06_29/detect.tflite",
"labels_file" : "/home/<用户名>/models/coco_ssd_mobilenet_v1_1.0_quant_2018_06_29/labelmap.txt",
"verbose" : 1
},
"object_detect_draw_cv" : {
"line_thickness" : 2
}
}
舞台在尺寸为 300×300 的低分辨率流图像上运行。运行以下命令,从尺寸为 400×300 的低分辨率图像中心传参一个 300×300 的裁剪到检测器,以使用此舞台文件与 rpicam-hello
:
$ rpicam-hello --post-process-file object_detect_tf.json --lores-width 400 --lores-height 300
检测对象为苹果和猫。
segmentation_tf
阶段下载:https://tfhub.dev/tensorflow/lite-model/deeplabv3/1/metadata/2?lite-format=tflite
segmentation_tf
使用 Google MobileNet v1 模型。此阶段需要一个标签文件,在 assets/segmentation_labels.txt
处找到。
此阶段在尺寸为 257×257 的图像上运行。因为 YUV420 图像必须具有偶数尺寸,所以低分辨率图像的宽度和高度至少应为 258 像素。该阶段向图像元数据添加一个包含 257×257 个值的向量,其中每个值表示像素所属的类别。你可以选择在图像的右下角绘制分割的表示。
你可以使用以下参数配置此阶段:
refresh_rate
必须在模型运行之间经过的帧数
model_file
TFLite 模型文件的文件路径
labels_file
包含标签列表的文件的文件路径
threshold
当设置为详细时,打印当标签的像素数超过此数字时
draw
将分割地图绘制到图像的右下角
verbose
将额外信息输出到控制台
示例 segmentation_tf.json
文件:
{
"segmentation_tf" : {
"number_of_threads" : 2,
"refresh_rate" : 10,
"model_file" : "/home/<用户名>/models/lite-model_deeplabv3_1_metadata_2.tflite",
"labels_file" : "/home/<用户名>/models/segmentation_labels.txt",
"draw" : 1,
"verbose" : 1
}
}
此示例将摄像头图像缩小至 258×258 像素。即使压缩非方形图像而无需裁剪,此阶段也能正常工作。此示例在右下角启用分割地图。
运行以下命令以使用此阶段文件与 rpicam-hello
:
$ rpicam-hello --post-process-file segmentation_tf.json --lores-width 258 --lores-height 258 --viewfinder-width 1024 --viewfinder-height 1024
在地图的右下角运行分割并显示结果。
使用 rpicam-apps
后处理框架,用户可以创建自己的自定义后处理阶段。甚至可以包括来自 OpenCV 和 TensorFlow Lite 的算法和例程。
要创建自己的后处理阶段,请从 PostProcessingStage
类派生一个新类。所有后处理阶段必须实现以下成员函数:
char const *Name() const
返回阶段的名称。与 JSON 后处理配置文件中列出的阶段进行匹配。
void Read(boost::property_tree::ptree const ¶ms)
从提供的 JSON 文件中读取阶段的配置参数。
void AdjustConfig(std::string const &use_case, StreamConfiguration *config)
为阶段提供影响相机配置的机会。对于不需要配置相机的阶段,通常为空。
void Configure()
在相机配置完成后调用,以分配资源并检查阶段是否可以访问必要的流。
void Start()
当摄像头启动时调用。对于不需要配置摄像头的阶段通常为空。
bool Process(CompletedRequest &completed_request)
展示已完成的摄像头请求以供后期处理。这是你将实现像素操作和图像分析的地方。如果后期处理框架不应将此请求传参给应用程序,则返回 true
。
void Stop()
当摄像头停止时调用。用于关闭异步线程上的全部活动处理。
当相机配置被销毁时调用 void Teardown()
。将其用作析构函数,在其中可以释放在 Configure
方法中设置的资源。
在所有阶段实现中,调用 RegisterStage
来向系统注册你的阶段。
不要忘记将你的阶段也添加到后处理文件夹的 CMakeLists.txt
中!
写自己的阶段时,请记住以下提示:
Process
方法会阻塞成像管道。如果花费的时间太长,管道会出现卡顿。始终将耗时算法委托给异步线程。
将工作委托给另一个线程时,必须复制图像缓冲区。对于像图像分析这样不需要全分辨率的应用程序,尝试使用低分辨率图像流。
后处理框架使用并行处理每一帧。这提高了吞吐量。然而,一些 OpenCV 和 TensorFlow Lite 函数在每一帧内引入了另一层并行性。考虑在每一帧内序列化调用,因为后处理已经利用了多个线程。
大多数流,包括低分辨率流,使用 YUV420 格式。你可能需要将其转换为另一种格式以供某些 OpenCV 或 TFLite 函数使用。
为获得最佳性能,请始终就地修改图像。
对于一个基本示例,请参见 negate_stage.cpp
。这个阶段通过将亮像素变暗和暗像素变亮来否定图像。这个阶段主要是派生类样板,仅用几行代码实现否定逻辑。
对于另一个示例,请参见 sobel_cv_stage.cpp
,它仅使用几行 OpenCV 函数实现了 Sobel 滤波器。
对于使用 TensorFlow Lite (TFLite) 的阶段,请从 TfStage 类派生一个新类。该类将模型执行委托给单独的线程,以防止相机出现卡顿。
TfStage 类实现了所有后处理阶段通常必须实现的成员函数,除了 Name
。所有派生自 TfStage
的阶段必须实现 Name
函数,并应实现以下一个或多个虚拟成员函数:
void readExtras()
基类读取命名模型和诸如 refresh_rate
之类的某些其他参数。使用此函数读取派生阶段的额外参数,并检查加载的模型是否正确(例如,具有正确的输入和输出维度)。
void checkConfiguration()
基类获取 TFLite 操作的低分辨率流和派生阶段需要的完整分辨率流。使用此函数检查你的阶段所需的流。如果你的阶段无法访问所需的流之一,则可能会跳过处理或引发错误。
void interpretOutputs()
使用此函数读取和解释模型输出。在模型完成时与模型在同一线程中运行。
void applyResults()
使用此函数将模型的结果(可能是几帧旧的)应用于当前帧。通常涉及附加元数据或绘图。在交付帧之前在主线程中运行。
有关示例实现,请参见 object_classify_tf_stage.cpp
和 pose_estimation_tf_stage.cpp
。
rpicam-apps
libcamera
和 rpicam-apps
为自己构建 libcamera
和 rpicam-apps
以获得以下好处:
你可以获取最新的增强功能和特性。
rpicam-apps
可以针对运行 32 位操作系统的树莓派 3 和树莓派 4 设备进行额外优化编译。
你可以包括可选的 OpenCV 和/或 TFLite 后处理阶段,或添加你自己的内容。
你可以定制或添加从 rpicam-apps
派生的应用程序。
rpicam-apps
而不构建 libcamera
。要构建 rpicam-apps
而不必先重新构建 libcamera
和 libepoxy
,请使用 apt
安装 libcamera
、libepoxy
及其依赖项:
$ sudo apt install -y libcamera-dev libepoxy-dev libjpeg-dev libtiff5-dev libpng-dev
技巧
如果你不需要支持 GLES/EGL 预览窗口,请省略
libepoxy-dev
。
要使用 Qt 预览窗口,请安装以下附加依赖项:
$ sudo apt install -y qtbase5-dev libqt5core5a libqt5gui5 libqt5widgets5
为了在树莓派系统中支持 libav
,请安装以下附加依赖项:
$ sudo apt install libavcodec-dev libavdevice-dev libavformat-dev libswresample-dev
如果你使用精简版树莓派系统,请安装 git
:
$ sudo apt install -y git
接下来,构建 rpicam-apps。
注意
请仅在你需要定制行为或最新功能尚未进入 apt 存储库时,才从头开始构建
libcamera
。
$ sudo apt install -y python3-pip git python3-jinja2
首先,安装以下 libcamera
依赖项:
$ sudo apt install -y libboost-dev
$ sudo apt install -y libgnutls28-dev openssl libtiff5-dev pybind11-dev
$ sudo apt install -y qtbase5-dev libqt5core5a libqt5gui5 libqt5widgets5
$ sudo apt install -y meson cmake
$ sudo apt install -y python3-yaml python3-ply
$ sudo apt install -y libglib2.0-dev libgstreamer-plugins-base1.0-dev
现在我们准备构建 libcamera 本身。
从 GitHub 下载树莓派的 libcamera 本地副本:
$ git clone https://github.com/raspberrypi/libcamera.git
切换到存储库的根目录:
$ cd libcamera
接下来,运行 meson
来配置构建环境:
$ meson setup build --buildtype=release -Dpipelines=rpi/vc4,rpi/pisp -Dipas=rpi/vc4,rpi/pisp -Dv4l2=true -Dgstreamer=enabled -Dtest=false -Dlc-compliance=disabled -Dcam=disabled -Dqcam=disabled -Ddocumentation=disabled -Dpycamera=enabled
注意
在 meson 构建配置期间,你可以通过将
-Dgstreamer=enabled
替换为-Dgstreamer=disabled
来禁用gstreamer
插件。如果禁用 gstreamer,则无需安装libglib2.0-dev
和libgstreamer-plugins-base1.0-dev
依赖项。
现在,你可以使用 ninja
构建 libcamera
:
$ ninja -C build
最后,运行以下命令安装你刚构建的 libcamera
二进制文件:
$ sudo ninja -C build install
技巧
在内存小于 1GB 的设备上,构建过程可能超出可用内存。应在
ninja
命令中添加参数-j 1
将构建限制为单个进程。这应该可以防止在树莓派 Zero 和树莓派 3 等设备上溢出可用内存。
libcamera
尚未具有稳定的二进制接口。始终在构建 libcamera
之后构建 rpicam-apps
。
rpicam-apps
首先获取 rpicam-apps
的必要依赖项。
$ sudo apt install -y cmake libboost-program-options-dev libdrm-dev libexif-dev
$ sudo apt install -y meson ninja-build
下载树莓派的 rpicam-apps
GitHub 存储库的本地副本:
$ git clone https://github.com/raspberrypi/rpicam-apps.git
切换到存储库的根目录:
$ cd rpicam-apps
对于像树莓派系统这样的基于桌面的操作系统,使用以下 meson
命令配置 rpicam-apps
构建:
$ meson setup build -Denable_libav=enabled -Denable_drm=enabled -Denable_egl=enabled -Denable_qt=enabled -Denable_opencv=disabled -Denable_tflite=disabled
对于像精简版树莓派系统这样的无头操作系统,使用以下 meson
命令配置 rpicam-apps
构建:
$ meson setup build -Denable_libav=disabled -Denable_drm=enabled -Denable_egl=disabled -Denable_qt=disabled -Denable_opencv=disabled -Denable_tflite=disabled
技巧
使用
-Dneon_flags=armv8-neon
来启用树莓派 3 或树莓派 4 上 32 位操作系统的优化。如果已安装 OpenCV 并希望使用基于 OpenCV 的后处理阶段,请使用-Denable_opencv=enabled
。如果已安装 TensorFlow Lite 并希望在后处理阶段中使用它,请使用-Denable_tflite=enabled
。
现在可以使用以下命令构建 rpicam-apps
:
$ meson compile -C build
技巧
在内存为 1GB 或更小的设备上,编译可能会溢出可用内存。请在 meson 命令中附加参数
-j 1
,将构建限制为单个进程。这应该可以防止在设备上如树莓派 Zero 和树莓派 3 上超出可用内存。 最后,运行以下命令安装你新构建的rpicam-apps
二进制文件:
$ sudo meson install -C build
安装后打开一个新的终端窗口,以确保你使用新的二进制文件。
最后,在“配置”部分遵循 dtoverlay
和显示驱动程序说明。
meson 构建配置支持以下标志:
-Dneon_flags=armv8-neon
在运行 32 位操作系统的树莓派 3、4 设备上加快某些后处理功能。
-Denable_libav=enabled
启用/禁用 libav 编码器集成。
-Denable_drm=enabled
启用/禁用 DRM/KMS 预览渲染,这是在没有桌面环境的情况下使用的预览窗口。
-Denable_egl=enabled
启用/禁用非 Qt 桌面环境的预览。如果你的系统缺少桌面环境,请禁用。
-Denable_qt=enabled
启用/禁用对预览窗口的基于 Qt 的实现的支持。如果未安装桌面环境或者不打算使用基于 Qt 的预览窗口,则禁用它。通常不推荐使用基于 Qt 的预览,因为它在计算上非常昂贵,但它可以与 X 显示转发一起使用。
-Denable_opencv=enabled
强制 OpenCV 基于的后处理阶段链接或不链接。需要启用 OpenCV。默认为 disabled
。
-Denable_tflite=enabled
启用或禁用 TensorFlow Lite 后处理阶段。默认情况下禁用。需要启用 Tensorflow Lite。根据你构建和/或安装 TFLite 的方式,你可能需要调整 post_processing_stages
目录中的文件 meson.build
。
以上参数中的每个参数( neon_flags
除外)支持以下值:
enabled
:启用该参数,如果依赖项不可用,则构建失败
disabled
:禁用该参数
auto
:如果有依赖项可用,则启用该参数
libepoxy
通常情况下不应重新构建 libepoxy
,因为此库很少更改。但是,如果确实要从头构建它,请按照以下说明操作。
从安装必要的依赖项开始。
$ sudo apt install -y libegl1-mesa-dev
接下来,从 GitHub 下载 libepoxy 存储库的本地副本:
$ git clone https://github.com/anholt/libepoxy.git
切换到存储库的根目录:
$ cd libepoxy
在存储库的根目录创建一个构建目录,然后进入该目录:
$ mkdir _build
$ cd _build
接下来,运行 meson
以配置构建环境:
$ meson
现在,你可以使用 ninja
构建 libexpoxy :
$ ninja
最后,运行以下命令安装你新构建的 libepoxy 二进制文件:
$ sudo ninja install
rpicam-apps
并未提供所有摄像头相关功能,所有人都可能需要。相反,这些应用程序体积小巧灵活。需要不同行为的用户可以自行实现。
所有的 rpicam-apps
使用一个事件循环,当从摄像头系统接收到一组新的帧时会收到消息。这组帧被称为 CompletedRequest
。这个 CompletedRequest
包含:
所有从单个摄像头帧派生的图像:通常是低分辨率图像和全尺寸输出
来自摄像头和后处理系统的元数据
rpicam-hello
rpicam-hello
是最小的应用程序,也是理解 rpicam-apps
设计的最佳起点。它从消息中提取 CompletedRequestPtr
,一个指向 CompletedRequest
的共享指针,并将其转发到预览窗口:
CompletedRequestPtr &completed_request = std::get<CompletedRequestPtr>(msg.payload);
app.ShowPreview(completed_request, app.ViewfinderStream());
每个 CompletedRequest
必须被回收到摄像头系统,以便缓冲区可以被重用。否则,摄像头会因为没有新的摄像头帧的缓冲区而耗尽。当不再有引用使用 C++ 的共享指针和自定义删除器机制时,这个回收过程会自动发生。
因此,rpicam-hello
必须完成以下操作以回收缓冲区空间:
事件循环必须完成一个周期,以便消息(代码中的 msg ),其中保存对 CompletedRequest
的引用,可以被下一条消息替换。这会丢弃对上一条消息的引用。
当事件线程调用 ShowPreview
时,它会向预览线程传参对 CompletedRequest
的引用。每次调用 ShowPreview
时,预览线程都会丢弃上一个 CompletedRequest
实例。
rpicam-vid
rpicam-vid 类似于 rpicam-hello
,在事件循环中添加了编码。在事件循环开始之前,rpicam-vid
会使用回调函数配置编码器。回调函数处理包含编码图像数据的缓冲区。在下面的代码中,我们将缓冲区发送到 Output
对象。Output
可以根据指定的参数将其写入文件或流式传输。
app.SetEncodeOutputReadyCallback(std::bind(&Output::OutputReady, output.get(), _1, _2, _3, _4));
因为此代码向编码器传参了对 CompletedRequest
的引用,所以 rpicam-vid
直到事件循环、预览窗口和编码器都丢弃它们的引用之前,无法回收缓冲区数据。
rpicam-raw
rpicam-raw
类似于 rpicam-vid
。它也在事件循环中进行编码。然而,rpicam-raw
使用了一个名为 NullEncoder 的虚拟编码器。它将输入图像用作输出缓冲区,而不是使用编解码器对其进行编码。NullEncoder 仅在输出回调完成后丢弃对缓冲区的引用。这确保在回调处理图像之前不会回收缓冲区。
rpicam-raw
不会将任何内容转发到预览窗口。
NullEncoder 在 rpicam-raw
可能过度。我们可能直接将图像发送到 Output 对象,而不是。但是,rpicam-apps
需要限制事件循环中的工作。NullEncoder 演示了如何在其他线程中处理大多数进程(甚至保持引用)。
rpicam-jpeg
rpicam-jpeg
以通常方式启动预览模式中的相机。计时器完成时,它会停止预览并切换到静态捕获:
app.StopCamera();
app.Teardown();
app.ConfigureStill();
app.StartCamera();
事件循环从静态模式返回的第一帧并将其保存为 JPEG。
libcamera
与 QtQt 是一种流行的应用程序框架和 GUI 工具包。rpicam-apps
包括一个参数,可以在相机预览窗口中使用 Qt。
不幸的是,Qt 在全局命名空间中将某些符号(如 slot
和 emit
)定义为宏。这会导致包含 libcamera
文件时出错。这个问题在所有同时使用 Qt 和 libcamera
的平台上都很常见。尝试以下解决方法以避免这些错误:
尽可能在全部情况下在 Qt 头文件之前列出 libcamera
包含文件,或包含 libcamera
文件的文件(如 rpicam-apps
文件)。
如果确实需要将 Qt 应用程序文件与 libcamera
包含混合在一起,请用 Q_SIGNALS:
替换 signals:
,用 Q_SLOTS:
替换 slots:
,用 Q_EMIT
替换 emit
,用 Q_FOREACH
替换 foreach
。
在所有 libcamera
包含文件的顶部添加以下内容:
#undef signals
#undef slots
#undef emit
#undef foreach
如果你的项目使用 qmake
,请将 CONFIG += no_keywords
添加到项目文件中。
如果你的项目使用 cmake
,请添加 SET(QT_NO_KEYWORDS ON)
。
Picamera2 库是基于 rpicam 的替代品,用于取代 Picamera,后者是 Python 接口,用于树莓派的旧版摄像头堆栈。Picamera2 提供了易于使用的 Python API。
有关 Picamera2 的文档可在 GitHub 和 Picamera2 手册中找到。
最近的树莓派系统镜像包含了 Picamera2 以及所有 GUI(Qt 和 OpenGL)依赖项。最近的精简版树莓派系统镜像包含了 Picamera2 但不包含 GUI 依赖项,尽管可以使用 DRM/KMS 来显示预览图像。
如果你的镜像不包含 Picamera2,请运行以下命令安装包含所有 GUI 依赖项的 Picamera2:
$ sudo apt install -y python3-picamera2
如果你不想要 GUI 依赖项,可以运行以下命令安装 Picamera2 而不安装 GUI 依赖项:
$ sudo apt install -y python3-picamera2 --no-install-recommends
注意
如果你之前使用 pip 安装了 Picamera2,请使用以下命令卸载:
pip3 uninstall picamera2
。
大多数树莓派设备都有专用端口用于摄像头模块。摄像头模块是高质量、高度可配置的摄像头,深受树莓派用户喜爱。
然而,对于许多用途,USB 网络摄像头具备你从树莓派记录图片和视频所需的一切。本节将解释如何在树莓派上使用 USB 网络摄像头。
首先,安装 fswebcam 软件包:
$ sudo apt install fswebcam
接下来,将你的用户名添加到 video 组,否则你可能会看到“权限被拒绝”错误:
$ sudo usermod -a -G video <用户名>
要检查用户是否已正确添加到组中,请使用命令 groups
。
运行以下命令使用网络摄像头拍照并将图像保存到名为 image.jpg
的文件中:
$ fswebcam image.jpg
你应该看到类似以下内容的输出:
--- Opening /dev/video0...
Trying source module v4l2...
/dev/video0 opened.
No input was specified, using the first.
Adjusting resolution from 384x288 to 352x288.
--- Capturing frame...
Corrupt JPEG data: 2 extraneous bytes before marker 0xd4
Captured frame in 0.00 seconds.
--- Processing captured image...
Writing JPEG image to 'image.jpg'.
默认情况下,fswebcam 使用低分辨率,并添加显示时间戳的横幅。
要为捕获的图像指定不同的分辨率,请使用参数 -r
,传参宽度和高度作为两个由 x
分隔的数字:
$ fswebcam -r 1280x720 image2.jpg
你应该看到类似以下输出:
--- Opening /dev/video0...
Trying source module v4l2...
/dev/video0 opened.
No input was specified, using the first.
--- Capturing frame...
Corrupt JPEG data: 1 extraneous bytes before marker 0xd5
Captured frame in 0.00 seconds.
--- Processing captured image...
Writing JPEG image to 'image2.jpg'.
指定分辨率以捕获更高质量的图像。
要从捕获的图像中删除横幅,请使用参数 --no-banner
:
$ fswebcam --no-banner image3.jpg
你应该看到类似以下内容的输出:
--- Opening /dev/video0...
Trying source module v4l2...
/dev/video0 opened.
No input was specified, using the first.
--- Capturing frame...
Corrupt JPEG data: 2 extraneous bytes before marker 0xd6
Captured frame in 0.00 seconds.
--- Processing captured image...
Disabling banner.
Writing JPEG image to 'image3.jpg'.
指定 --no-banner
以保存图像而不带有时间戳横幅。
与 rpicam-apps
不同,fswebcam 没有内置什么功能来替换输出图像名称中的时间戳和数字。在捕获多个图像时,手动编辑文件名可能会很繁琐。相反,使用 Bash 脚本来实现这个功能。
在你的主文件夹中创建一个名为 webcam.sh
的新文件。添加以下示例代码,该代码使用 bash 编程语言将图像保存到文件中,文件名包含年、月、日、小时、分钟和秒:
#!/bin/bash
DATE=$(date +"%Y-%m-%d_%H-%M-%S")
fswebcam -r 1280x720 --no-banner $DATE.jpg
然后,通过运行以下命令使 bash 脚本可执行:
$ chmod +x webcam.sh
使用以下命令运行脚本,捕获图像并将其保存到带有时间戳名称的文件中,类似于 2024-05-10_12-06-33.jpg
:
$ ./webcam.sh
你应该看到类似以下内容的输出:
--- Opening /dev/video0...
Trying source module v4l2...
/dev/video0 opened.
No input was specified, using the first.
--- Capturing frame...
Corrupt JPEG data: 2 extraneous bytes before marker 0xd6
Captured frame in 0.00 seconds.
--- Processing captured image...
Disabling banner.
Writing JPEG image to '2024-05-10_12-06-33.jpg'.
使用 cron 来安排照片捕捉以给定间隔。通过正确的间隔,比如每分钟一次,你可以捕捉一个延时摄影。
首先,打开用于编辑的 cron 表:
$ crontab -e
请你在编辑器中打开文件,添加以下行到计划中,每分钟拍照一次,用你的用户名替换 <用户名>
:
* * * * * /home/<用户名>/webcam.sh 2>&1
保存并退出,然后你应该看到以下消息:
crontab: installing new crontab
V4L2 驱动程序为访问摄像头和编解码器功能提供了标准的 Linux 接口。通常,Linux 在启动时会自动加载驱动程序。但在某些情况下,你可能需要显式加载摄像头驱动程序。
/dev/videoX
默认操作
video0
第一个 CSI-2 接收器的 Unicam 驱动程序
video1
第二个 CSI-2 接收器的 Unicam 驱动程序
video10
视频解码
video11
视频编码
video12
简单的 ISP,除了 Bayer 到 RGB/YUV 转换外,还可以在 RGB/YUV 格式之间执行转换和调整大小
video13
输入到完全可编程的 ISP
video14
来自完全可编程 ISP 的高分辨率输出
video15
完全可编程 ISP 的低结果输出
video16
完全可编程 ISP 的图像统计
video19
HEVC 解码
有关如何使用 V4L2 驱动程序的更多信息,请参阅 V4L2 文档。
树莓派 SoC 都有两个相机接口,支持 CSI-2 D-PHY 1.1 或紧凑相机端口 2(CCP2)源。该接口以代号 Unicam 而闻名。第一个 Unicam 实例支持两个 CSI-2 数据通道,而第二个支持四个。每个通道最高可运行速度为 1Gbit/s(DDR,因此最大链路频率为 500MHz)。
计算模块和树莓派 5 都将两个外设的所有通道路由出去。在树莓派 5 之前的其他型号只暴露第二个实例,只将两个数据通道路由到相机连接器。
V4L2 软件接口是与 Unicam 外围设备通信的唯一方式。曾经还有固件和 MMAL rawcam 组件接口,但这些已不再受支持。
注意
仅在使用 libcamera 时,Unicam 的 V4L2 接口可用。
为 Unicam 块提供了一个完全开源的内核驱动程序;这个内核模块,称为 bcm2835-unicam,与 V4L2 子设备驱动程序进行交互,传参原始帧。这个 bcm2835-unicam 驱动程序控制传感器并配置摄像头串行接口 2(CSI-2)接收器。外围设备将原始帧(经过 Debayer 处理)写入 SDRAM,以便 V4L2 传参给应用程序。在摄像头传感器捕获图像和 bcm2835-unicam 驱动程序将图像数据放入 SDRAM 之间,除了 Bayer 解包到 16 位/像素之外,没有图像处理。
|------------------------|
| bcm2835-unicam |
|------------------------|
^ |
| |-------------|
img | | Subdevice |
| |-------------|
v -SW/HW- |
|---------| |-----------|
| Unicam | | I²C 或 SPI|
|---------| |-----------|
csi2/ ^ |
ccp2 | |
|-----------------|
| sensor |
|-----------------|
主线 Linux 包含一系列现有驱动程序。树莓派内核树具有一些额外的驱动程序和设备树叠加,用于配置它们:
Omnivision OV5647
500 万像素摄像头
原装树莓派摄像头
索尼 IMX219
800 万像素相机
旧版树莓派相机
索尼 IMX477
1200 万像素相机
树莓派 HQ 相机
索尼 IMX708
1200 万像素相机
树莓派相机模块 3
索尼 IMX296
160 万像素相机
树莓派全局快门相机模块
Toshiba TC358743
HDMI 到 CSI-2 桥接器
模拟设备 ADV728x-M
模拟视频到 CSI-2 桥接器
不支持隔行扫描
Infineon IRS1125
飞行时间深度传感器
由第三方支持
由于子设备驱动程序也是具有标准化 API 的内核驱动程序,第三方可以自由地为他们选择的来源编写自己的驱动程序。
这是通过 Unicam 进行接口的推荐方法。
当为打算与 bcm2835-unicam
模块一起使用的新设备开发驱动程序时,你需要驱动程序和相应的设备树叠加。理想情况下,应将驱动程序提交给 linux-media 邮件列表进行代码审查和合并到主线,然后移至内核树;但也可以对直接将驱动程序进行审查和合并到树莓派内核做出例外。
注意
所有内核驱动程序均在 GPLv2 许可下授权,因此必须提供源代码。仅提供二进制模块的行为会违反 Linux 内核的 GPLv2 授权许可。
旧版 bcm2835-unicam
模块已经编写,以尝试适应当前在主线 Linux 内核中找到的所有类型的 CSI-2 源驱动程序。这些可以大致分为相机传感器和桥接芯片。桥接芯片允许在某些其他格式和 CSI-2 之间进行转换。
相机传感器的传感器驱动程序负责设备的所有配置,通常通过 I²C/SPI。与从头开始编写驱动程序不同,通常更容易以现有驱动程序为基础并根据需要进行修改。
IMX219 驱动程序是一个很好的起点。该驱动程序支持 8 位和 10 位 Bayer 读出,因此枚举帧格式和帧大小稍微复杂一些。
传感器通常支持 V4L2 用户控件。并非所有这些控件都需要在驱动程序中实现。IMX219 驱动程序仅实现了一个小子集,如下所列,其实现由 imx219_set_ctrl
函数处理。
V4L2_CID_PIXEL_RATE
/ V4L2_CID_VBLANK
/ V4L2_CID_HBLANK
:允许应用程序设置帧速率
V4L2_CID_EXPOSURE
:设置曝光时间(以行为单位);应用程序需要使用 V4L2_CID_PIXEL_RATE
、V4L2_CID_HBLANK
和帧宽度来计算行时间
V4L2_CID_ANALOGUE_GAIN
:传感器特定单位中的模拟增益
V4L2_CID_DIGITAL_GAIN
:传感器特定单位中的可选数字增益
V4L2_CID_HFLIP
/ V4L2_CID_VFLIP
:将图像水平或垂直翻转;此操作可能会改变帧中数据的 Bayer 顺序,就像在 IMX219 上的情况一样。
V4L2_CID_TEST_PATTERN
/ V4L2_CID_TEST_PATTERN_*
:启用从传感器输出各种测试图案;用于调试
在 IMX219 的情况下,许多这些控件直接映射到对传感器本身的寄存器写入。
进一步的指导可在 libcamera 传感器驱动要求和树莓派摄像头调整指南第 3 章中找到。
设备树
设备树用于选择传感器驱动程序并配置参数,如 CSI-2 通道数量、连续时钟通道操作和链路频率(通常仅支持一个)。
6.1 内核的 IMX219 设备树叠加层可在 GitHub 上获得。
这些是将传入的视频流(例如 HDMI 或复合视频)转换为可以被树莓派 CSI-2 接收器接受的 CSI-2 流的设备。
处理桥接芯片更加复杂。与摄像头传感器不同,它们必须响应传入信号并将其报告给应用程序。
处理桥接芯片的机制可以分为两类:模拟或数字。
在下面的部分中使用 ioctls 时,名称中的 S 表示它是一个设置函数,而 G 是一个获取函数,ENUM 列举了一组允许的值。
模拟视频源
模拟视频源使用标准 ioctls
来检测和设置视频标准。VIDIOC_G_STD
,VIDIOC_S_STD
,VIDIOC_ENUMSTD
,和 VIDIOC_QUERYSTD
可用。
选择错误的标准通常会导致图像损坏。设置标准通常也会在 V4L2 捕获队列上设置分辨率。无法通过 VIDIOC_S_FMT
设置。通常,在流媒体之前通过 VIDIOC_QUERYSTD
请求检测到的标准,然后用 VIDIOC_S_STD
设置是个好主意。
数字视频源
对于数字视频源,如 HDMI,有一组备用调用,允许指定所有数字定时参数: VIDIOC_G_DV_TIMINGS
,VIDIOC_S_DV_TIMINGS
,VIDIOC_ENUM_DV_TIMINGS
,和 VIDIOC_QUERY_DV_TIMINGS
。
与模拟桥一样,定时通常固定 V4L2 捕获队列分辨率,并在流之前使用 VIDIOC_QUERY_DV_TIMINGS
的结果调用 VIDIOC_S_DV_TIMINGS
应确保格式正确。
根据桥接芯片和驱动程序的不同,可能通过 VIDIOC_SUBSCRIBE_EVENT
和 V4L2_EVENT_SOURCE_CHANGE
向应用程序报告输入源的更改。
目前支持的设备
树莓派的 Linux 内核目前支持两种桥接芯片:用于模拟视频源的 Analog Devices ADV728x-M 和用于 HDMI 源的 Toshiba TC358743。
Analog Devices ADV728x(A)-M 模拟视频到 CSI2 桥接芯片将复合 S 视频(Y/C)或分量(YPrPb)视频转换为单通道 CSI-2 接口,并受 ADV7180 内核驱动程序支持。
有关该芯片各个版本的产品详细信息,请访问 Analog Devices 网站:ADV7280A,ADV7281A 和 ADV7282A。
由于当前核心 V4L2 实现中存在一些缺失的代码,选择源失败,因此树莓派内核版本添加了一个内核模块参数 dbg_input 到 ADV7180 内核驱动程序,每次调用 VIDIOC_S_STD 时设置输入源。在某个时候,主流将修复底层问题(内核 API 调用 s_routing
和用户空间调用 VIDIOC_S_INPUT
之间的不一致),并将删除此修改。
不支持接收隔行视频,因此 ADV7281(A)-M 版本的芯片的用途有限,因为它没有必要的 I2P 去隔行块。在选择设备时,请确保指定-M 参数。如果没有,你将获得一个无法与树莓派接口的并行输出总线。
目前没有已知商用板使用这些芯片,但此驱动程序已通过模拟器件 EVAL-ADV7282-M 评估板进行了测试。
如果你使用的是基于 ADV7282-M 芯片的衍生,则可以使用 config.txt
dtoverlay adv7282m
加载此驱动程序;或者如果你使用其他变体,则可以使用参数 adv7280m=1
、adv7281m=1
或 adv7281ma=1
加载。
dtoverlay=adv728x-m,adv7280m=1
Toshiba TC358743 是一款 HDMI 到 CSI-2 桥接芯片,能够将视频数据转换为高达 1080p60。
可在 Toshiba 网站上找到有关此桥接芯片的信息。
TC358743 将 HDMI 接口转换为 CSI-2 和 I²S 输出。它受 TC358743 内核模块支持。
芯片支持将传入的 HDMI 信号作为 RGB888、YUV444 或 YUV422,最高支持 1080p60。它可以转发 RGB888,或将其转换为 YUV444 或 YUV422,并在 YUV444 和 YUV422 之间双向转换。仅已测试 RGB888 和 YUV422 支持。当使用两个 CSI-2 通道时,支持的最大速率为 1080p30 作为 RGB888,或 1080p50 作为 YUV422。在计算模块上使用四个通道时,1080p60 可以以任一格式接收。
HDMI 通过接收设备广告 EDID 来协商分辨率,其中包含其支持的所有模式。内核驱动程序不了解你希望接收的分辨率、帧率或格式,因此用户需要通过 VIDIOC_S_EDID ioctl
提供一个合适的文件,或者更容易地使用 v4l2-ctl --fix-edid-checksums --set-edid=file=filename.txt
(添加参数 --fix-edid-checksums
意味着你不必在源文件中正确获取校验和值)。生成所需的 EDID 文件(二进制 EDID 文件的文本十六进制转储)并不太繁琐,有可用工具可用于生成它们,但这超出了本页面的范围。
如上所述,使用 DV_TIMINGS ioctl
配置驱动程序以匹配传入视频。这样做的最简单方法是使用命令 v4l2-ctl --set-dv-bt-timings query
。驱动程序确实支持生成 SOURCE_CHANGED
事件,如果你希望编写一个处理变化源的应用程序。通过设置输出像素格式来实现更改像素格式,但只有像素格式字段将被更新,因为分辨率是由 DV 定时配置的。
有几块商用板可以将该芯片连接到树莓派。Auvidea B101 和 B102 是最常见的,但也有其他等效的板可用。
使用 config.txt
dtoverlay tc358743
加载此驱动程序。
该芯片还支持通过 I²S 捕获立体声 HDMI 音频。Auvidea 板将相关信号引出到一个标头,可连接到树莓派的 40 引脚排针。所需的接线是:
LRCK/WFS
7
35
19
BCK/SCK
6
12
18
DATA/SD
5
38
20
GND
8
39
不适用
除了叠加层 tc358743
外,还需要叠加层 tc358743-audio
。这应该为 HDMI 音频创建一个 ALSA 录音设备。
音频不进行重新采样。音频的存在反映在 V4L2 控制 TC358743_CID_AUDIO_PRESENT
(音频存在) 中,传入音频的采样率反映在 V4L2 控制 TC358743_CID_AUDIO_SAMPLING_RATE
(音频采样频率) 中。当没有音频存在或者采样率与报告的不同时录制会发出警告。
rpicam
和 raspicam
之间的差异rpicam-apps
模拟旧版 raspicam
应用程序的大多数功能。然而,用户可能会注意到以下差异:
Boost program_options
不允许参数的多字符短版本,因此这些参数不得不被删除。长格式参数以相同的方式命名,并保留任意单字符短格式。
rpicam-still
和 rpicam-jpeg
在预览窗口中不显示捕获的图像。
rpicam-apps
移除了以下 raspicam
功能:
不透明度 ( --opacity
)
图像效果 ( --imxfx
)
色彩效果 ( --colfx
)
注释( --annotate
,--annotateex
)
动态范围压缩,或 DRC( --drc
)
立体声( --stereo
,--decimate
和 --3dswap
)
图像稳定 ( --vstab
)
演示模式 ( --demo
) 后期处理替换了许多这些功能。
rpicam-apps 移除了参数 rotation
支持 90° 和 270° 旋转。
raspicam 混淆了计量和曝光;rpicam-apps 将这些参数分开。
要在 rpicam-apps 中禁用自动白平衡(AWB),请使用一对色彩增益设置 awbgains (例如 1.0,1.0 )。
rpicam-apps 无法将 NoIR 相机模块的自动白平衡(AWB)设置为灰世界模式。相反,将参数 tuning-file
传参给一个红外夜视特定的调整文件,如 imx219_noir.json
。
rpicam-apps 不提供对数字增益的显式控制。相反,参数 gain
隐式设置它。
rpicam-apps 移除了参数 --ISO
参数。相反,计算所需 ISO 值对应的增益。供应商可以提供增益到 ISO 的映射。
rpicam-apps 不支持设置闪烁周期。
rpicam-still 不支持连拍。相反,考虑在 MJPEG 模式下使用 rpicam-vid,并使用 --segment 1
强制将每帧保存为单独的文件。
rpicam-apps 使用开源驱动程序来驱动所有图像传感器,因此启用或禁用传感器上的瑕疵像素校正(DPC)的机制是不同的。树莓派 HQ 摄像头上的 imx477 驱动程序默认启用传感器上的 DPC。要在 HQ 摄像头上禁用传感器上的 DPC,请运行以下命令:
$ sudo echo 0 > /sys/module/imx477/parameters/dpc_enable
如果你的摄像头模块不像你期望的那样工作,请尝试以下一些修复方法:
在树莓派 3 及更旧版本的设备上运行树莓派系统 Bullseye 及更旧的版本:
要启用硬件加速的摄像头预览,请启用 Glamor。要启用 Glamor,请在终端中输入 sudo raspi-config
,选择 Advanced Options > Glamor > Yes。然后使用 sudo reboot
重启你的树莓派。
如果你看到与显示驱动程序相关的错误,请将 dtoverlay=vc4-fkms-v3d
或 dtoverlay=vc4-kms-v3d
添加到 /boot/config.txt
。然后使用 sudo reboot
重启你的树莓派。
在旧版树莓派 3 及更早版本上,图形硬件只能支持最大尺寸为 2048×2048 像素的图像,这限制了可以调整大小以适应预览窗口的相机图像。因此,对大于 2048 像素宽的图像进行视频编码会产生损坏或缺失的预览图像。
在树莓派 4 上,图形硬件只能支持最大尺寸为 4096×4096 像素的图像,这限制了可以调整大小以适应预览窗口的相机图像。因此,对大于 4096 像素宽的图像进行视频编码会产生损坏或缺失的预览图像。
预览窗口可能在桌面环境中显示屏幕撕裂。这是一个已知的,无法修复的问题。
检查 FFC(平面柔性电缆)是否牢固插入,完全插入,并且接触面朝向正确方向。FFC 应该均匀插入,不应倾斜。
如果你在相机和你的树莓派之间使用连接器,请检查连接器上的端口是否牢固插入,完全插入,并且接触面朝向正确方向。
检查确保 FFC(平面柔性电缆)连接到 CSI(摄像头串行接口),而不是 DSI(显示串行接口)。连接器适配到任一端口,但只有 CSI 端口可以为摄像头供电和控制。在靠近端口的板上查找打印的 CSI 标签。
尝试不同的电源适配器。摄像头模块会给你的树莓派的电源需求增加约 200-250mA。如果你的电源适配器质量不高,你的树莓派可能无法为摄像头模块供电。
如果你已经检查了上述所有问题,但摄像头模块仍然无法按照你的期望工作,请尝试在我们的论坛上发帖以获取更多帮助。
要获取有关 libcamera 和 rpicam-apps
的进一步帮助,请查看树莓派摄像头论坛。在发帖之前:
记下你的操作系统版本( uname -a
)。
记下你 libcamera 和 rpicam-apps
的版本( rpicam-hello --version
)。
报告你正在使用的摄像头模块的制造商和型号。
报告你正在尝试使用的软件。我们不支持第三方摄像头模块供应商的软件。
报告你的树莓派型号,包括内存大小。
包括应用程序控制台输出中的所有相关摘录。
如果相机软件中存在特定问题(例如崩溃),请考虑在 GitHub 存储库中创建一个问题,包括上面列出的相同细节。
raspi-config
技巧
树莓派桌面版(Raspberry Pi Desktop)用户可使用图形化版本的
raspi-config
:位于“首选项(Preferences)” → “树莓派配置(Raspberry Pi Configuration)”。不过某些高级配置仅存在于raspi-config
。
raspi-config
能帮你配置树莓派。对于不同的树莓派型号,可配置的参数也不尽相同。若要打开这款配置工具,请执行如下命令:
$ sudo raspi-config
你将在灰色窗口中,看到显现的蓝色背景界面,上面带有各种参数:
用 上箭头(↑)、下箭头(↓),你就能在可选条目间自由切换,当前所选会被高亮。
按 右箭头(→)、Tab 键 可切换按钮 <Select>
和 <Finish>
。按 左箭头(←)、Tab 键 可返回上级菜单。
raspi-config
会自动修改 /boot/firmware/config.txt
及相关 Linux 配置文件。个别参数可能需要重启后才能生效:如果你修改了他们当中任何一个,在退出时,raspi-config
会要求你重启。
技巧
在参数值所提供的冗长列表中(如时区城市列表),输入单个字母即可跳转到列表中的对应部分。例如,输入
L
会跳转至 Lisbon(里斯本)。
系统参数(System options)的子菜单:能让你对启动、登录和网络过程的相关部分进行配置修改,以及其他系统级的修改。
可配置 WiFi 网络名称(SSID)和密码。
指定音频输出位置。
修改你的密码。
获取更多信息,请参阅修改用户密码。
在网络上为树莓派设置可见的 mDNS 域名。
选择启动到控制台,还是桌面。以及在接通电源时,是否自动登录到当前用户账户。
在启动前等待网络连接。
启用或禁用:开机时显示的启动画面。
如果你的树莓派型号支持,可以修改电源灯的行为。
修改默认的网络浏览器。
注意
在 Wayland 下不可用。
如果在屏幕上显示的文本开头于屏幕边缘消失,可启用 overscan(过扫描)调整边框。在某些显示器(特别是监控器)上,禁用过扫描会使画面填充到整个屏幕,即去除黑边。
启用或禁用:Screen blanking——屏幕节能(无操作时关闭信号输出)。
用于无头设置所用的显示分辨率。
启用或禁用复合视频(composite video)。
启用或禁用:HDMI 的 4K 60p 分辨率输出。
启用和禁用各种物理接口、虚拟接口。
启用或禁用:树莓派终端 SSH 远程访问。
你可以在另一台计算机上,使用 SSH 远程访问树莓派的命令行。在默认情况下,SSH 处于禁用状态。在 SSH 文档页上能阅读更多关于 SSH 的使用信息。如果你将树莓派直接接入到了公共网络,请不要启用 SSH,除非你为所有用户都设置了安全的密码。
启用或禁用:WayVNC、RealVNC 虚拟网络计算服务(virtual network computing,VNC)。
启用或禁用:SPI 接口,是否自动加载 SPI 内核模块。
启用或禁用:I²C 接口,是否自动加载 I²C 内核模块。
启用或禁用:串口上的 shell 及内核信息输出。
启用或禁用:单总线(Dallas 1-wire)接口,通常用于 DS18B20 温度传感器。
启用或禁用:GPIO 引脚的远程访问。
如果你的树莓派型号支持,可对 CPU 超频。超频能力视树莓派设备个体体质而异,即使是相同型号也会有所不同。超频过高可能会导致不稳定。
警告
超频可能会缩短你树莓派的使用寿命。 如果因某个特定级别的超频导致系统不稳定,可以试试较为保守的超频。在启动过程中按住 Shift 键 可临时禁用超频。
改变向 GPU 提供的内存大小。
启用或禁用:只读文件系统。
可自定义接入 GPIO 的风扇行为(树莓派 4 外壳自带)。对树莓派 5 外壳自带风扇、树莓派 5 主动散热器(使用特殊四针风扇头)无效。
配置位置、国家/地区相关参数。
可选择语言环境,如 en_GB.UTF-8 UTF-8
(英语)(译者注:中文为zh_CN.UTF-8 UTF-8
)。
设置你的本地时区,从地区(译者注:Asia,亚洲)开始,然后选择城市(译者注:北京时间为 Shanghai),例如"Asia/Shanghai"(译者注:IANA 规范)。键入单个字母可跳转到列表中的该字母。
将打开菜单,你可以在其中选择你的键盘布局(译者注:目前中国使用标准美式键盘布局)。一般修改会立即生效,但可能需要重启。键入单个字母会跳转到列表中的字母所在。
为你的无线网络设置区域码。
扩展你的操作系统分区,可便利用整个存储设备,从而带来更大的文件存储空间。要完成此操作,你需重启树莓派。通常,在初次启开机时,树莓派系统会执行此操作。如果你把你的操作系统克隆到了容量大于旧设备的其他存储设备上,该功能可能会极其有用。
警告
没有再次确认的步骤。选择该参数会立刻开始分区扩展操作。
启用或禁用:可预测的网络接口名称。
配置网络代理。
在树莓派 4 及后续新款设备上,设定如下:在未插入存储卡的情况下,是否使用 USB 启动、网络启动。有关更多信息,请参阅启动加载程序配置。
在树莓派 4 及后续新款设备上,更新到最新的 ROM 引导软件。或者,倘若最新版本引发了故障,你可以在此恢复出厂默认设置。
在 X11 和 Wayland 后端间进行切换。在树莓派 4 及后续新款设备上,默认使用 Wayland。其他型号的树莓派默认使用 X11。
注意
要在树莓派 4 之前的型号上使用 Wayland,你还必须把
wayland=on
添加至/boot/firmware/cmdline.txt
。
在 Bookworm 以前,树莓派系统使用的是 PulseAudio。现在则可以在 PulseAudio 和 PipeWire 音频后端间进行切换。
把 raspi-config
更新到最新版本。
raspi-config
相关说明。
退出 raspi-config
。如果你进行的修改需要重启,raspi-config
会提示你重启。首次进行修改时,最好重启。如果选择了调整存储卡大小,重启可能会花比平时更久的时间。
raspi-config
工具 raspi-config
还支持非交互式选项及参数,无需可视化组件,就可以用命令行修改所有参数。可用参数可能因树莓派型号而异。
$ sudo raspi-config nonint <命令> <参数> [可选参数]
注意
0
和1
的含义因参数而异。在将值赋给参数之前,请务必查阅文档。
配置 WiFi 网络名称(SSID)和密码。
$ sudo raspi-config nonint do_wifi_ssid_passphrase <网络名称> <密码> [隐藏的网络] [明文]
填入无线网络名称(SSID)和密码(如需要)。以下是可选参数:
参数 <隐藏的网络>
代表网络名称可见性。如果网络名称开放广播,请使用 0
或省略该参数。如果你的网络名称是隐藏的,请填 1
。默认为 0
。
参数 <明文>
代表你是否打算明文传输密码。如果你的密码包含空格、特殊字符(如 !
),则必须使用 0
,并在密码两头加上英文双引号 "
。如无以上情形,你可以使用 1
或省略该参数。默认为 1
。但若要使用该参数,你必须同时赋值给 <隐藏的网络>
。
例如,通过执行以下命令,可以连接至:
未隐藏的网络 myssid
,密码为 mypassphrase
:
$ sudo raspi-config nonint do_wifi_ssid_passphrase myssid mypassphrase
隐藏的网络 myssid
,密码为 mypassphrase
:
$ sudo raspi-config nonint do_wifi_ssid_passphrase myssid mypassphrase 1
未隐藏的网络 myssid
,密码为 my passphrase
:
$ sudo raspi-config nonint do_wifi_ssid_passphrase myssid "my passphrase" 0 0
指定音频输出位置。
$ sudo raspi-config nonint do_audio <数字>
在树莓派 4B 上,你可使用以下参数:
0
:bcm2835 headphone jack(耳机插孔)
1
:vc4-hdmi-0
2
:vc4-hdmi-1
要查看参数 <数字>
的所有可用值列表,请参阅交互版 raspi-config
中所使用的缩写。
修改你的密码。
有关修改用户密码的更多信息,请参阅修改用户密码。
$ sudo raspi-config nonint do_change_pass
注意
此功能会使用全屏界面进行交互,即使在命令行执行参数亦如此。
在网络上为此树莓派设置可见的 mDNS 域名。
$ sudo raspi-config nonint do_hostname <主机名>
选择:启动到控制台,还是桌面;在接通电源时,是否自动登录到当前用户账户。
$ sudo raspi-config nonint do_boot_behaviour <B1/B2/B3/B4>
B1
:启动到控制台,需要登录
B2
:启动到控制台,自动登录
B3
:启动到桌面,需要登录
B4
:启动到桌面,自动登录
是否在启动前等待网络连接。
$ sudo raspi-config nonint do_boot_wait <0/1>
0
:启动前不等待网络连接
1
:启动前等待网络连接
启用或禁用:启动时显示的启动画面。
$ sudo raspi-config nonint do_boot_splash <0/1>
0
:启用启动画面
1
:禁用启动画面
如果你的树莓派型号支持,可以改变 LED 电源灯的行为。
$ sudo raspi-config nonint do_leds <0/1>
0
:用闪烁代表磁盘活动状态
1
:LED 电源灯常亮
修改默认的网络浏览器。若所选网络浏览器在当前并未安装,将不生效。
$ sudo raspi-config nonint do_browser <chromium-browser/firefox>
注意
在 Wayland 下不可用。
如果在屏幕上显示的文本开头于屏幕边缘消失,可启用 overscan(过扫描)调整边框。在某些显示器上,特别是监控器上,禁用过扫描会把图像填充到整个屏幕,即去除黑边。
$ sudo raspi-config nonint do_overscan_kms <device> <enabled>
设备:
1
: HDMI-1
2
: HDMI-2
使用:
0
:启用过扫描
1
:禁用过扫描
启用或禁用:屏幕节能(无操作时关闭屏幕信号)。
$ sudo raspi-config nonint do_blanking <0/1>
0
:启用屏幕节能(无操作时关闭屏幕信号)
1
:禁用屏幕节能(无操作时不会关闭屏幕信号)
用于无头设置所使用的显示分辨率。
$ sudo raspi-config nonint do_vnc_resolution <宽>x<高>
启用或禁用复合视频(composite video)输出。
在树莓派 4 上:
$ sudo raspi-config nonint do_pi4video <V1或V2或V3>
V1
:启用 HDMI 4K 60p 输出
V2
:启用复合视频输出
V3
:禁用 4K 60p 和复合输出
对于其他型号:
$ sudo raspi-config nonint do_composite <0或1>
0
:启用复合视频
1
:禁用复合视频
启用或禁用:树莓派终端 SSH 远程访问。
SSH 能让你在另一台计算机远程访问树莓派的命令行。有关 SSH 的更多信息,请参阅 SSH 文档。
$ sudo raspi-config nonint do_ssh <0或1>
0
:启用 SSH
1
:禁用 SSH
启用或禁用:虚拟网络计算服务(virtual network computing,VNC)。有关 VNC 的更多信息,请参阅 VNC 文档。
$ sudo raspi-config nonint do_vnc <0或1>
0
:启用 VNC
1
:禁用 VNC
启用或禁用:SPI 接口,是否自动加载 SPI 内核模块。
$ sudo raspi-config nonint do_spi <0或1>
0
:启用 SPI
1
:禁用 SPI
启用或禁用:I²C 接口,是否自动加载 I²C 内核模块。
$ sudo raspi-config nonint do_i2c <0或1>
0
:启用 I²C
1
:禁用 I²C
启用或禁用:串口硬件。
$ sudo raspi-config nonint do_serial_hw <0或1>
0
:启用串口
1
:禁用串口
启用或禁用: shell 及内核信息的串口输出。
$ sudo raspi-config nonint do_serial_cons <0或1>
0
:启用串口控制台
1
:禁用串口控制台
启用或禁用:Dallas 1-wire(单总线)接口,通常用于 DS18B20 温度传感器。
$ sudo raspi-config nonint do_onewire <0或1>
0
:启用 1-wire
1
:禁用 1-wire
启用或禁用:GPIO 引脚的远程访问。
$ sudo raspi-config nonint do_rgpio <0或1>
0
:启用 GPIO 远程访问
1
:禁用 GPIO 远程访问
若你的树莓派型号支持,可对 CPU 超频。超频潜力视树莓派设备个体体质而异,即使是相同型号也会有所不同。超频过高可能会导致不稳定。
警告
超频可能会缩短你树莓派的使用寿命。 如因某个特定级别的超频造成系统不稳定,可尝试更为保守的超频。在启动过程中按住 Shift 键 可暂时禁用超频。
$ sudo raspi-config nonint do_overclock <设置>
此命令接受以下 <设置>
值:
None
:不超频(默认)
Modest
:超频至最大值 50%
Medium
:超频至最大值 75%
High
:超频至最大值 100%
Turbo
:超频至最大值 125%
修改向 GPU 提供的内存量。
$ sudo raspi-config nonint do_memory_split <megabytes>
启用或禁用:只读文件系统。
$ sudo raspi-config nonint do_overlayfs <0或1>
0
:启用堆叠文件系统(OverlayFS)
1
:禁用堆叠文件系统(OverlayFS)
可自定义接入 GPIO 的风扇行为(树莓派 4 外壳自带)。对树莓派 5 外壳自带风扇、树莓派 5 主动散热器(使用特殊四针风扇接头接入)无效。
$ sudo raspi-config nonint do_fan <0/1> [gpio] [onTemp]
0
:启用风扇
1
:禁用风扇
默认 gpio
为 14。
onTemp
默认为 80 °C。
选择语言环境,如 en_GB.UTF-8 UTF-8
(英语)(译者注:中文为 zh_CN.UTF-8 UTF-8
)。
$ sudo raspi-config nonint do_change_locale <语言环境>
要查看参数 <语言环境>
的所有可用值列表,请参阅交互版 raspi-config
中所使用的缩写。
设置你的本地时区,从地区开始,然后选择城市,如"Asia/Shanghai"。
$ sudo raspi-config nonint do_change_timezone <时区>
要查看 <时区>
参数的所有缩写值列表,请参见交互版 raspi-config
。
设置键盘布局。一般来说,修改会立即生效,但也可能需重启才能生效。
$ sudo raspi-config nonint do_configure_keyboard <键盘布局>
要查看参数 <键盘布局>
的所有可用值列表,请参阅交互版 raspi-config
中所使用的缩写。
设置无线网络的区域码。
$ sudo raspi-config nonint do_wifi_country <区域码>
要查看 <区域码>
参数的所有可用值列表,请参阅交互版 raspi-config
中所使用的缩写。
扩展你的操作系统分区,可使用整个存储设备,能为你带来更多的文件存储空间。需要需重启你的树莓派才能完成该操作。通常,树莓派系统会在初次开机时执行此操作。如果你将你的操作系统克隆到了容量大于旧设备的其他存储设备上,该功能可能会极其有用。
警告
没有再次确认的步骤。选择该参数会立刻执行分区扩展操作。
$ sudo raspi-config nonint do_expand_rootfs
启用或禁用:可预测的网络接口名称。
$ sudo raspi-config nonint do_net_names <0或1>
0
:启用可预测的网络接口名称
1
:禁用可预测的网络接口名称
配置网络代理。
$ sudo raspi-config nonint do_proxy <代理服务器的协议类型> <代理服务器的地址>
对于树莓派 4 及后续新款设备,在未插入存储卡的情况下,指定:是否进行 USB 启动和网络启动。有关更多信息,请参阅引导加载程序配置。
$ sudo raspi-config nonint do_boot_order <B1或B2或B3>
视你的设备而定,你可以在以下参数中进行选择:
B1 :存储卡启动:若存储卡可用,则优先从存储卡启动;如存储卡不可用,再从 NVMe 启动;若存储卡、NVMe 均不可用,那么则从 USB 启动
B2 :NVMe/USB 启动:若 NVMe 可用,则优先从 NVMe 启动;如 NVMe 不可用,再从 USB 启动;若 NVMe、USB 均不可用,那么则从存储卡启动
B3 :网络启动:若存储卡可用,则优先从存储卡启动;如存储卡不可用,则从网络启动
对于树莓派 4 及后续新款设备,要更新到最新版的 ROM 引导软件。或者,倘若最新版本引发了故障,你也可以在此恢复出厂默认设置。
$ sudo raspi-config nonint do_boot_rom <E1或E2>
E1
:使用最新的引导 ROM
E2
:使用出厂默认设置
在 X11 和 Wayland 后端间进行切换。对于树莓派 4 及后续新款设备,默认使用 Wayland。其他型号的树莓派默认为 X11。
$ sudo raspi-config nonint do_wayland <W1或W2>
W1
:使用 X11 后端
W2
:使用 Wayland 后端
注意
要在树莓派 4 先前的型号上使用 Wayland,你还必须把
wayland=on
添加到/boot/firmware/cmdline.txt
。
使用此参数在 PulseAudio 和 PipeWire 音频后端之间进行切换。在树莓派系统 Bookworm 之前,树莓派系统使用 PulseAudio。
$ sudo raspi-config nonint do_audioconf <1或2>
1
:使用 PulseAudio 后端
2
:使用 PipeWire 后端
将 raspi-config
更新至最新版本。
$ sudo raspi-config nonint do_update
要配置你的树莓派,使用非默认显示模式,请手动设定分辨率和方向。
对于大多数 HDMI 显示器,树莓派系统都能使其达到最高分辨率和刷新率。
树莓派 Zero、Zero W 和 Zero 2 W 均搭载了 mini HDMI 接口,因此你需要 mini HDMI 转全尺寸 HDMI 转接线(转接头)。
树莓派 4、5 和 400 均搭载了两个 micro HDMI 端口,因此你需要为每台你想使用的显示器,各准备一份 micro HDMI 转标准 HDMI 转接线(转接头)。请在树莓派开机之前接入上述适配器。
树莓派 4 和 400 可以同时输出到两个显示器(高达 1080p 分辨率、60Hz 刷新率),或输出至两台 4K 30Hz 刷新率的显示器。如果你把显示器接入了 HDMI0
口,并在 /boot/firmware/config.txt
设置了参数 hdmi_enable_4kp60=1
,还可以用 60Hz 刷新率输出单台 4K 显示器。
无须专门配置,树莓派 5 就可以 4K 分辨率、60Hz 刷新率,输出至两台显示器。
在树莓派桌面上,打开菜单“首选项(Preferences)”,然后选择工具“屏幕配置(Screen Configuration)”。你应该会看到当前树莓派已接入的显示器(用图标表示)。右键单击要修改的显示器,然后选择一项参数。单击“应用(Apply)”并退出“屏幕配置(Screen Configuration)”保存修改。
使用以下命令能打开工具 屏幕配置(Screen Configuration) :
$ arandr
你应该会看到当前树莓派已接入的显示器(以图标表示)。右键单击要修改的显示器,然后选择一项参数。单击“应用(Apply)”并退出 屏幕配置(Screen Configuration) 以保存修改。
要手动配置分辨率和方向,你得知道显示设备的名称。要确定设备名称,请运行以下命令,来显示已接入设备的信息:
$ kmsprint | grep Connector
如果你使用着 Wayland 桌面混成器,你可以通过编辑你主目录中的文件来,设置自定义显示分辨率:.config/wayfire.ini
。可编辑现有的 [output:<device>]
部分。倘若没有,则添加新部分 [output:<device>]
,以适配你的显示设备。要修改显示分辨率,请添加 mode
这行。例如,对于以下示例,配置为:设备名称是 HDMI-A-1
、分辨率是 1080p 60Hz:
[output:HDMI-A-1]
mode = 1920x1080@60
有关可支持的分辨率和 mode
语法的信息,请参阅 Wayfire 文档。
将相同的配置段落添加到 /usr/share/greeter.ini
,可以配置登录屏幕分辨率。
如果你正在运行 Wayland 桌面混成器,可以通过设置 wlr-randr
自定义屏幕显示方向。以下命令分别将屏幕方向配置为 0°、90°、180° 和 270°:
$ wlr-randr --output HDMI-A-1 --transform normal
$ wlr-randr --output HDMI-A-1 --transform 90
$ wlr-randr --output HDMI-A-1 --transform 180
$ wlr-randr --output HDMI-A-1 --transform 270
参数 --output
可指定要修改屏幕方向的设备。
注意
如要通过 SSH 运行此命令,请添加如下前缀:
WAYLAND_DISPLAY=wayland-1
。比如WAYLAND_DISPLAY=wayland-1 wlr-randr --output HDMI-A-1 --transform 90
。
你还可以使用以下某个 --transform
参数,在镜像屏幕的同时改变显示方向:flipped
、flipped-90
、flipped-180
、flipped-270
。
当然,你还可以通过编辑你主目录(home)中的文件,来旋转屏幕方向:.config/wayfire.ini
。请编辑现有的 [output:<device>]
部分。倘若没有,则添加新的 [output:<device>]
部分以适配你的显示设备。要旋转屏幕方向,需添加 transform
这行。以下示例配置:设备名称是 HDMI-A-1
、分辨率是 1080p 60Hz,旋转角度是 270°:
[output:HDMI-A-1]
mode = 1920x1080@60
transform = 270
Wayland 支持以下 transform
参数:
normal
90
180
270
将相同的配置内容添加到 /usr/share/greeter.ini
,来改变登录界面的屏幕方向。
要修改树莓派控制台模式下的分辨率和方向,请使用 KMS 设置。有关更多信息,请参阅配置内核命令行。
注意
若将控制台模式同时输出至多个显示器,那么所有接入的显示器将使用相同的屏幕方向。
树莓派系统支持多种音频输出模式:HDMI 1、耳机插孔(如果你的设备有)和 USB 音频。
在默认情况下,树莓派系统将音频输出到 HDMI 1。如果 HDMI 输出不可用,树莓派系统会将音频输出到耳机插孔、已接入的 USB 音频设备。
本节介绍了在树莓派系统中,多种配置音频输出的方法。
单击系统托盘上的音量图标,打开音频输出选择器。该界面可让你选择音频输出设备。单击音频输出设备,能切换音频输出到该设备。
专业音频配置文件
在 音频输出选择器(audio output selector) 中查看音频设备时,你大概会看到一个叫专业音频(Pro Audio)的设备配置文件。该配置文件在每个音频设备上暴露了最大数量的通道,使你能够更好地控制信号的路由。除非你要对音频输出进行细粒度调整控制,否则请使用其他设备配置文件。
更多有关专业音频配置文件的内容,请访问 PipeWire 常见问题解答。
raspi-config
控制音频要修改音频输出,请使用 raspi-config
,运行以下命令:
$ sudo raspi-config
你将看到配置界面。完成以下步骤,可修改你的音频输出:
选择 System options
并按 回车键。
选择 Audio options
并按 回车键。
选择所需模式,然后按 回车键 选定该模式。
按 右箭头(→) 退出参数列表。选择 Finish
退出配置工具。
可以用图形化用户界面(GUI)配置树莓派系统的无线连接。精简版树莓派系统和无头机器的用户可以用 nmcli
,在命令行设置无线网络连接。
注意
自树莓派系统 Bookworm 以降,默认的网络配置工具变成了 Network Manager。旧款树莓派系统使用
dhcpd
和别的工具进行网络配置。
点击菜单栏右侧的网络图标打开网络管理器。如果你使用的树莓派搭载了内置无线连接功能(或插入了无线适配器),则单击此图标即可显示可用无线网络列表。如果看到信息“未找到 AP——正在扫描……(No APs found - scanning…)”,请等待几秒,网络管理器应该就能搜到你的网络。
注意
搭载双频无线的树莓派设备(树莓派 3B+、4、计算模块 4、树莓派 400、5)会自动禁用网络,直到你分配无线局域网区域。要设置无线局域网区域,请在“首选项(Preferences)”菜单里打开工具树莓派配置(Raspberry Pi Configuration),选择 本地化(Localisation),然后从菜单中选择你的区域。
右侧的图标会提示网络是否加密,并指示了信号强度。单击要连接的网络。如果是加密网络,对话框将让你输入网络密钥:
输入密钥,然后单击“确定(OK)”,再等待几秒钟。网络图标会闪烁一下,表示正在建立连接。连接成功后,图标将停止闪烁并显示信号强度。
连接到隐藏的网络
要使用隐藏的网络,请在网络菜单中找到到 高级参数(Advanced options) → 连接到隐藏的 WiFi 网络(Connect to a hidden Wi-Fi network):
然后,输入隐藏网络的网络名称(SSID)。询问你的网络管理员:你所用的网络使用了哪种加密方式。目前,大多数家用网络使用的是 WPA 和 WPA2 个人加密,公共网络有时使用 WPA 和 WPA2 企业加密。选择你网络的加密方式,并输入你的凭据:
单击“连接(Connect)”按钮可启动网络连接。
本指南将帮你:在不使用图形化工具(且无需附加软件)的情况下,在树莓派上配置使用无线连接。
注意
本指南适用于 WEP、WPA、WPA2 和 WPA3 网络,但可能不适用于企业网络。
启用无线网络
在全新安装时,你必须指定你设备的使用位置。这样可以使你的设备选择正确的 5GHz 网络频段。在你指定无线局域网区域后,你就可以使用树莓派内置的无线网络模块了。
要做到这一点,请使用命令行工具 raspi-config
,设置你的无线局域网区域。运行以下命令:
$ sudo raspi-config
使用 方向键 选择菜单项“本地化参数(Localisation options)”。选择参数 WLAN 区域(WLAN country)。使用 方向键 从下拉菜单中选择你的区域。按 回车键 确认选择。
现在,你应该已经可以访问无线网络了。运行以下命令来查看你是否已启用 WiFi 无线电:
$ nmcli radio wifi
若此命令返回文字“enabled(已启用)”,则可以继续准备配置连接。若此命令返回“disabled(已禁用)”,请尝试使用以下命令启用 WiFi:
$ nmcli radio wifi on
搜索网络
要扫描无线网络,请运行以下命令:
$ nmcli dev wifi list
你应看到类似输出如下:
IN-USE BSSID SSID MODE CHAN RATE SIGNAL BARS SECURITY
90:72:40:1B:42:05 myNetwork Infra 132 405 Mbit/s 89 **** WPA2
90:72:42:1B:78:04 myNetwork5G Infra 11 195 Mbit/s 79 *** WPA2
9C:AB:F8:88:EB:0D Pi Towers Infra 1 260 Mbit/s 75 *** WPA2 802.1X
B4:2A:0E:64:BD:BE Example Infra 6 195 Mbit/s 37 ** WPA1 WPA2
在“SSID”这一列,查找要连接的网络名称。使用网络名称(SSID)和密码连接到网络。
连接到网络
运行以下命令来配置网络连接,请把占位符 <网络名称>
改为你要配置的网络名称:
$ sudo nmcli --ask dev wifi connect <网络名称>
在出现提示后,输入你的网络密码。
在你输入密码后,你的树莓派应该会自动接入网络。
如果你看到了报错,提示你“Secrets were required, but not provided(需要密码,但未提供密码)”,则意味着你输入的密码错误。请再次运行上述命令,并仔细检查你输入的密码。
要检查是否已接入网络,请运行以下命令:
$ nmcli dev wifi list
应该看到类似输出如下:
IN-USE BSSID SSID MODE CHAN RATE SIGNAL BARS SECURITY
* 90:72:40:1B:42:05 myNetwork Infra 132 405 Mbit/s 89 **** WPA2
90:72:42:1B:78:04 myNetwork5G Infra 11 195 Mbit/s 79 *** WPA2
9C:AB:F8:88:EB:0D Pi Towers Infra 1 260 Mbit/s 75 *** WPA2 802.1X
B4:2A:0E:64:BD:BE Example Infra 6 195 Mbit/s 37 ** WPA1 WPA2
在“IN-USE”列中查找星号(*
);它应该出现在你打算接入网络的网络名称(SSID)所在的同一行。
注意
你也可以手动编辑你的连接,配置文件位于目录
/etc/NetworkManager/system-connections/
下。
连接到未加密的网络
如果你要连接的网络未使用密码,请运行以下命令:
$ sudo nmcli dev wifi connect <网络名称>
警告
未加密的无线网络可能会将你的个人信息暴露在风险之中。应尽可能请使用安全的无线网络(或 VPN)。
连接到隐藏的网络
如果你正在使用着隐藏的网络,请在运行 nmcli
时指定参数 “hidden”,并赋值为“yes”。
$ sudo nmcli --ask dev wifi connect <网络名称> hidden yes
设置网络优先级
如果你的设备同时检测到了多个已知网络,它可能会随机接入到任意某个已检测到的已知网络。可使用优先级参数,强制让你的树莓派优先连接到特定网络。在范围内,你的设备将连接到具有最高优先级的网络。运行以下命令,可查看已知网络的优先级:
$ nmcli --fields autoconnect-priority,name connection
你应该看到类似输出如下:
AUTOCONNECT-PRIORITY NAME
0 myNetwork
0 lo
0 Pi Towers
0 Example
-999 Wired connection 1
使用命令 nmcli connection modify
可设置网络的优先级。以下示例命令:把叫做 "Pi Towers" 的网络的优先级设置为 10
:
$ nmcli connection modify "Pi Towers" connection.autoconnect-priority 10
在范围内,你的设备将始终尝试连接到具有最高非负优先级值的网络。你亦可以为网络分配负优先级;仅在范围内,没有其他已知网络时,你的设备才会尝试连接到负优先级网络。例如,现有三个网络:
AUTOCONNECT-PRIORITY NAME
-1 snake
0 rabbit
1 cat
1000 dog
在范围内,若所有这些网络同时存在,你的设备将首先尝试连接到网络“dog”。
若网络“dog”连接失败,你的设备将尝试连接到网络“cat”。
若网络“cat”连接失败,你的设备将尝试连接到网络“rabbit”。
若网络“rabbit”连接失败,且你的设备未检测到其他已知网络,你的设备将尝试连接到网络“snake”。
在默认情况下,树莓派系统会尝试用 DHCP 自动配置所有网络接口。如果 DHCP 失败,则回滚至自动分配的私有地址,范围是 169.254.0.0/16
。
若要给你的树莓派分配静态 IP 地址,请在路由器上为其设定一个保留地址。你的树莓派仍将通过 DHCP 分配其地址,但每次都会收到相同的地址。可以在 DHCP 服务器中,将树莓派的 MAC 地址绑定到静态 IP 地址,来实现“静态”地址的分配。
你可以配置你的树莓派使用 屏幕节能(Screen Blanking):在一段时间内无操作后,断开屏幕信号。在默认情况下,在启用屏幕节能后,树莓派系统将在无操作十分钟后关闭屏幕。
你可以使用树莓派配置(Raspberry Pi Configuration)菜单中的参数屏幕节能来控制屏幕节能(无操作时关闭屏幕)。
单击菜单栏中的树莓派按钮。切换到 首选项(Preferences) → 树莓派配置(Raspberry Pi Configuration)。
选择显示(Display)参数。将参数按钮切换到屏幕节能(Screen Blanking)。按下 完成(OK),确认你的选择。
你可以使用命令行工具 raspi-config
,来启用和禁用屏幕节能。运行以下命令打开该工具:
$ sudo raspi-config
使用 方向键 切换,使用 回车键 选择。选择 Display Options
。再使用 方向键:选择 yes
可启用屏幕节能;选择 no
可禁用屏幕节能。
你还可以编辑添加以下行到 ~/.config/wayfire.ini
:
[idle]
dpms_timeout=600
变量 dpms_timeout
控制了在树莓派系统在屏幕关闭之前所需的无操作时间(秒)。如,值若为 600
,则意味着会在 600 秒(十分钟)后关闭屏幕。将值置 0
,屏幕将永不熄灭。
树莓派配置使用的屏幕节能配置 dpms_timeout
仅涉及桌面会话。在 控制台模式 下,即当你的树莓派仅接入至带有终端输入的监控器和键盘时,请在内核命令行下,使用设置 consoleblank
。
要修改控制台模式下的屏幕节能配置,请以管理员身份,用文本编辑器打开 /boot/firmware/cmdline.txt
:
$ sudo nano /boot/firmware/cmdline.txt
你可以在这儿调整树莓派系统,在关闭屏幕之前,等待控制台的时间(秒)。例如,添加 consoleblank=600
可在其无操作 600 秒后关闭显示信号输出。将值置 0
,屏幕将永不熄灭。
修改 cmdline.txt
后,只有在重启后才会生效。使用以下命令重启你的树莓派:
$ sudo reboot
你可以使用以下命令显示当前控制台屏幕关闭时间(秒):
$ cat /sys/module/kernel/parameters/consoleblank
你可以用工具 raspi-config
,在命令行来修改当前用户账户的密码:
$ sudo raspi-config
选择 option 2,并按照说明修改密码。
还可以使用工具 passwd
:
$ passwd
要添加新用户,请输入以下命令:把占位符 <用户名>
改成新用户的用户名:
$ sudo adduser <用户名>
在出现提示时,为新用户输入密码。
新用户的主目录位于 /home/<用户名>/
。
为了授予新用户必要的权限,比如 sudo
,运行以下命令将该用户添加到相关用户组,请把占位符 <用户名>
换成新用户的用户名:
$ sudo usermod -a -G adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,input,netdev,gpio,i2c,spi <用户名>
要检查权限是否成功授予,请运行以下命令,请将占位符 <用户名>
换成新用户的用户名:
$ sudo su - <用户名>
如果上述命令成功运行,则已成功为该用户配置了权限。
要删除用户,请运行以下命令,请将占位符 <用户名>
换成要删除的用户名:
$ sudo deluser -remove-home <用户名>
此命令将删除用户及其主目录。如果你想保留该用户的主目录,请在执行命令时,把参数 -remove-home
去掉。
要修改在启动时自动登录到你树莓派的用户,请运行以下命令:
$ sudo raspi-config
选择 option 1
, Boot/Auto login
。重启以使修改生效。
你可以将外置硬盘、固态硬盘和 USB 存储设备接入树莓派上的任意 USB 口,然后挂载文件系统,访问里面存储的数据。
在默认情况下,对于常见的文件系统(FAT、NTFS 和 HFS+),你的树莓派会自动挂载,挂载位置是 /media/pi/<HARD-DRIVE-LABEL>
。
注意
精简版树莓派系统(Raspberry Pi OS Lite)未实现自动挂载功能。
要设置存储设备,必须手动挂载,把它挂载到你选择的特定位置。
你可以将存储设备挂载到特定文件夹位置。通常挂载到文件夹 /mnt
下,例如 /mnt/mydisk
。请注意,文件夹必须为空。
将存储设备插入树莓派上的 USB 端口,并使用以下命令列出树莓派上的所有磁盘分区:
$ sudo lsblk -o UUID,NAME,FSTYPE,SIZE,MOUNTPOINT,LABEL,MODEL
树莓派自身使用了挂载点 /
和 /boot/firmware/
。你的存储设备将与其他已连接的存储设备一同显示在此列表中。
使用 SIZE、LABEL 和 MODEL 这几列来辨别指向存储设备的磁盘分区的名称(如 sda1
)。FSTYPE 这列包含了文件系统类型。如果你的存储设备使用的是 exFAT 文件系统,请安装 exFAT 驱动程序:
$ sudo apt update
$ sudo apt install exfat-fuse
如果你的存储设备使用 NTFS 文件系统,你将只能以只读方式使用它。如果你想要对设备进行写操作,可以安装驱动程序 ntfs-3g:
$ sudo apt update
$ sudo apt install ntfs-3g
运行以下命令以获取磁盘分区的位置:
$ sudo blkid
比如,/dev/sda1
。
创建一个目标文件夹,用作存储设备的挂载点。在这种情况下,使用的挂载点名称是 mydisk
。你可以指定成自己想要的名称:
$ sudo mkdir /mnt/mydisk
将存储设备挂载到你创建的挂载点上:
$ sudo mount /dev/sda1 /mnt/mydisk
要检查存储设备是否挂载成功,可通过列出内容来确认:
$ ls /mnt/mydisk
你可以修改 fstab
文件,设定树莓派在启动时,存储设备自动挂载的位置。在 fstab
文件中,磁盘分区由全局唯一标识符(UUID)标记。
获取磁盘分区的 UUID:
$ sudo blkid
从列表中找到磁盘分区并标记 UUID。(如 5C24-1453
)使用诸如 nano 之类的命令行编辑器打开 fstab 文件:
$ sudo nano /etc/fstab
在 fstab
文件中添加以下几行:
UUID=5C24-1453 /mnt/mydisk fstype defaults,auto,users,rw,nofail 0 0
用你在上述步骤中找到的文件系统类型(如 ntfs
)替换 fstyp
。
如果文件系统类型为 FAT 或 NTFS,请紧跟 nofail
之后,再添加 ,umask=000
。这将让所有用户完全读写存储设备上的任意文件。
现在你已在 fstab
中设置了一个条目。在启动树莓派时,该存储设备是否接入均可开机。在拔下存储设备之前,你必须先将树莓派关机,或者手动卸载该存储设备。
注意
在树莓派启动时,如未接入存储设备,启动时将再多等 90 秒。你可以紧跟
nofail
之后,再添加,x-systemd.device-timeout=30
来缩短时间。这将把超时时间修改为 30 秒,这意味着系统仅会等待 30 秒,然后就会放弃磁盘挂载。
要获取有关每个 Linux 命令的更多信息,请使用 man
命令查阅特定的手册页。例如,man fstab
。
当树莓派关机时,系统会负责卸载存储设备,以便安全拔出。如果你想手动卸载设备,可以使用以下命令:
$ sudo umount /mnt/mydisk
如果收到报错“device is busy(设备正忙)”,意味着存储设备未被卸载。如果没有显示错误,现在可以安全地拔出设备。
“device is busy”(设备正忙)这个报错意味在着存储设备上,有文件被程序占用。要关闭这些文件,请执行如下步骤。
关闭所有打开了存储设备上的文件的软件。如果你打开了一个终端,请确保你未处于存储设备所挂载的文件夹(及其子文件夹)下。
如果你仍然无法卸载存储设备,你可以使用工具 lsof
检查是哪个程序在设备上打开了文件。首先你要用 apt
安装 lsof
:
$ sudo apt update
$ sudo apt install lsof
使用 lsof 命令:
$ lsof /mnt/mydisk
cmdline.txt
)在启动时,Linux 内核可接受一组命令行参数。对于树莓派,可在启动分区中的文件 cmdline.txt
里定义该命令行。你可使用任意文本编辑器编辑该文本文件。
$ sudo nano /boot/firmware/cmdline.txt
重要
请把所有参数放在
cmdline.txt
中的一行里。不要 用换行符。
要查看在启动时传递给内核的命令行,请运行以下命令:
$ cat /proc/cmdline
因为树莓派固件会在启动内核之前对命令行进行修改,所以此命令行的输出与 cmdline.txt
的内容不会完全吻合。
内核命令行参数有很多,其中某些由内核本身定义。其他的可能由内核正在使用的代码定义,如 Plymouth 闪屏系统。
console
定义了串口控制台。通常有两个条目:
console=serial0,115200
console=tty1
root
定义了根文件系统的位置。例如,root=/dev/mmcblk0p2
表示多媒体卡区块 0 分区 2。
rootfstype
定义了根文件系统使用的文件系统类型,例如 rootfstype=ext4
。
quiet
将默认的内核日志级别设置为 KERN_WARNING
,在启动过程中将屏蔽除非常严重级别外的内核信息。
旧版树莓派系统中所使用的传统固件和 FKMS 显示模式,已不再支持。作为代替,最新版本的操作系统使用 KMS(内核模式设置)。
如果在 cmdline.txt
中没有 video
这个条目,树莓派操作系统将根据接入 HDMI 显示器的 EDID,自动选定(基于 Linux 内核信息)显示器能支持的最佳分辨率。在精简版树莓派系统(Raspberry Pi OS Lite)、控制台模式中,你必须自己手动修改 video
这个条目,才能调整分辨率和屏幕方向。
video=HDMI-A-1:1920x1080M@60
还可以添加屏幕旋转和翻转(屏幕镜像)参数,请参考 Linux 帧缓冲文档 标准。以下示例定义了一台显示器:名为 HDMI-A-1
、分辨率为 1080p、刷新率为 60Hz、屏幕旋转 90 度、并在 X 轴上翻转屏幕(屏幕镜像):
video=HDMI-A-1:1920x1080M@60,rotate=90,reflect_x
要指定屏幕旋转方向和翻转参数,必须同时显式声明分辨率。
显示类型的支持参数——video=
条目 =
后的部分,支持:
HDMI-A-1
HDMI 1(树莓派 4B 主板上标为 HDMI 0;单个 HDMI 主板上标为 HDMI)
HDMI-A-2
HDMI 2(树莓派 4B 主板上标为 HDMI 1)
DSI-1
DSI 或 DPI
Composite-1
复合视频
此部分是可以在内核命令行中使用的其他条目。以下列表不是完整无遗的。
splash
启动时使用 Plymouth 模块显示启动画面。
plymouth.ignore-serial-consoles
如启用 Plymouth 模块,它通常会屏蔽掉出现在串口控制台上的所有启动信息。此参数能让 Plymouth 忽略所有串口控制台,重现启动消息,如同没有运行 Plymouth 一样。
dwc_otg.lpm_enable=0
禁用驱动程序 dwc_otg
中设置的链接状态电源管理(Link Power Management,LPM)。该驱动程序驱动着 USB 控制器(嵌入在树莓派计算机的处理器中)。在树莓派 4 上,此控制器默认已禁用,且它仅连接至 USB Type C 电源输入接口。树莓派 4 上的 USB-A 接口由其他的,同此设置无涉的 USB 控制器驱动。
dwc_otg.speed
可设置树莓派计算机 USB 控制器的速率(处理器内置)。设置 dwc_otg.speed=1
则为全速(USB 1.0),但低于高速(USB 2.0)。除非要排除 USB 设备故障,否则不应设置此参数。
smsc95xx.turbo_mode
启用或禁用:有线网络驱动程序超频。smsc95xx.turbo_mode=N
则关闭超频模式。
usbhid.mousepoll
指定鼠标轮询间隔。如果你遇到了无线鼠标移动缓慢、不稳定等故障,将其置 0
(usbhid.mousepoll=0
)也许有用。
drm.edid_firmware=HDMI-A-1:edid/your_edid.bin
使用它能覆盖你显示器内置 EDID(/usr/lib/firmware/edid/your_edid.bin
)信息。
你可以使用工具 raspi-config
配置树莓派系统的界面语言、键盘布局和时区。
在这儿,我们介绍了一些常见方法,能优化你树莓派的安全性。
sudo
命令要求密码以 sudo
打头运行的命令,将会以超级用户执行。在默认情况下无需密码。但是你可以要求,所有以 sudo
运行的命令,均需输入密码,来改善你树莓派的安全性。
要强制 sudo
需要密码,请编辑你用户账户的 sudoers 文件中的 nopasswd
,请将文件名中的占位符 <用户名>
换成你的用户名:
$ sudo visudo /etc/sudoers.d/010_<用户名>-nopasswd
将 <用户名>
这个条目修改为如下内容,请把 <用户名>
换成你的用户名:
<用户名> ALL=(ALL) PASSWD: ALL
保存文件。你的设置会立即生效。
仅最新版本的操作系统包含了所有最新的安全补丁。请始终将你设备中的树莓派系统更新至最新版本。
如果你通过 SSH 连接至树莓派,通过添加 cron
作业,专门更新 SSH 服务器可能是值得的。可把以下命令,作为每日 cron
作业运行,确保你能及时收到最新的 SSH 安全修复程序。它独立于你的正常更新流程。
$ apt install openssh-server
SSH 是远程访问树莓派的常用方式。在默认情况下,SSH 要求用户名和密码。为了提高 SSH 的安全性,请使用基于密钥的身份验证。
你还可以通过修改 sshd
配置,允许(allow) 或 拒绝(deny) 特定用户。
$ sudo nano /etc/ssh/sshd_config
将以下行添加、编辑或添加到文件末尾,其中涉及了你想要允许登录的用户名:
AllowUsers alice bob
你还可以使用 DenyUsers
来明确禁止某些用户名登录:
DenyUsers jane john
修改后,请使用以下命令重启 sshd
服务,以使修改生效:
$ sudo systemctl restart ssh
Linux 上有许多防火墙解决方案可用。大多数通过底层的 iptables 项目来进行数据包过滤。该项目基于 Linux netfiltering 系统。在默认情况下,树莓派系统上预装了 iptables
,但未设置。设置它可能是一件非常麻烦的事情。Uncomplicated Firewall (UFW) 项目提供了比 iptables
更为易用的界面。UFW 是 Ubuntu 中默认的防火墙工具,也可以安装到你的树莓派上:
$ sudo apt install ufw
ufw
是一款命令行工具,然而也有图形界面可用。请注意,ufw
须以 root 权限运行,因此所有命令都以 sudo
开头。还可以使用参数 --dry-run
执行所有的 ufw
命令,这表示仅输出命令的执行结果,而不进行任何实质性修改。
启用防火墙,同时设定防火墙开机自启:
$ sudo ufw enable
要禁用防火墙,同时禁用防火墙开机自启,请使用:
$ sudo ufw disable
允许特定端口访问(我们在本例中使用了 22 端口):
$ sudo ufw allow 22
拒绝访问端口也非常简单(我们再次以 22 端口为例):
$ sudo ufw deny 22
你还可以指定在端口上允许和拒绝哪种服务。在此示例中,我们拒绝了 22 端口上的 TCP:
$ sudo ufw deny 22/tcp
如果你不知道服务会使用哪个端口,那么可以指定服务。此示例允许 ssh 服务通过防火墙访问:
$ sudo ufw allow ssh
命令 status
可列出当前防火墙的所有配置:
$ sudo ufw status
规则可能十分复杂:允许/阻止特定 IP 地址、指定允许流量的方向、限制连接尝试的次数(有助于缓解 DDoS 攻击)。你还可以指定要应用规则的设备(如 eth0、wlan0)。请参阅 ufw
手册页(man ufw
)以获取除下面命令之外的完整详细信息。
在 ssh 端口上(TCP)限制登录尝试。如果 IP 地址在过往 30 秒内有过六次及更多次连接尝试,则拒绝连接:
$ sudo ufw limit ssh/tcp
拒绝从 IP 地址 192.168.2.1 访问端口 30
$ sudo ufw deny from 192.168.2.1 port 30
fail2ban
阻挡可疑活动在树莓派作为服务器时,你必须在防火墙中创建有意的漏洞以允许服务器流量通过。Fail2ban 可以帮助保护你的服务器。Fail2ban 会检查日志文件中的检查可疑活动,如多次暴力登录尝试。它可以帮助你避免:手动检查入侵尝试的日志文件,然后再通过 iptables
更新防火墙来阻止它们。
运行以下命令安装 fail2ban
:
$ sudo apt install fail2ban
在安装过程中,Fail2ban 会创建 /etc/fail2ban/jail.conf
。要启用 Fail2ban,请把 jail.conf
复制到 jail.local
:
$ sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
在此配置文件中包含了一组默认参数,以及用于检查特定服务异常的参数。要查看用于 ssh
的规则,请用编辑器打开 jail.local
:
$ sudo nano /etc/fail2ban/jail.local
如果没有 [ssh]
这个部分,则需要手动创建:向里面添加以下几行:
[ssh]
enabled = true
port = ssh
filter = sshd
backend = systemd
maxretry = 6
这将启用对可疑 ssh
活动的 Fail2ban 检查,包括检查系统日志,并在阻止活动之前给予进行六次重试机会。
在同一文件中,此 [default]
部分定义了默认的封禁操作 iptables-multiport
,当达到检测阈值时,执行文件 /etc/fail2ban/action.d/iptables-multiport.conf
:
# 默认禁止操作(例如:iptables、iptables-new、
# iptables-multiport、shorewall 等)。用于定义
# 变量 action_*,可以全局/部分覆盖
# 文件 jail.local
banaction = iptables-multiport
multiport(多端口)会禁止全部端口上的一切访问。action.d
文件夹包含许多可用于自定义服务器响应可疑活动的替代操作配置文件。
例如,如果要在三次失败尝试后永久拉黑 IP 地址,请将 [ssh]
部分中的 maxretry
值修改为 3
,并将 bantime
设置为负数:
[ssh]
enabled = true
port = ssh
filter = sshd
backend = systemd
maxretry = 3
bantime = -1
无头(headless)是指在没有显示器、键盘、鼠标的情况下运行树莓派。要运行无头树莓派,你需要一种在其他计算机上访问它的方法。要远程访问你的树莓派,你需要将树莓派接入网络,并找到一种使用该网络访问树莓派的方法。
要把树莓派连接到网络,你可以通过以太网,把设备进行有线连接,或者配置无线网络。
要通过该网络访问树莓派,请使用 SSH。通过 SSH 连接,你就可以使用 raspi-config
来启用 VNC(如果你更喜欢图形化桌面环境)。
如果你从头开始设置你的树莓派,请在启动盘制作过程中设置无线网络和 SSH。如果你已经设置好了树莓派,你可以使用 raspi-config
配置 SSH。
警告
取决于你使用的树莓派、存储卡的型号,在初次开机时,你的树莓派,可能需要长达五分钟的时间才能启动,接入无线网络。
若要在首次启动时就连接到有线网络,请把你的树莓派接入以太网。如果说你的树莓派没有以太网接口,则需使用以太网转换器。你的树莓派将自动连接到网络。
要在初次启动无头树莓派时配置无线网络访问,请使用树莓派启动盘制作工具中的高级设置菜单。输入你首选无线网络的网络名称(SSID)和密码。在你的树莓派初次启动时,将用这些凭据接入网络。某些无线适配器及特定树莓派开发板并不支持 5GHz 网络;请查阅你的无线模块文档,以确保与你偏好网络的兼容性。
注意
旧款树莓派系统会使用一个叫
wpa_supplicant.conf
的文件,把该文件放入 boot 文件夹就可以配置无线网络设置。从树莓派系统 Bookworm 开始,此功能已弃用。
如果没有键盘和显示器,你需要某种方法来远程控制你的无头树莓派。在初次启动时,唯一的办法就是 SSH。要在全新安装的树莓派系统上启用 SSH,请选择以下某种方法:
在树莓派启动盘制作工具的操作系统自定义菜单中启用 SSH,然后输入用户名和密码
在存储卡的根目录下创建一个文件 ssh
,然后按照下面部分的说明手动配置用户 userconf.txt
欲了解更多信息,请参阅设置 SSH 服务器。通过 SSH 连接,你就可以使用 raspi-config
来启用 VNC,如果你更喜欢图形桌面环境。
在你的存储卡根目录下,创建一个文件 userconf.txt
。
该文件应为一行文本,由 <用户明>:<密码>
组成:你想要使用的用户名,紧接一个英文冒号,然后是你想要用的密码的 加密 形式。
注意
<用户名>
仅支持小写英语字母,数字和-
。且必须以字母开头。长度不大于 31 个字符。
要生成加密密码,请在其他计算机上使用 OpenSSL。打开终端并输入以下内容:
$ openssl passwd -6
在提示后输入密码进行验证。然后,该命令将输出该密码的加密形式。
你的树莓派可以用无线模块发射自己的无线网络。如果你通过以太网口(或其他无线模块)把你的树莓派接入互联网,那么接入此无线网络的其他设备就可以通过你的树莓派来上网。
假如使用的有线网络 IP 段是 10.x.x.x
。你可将你的树莓派连接到该网络,并在使用另一个 IP 段(如 192.168.x.x
)的独立网络上,为无线客户端提供服务。
请注意:在以下拓扑中,笔记本电脑与路由器和有线客户端的 IP 段是分离的:
在这种网络配置下,无线客户端可以通过树莓派路由器彼此通信。但是,无线网络上的客户端不能直接与有线网络上的客户端进行通信(除了树莓派)。无线客户端位于私有网络中,与为有线客户端提供服务的网络相分离。
注意
树莓派 5、4、3,树莓派 Zero W、2 W 可使用内置的无线模块发射无线网络。未搭载内置无线网卡的树莓派型号可使用外置无线模块来实现此功能。
要在命令行上创建发射无线网络,请运行以下命令,把占位符 <网络名称>
和 <密码>
改成你自己的值:
$ sudo nmcli device wifi hotspot ssid <网络名称> password <密码>
使用其他的无线客户端(如笔记本电脑和智能手机)连接至网络。查找与网络名称(SSID)与 <网络名称>
一致的网络。输入你的网络密码,你应成功连接至网络。如果你的树莓派通过以太网连接或者别的无线适配器接入互联网,你应该也能上网。
要禁用热点网络,并将你的树莓派还原成无线客户端,请运行以下命令:
$ sudo nmcli device disconnect wlan0
在禁用热点后,运行以下命令,可重新连接到其他 WiFi 网络:
$ sudo nmcli device up wlan0
技巧
有关连接到无线网络的更多信息,请参阅配置网络。
在默认情况下,你用树莓派发射的无线网络与已接入以太网的父网络相分离。在这种拓扑下,连接到父网络的设备无法直接与接入树莓派发射的无线网络的设备进行通信。如果你希望连接的无线设备能够与父网络上的设备通信,你可以将你的树莓派配置成网桥。有了网桥,所有接入树莓派托管的无线网络的设备都会被分配一个父网络中的 IP 地址。
在以下拓扑中,笔记本电脑、路由器和有线客户端位于相同的 IP 段:
以下步骤记录了如何在你的树莓派上设置网桥,以实现无线客户端和父网络之间的通信。
首先,创建一个网桥接口:
$ sudo nmcli connection add type bridge con-name 'Bridge' ifname bridge0
接下来,把你设备的以太网连接添加到父网桥:
$ sudo nmcli connection add type ethernet slave-type bridge \
con-name 'Ethernet' ifname eth0 master bridge0
最后,把你的无线热点连接添加到桥接中。你可以添加现有的热点接口,亦可创建新的:
如果你已经按照上述说明创建了无线热点连接,请使用以下命令将现有接口添加至桥接:
$ sudo nmcli connection modify 'Hotspot' master bridge0
如果你尚未创建无线热点连接,请使用单个命令(所有行是一条命令)来创建新接口并将其添加到桥接中,把占位符 <热点密码>
改成你选定的密码:
$ sudo nmcli connection add con-name 'Hotspot' \
ifname wlan0 type wifi slave-type bridge master bridge0 \
wifi.mode ap wifi.ssid Hotspot wifi-sec.key-mgmt wpa-psk \
wifi-sec.proto rsn wifi-sec.pairwise ccmp \
wifi-sec.psk <热点密码>
现在你已配置好了桥接,是时候激活它了。运行以下命令以激活桥接:
$ sudo nmcli connection up Bridge
运行以下命令,开始发射你的无线网络:
$ sudo nmcli connection up Hotspot
你可以使用命令 nmcli device
来验证桥接、以太网接口和无线热点接口是否均处于活动状态。
技巧
可使用诸如 arp-scan 之类的工具,检查在接入热点后,是否能访问父网络上的设备。
代理服务器是客户端设备和互联网之间的中介。要将你的树莓派配置为代理服务器客户端,请按照本节中的说明操作。
你将需要:
代理服务器的 IP 地址/主机名、端口
如果需要,为你的代理设置用户名和密码
你需要设置三个环境变量(http_proxy
、https_proxy
、no_proxy
),以便你的树莓派知道如何访问代理服务器。
打开终端,使用 nano 打开文件 /etc/environment
:
$ sudo nano /etc/environment
将以下内容添加到文件 /etc/environment
,以创建变量 http_proxy
:
export http_proxy="http://<代理IP地址>:<代理端口>"
用代理的 IP 地址和端口分别替换占位符 <代理IP地址>
和 <代理端口>
。
注意
如果你使用的代理需要用户名和密码,请使用以下格式:
export http_proxy="http://<用户名>:<密码>@代理IP地址:代理端口"
把你用于验证代理的用户名和密码分别替换占位符
<用户名>
和<密码>
。
为环境变量 https_proxy
输入相同的信息:
export https_proxy="http://<用户名>:<密码>@代理IP地址:代理端口"
创建环境变量 no_proxy
,这是一个由逗号分隔的地址列表,你的树莓派不应该使用代理。
export no_proxy="localhost, 127.0.0.1"
你的 /etc/environment
文件现在应该如下所示:
export http_proxy="http://<用户名>:<密码>@代理IP地址:代理端口"
export https_proxy="http://<用户名>:<密码>@代理IP地址:代理端口"
export no_proxy="localhost, 127.0.0.1"
按 Ctrl + X 保存并退出。
sudoers
文件要在下载和安装软件等以 sudo
方式运行的操作中,使用代理环境变量,请更新 sudoers
。
使用以下命令打开 sudoers
:
$ sudo visudo
将以下行添加到文件中,这样 sudo
就能使用你刚创建的环境变量:
Defaults env_keep+="http_proxy https_proxy no_proxy"
按 Ctrl + X 保存并退出。
重启你的树莓派以使修改生效。现在你应该能够通过代理服务器访问互联网了。
boot
的内容树莓派系统把引导文件放在存储卡上的首个分区中,该分区使用 FAT 文件系统。
所有型号的树莓派在启动时,都会先从启动分区加载文件,来启动所有的处理器核心,继而再加载 Linux 内核。
在启动时,Linux 会把启动分区挂载到 /boot/firmware/
。
注意
在 Bookworm 之前的树莓派系统将启动分区放在
/boot/
。自 Bookworm 以降,启动分区位于/boot/firmware/
。
bootcode.bin
在启动时,SoC 会加载引导加载程序(bootloader)。引导加载程序会执行一些最基本的设置,继而加载某个 start*.elf
文件。
树莓派 4、5 不使用 bootcode.bin
。它们使用的引导代码位于板载 EEPROM 中。
start*.elf
在二进制固件模块(start*.elf
)被加载到 VideoCore GPU(Soc 中)后,引导过程将由这些固件模块接管。
start.elf
基本固件
start_x.elf
含附加编解码器
start_db.elf
用于调试
start_cd.elf
精简版固件,移除了对硬件模块(如编解码器和 3D)以及对调试日志支持的支持;它还施加了对初始帧缓冲区限制。当在 config.txt
中指定 gpu_mem=16
时,将自动调用精简固件。
start4.elf
、start4x.elf
、start4db.elf
和 start4cd.elf
是树莓派 4 系列(树莓派 4B、400,计算模块 4、4S)的专用固件文件。
要了解如何使用这些文件的详细信息,请参阅 config.txt 文档。
树莓派 5 不再采用这些 elf
文件。固件直接嵌入到了引导加载程序(EEPROM 中的 bootloader)。
fixup*.dat
与上节所列的 start*.elf
文件相对应的链接器文件。
cmdline.txt
内核命令行,将传给引导时的内核。
config.txt
涉及许多用于设置树莓派的配置参数。有关更多信息,请参阅 config.txt 文档。
重要
树莓派 5 要求:在启动分区中,须有一个非空的
config.txt
文件。
issue.txt
文本格式的维护信息,包含发行版日期和 Git 提交 ID。
initramfs*
即初始内存盘。在挂载真实的根文件系统之前,先把临时根文件系统加载到内存上。
自 Bookworm 以降,树莓派系统默认内置了一个 initramfs
文件。要启用初始内存盘,请在 config.txt
中使用关键字 auto_initramfs
进行配置。
ssh
(ssh.txt
)若存在此文件,在启动时会开启 SSH。在默认情况下,没有该文件,因此会禁用 SSH。该文件内容随意,即使是空的也会启用 SSH。
*.dtb
)DTB 文件涉及各种树莓派型号的硬件定义。这些文件将根据检测到的树莓派型号,在启动时设置内核。
*.img
)适用于各种树莓派型号的内核镜像文件:
kernel.img
BCM2835
树莓派 Zero,树莓派 1
kernel7.img
BCM2836、BCM2837
树莓派 Zero 2 W,树莓派 2、3
基于 BCM2837 的新款树莓派 2
kernel7l.img
BCM2711
树莓派 4、400,CM4,CM4S
大物理地址扩展(LPAE)
kernel8.img
BCM2837、BCM2711、BCM2712
树莓派 Zero 2 W,树莓派 2、3、4、400,CM4、CM4S、树莓派 5
。基于 BCM2836 的树莓派 2 不支持 64 位内核。
kernel_2712.img
BCM2712
树莓派 5
针对树莓派 5 优化的 。
注意
在使用 32 位内核的系统上,
lscpu
会把 CPU 架构报告成armv7l
;在使用 64 位内核的系统上,lscpu 会把 CPU 架构报告成aarch64
。对于armv7l
,l
指的是小端 CPU 架构(如kernel7l.img
文件名所示),而非指LPAE
。
overlays
(叠加层)包含设备树叠加层。用于配置各种硬件设备(如第三方声卡)。可使用 config.txt
中的条目对这些叠加层进行选择。更多有关信息,请参阅设备树、叠加层和参数。
在大多数情况下,如果由于某种原因树莓派无法启动(或必须关机),LED 灯将闪烁特定次数以传达状态信息。LED 将发出特定次数(0 或更多)的长闪烁,然后发出短闪烁,以传达确切状态。在大多数情况下,重复间隔为两秒。
0
3
无法启动的一般故障
0
4
未找到 start*.elf
0
7
未找到内核镜像
0
8
内存(SDRAM)故障
0
9
内存(SDRAM)容量不足
0
10
处于 HALT 状态
2
1
分区不是 FAT
2
2
无法读取分区
2
3
扩展分区不是 FAT
2
4
文件签名/哈希值不匹配(树莓派 4、5)
3
1
SPI EEPROM 错误(树莓派 4、5)
3
2
SPI EEPROM 写保护(树莓派 4、5)
3
3
I²C 错误(树莓派 4、5)
3
4
安全启动配置无效
4
3
未找到 RP1
4
4
主板类型不受支持
4
5
致命性固件错误
4
6
A 类电源故障
4
7
B 类电源故障
在树莓派上有两类串口可用——PL011 和 mini 串口。PL011 是一款功能强大、符合 16550 标准的串口,而 mini 串口则功能有所欠缺。
树莓派上的所有串口均仅支持 3.3V(接入 5V 会损坏)。可使用适配器转接到 5V 设备。此外,也可以使用各种第三方的廉价 USB 转 3.3V 串口转换器。
如下所示,树莓派 Zero,树莓派 1、2、3 均搭载了两个串口:
UART0
PL011
UART1
mini 串口
树莓派 4B、400 搭载了另外四个 PL011,在默认情况下,它们已被禁用:
UART0
PL011
UART1
mini 串口
UART2
PL011
UART3
PL011
UART4
PL011
UART5
PL011
树莓派 5 搭载了另外四个 PL011,这些在默认情况下也是被禁用的:
UART0
PL011
UART1
PL011
UART2
PL011
UART3
PL011
UART4
PL011
树莓派 5 没有 mini 串口。
计算模块 1、3、3+ 均搭载了两个串口,而计算模块 4 则有六个串口(如上所述)。
所有型号的计算模块,在默认情况下均禁用了串口,但可以通过使用设备树叠加层来显式启用。你还可以指定要使用的 GPIO 引脚,例如:
dtoverlay=uart1,txd1_pin=32,rxd1_pin=33
在树莓派上,使用 GPIO 14(TX)和 15(RX)的串口——就是主串口。在默认情况下,大概率也会同时把 Linux 控制台输出到该串口。请注意,在 GPIO 排针上,GPIO 14 是引脚 8,而 GPIO 15 是引脚 10。
在树莓派 5 上,调试接口就是主串口。
副串口通常并未接入 GPIO 连接器。在默认情况下,副串口连接至无线局域网/蓝牙控制器(复合)的蓝牙侧(如果该型号搭载了此控制器)。
以下表格总结了各种树莓派设备上串口的分配情况:
树莓派 Zero
UART0
UART1
树莓派 Zero W、Zero 2 W
UART1
UART0
树莓派 1
UART0
UART1
树莓派 2
UART0
UART1
树莓派 3
UART1
UART0
计算模块 3、3+
UART0
UART1
树莓派 4
UART1
UART0
树莓派 5
UART10
<专用串口>
树莓派系统上的 Linux 设备:
/dev/ttyS0
mini 串口
/dev/ttyAMA0
第一个 PL011(UART0)
/dev/serial0
主串口
/dev/serial1
副串口
/dev/ttyAMA10
树莓派 5 的调试串口
/dev/serial0
和 /dev/serial1
都是符号链接,各指向 /dev/ttyS0
、/dev/ttyAMA0
其中之一。
在树莓派 5 上,/dev/serial0
是指向 /dev/ttyAMA10
的符号链接。
由于 Bookworm 的变更,在默认情况没有 /dev/serial1
。你可以在 config.txt
中,设置以下参数再次启用 serial1
:
dtparam=krnbt=off
技巧
该参数可能并不会兼容后续的所有型号。应仅在你的用例无其他替代方案时,才使用该参数。
注意
mini 串口默认已禁用。要启用,必须禁用蓝牙或者把 mini 串口设置成主串口。
为了使用 mini 串口,你需要配置树莓派,把 VPU 核心时钟设置为固定频率。这是因为 mini 串口时钟与 VPU 主频相关联,因此当主频发生变化时,串口的波特率也会同时改变。要修改 mini 串口的行为,可以将 enable_uart
和 core_freq
这些设置添加到 config.txt
。以下表格总结了可能的情况:
主串口
可变
mini 串口已禁用
主串口
可设置 enable_uart=1
固定主频
启用 mini 串口,主频被固定为 250MHz;如设置 force_turbo=1
,则使用 VPU 超频频率
副串口
可变
mini 串口已禁用
副串口
可设置 core_freq=250
固定主频
mini 串口已启用
参数 enable_uart
的默认状态取决于谁是主串口:
主串口
参数 enable_uart
的默认状态
mini 串口
0
第一个 PL011(UART0)
1
在默认情况下,主串口被分配给 Linux 控制台。如果你希望将主串口用于其他目的,你必须重新配置树莓派系统。可以使用 raspi-config
来做到这一点:
启动 raspi-config:sudo raspi-config
选择 option 3 - Interface Options
选择 option P6 - Serial Port
在提示信息 Would you like a login shell to be accessible over serial?(您是否想要通过串口访问登录 shell?)
处,回答“No”
在提示信息 Would you like the serial port hardware to be enabled?(您是否想要启用串口硬件接口?)
处,回答“Yes”
退出 raspi-config
并重启树莓派,以使修改生效
尽管在 Linux 内核启动过程中,相对较早地启动了串口,但仍比一些关键基础设备的配置要晚得多。如果无法得到这些早期阶段的内核日志信息,可能很难对那个时间段出现的故障进行诊断。要为其中某个串口启用 earlycon
支持,请根据所选的主串口,向 cmdline.txt
添加以下参数:
对于树莓派 5,earlycon
仅可通过以下设置输出至调试接口(3 针):
earlycon=pl011,0x107d001000,115200n8
对于树莓派 4、400 和计算模块 4:
earlycon=uart8250,mmio32,0xfe215040
earlycon=pl011,mmio32,0xfe201000
对于树莓派 2、3 和计算模块 3:
earlycon=uart8250,mmio32,0x3f215040
earlycon=pl011,mmio32,0x3f201000
对于树莓派 1,树莓派 Zero 和计算模块 1:
earlycon=uart8250,mmio32,0x20215040
earlycon=pl011,mmio32,0x20201000
默认波特率为 115200bps。
注意
如果早期控制台配置错误,可能会有碍树莓派启动。
在内核 GitHub 中,可以找到各种串口设备树叠加层定义。最有用的两个叠加层是 disable-bt
和 miniuart-bt
。
disable-bt
将禁用蓝牙设备,并把第一个 PL011(UART0)设置成主串口。你还必须禁用初始化调制解调器的系统服务,以防它连接到串口:可使用 sudo systemctl disable hciuart
。
miniuart-bt
将蓝牙功能切换到 mini 串口,并将第一个 PL011(UART0)设置成主串口。请注意,这可能会降低最大可用波特率(请参阅下文有关 mini 串口限制的内容)。你还必须使用 force_turbo=1
或 core_freq=250
将 VPU 核心时钟设置为固定频率。
叠加层 uart2
、uart3
、uart4
和 uart5
用于在树莓派 4 上启用另外四个串口。在文件夹中还有其他特定于串口的叠加层。有关设备树叠加层的详细信息,请参考 /boot/firmware/overlays/README
,或运行 dtoverlay -h overlay-name
查看描述和使用信息。
向 config.txt
文件添加一行以应用设备树叠加层。请注意,请去掉文件名中的 -overlay.dts
部分。例如:
dtoverlay=disable-bt
PL011 串口和 mini 串口有些不同。
mini 串口的 FIFO 存储比较小。再加上缺乏流量控制,导致在较高的波特率下更易丢失字符。它的功能通常也弱于 PL011,主要是因为其波特率与 VPU 时钟速度相关联。
与 PL011 相比,mini 串口的不足有:
没有中断检测
没有帧错误检测
没有奇偶校验位
没有接收超时中断
mini 串口和基于 BCM2835 的 PL011 实现均不支持 DCD、DSR、DTR 和 RI 信号。
可在 SoC 外设文档中找到详细的 mini 串口文档。
树莓派内核和固件使用设备树(Device Tree,DT)来描述硬件。这些设备树可能涉及用于控制板载功能的设备树参数。设备树叠加层能描述和配置可选的外部硬件,还能支持更多的可调参数。
固件加载程序(start.elf
及衍生文件)负责加载 DTB(设备树模块——某种机器可读的设备树文件)。它根据主板的修订版本选择要加载的 DTB,并进行修改以进一步定制。这种运行时定制消除了大部分仅细微差异的 DTB 需求。
会在 config.txt
中识别用户设定的参数,以及所有叠加层及相关参数,然后应用。比如,加载程序会根据结果来设定要用于控制台的所有串口。最后,再启动内核,传递指向合并 DTB 的指针。
设备树(Device Tree,DT)是对设备硬件的描述。它应涉及基本 CPU 的名称、其内存配置以及所有外部和内部的外围设备。设备树不应用于描述软件——尽管通过枚举硬件模块,通常会触发加载驱动程序模块。
注意
切记,设备树应与操作系统无关,因此任何 Linux 的特定内容均不应出现在里面。
设备树是硬件配置,以节点层次结构的形式呈现。每个节点可包含属性和子节点。属性是由字节构成的命名数组,可包含字符串、数字(大端序,Big-Endian)、任意字节序列以及三者的任意组合。打个比方:在文件系统中,目录是节点,文件是属性。设备树中节点和属性的位置可以用路径表示,并使用斜杠作为分隔符,单个斜杠(/
)代表根分区。
设备树通常以一种名为设备树源代码(DTS)的文本形式编写,并存储在后缀为 .dts
的文件中。DTS 的语法和 C 语言类似:使用大括号分组,每行以英文分号结尾。请注意,DTS 需在右大括号后添加英文分号,可将其视为 C 语言中的 struct
(结构体),而不要将其视作函数。编译后的二进制文件格式为 .dtb
,名为扁平化设备树(Flattened Device Tree,FDT)或设备树 blob(DTB,Device Tree Blob)。
下面是个简单树,文件格式是 .dts
:
/dts-v1/;
/include/ "common.dtsi";
/ {
node1 {
a-string-property = "A string";
a-string-list-property = "first string", "second string";
a-byte-data-property = [0x01 0x23 0x34 0x56];
cousin: child-node1 {
first-child-property;
second-child-property = <1>;
a-string-property = "Hello, world";
};
child-node2 {
};
};
node2 {
an-empty-property;
a-cell-property = <1 2 3 4>; /* 每个数字(cell)都是 uint32。*/
child-node1 {
my-cousin = <&cousin>;
};
};
};
/node2 {
another-property-for-node2;
};
此树包含:
必要的设备树头: /dts-v1/
对其他 DTS 文件的引用,传统上命名为 *.dtsi
,类似于 C 语言中的 .h
头文件
单个根节点: /
一对子节点:node1
和 node2
node1 的子节点:child-node1
和 child-node2
一个标签(cousin
)及对该标签的引用(&cousin
)
散布在树中的几个属性
一个重复的节点 (/node2
)
属性是简单的键值对,其值可为空,亦可包含任意字节流。虽然在数据结构中没有规定数据类型,但在设备树源代码文件中,有一些代表基本数据的表示方式。
文本字符串(以 NUL 结尾),用英文双引号表示:
string-property = "a string";
cell 由尖括号分隔,32 位无符号整数:
cell-property = <0xbeef 123 0xabcd1234>;
所有字节数据用方括号分隔,并以十六进制输入:
binary-property = [01 23 45 67 89 ab cd ef];
可以使用逗号把不同表示形式的数字连接起来:
mixed-property = "a string", [01 23 45 67], <0x12345678>;
亦可使用逗号来创建字符串列表:
string-list = "red fish", "blue fish";
/include/
的补充说明指令 /include/
实现了简单的文本引用,类似 C 语言的 #include
指令,但是设备树编译器的特性造成了不同的使用方式。鉴于节点是被命名的,可能带有绝对路径,因此在 DTS 文件(及其引用文件)中,相同的节点可能会出现两次。当发生这种情况时,节点和属性将被合并,属性会根据需要进行替换和覆盖(后续值会覆盖先前的值)。
在以上示例中,第二次出现的 /node2
会把新属性添加到原始属性中:
/node2 {
an-empty-property;
a-cell-property = <1 2 3 4>; /* 每个数字(cell)都是 uint32 */
another-property-for-node2;
child-node1 {
my-cousin = <&cousin>;
};
};
因此,一个 .dtsi
可以覆盖树中的多个位置,或者为其提供默认值。
树中的一部分经常需要引用另一部分,有四种方法可以实现这一点:
Path string
类似于文件系统路径,如在 BCM2835、BCM2836 中,I²S 设备的完整路径是 /soc/i2s@7e203000
。标准 API 不会创建到属性的路径(如 /soc/i2s@7e203000/status
)。所以,你应先找到一个节点,然后选择该节点的属性。
Phandle
phandle
属性是分配给节点的,唯一的 32 位整数。由于历史原因,你可能还会看到一个多余的匹配 linux,phandle
。Phandle 按顺序编号,从 1 开始(0 不是有效的 phandle)。它们通常由设备树编译器分配,当它在整数上下文中遇到对节点的引用时,通常以标签的形式。使用 phandle 引用节点的引用仅被编码为相应的整数(单元)值;没有标记表明它们应被解释为 phandle,因为这是应用程序定义的。
Label
如同 C 语言中的标签是为代码中的位置命名一样,设备树标签给层次结构中的节点分配名称。编译器获取标签的引用,并在字符串上下文(&node
)中将其转换为路径,在整数上下文(<&node>
)中将其转换为 phandle;原始标签不会出现在编译输出中。请注意,标签不包含结构;它们只是一个扁平的全局命名空间中的标记。
Aliases
和标签类似。不同之处在于,它们以索引形式出现在 FDT 输出。它们作为 /aliases
节点的属性进行存储,每个属性将别名名称映射到路径字符串。尽管别名节点出现在源中,但路径字符串通常显示为对标签的引用(&node
),而非完全写出。解析路径字符串为节点的设备树 API 通常查看路径的首字符,将不以斜杠开头的路径视为必须首先使用 /aliases
表转换为路径的别名。
如何构建设备树,以及如何最大程度地利用它来捕获一些硬件的配置,是一个庞大而复杂的主题。有许多可用资源,其中一部分列在下面,但有几点需要强调:
compatible
属性是硬件描述和驱动程序之间的中介。当操作系统遇到带有 compatible 属性的节点时,它会在其设备驱动程序数据库中查找最佳匹配项。在 Linux 中,通常会触发驱动程序模块的自动加载,前提是它已经被适当标记且未被列入黑名单。
status
属性指示启用还是禁用设备。如果 status 是 ok,okay 或空,则设备已启用。除此之外,status 应是 disabled,即禁用设备。将设备放置在某个 .dtsi
文件中,并将状态设置为 disabled 可能很有用。然后,派生配置可以引用该 .dtsi
,并把所需设备的状态设置为 okay。
现代片上系统(System on a Chip,SoC)是非常复杂的设备;完整的设备树可能长达数百行。再进一步,将 SoC 放置在带有其他组件的主板上,只会让情况变得更加复杂。为了保持可管理性(特别是如果有共享组件的相关设备),将共用元素放入 .dtsi
文件,以便从可能的多个 .dts
文件中引用,这是有道理的。
像树莓派这种设备,如果还支持了可选的插件配件(如扩展板),问题就会变得更加棘手。最后,每种可能的配置都需要一个设备树来描述它,但假如考虑到所有不同的基本型号和大量可用的配件,组合的数量开始迅速增加。
需要一种方法来描述这些可选组件:使用部分设备树,然后通过采用基本的设备树,并添加了一些可选元素来构建完整的树。如果这样做,这些可选元素就被称为"叠加层"。
除非你想要学习如何为树莓派编写叠加层,否则你可能更喜欢跳转到使用设备树。
设备树叠加层包含多个片段,每个片段都针对一个节点及其子节点。尽管概念听起来十分简单,但刚开始的语法似乎非常奇怪:
// 开启 i2s 接口
/dts-v1/;
/plugin/;
/ {
compatible = "brcm,bcm2835";
fragment@0 {
target = <&i2s>;
__overlay__ {
status = "okay";
test_ref = <&test_label>;
test_label: test_subnode {
dummy;
};
};
};
};
字符串 compatible
标识是为 BCM2835 设计的,这是树莓派 SoC 的基本架构;如果叠加层使用了树莓派 4 的功能,则正确的值为 brcm,bcm2711
。除此外,brcm,bcm2835
可用于所有树莓派叠加层。然后是第一个(在这种情况下是唯一的)片段。片段应从零开始编号。违反这点可能导致某些/全部片段被忽略。
每个片段都由两部分组成:一个 target
属性,用于标识要应用叠加层的节点;以及 __overlay__
本身,其主体将添加到目标节点。如果它是这样编写的,上述的示例可以解释为:
/dts-v1/;
/plugin/;
/ {
compatible = "brcm,bcm2835";
};
&i2s {
status = "okay";
test_ref = <&test_label>;
test_label: test_subnode {
dummy;
};
};
若使用的 dtc
版本够新,你可以按照上述示例编写,可获得相同的输出,但某些自制工具尚不兼容这种格式。当下,应以旧格式编写所有你想将其包含在标准树莓派系统内核的叠加层。
将该叠加层与标准树莓派基础设备树(如 bcm2708-rpi-b-plus.dtb
)合并的效果,前提是叠加层在之后加载,将启用 I²S 接口,将其状态修改为 okay
。但是,如果尝试使用以下方式编译此叠加层:
$ dtc -I dts -O dtb -o 2nd.dtbo 2nd-overlay.dts
……你将收到报错:
Label or path i2s not found
这并不怎么意外,因为没有提及基础文件 .dtb
、.dts
,编译器就找不到标签 i2s
。
再试一次,这次使用原始示例,并添加参数 -@
来允许未解决的引用(同时使用 -Hepapr
解决一些麻烦):
$ dtc -@ -Hepapr -I dts -O dtb -o 1st.dtbo 1st-overlay.dts
如果 dtc
返回了有关第三行的报错,则它没有工作所需的扩展工具。请运行 sudo apt install device-tree-compiler
,然后重试一次。这次,编译应能顺利完成。请注意,适当的编译器也可在内核树中作为 scripts/dtc/dtc
使用,当使用 dtbs
make target 时构建:
$ make ARCH=arm dtbs
转储 DTB 文件的内容,看看编译器生成了什么:
$ fdtdump 1st.dtbo
输出应类似如下:
/dts-v1/;
// magic: 0xd00dfeed
// totalsize: 0x207 (519)
// off_dt_struct: 0x38
// off_dt_strings: 0x1c8
// off_mem_rsvmap: 0x28
// version: 17
// last_comp_version: 16
// boot_cpuid_phys: 0x0
// size_dt_strings: 0x3f
// size_dt_struct: 0x190
/ {
compatible = "brcm,bcm2835";
fragment@0 {
target = <0xffffffff>;
__overlay__ {
status = "okay";
test_ref = <0x00000001>;
test_subnode {
dummy;
phandle = <0x00000001>;
};
};
};
__symbols__ {
test_label = "/fragment@0/__overlay__/test_subnode";
};
__fixups__ {
i2s = "/fragment@0:target:0";
};
__local_fixups__ {
fragment@0 {
__overlay__ {
test_ref = <0x00000000>;
};
};
};
};
在文件结构的详细描述之后,我们有了一个片段。但请仔细观察——我们在 &i2s
处写了什么,现在却写成了 0xffffffff
,这表明发生了一些奇怪的事情(较旧版本的 dtc 可能会写成 0xdeadbeef
)。编译器还添加了一个包含唯一(对于此叠加层而言)的小整数的 phandle
属性,以指示该节点具有标签,并用相同的小整数替换了对标签的所有引用。
在 fragment 之后有三个新节点:
__symbols__
列出了叠加层中使用的标签( test_label
在这里),以及带有标签节点的路径。这个节点是如何处理未解析符号的关键。
__fixups__
包含一个属性映射列表,将未解析符号的名称映射到需要使用目标节点的 phandle 进行修补的片段内单元格路径列表。在这种情况下,路径是到 target
的 0xffffffff
值,但片段可能包含其他未解析引用,这将需要另外修复。
__local_fixups__
保存了存在于叠加层内的标签引用的位置:test_ref
属性。这是必需的,因为执行合并的程序必须确保 phandle 编号是连续且唯一的。
在 1.3 节中提到“原始标签不会出现在编译输出中”,但是当使用参数 -@
时,情况并非如此。相反,每个标签都会导致节点 __symbols__
中的一个属性,将标签映射到路径,就像节点 aliases
一样。实际上,机制如此相似,以至于在解析符号时,树莓派加载程序会在没有 __symbols__
节点的情况下搜索“别名”节点。曾经,这非常有用,因为提供足够的别名可让非常老版本的 dtc
也能构建基本的 DTB 文件,但幸运的是,那已经是远古历史了。
为了减少大量的设备树叠加层产生的,外围设备用户修改 DTS 文件的需要,树莓派加载程序支持了一项新功能,设备树参数。这能使用命名参数对设备树进行小修改,类似于内核模块从 modprobe
和内核命令行接收参数的方式。参数可以由基本 DTB 和叠加层暴露,包括扩展板叠加层。
通过在根节点添加一个 __overrides__
节点来定义参数。它包含属性,其名称是选择的参数名称,其值是一个序列,包括目标节点的 phandle(对标签的引用)和指示目标属性的字符串;支持字符串、整数(cell)和布尔属性。
字符串参数
字符串参数的声明方式如下:
name = <&label>,"property";
其中 label
和 property
将被适当的值替换。字符串参数可能导致它们的目标属性增长、缩小或被创建。
请注意,名为 status
的属性被特殊对待;非零/true/yes/on 值将被转换为字符串 "okay"
,而 零/false/no/off 将变为 "disabled"
。
整数参数
整数参数是这样声明的:
name = <&label>,"property.offset"; // 8-bit
name = <&label>,"property;offset"; // 16-bit
name = <&label>,"property:offset"; // 32-bit
name = <&label>,"property#offset"; // 64-bit
在这里,label
、property
和 offset
将被适当的值替换;偏移量以字节为单位相对于属性的起始位置指定(默认为十进制),前面的分隔符指定参数的大小。与早期实现不同,整数参数可以引用不存在的属性或超出现有属性末尾的偏移量。
布尔参数
设备树将布尔值编码为零长度属性;如果存在,则该属性为 true;如果不存在,则该属性为 false。它们的定义如下:
boolean_property; // 设置 “boolean_property” 为 true
通过不定义属性将其分配值 false
。布尔参数的声明如下,用适当的值替换占位符 标签
和 属性
:
name = <&标签>,"属性?";
倒置布尔在应用相同方式之前反转输入值,就像常规布尔一样;它们的声明方式类似,但使用 !
表示反转:
name = <&标签>,"<属性>!";
布尔参数可以触发属性创建或删除,但它们不能删除基本 DTB 中已经存在的属性。
字节字符串参数
字节字符串属性是任意字节序列(如 MAC 地址)。它们接受十六进制字节的字符串,字节间的英文冒号可有可无。
mac_address = <ðernet0>,"local_mac_address[";
选择 [
是为了与声明字节字符串的设备树语法匹配:
local_mac_address = [aa bb cc dd ee ff];
具有多个目标的参数
在设备树中的某些情况下,能够在多个位置设置相同的值是很方便的。与创建多个参数的笨拙方法不同,可以通过将它们连接起来,将多个目标添加到单个参数中,就像这样:
__overrides__ {
gpiopin = <&w1>,"gpios:4",
<&w1_pins>,"brcm,pins:0";
...
};
(示例来自 w1-gpio
叠加层)
注意
甚至可以使用单个参数针对不同类型的属性。你可以合理地将“启用”参数连接到字符串
status
、包含 0/1 的单元格以及适当的布尔属性。
文本分配
设备树参数机制能从同一参数中修补多个目标,但其效用受到限制,因为必须将相同的值写入所有位置(除了格式转换和从反转布尔值中获得的否定)。嵌入式文字分配的添加允许参数写入任意值,而不管用户提供的参数值如何。
分配出现在声明的末尾,并由 =
表示:
str_val = <&target>,"strprop=value"; // 1
int_val = <&target>,"intprop:0=42" // 2
int_val2 = <&target>,"intprop:0=",<42>; // 3
bytes = <&target>,"bytestr[=b8:27:eb:01:23:45"; // 4
第 1、2 和 4 行相当明显,但第 3 行更有趣,因为该值显示为整数(单元)值。设备树编译器在编译时评估整数表达式,这可能很方便(特别是如果使用宏值),但该单元也可以包含对标签的引用:
// 强制 LED 使用内置 GPIO 控制器上的 GPIO。
exp_led = <&led1>,"gpios:0=",<&gpio>,
<&led1>,"gpios:4";
应用叠加层时,标签将按照通常的方式针对基本 DTB 进行解析。最好将多部分参数拆分到多行,以便更容易阅读——随着单元值分配的增加,这变得更加必要。
请记住,除非应用了参数,否则参数不起作用(查找表中的默认值将被忽略),除非使用参数名称而不指定值。
查找表
查找表可在使用之前转换参数输入值。它们充当关联数组,有点像 switch/case 语句:
phonetic = <&node>,"letter{a=alpha,b=bravo,c=charlie,d,e,='tango uniform'}";
bus = <&fragment>,"target:0{0=",<&i2c0>,"1=",<&i2c1>,"}";
不含 =value
的键意味着把键作为值,不含键的 = 表示在没有匹配项的情况下是默认值,并且以逗号开始或结束列表(或在任意处使用 空键=值
对)表示未匹配的输入值应该保持不变;否则,找不到匹配项将会报错。
注意
在单元格整数值后的表字符串中,逗号分隔符是隐式的:显示添加一个会创建一个空对(见上文)。
注意
由于查找表操作的是输入值,而文字赋值会忽略它们,因此不可能将两者结合在一起:查找声明中
}
结束后的字符被视为错误。
叠加层/片段参数
描述中所述的设备树参数机制存在许多限制,包括缺乏创建整数数组的简便方法,以及无法创建新节点。克服其中一些限制的方法是有条件地包含或排除某些片段。
通过将 __overlay__
节点重命名为 __dormant__
,可以将片段从最终合并过程中排除(禁用)。参数声明语法已增补,以允许否则非法的零目标 phandle 指示以下字符串包含片段或叠加层范围的操作。到目前为止,已实现了四种操作:
+<n> // 启用片段 <n>
-<n> // 禁用片段 <n>
=<n> // 如果指定的参数值为 true,则启用片段 <n>,否则禁用片段 <n>。
!<n> // 如果指定的参数值为 false,则启用片段 <n>,否则禁用片段 <n>。
例子:
just_one = <0>,"+1-2"; // 开启 1,禁用 2
conditional = <0>,"=3!4"; // 如果值为 true,则启用 3,禁用 4。
// 如果值为 false,则禁用 3,启用 4。
叠加层 i2c-rtc
使用这种技术。
特殊属性
一些属性名称,在被参数定位时,会得到特殊处理。你可能已经注意到的一个——status
:将布尔值转换为 okay
表示 true,disabled
表示 false。
分配给 bootargs
属性会将其附加到其末尾,而不是覆盖它。这是如何向内核命令行添加设置的方式。
reg
属性用于指定设备地址,即内存映射硬件块的位置,I²C 总线上的地址等。子节点的名称应该用十六进制地址加以限定,使用 @
作为分隔符:
bmp280@76 {
reg = <0x77>;
...
};
当分配给 reg
属性时,父节点名称的地址部分将被替换为分配的值。这可用于在多次使用相同叠加层时防止节点名称冲突,即这是 i2c-gpio
叠加层使用的技术。
name
属性是一个伪属性,即它不应出现在设备树中,但是对其赋值会导致其父节点的名称修改为分配的值。与 reg
属性一样,可用于给节点提供唯一的名称。
叠加层映射文件
随着树莓派 4(基于 BCM2711 SoC 构建)的问世,带来了许多变化;其中某些变化是附加的接口,另一些是对现有接口进行的修改(删除)。有一些专为树莓派 4 设计的新叠加层,这些叠加层在旧硬件上无意义(如启用新的 SPI、I²C 和串口的叠加层),哪怕是控制着新设备上仍相关的功能的其他叠加层,也不能正确应用。
因此,有必要针对具有不同硬件的多个平台定制叠加层方法。在单个 .dtbo
文件中支持它们将需要大量使用隐藏的(“休眠”)片段,并切换到按需符号解析机制,以便不带的丢失符号也不会导致失败。一个更简单的解决方案是添加一个功能,根据当前平台将叠加层名称映射到几个实现文件中的一个。
叠加层映射是固件在引导时加载的文件。它以 DTS 源代码格式编写为 overlay_map.dts
,被编译为 overlay_map.dtb
并存放在叠加层目录。
这是当前映射文件的节选(请参阅完整版本):
/ {
disable-bt {
bcm2835;
bcm2711;
bcm2712 = "disable-bt-pi5";
};
disable-bt-pi5 {
bcm2712;
};
uart5 {
bcm2711;
};
pi3-disable-bt {
renamed = "disable-bt";
};
lirc-rpi {
deprecated = "use gpio-ir";
};
};
每个节点都有一个需要特殊处理的叠加层名称。每个节点的属性要么是平台名称,要么是少数几个特殊指令之一。当前支持的平台有:bcm2835
,其中包括所有基于 BCM2835、BCM2836 和 BCM2837 SoC 构建的树莓派;bcm2711
适用于树莓派 4B、400 和 CM4;bcm2712
适用于树莓派 5 和 CM5。
不带值的平台名称(空属性)表示当前叠加层与该平台兼容;例如,uart5
兼容 bcm2711
平台。对于平台的非空值是要使用的替代叠加层的名称,请求在 BCM2712 上使用 disable-bt
会触发加载 disable-bt-pi5
。未在叠加层节点中包含的任何平台都不兼容该叠加层。未在映射中提到的任何叠加层都推定与所有平台兼容。
第二个示例节点,disable-bt-pi5
:可从 disable-bt
的内容中推断出,但这种智能是用于文件的构建,而不是用于其解释。
仅在 BCM2711 上使用 uart5
叠加层才有意义。
如果没有为叠加层列出平台,则可能适用其中某个特殊指令:
renamed
指令表示叠加层的新名称(应与原始名称基本兼容),但也会记录有关更名的警告。
deprecated
指令包含一个简要的解释性错误消息,在通用前缀 overlay '...' is deprecated:
之后将被记录。
链接重命名和特定于平台的实现是允许的,但要小心避免循环!
切记:只需列出异常——叠加层的节点缺失意味着应该为所有平台使用默认文件。
在调试中介绍了如何从固件中获取诊断消息。
dtoverlay
和 dtmerge
工具已增补,可支持映射文件:
dtmerge
从基础 DTB 中的兼容字符串中提取平台名称。
dtoverlay
从 live 设备树中读取兼容字符串位于 /proc/device-tree
处,但你可以使用参数 -p
来提供替代平台名称(在不同平台上进行干扰运行时很有用)。
它们都将错误、警告和所有调试输出发送到 STDERR。
示例
这里有一些不同类型的属性示例,带有修改它们的参数:
/ {
fragment@0 {
target-path = "/";
__overlay__ {
test: test_node {
string = "hello";
status = "disabled";
bytes = /bits/ 8 <0x67 0x89>;
u16s = /bits/ 16 <0xabcd 0xef01>;
u32s = /bits/ 32 <0xfedcba98 0x76543210>;
u64s = /bits/ 64 < 0xaaaaa5a55a5a5555 0x0000111122223333>;
bool1; // 默认为 true
// bool2 默认为 false
mac = [01 23 45 67 89 ab];
spi = <&spi0>;
};
};
};
fragment@1 {
target-path = "/";
__overlay__ {
frag1;
};
};
fragment@2 {
target-path = "/";
__dormant__ {
frag2;
};
};
__overrides__ {
string = <&test>,"string";
enable = <&test>,"status";
byte_0 = <&test>,"bytes.0";
byte_1 = <&test>,"bytes.1";
u16_0 = <&test>,"u16s;0";
u16_1 = <&test>,"u16s;2";
u32_0 = <&test>,"u32s:0";
u32_1 = <&test>,"u32s:4";
u64_0 = <&test>,"u64s#0";
u64_1 = <&test>,"u64s#8";
bool1 = <&test>,"bool1!";
bool2 = <&test>,"bool2?";
entofr = <&test>,"english",
<&test>,"french{hello=bonjour,goodbye='au revoir',weekend}";
pi_mac = <&test>,"mac[{1=b8273bfedcba,2=b8273b987654}";
spibus = <&test>,"spi:0[0=",<&spi0>,"1=",<&spi1>,"2=",<&spi2>;
only1 = <0>,"+1-2";
only2 = <0>,"-1+2";
enable1 = <0>,"=1";
disable2 = <0>,"!2";
};
};
更多示例,请查看树莓派 Linux GitHub 存储库中托管的大量叠加层源文件。
固件中的叠加层在处理和使用 dtoverlay
工具的运行时叠加层应用,将在叠加层中定义的标签视为私有于该叠加层。这样可以避免为标签发明全局唯一名称(使它们保持简短),并且允许同一叠加层多次使用而不发生冲突(前提是使用一些技巧,请参阅特殊属性)。
有时,创建一个标签并从另一个叠加层中使用它非常有用。自 2020 年 2 月 14 日发布的固件具有将某些标签声明为全局的能力:__exports__
节点:
...
public: ...
__exports__ {
public; // 将标签“public”导出到基本设备树 (DT)
};
};
当应用此叠加层时,加载程序会剥离除了已导出的符号之外的所有符号(在本例中为 public
),并重新编写路径,使其相对于包含标签的片段的目标。然后加载在此之后的叠加层可以引用 &public
。
在大多数情况下,片段应用的顺序无关紧要,但对于自身打补丁的叠加层(其中片段的目标是叠加层中的标签,称为叠加层内部片段),应用顺序非常重要。在旧固件上,片段严格按顺序从上到下应用。自 2020 年 2 月 14 日以降,固件把片段分两次应用:
首先应用并隐藏目标其他片段的片段。
然后应用常规片段。
这种拆分对于运行时叠加层特别重要,因为第一步在工具 dtoverlay
中执行,第二步由内核执行(无法处理内部叠加层片段)。
config.txt
在树莓派上,加载程序(如 start.elf
镜像)的任务是把叠加层与适当的基础设备树相结合,然后将完全解析的设备树传给内核。基础设备树位于 FAT 分区(Linux 在 /boot/firmware/
)中与 start.elf
相邻,命名是 bcm2711-rpi-4-b.dtb
、bcm2710-rpi-3-b-plus.dtb
等。请注意,某些型号(3A+,A,A+)将使用对应的“b”款等效型号(3B+,B,B+)。此选择是自动的,并允许在所有设备中使用相同的存储卡镜像。
注意
设备树、ATAG 相互斥,将 DTB 传给不支持它的内核将造成启动失败。可固件将始终尝试加载设备树,并将其传递给内核。因为自 rpi-4.4.y 以降,若没有 DTB,所有的内核都无法正常工作。你可以在
config.txt
中添加device_tree=
来覆盖此设置,这将强制使用 ATAG,对于简单的裸机内核可能很有用。
当前的加载程序支持使用 bcm2835_defconfig
进行构建,该配置选择了上游 BCM2835 支持。这个配置将触发构建 bcm2835-rpi-b.dtb
、bcm2835-rpi-b-plus.dtb
。如果这些文件与内核一起被复制,那么加载程序将尝试默认加载其中某个 DTB。
为了管理设备树和叠加层,加载程序可使用一些 config.txt
指令:
dtoverlay=acme-board
dtparam=foo=bar,level=42
这将触发加载程序在固件分区中查找 overlays/acme-board.dtbo
。树莓派系统把固件分区挂载到了 /boot/firmware/
。然后它会搜索参数 foo
和 level
,并将指定的值分配给它们。
加载程序还将搜索附加扩展板(带有已编程 EEPROM),并从中加载们能用的叠加层:直接或通过“overlays”目录中的名称; 这一切都在没有任何用户干预的情况下进行。
有多种方法可以告诉内核正在使用设备树:
在引导过程中,“Machine model:”内核信息具有特定于主板的值,如“Raspberry Pi 2 Model B”,而非“BCM2709”。
有 /proc/device-tree
,包含了与设备树的节点和属性完全相同的子目录和文件。
使用设备树,内核将自动搜索并加载支持指示启用设备的模块。因此,通过为设备创建适当的设备树叠加层,你可以使设备用户免于编辑 /etc/modules
;所有配置都在 config.txt
中进行(如使用扩展板,甚至这一步都不需要做)。但是,请注意,诸如 i2c-dev
之类的分层模块仍然需要显式加载。
反过来,由于平台设备只有在 DTB 请求时才会被创建,因此不再需要黑名单模块,这些模块过去是由主板支持代码中定义的平台设备加载的结果。实际上,当前的树莓派系统镜像不包含黑名单文件(除了某些 WLAN 设备,其中有多个可用驱动程序)。
如上所述,设备树参数是一种方便的方式:可以对设备的配置进行小的修改。当前的基本 DTB 支持用于启用和控制板载音频、I²C、I²S 和 SPI 接口的参数,而无需使用专用叠加层。在使用中,参数看起来像这样:
dtparam=audio=on,i2c_arm=on,i2c_arm_baudrate=400000,spi=on
注意
多个赋值可以放在同一行,但要确保未超过 80 个字符的限制。
如果你有一个定义了某些参数的叠加层,可在后续行上指定这些参数,就像这样:
dtoverlay=lirc-rpi
dtparam=gpio_out_pin=16
dtparam=gpio_in_pin=17
dtparam=gpio_in_pull=down
…或者像这样将参数附加到叠加层行:
dtoverlay=lirc-rpi,gpio_out_pin=16,gpio_in_pin=17,gpio_in_pull=down
叠加层参数仅在加载下一个叠加层之前有效。如果同名参数同时被叠加层和基础导出,叠加层中的参数优先;但建议不要这么做。要暴露基础 DTB 导出的参数,可以结束当前叠加层范围:
dtoverlay=
树莓派开发板有两个 I²C 接口。他们通常区分为:一个用于 ARM,一个用于 VideoCore(GPU)。在几乎所有型号上,i2c1
属于 ARM,i2c0
属于 VC(用于控制摄像头并读取扩展板的 EEPROM)。然而,两个旧款的 B 型树莓派设定相反。
为了使所有树莓派都能使用同一组叠加层和设备树参数,固件创建了一些特定于主板的参数。这些是:
i2c/i2c_arm
i2c_vc
i2c_baudrate/i2c_arm_baudrate
i2c_vc_baudrate
这些分别是 i2c0
、i2c1
、i2c0_baudrate
和 i2c1_baudrate
的别名。建议仅在必要时才使用 i2c_vc
和 i2c_vc_baudrate
。比如,你正在编程扩展板的 EEPROM(最好使用 i2c-gpio
叠加层使用 I²C 软件总线)。启用 i2c_vc
可能会导致树莓派相机、树莓派触摸显示屏无法正常工作。
对于编写叠加层的人,相同的别名已应用于 I²C 设备树节点上的标签。因此,你应该编写:
fragment@0 {
target = <&i2c_arm>;
__overlay__ {
status = "okay";
};
};
所有基于数字衍生的叠加层将被修改为使用新的别名。
树莓派扩展板(HAT)是搭载了嵌入式 EEPROM 的扩展板,专为带有 40 脚 GPIO 排针的树莓派设计。EEPROM 包括启用板(或要从文件系统加载的叠加层的名称)所需的所有设备树叠加层,此叠加层还可以公开参数。但
扩展板叠加层在基本 DTB 之后由固件自动加载,因此其参数可在加载其他所有叠加层之前访问,或者在使用 dtoverlay=
结束叠加层范围之前访问。如果出于某种原因你想要抑制 HAT 叠加层的加载,请在任何其他 dtoverlay
或 dtparam
指令之前放置 dtoverlay=
。
自 Linux 4.4 以降,树莓派内核可支持叠加层和参数的动态加载。兼容内核管理一个叠加层的堆栈,这些叠加层位于基本 DTB 之上。修改立即反映在 /proc/device-tree
中,可触发模块的加载,平台设备的创建与销毁。
上面提到的“堆栈”一词非常重要:叠加层只能在堆栈顶部添加和移除;修改堆栈中较低位置的内容需要首先移除其顶部的所有内容。
有一些用于管理叠加层的新命令:
命令 dtoverlay
dtoverlay
是一个命令行工具,可在系统运行时加载和移除叠加层,同时列出可用的叠加层并显示其帮助信息。
使用 dtoverlay -h
获取使用信息:
Usage:
dtoverlay <overlay> [<param>=<val>...]
Add an overlay (with parameters)
dtoverlay -D [<idx>] Dry-run (prepare overlay, but don't apply -
save it as dry-run.dtbo)
dtoverlay -r [<overlay>] Remove an overlay (by name, index or the last)
dtoverlay -R [<overlay>] Remove from an overlay (by name, index or all)
dtoverlay -l List active overlays/params
dtoverlay -a List all overlays (marking the active)
dtoverlay -h Show this usage message
dtoverlay -h <overlay> Display help on an overlay
dtoverlay -h <overlay> <param>.. Or its parameters
where <overlay> is the name of an overlay or 'dtparam' for dtparams
Options applicable to most variants:
-d <dir> Specify an alternate location for the overlays
(defaults to /boot/firmware/overlays or /flash/overlays)
-v Verbose operation
与 config.txt
等效,但有区别:所有叠加层的参数必须位于同一条命令行中:dtparam 命令仅用于基本 DTB 的参数。
变更内核状态(如添加和删除内容)的衍生命令需要 root 权限,因此可能需要在命令前加上 sudo
。只有在运行时应用的叠加层和参数可以被卸载——由固件应用的叠加层或参数会“固定”在系统中,因此不会被 dtoverlay
列出,也无法被移除。
命令 dtparam
dtparam
创建并加载一个叠加层,其效果基本与在 config.txt
中使用 dtparam
指令相同。在使用上,它与带有 -
的叠加层名称的 dtoverlay
基本等效,但存在一些差异: dtparam
将列出基础 DTB 的所有已知参数的帮助信息。仍然可使用 dtparam -h
获取有关 dtparam 命令的帮助。在指示要移除的参数时,只能使用索引号(而非名称)。并非所有的 Linux 子系统都会在运行时响应设备的添加:I²C、SPI 和声音设备可以工作,但有些则不行。
运行时可用叠加层的撰写指南
创建或删除设备对象是由添加或移除节点,或节点状态从禁用变为启用或反之触发的。"status"属性的缺失意味着节点已启用。
不要在将叠加层基础 DTB 中现有节点的片段内创建节点,因为内核将重命名新节点以使其唯一。如果要修改现有节点的属性,请创建一个针对它的片段。
ALSA 不会干预其编解码器和其他组件在使用时的卸载行为。如果要删除的编解码器正在被声卡所使用,删除其使用的叠加层可能会导致内核异常。实验发现设备在叠加层中以片段顺序的相反顺序被删除,因此将卡的节点放在组件节点之后允许有序关闭。
注意事项
在运行时加载叠加层是内核的一个最新功能,截至本文撰写时,无法从用户空间执行此操作。通过将此机制的细节隐藏在命令背后,用户可以在不同内核接口标准的情况下免受影响。
某些叠加层在运行时的效果比其他叠加层更好。某些设备树部分仅在引导时使用,所以使用叠加层修改它们是无效的。
应用或移除一些叠加层可能会触发意外行为,因此应谨慎进行。这就是需要 sudo
的原因之一。
卸载 ALSA 卡的叠加层可能会因为某些正在使用 ALSA 的活动而等待:LXPanel 音量滑块插件展示了这种效果。为了使声卡的叠加层能够被移除,lxpanelctl
工具已被赋予两个新参数:alsastop
和 alsastart
,并且这些参数在加载或卸载叠加层之前和之后分别调用辅助脚本 dtoverlay-pre
和 dtoverlay-post
。
移除叠加层不会触发卸载已加载的模块,但可能会导致一些模块的引用计数降至零。运行两回 rmmod -a
将触发卸载未使用的模块。
叠加层必须按相反顺序移除。这些命令将允许你移除较早的叠加层,但所有中间的叠加层将被移除并重新应用,这可能会产生意想不到的后果。
仅会探测树顶层和总线节点的子级的设备树节点。对于运行时添加的节点,进一步的限制是总线必须注册通知以添加和移除子级。但是,有一些例外情况会打破这个规则并引起混淆:内核明确扫描整个树以寻找某些设备类型(时钟和中断控制器是主要的两种),以便早期初始化它们(对于时钟)或按特定顺序初始化(对于中断控制器)。这种搜索机制仅在引导过程中进行,因此对于运行时由叠加层添加的节点无效。因此,建议将固定时钟节点放在树的根部,除非保证不会在运行时使用叠加层。
要获取受支持的叠加层及参数,请参阅 /boot/firmware/overlays
下,叠加层文件 .dtbo
附加的 README 文件。它会不断地添加和修改,以保持最新。
固件使用特殊的 /chosen
节点在引导加载程序及固件与操作系统之间传递参数。除非另有说明,否则每个属性都存储为 32 位整数。
overlay_prefix
(字符串)由 config.txt
选择的 overlay_prefix
字符串。
os_prefix
(字符串)由 config.txt
选择的 os_prefix 字符串。
rpi-boardrev-ext
来自 OTP 第 33 行 的扩展板修订代码。
rpi-country-code
PiWiz 使用的区域码。仅适用于树莓派 400。
rpi-duid
(字符串)仅适用于树莓派 5。PCB 上二维码的字符串表示。
/chosen/bootloader
除非另有说明,否则每个属性都存储为 32 位整数。
boot-mode
用于加载内核的引导模式。请参阅 BOOT_ORDER。
partition
引导过程中使用的分区号。如果加载了虚拟内存盘(ramdisk )boot.img
,则此引用的是虚拟内存盘中加载的分区,而不是虚拟内存盘内部的分区号。
pm_rsts
在引导过程中寄存器 PM_RSTS
的值。
tryboot
如果在启动时设置了参数 tryboot
,则置为 1
。
/chosen/power
仅适用于树莓派 5。除非另有说明,否则每个属性均被存储为 32 位整数。
max_current
电源适配器可以提供的最大电流(以 mA 为单位)。固件报告的由 USB-C、USB-PD 或 PoE 接口指示的值。对于台式电源适配器(如接入 GPIO 针脚),请在引导加载程序配置中定义 PSU_MAX_CURRENT
,来指示电源适配器的电流能力。
power_reset
仅适用于树莓派 5。一个位字段,指示电源管理(PMIC)被重置的原因。
0
过压
1
低压
2
高温
3
启用信号
4
Watchdog
rpi_power_supply
(一对 32 位整数)树莓派官方 27W 电源适配器的 USB VID 和 Product VDO(如已接入)。
usb_max_current_enable
如果 USB 接口的电流限制器在启动时被设置为低限,则为 0;如果启用了高限,则为非 0
值。如果电源适配器报告其最大电流为 5A,或在 config.txt
中强制使用 usb_max_current_enable=1
,则自动启用高电平。
usb_over_current_detected
如果在 USB 启动期间发生过 USB 过流事件,则为非 0
值。
usbpd_power_data_objects
(包含多个 32 位整数的二进制数据区块)引导加载程序在 USB-PD 协商期间接收到的原始二进制 USB-PD 对象(仅限固定供电)。要为错误报告捕获此内容,请运行 hexdump -C /proc/device-tree/chosen/power/usbpd_power_data_objects
。
格式由 USB PD 规范定义。
/chosen/bootloader
以下属性特定于 BCM2711 和 BCM2712 的 SPI EEPROM 引导加载程序。除非另有说明,否则每个属性都存储为 32 位整数。
build_timestamp
EEPROM 引导加载程序的构建时间(UTC)。
capabilities
这个位字段描述了当前引导加载程序支持的功能。这可以用来在引导加载程序 EEPROM 配置中启用功能(例如 USB 启动)之前检查是否支持。
0
使用 VLI USB 主机控制器进行
1
2
模式
3
4
使用 BCM2711 USB 主机控制器进行
5
6
7
update_timestamp
由 rpi-eeprom-update
设置的更新时间戳(UTC)。
signed
如启用安全启动,此位字段为非 0
。每个位指示当前的安全启动配置。
0
已在 EEPROM 配置文件中定义 SIGNED_BOOT
。
1
保留
2
ROM 开发密钥已吊销。请参阅 。
3
OTP 中已写入客户公钥摘要。请参阅 。
4…31
保留
version
(字符串)用于引导加载程序的 Git 版本,是字符串。
/chosen/bootloader/usb
如果系统是从 USB 启动的,则定义以下属性。这些属性可用于唯一标识 USB 引导设备。每个属性存储为 32 位整数。
usb-version
USB 主协议版本(2 或 3)。
route-string
由 USB 3.0 规范定义的设备的 USB 路由字符串标识符。
root-hub-port-number
引导设备连接到的根集线器端口号:可能通过其他 USB 集线器连接。
lun
用于大容量存储设备的逻辑单元号。
固件通过 NVMEM 子系统提供引导加载程序 EEPROM 部分的只读内存映射。
每个区域在 /sys/bus/nvmem/devices/
下显示为一个 NVMEM 设备,在 /sys/firmware/devicetree/base/aliases
下显示为一个命名别名。
从 rpi-eeprom-update 读取 NVMEM 模式的示例 shell 脚本代码。
blconfig_alias="/sys/firmware/devicetree/base/aliases/blconfig"
blconfig_nvmem_path=""
if [ -f "${blconfig_alias}" ]; then
blconfig_ofnode_path="/sys/firmware/devicetree/base"$(strings "${blconfig_alias}")""
blconfig_ofnode_link=$(find -L /sys/bus/nvmem -samefile "${blconfig_ofnode_path}" 2>/dev/null)
if [ -e "${blconfig_ofnode_link}" ]; then
blconfig_nvmem_path=$(dirname "${blconfig_ofnode_link}")
fi
fi
fi
blconfig
别名,指向存储引导加载程序 EEPROM 配置文件副本的 NVMEM 设备。
blpubkey
别名,指向以二进制格式存储引导加载程序 EEPROM 公钥副本(如果已定义)的 NVMEM 设备。可以使用 rpi-bootloader-key-convert 工具将数据转换为 PEM 格式,以便与 OpenSSL 一起使用。
有关更多信息,请参阅安全启动。
加载程序将跳过缺少的叠加层和错误参数,但如果存在严重错误,比如缺少或损坏的基本 DTB 或失败的叠加层合并,那么加载程序将退回到非设备树引导。如果发生这种情况,或者如果你的设置不符合你的期望,需要检查加载程序的警告或错误:
$ sudo vclog --msg
通过将 dtdebug=1
添加到 config.txt
可以启用其他的调试。
你可以这样创建当前设备树状态,以人类可读的形式表示:
$ dtc -I fs /proc/device-tree
这对于查看将叠加层合并到基础树上的效果可能很有用。
如果内核模块未按预期加载,请检查它们是否在 /etc/modprobe.d/raspi-blacklist.conf
中,即是否被列入了黑名单;在使用设备树时,不应该有黑名单的使用需求。如果没有发现任何异常,你还可以通过在 /lib/modules/<版本>/modules.alias
中搜索 compatible
值来检查模块是否导出了正确的别名。否则,你的驱动程序可能缺少以下内容之一:
.of_match_table = xxx_of_match,
要么:
MODULE_DEVICE_TABLE(of, xxx_of_match);
如果失败,可能因为 depmod
失败,或者更新的模块尚未安装在目标文件系统上。
dtmerge
、dtdiff
和 ovmerge
测试叠加层。除了命令 dtoverlay
和 dtparam
,还有一款能把叠加层应用到 DTB 的工具:dtmerge
。要使用它,你首先需要获取基本的 DTB,可以通过以下两种方式获取:
从 /proc/device-tree
中的实时设备树状态生成它:
$ dtc -I fs -O dtb -o base.dtb /proc/device-tree
将包含你迄今为止在 config.txt
中应用的所有叠加层和参数,或者通过在运行时加载它们,这可能是你想要的,也可能不是。或者:
从 /boot/firmware/
中的源 DTB 复制它。这不会包括叠加层和参数,但也不会包括固件的一切其他修改。为了允许测试所有叠加层,dtmerge
工具将创建一些特定于板的别名("i2c_arm" 等),但这意味着合并的结果将与原始 DTB 有更多差异。你可能期望的不同。解决此问题的方法是使用 dtmerge 进行复制:
$ dtmerge /boot/firmware/bcm2710-rpi-3-b.dtb base.dtb -
( -
表示不存在的叠加层名称)。
你现在可以尝试应用叠加层/参数:
$ dtmerge base.dtb merged.dtb - sd_overclock=62
$ dtdiff base.dtb merged.dtb
将返回:
--- /dev/fd/63 2016-05-16 14:48:26.396024813 +0100
+++ /dev/fd/62 2016-05-16 14:48:26.396024813 +0100
@@ -594,7 +594,7 @@
};
sdhost@7e202000 {
- brcm,overclock-50 = <0x0>;
+ brcm,overclock-50 = <0x3e>;
brcm,pio-limit = <0x1>;
bus-width = <0x4>;
clocks = <0x8>;
你还可以比较不同的叠加层/参数。
$ dtmerge base.dtb merged1.dtb /boot/firmware/overlays/spi1-1cs.dtbo
$ dtmerge base.dtb merged2.dtb /boot/firmware/overlays/spi1-2cs.dtbo
$ dtdiff merged1.dtb merged2.dtb
要获得:
--- /dev/fd/63 2016-05-16 14:18:56.189634286 +0100
+++ /dev/fd/62 2016-05-16 14:18:56.189634286 +0100
@@ -453,7 +453,7 @@
spi1_cs_pins {
brcm,function = <0x1>;
- brcm,pins = <0x12>;
+ brcm,pins = <0x12 0x11>;
phandle = <0x3e>;
};
@@ -725,7 +725,7 @@
#size-cells = <0x0>;
clocks = <0x13 0x1>;
compatible = "brcm,bcm2835-aux-spi";
- cs-gpios = <0xc 0x12 0x1>;
+ cs-gpios = <0xc 0x12 0x1 0xc 0x11 0x1>;
interrupts = <0x1 0x1d>;
linux,phandle = <0x30>;
phandle = <0x30>;
@@ -743,6 +743,16 @@
spi-max-frequency = <0x7a120>;
status = "okay";
};
+
+ spidev@1 {
+ #address-cells = <0x1>;
+ #size-cells = <0x0>;
+ compatible = "spidev";
+ phandle = <0x41>;
+ reg = <0x1>;
+ spi-max-frequency = <0x7a120>;
+ status = "okay";
+ };
};
spi@7e2150C0 {
Utils 存储库包含了另一款设备树工具——ovmerge
。与 dtmerge
不同,ovmerge
结合了文件并以源形式应用叠加层。由于叠加层从未被编译,标签得以保留,结果通常更易读。它还具有许多其他技巧,例如能够列出文件包含的顺序。
如果你有非常特定的需求,而默认 DTB 无法满足,或者你只是想尝试编写自己的设备树,请让加载程序加载指定的 DTB 文件,就像这样:
device_tree=my-pi.dtb
树莓派的 Linux 内核需要使用设备树。对于裸机和其他操作系统,可通过添加以下内容来禁用设备树加载:
device_tree=
到 config.txt
。
加载程序使用的一些快捷方式:
dtparam=i2c_arm=on
dtparam=i2s=on
可以简写成:
dtparam=i2c,i2s
( i2c
是 i2c_arm
的别名,=on
为默认)。它仍然接受长形式版本: device_tree_overlay
和 device_tree_param
。
config.txt
中可用的其他设备树命令device_tree_address
用于覆盖固件加载设备树的地址(不是 dt-blob)。在默认情况下,固件将选择一个合适的位置。
device_tree_end
将对加载的设备树设置(独占)限制。默认情况下,设备树可以增长到可用内存的末尾,这几乎肯定是所需的。
dtdebug
如果非 0
,会打开固件的设备树处理的一些详细日志记录。
enable_uart
启用主/控制台串口(在树莓派 3、4、400,树莓派 Zero W 和 Zero 2 W 上为 ttyS0,在其他情况下为 ttyAMA0——除非与诸如 miniuart-bt 的叠加层交换)。如果主串口是 ttyAMA0,则 enable_uart
默认为 1
(已启用),否则默认为 0
(已禁用)。这是因为有必要阻止核心频率的变化,否则会使 ttyS0 无法使用,因此 enable_uart=1
意味着 core_freq=250
(除非 force_turbo=1
)。在某些情况下,这会影响性能,因此默认情况下关闭。
overlay_prefix
指定要从中加载叠加层的子目录/前缀。默认为 "overlays/"。请注意末尾的“/”。如果需要,你可以在最后一个“/”后添加内容以向每个文件添加前缀,尽管这可能不是必要的。
可以用设备树对端口进行进一步的控制。有关更多详细信息,请参阅第 3 节。
如果你在阅读本文档后,仍未得到解决设备树问题的办法,也有别的方法能用。通常在树莓派文档论坛上能找到答案,尤其是设备树论坛。
注意
通过用户提供的 DTB 自定义默认引脚配置的方法,已弃用。
在引导序列期间,GPIO 引脚经历了各种操作。
上电时,引脚默认为输入状态,并具有默认的上拉电阻、下拉电阻,这些在数据表中有说明
由 bootrom 设置
通过 bootcode.bin
设置
通过 dt-blob.bin
设置(当前位置)
通过 GPIO 命令在 config.txt
中设置
附加固件引脚(如串口)
内核/设备树
在软重置时,该过程仍适用,除了默认的上拉电阻、下拉电阻(仅在上电复位时应用)。
可能需要几秒钟才能完成此过程。在此期间,GPIO 引脚的状态可能与附加外设的预期状态(由 dt-blob.bin
或 config.txt
定义)不同。由于不同的 GPIO 引脚,其默认上拉、下拉状态都不一样,你应对你的外设执行 某个操作:
选择在复位时,默认的 GPIO 引脚(具备外设所需的上拉、下拉电阻)
延迟外设启动,直到完成相关操作。
添加适当的上拉电阻、下拉电阻
为了将设备树源代码文件(.dts
)编译成 DTB(.dtb
)文件,必须安装设备树编译器,方法是运行 sudo apt install device-tree-compiler
。然后可以使用 dtc
命令,如下:
$ sudo dtc -I dts -O dtb -o /boot/firmware/dt-blob.bin dt-blob.dts
同样,如有需要,可将 .dtb
文件转换回 .dts
文件。
$ dtc -I dtb -O dts -o dt-blob.dts /boot/firmware/dt-blob.bin
dt-blob
的各个部分dt-blob.bin
用于在启动时配置二进制区块(VideoCore)。Linux 内核目前不使用它。dt-blob 可以配置所有型号的树莓派(包括计算模块),以使用替代设置。dt-blob 中的以下部分有效:
videocore
本部分包含了 VideoCore 所有的二进制区块信息。所有后续部分必须被包含在此部分内。
pins_*
有许多单独的 pins_*
部分,基于特定型号的树莓派,即:
pins_rev1
:Rev1 引脚设置。由于移动了 I²C 引脚,因此存在一些差异。
pins_rev2
:Rev2 引脚设置。涉及 P5 上附加编解码器的引脚。
pins_bplus1
:树莓派 1B+ 修订版 1.1,包括完整的 40 脚排针。
pins_bplus2
:树莓派 1B+ 修订版 1.2,交换 low-power 和 lan-run 引脚。
pins_aplus
:树莓派 1A+,未搭载以太网。
pins_2b1
:树莓派 2B 修订版 1.0;通过 I²C0 控制开关电源管理系统。
pins_2b2
:树莓派 2B 修订版 1.1;通过软件 I²C 在 42 和 43 上控制开关电源管理系统。
pins_3b1
:树莓派 3B 修订版 1.0
pins_3b2
:树莓派 3B 修订版 1.2
pins_3bplus
:树莓派 3B+
pins_3aplus
:树莓派 3A+
pins_pi0
:树莓派 Zero
pins_pi0w
:树莓派 Zero W
pins_pi02w
:树莓派 Zero 2 W
pins_cm
:树莓派计算模块 1。默认情况下,这是芯片的默认设置,因此它是关于芯片上默认上拉、下拉的有用信息来源。
pins_cm3
:树莓派计算模块 3
pins_cm3plus
:树莓派计算模块 3+
pins_cm4s
:树莓派计算模块 4S
pins_cm4
:树莓派计算模块 4
每个 pins_*
部分都可包含 pin_config
和 pin_defines
部分。
pin_config
pin_config
部分用于配置各个引脚。该部分中的每个项目必须是一个被命名的引脚部分,例如 pin@p32
,表示 GPIO32。还有一个特殊部分 pin@default
,其中包含未在 pin_config
部分中明确命名的所有内容的默认设置。
pin@pinname
该部分可以包含以下项目的任意组合:
polarity
active_high
active_low
termination
pull_up
pull_down
no_pulling
startup_state
active
inactive
function
input
output
sdcard
i2c0
i2c1
spi
spi1
spi2
smi
dpi
pcm
pwm
uart0
uart1
gp_clk
emmc
arm_jtag
drive_strength_mA
驱动强度用于设置引脚的强度。请注意,你只能为该参数指定单个驱动强度。有效值为 <8>
、<16>
。
pin_defines
此部分用于将 VideoCore 的特定功能分配给指定引脚。这使用户能把摄像头电源使能引脚移动到其他位置,或改变 HDMI 热插拔位置:这些都是 Linux 无法控制的。请参考以下 DTS 示例文件。
可以通过此接口修改时钟的配置,但也许结果难以预测!时钟系统的配置异常复杂。有五个独立的锁相环(PLL),每个 PLL 都有自己的固定(PLLC 下可变)压控振荡器(VCO)频率。每个 VCO 然后有多个不同的通道,可以设置为 VCO 频率的不同分频。每个时钟目的地都可以设置为从某个时钟通道获取信号,但由于时钟信号源到目的地的映射有限,因此并非所有通道都能连接到所有时钟目的地。
这里有一些示例配置,你可以用来修改特定的时钟。当请求时钟配置时,我们将添加到此资源。
clock_routing {
vco@PLLA { freq = <1966080000>; };
chan@APER { div = <4>; };
clock@GPCLK0 { pll = "PLLA"; chan = "APER"; };
};
clock_setup {
clock@PWM { freq = <2400000>; };
clock@GPCLK0 { freq = <12288000>; };
clock@GPCLK1 { freq = <25000000>; };
};
以上内容会把 PLLA 使用的 VCO 频率设置为 1.96608GHz(此 VCO 的频率范围是 600MHz-2.4GHz);将 APER 通道设置为 4 分频,并让 GPCLK0 从 PLLA 获取信号源(通过 APER)。之所以要提供时钟 12288000 Hz,是为了便于音频编解码器生成频率 48000 Hz。
固件存储库包含了树莓派主分支的固件,通常从中派生出其他内容。
树莓派推出了 多种 系列的计算机:
旗舰 系列通常简称为“树莓派(Raspberry Pi)”,搭载了高性能硬件、完整的 Linux 操作系统及多种常见接口。其外形尺寸与信用卡大小相当。
Zero 系列搭载了完整的 Linux 操作系统和最基本的接口,价格实惠,体积小,功耗低。
计算模块(Compute Module) 系列,一般简称为 "CM"。计算模块系列搭载了高性能硬件和完整的 Linux 操作系统,适合工业和嵌入式的小尺寸用途。计算模块的硬件与相应旗舰型号相当,但接口较少,甚至未板载 GPIO 引脚。用户需将计算模块接到一块单独的基板上,基板提供了使用接口和引脚。
此外,树莓派还推出了 Pico 系列微型多用途微控制器开发板。Pico 系列不支持 Linux,也不支持可移动存储,只能以把二进制文件刷到板载闪存存储器的方式进行编程。
B 代表其搭载了以太网口。A 代表低成本产品线——其体积较小,不带以太网口,内存也不大;因受开发版高度限制,USB 接口也较少。
树莓派 A
256MB 512MB
26 脚 GPIO 排针
* HDMI * 2 × USB 2.0 * CSI 相机接口 * DSI 显示器接口 * 3.5 mm 音频插孔 * RCA 复合视频端子 * 以太网(100Mb/s) * SD 卡插槽 * micro USB 电源
树莓派 A
256MB
26 脚 GPIO 排针
* HDMI * USB 2.0 * CSI 摄像头接口 * DSI 显示接口 * 3.5 mm 音频插孔 * RCA 复合视频端子 * SD 卡插槽 * micro USB 电源
树莓派 A+
512MB
40 脚 GPIO 排针
* HDMI * 4 × USB 2.0 * CSI 摄像头接口 * DSI 显示器接口 * 3.5 mm AV 插孔 * 以太网(100Mb/s) * microSD 卡槽 * micro USB 电源
树莓派 A+
256MB 512MB
40 脚 GPIO 排针
* HDMI * USB 2.0 * CSI 摄像头接口 * DSI 显示器接口 * 3.5 mm 音视频插孔 * microSD 卡槽 * micro USB 电源
树莓派 2B
BCM2836(在 1.2 版中切换到 BCM2837)
1 GB
40 脚 GPIO 排针
* HDMI * 4 × USB 2.0 * CSI 摄像头接口 * DSI 显示接口 * 3.5 mm AV 插孔 * 以太网 (100Mb/s) * microSD 卡插槽 * micro USB 电源
树莓派 3 A
1 GB
40 脚 GPIO 排针
* HDMI * 4 × USB 2.0 * CSI 摄像头接口 * DSI 显示器接口 * 3.5 mm AV 插孔 * 以太网(100Mb/s) * 2.4GHz 单频 802.11n Wi-Fi(35Mb/s) * 蓝牙 4.1,低功耗蓝牙(BLE) * microSD 卡槽 * micro USB 电源
树莓派 3B+
1GB
40 脚 GPIO 排针
* HDMI * 4 × USB 2.0 * CSI 相机接口 * DSI 显示接口 * 3.5 mm AV 插孔 * 支持 PoE 的以太网(300Mb/s) * 2.4/5GHz 双频 802.11ac Wi-Fi(100Mb/s) * 蓝牙 4.2,低功耗蓝牙(BLE) * microSD 卡槽 * micro USB 电源
树莓派 3A+
512 MB
40 脚 GPIO 排针
* HDMI * USB 2.0 * CSI 相机接口 * DSI 显示接口 * 3.5 mm AV 插孔 * 2.4/5GHz 双频段 802.11ac Wi-Fi (100Mb/s) * 蓝牙 4.2、低功耗蓝牙(BLE) * microSD 卡槽 * micro USB 电源
树莓派 4A
1GB 2GB 4GB 8GB
40 脚 GPIO 排针
* 2 × micro HDMI * 2 × USB 2.0 * 2 × USB 3.0 * CSI 摄像头接口 * DSI 显示屏接口 * 3.5 mm 音视频插孔 * PoE 支持的千兆以太网(1Gb/s) * 2.4/5GHz 双频 802.11ac Wi-Fi (120Mb/s) * 蓝牙 5, 低功耗蓝牙(BLE) * microSD 卡槽 * Type-C 电源 (5V/3A (15W))
树莓派 400
4GB
40 脚 GPIO 排针
* 2× micro HDMI * USB 2.0 * 2× USB 3.0 * 千兆以太网(1Gb/s) * 2.4/5GHz 双频 802.11ac 无线网络(120Mb/s) * 蓝牙 5,低功耗蓝牙(BLE) * microSD 卡槽 * Type-C 电源(5V/3A(15W))
树莓派 5
(2GB 款使用 )
2GB 4GB 8GB
40 脚 GPIO 排针
* 2 × micro HDMI * 2 × USB 2.0 * 2 × USB 3.0 * 2 × CSI 摄像头/DSI 显示接口 * 单通道 PCIe FFC 连接器 * UART 连接器 * RTC 电池连接器 * 四针 JST-SH PWM 风扇连接器 * 支持 PoE+ 的千兆以太网(1Gb/s) * 2.4/5GHz 双频段 802.11ac Wi-Fi 5(300Mb/s) * 蓝牙 5,低功耗蓝牙(BLE) * microSD 卡槽 * Type-C 电源 5V/5A(25W)、支持 5V/3A(15W),但外设会受限至 600mA
更多有关旗舰系列树莓派接口的信息,请参阅原理图和机械图。
带 H 后缀的型号在 GPIO 引脚上预先焊接了排针。不带 H 后缀的型号未在 GPIO 引脚上焊接排针——用户需要手动焊接排针或使用第三方排针套件。
所有 Zero 系列型号搭载了以下连接功能:
一个 microSD 卡槽
一个 CSI 摄像头接口 (最早由 Zero 1.3 引入)
一个 mini HDMI 端口
micro USB 端口 × 2(一个用于电源输入,另一个供外部设备使用)
树莓派 Zero
512MB
40 脚 GPIO 排针(未焊接)
无
树莓派 Zero W
512MB
40 脚 GPIO 排针(未焊接)
* 2.4GHz 单频 802.11n Wi-Fi(35Mb/s) * 蓝牙 4.0,低功耗蓝牙(BLE)
树莓派 Zero WH
512MB
40 脚 GPIO 排针
* 2.4GHz 单频 802.11n Wi-Fi(35Mb/s) * 蓝牙 4.0,低功耗蓝牙(BLE)
树莓派 Zero 2 W
512MB
40 脚 GPIO 排针(未焊接)
* 2.4GHz 单频 802.11n Wi-Fi (35Mb/s) * 蓝牙 4.2,低功耗蓝牙(BLE)
树莓派计算模块 1
512MB
0GB(精简版) 4GB
DDR2 SO-DIMM
none
树莓派计算模块 3
1GB
0GB(精简版) 4GB
DDR2 SO-DIMM
无
树莓派计算模块 3+
1GB
0GB(Lite) 8GB 16GB 32GB
DDR2 SO-DIMM
无
树莓派计算模块 4S
1GB 2GB 4GB 8GB
0GB(精简版) 8GB 16GB 32GB
DDR2 SO-DIMM
无
树莓派计算模块 4
1GB 2GB 4GB 8GB
0GB (精简) 8GB 16GB 32GB
双 100 引脚高密度连接器
可选: * 2.4/5GHz 双频 802.11ac Wi-Fi 5 (300Mb/s) * 蓝牙 5, 低功耗蓝牙(BLE)
注意
某些计算模块的外形尺寸与 DDR2 SO-DIMM 相同,但不兼容其电气规格。
更多有关树莓派计算模块的信息,请参阅计算模块文档。
带 H 后缀的型号在 GPIO 引脚上预先焊接了排针。不带 H 后缀的型号未焊接到 GPIO 引脚的排针——用户必须手动焊接排针或使用第三方排针套件。
树莓派 Pico
264KB
2MB
2 排 20 脚 GPIO 排针(未焊接)
无
树莓派 Pico H
264KB
2MB
2 排 20 脚 GPIO 排针(未焊接)
无
树莓派 Pico W
264KB
2MB
2 排 20 脚 GPIO 排针(未焊接)
* 2.4GHz 单频 802.11n Wi-Fi(10Mb/s) * 蓝牙 5.2,低功耗蓝牙(BLE)
树莓派 Pico WH
264KB
2MB
2 排 20 脚 GPIO 排针
* 2.4GHz 单频 802.11n Wi-Fi(10Mb/s) * 蓝牙 5.2,低功耗蓝牙(BLE)
树莓派 Pico 2
520KB
4MB
2 排 20 脚 GPIO 排针(未焊接)
无
有关各种树莓派 Pico 的更多信息,请参阅 Pico 文档。
各式树莓派开发板的原理图:
树莓派 5 的 STEP 文件
注意
树莓派 3A+ 的机械图纸亦适用于树莓派 1A+。
树莓派 Zero 2W 在生产过程中使用了许多测试点位置。
STATUS_LED
LED 的电源状态(低 = 打开)
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
所有树莓派产品均通过了充分的合规测试。更多有关信息,请参阅产品信息网站。
树莓派设备使用的 PCB 符合 UL94-V0 标准。
注意
仅适用于 PCB。
依据树莓派在合规测试期间的实际测试情况,合规支持计划的目标是消除处理合规问题的负担,为公司更轻松地将新产品推向消费者提供支持。它为用户提供了与 UL 公司的专门团队联系的机会,他们借助对树莓派的深入了解,评估和测试用户的产品。
了解更多关于树莓派合规支持计划的信息。
由树莓派提供支持的 Powered by RaspberryPi 计划,为想要使用树莓派 logo 形式的公司提供了一个流程,涵盖了搭载树莓派计算机、芯片的产品,以及由树莓派提供的服务。如果你希望进行申请流程,可在线操作。
我们已审批的设计合作伙伴名单提供了一组我们密切合作并支持的咨询公司,它们能够在硬件、软件和机械领域提供付费设计服务。
在重负荷情况下,所有款式的树莓派,都会进行一定程度的发热管理,以避免过热。SoC 内置了温度传感器,GPU 上的软件会进行轮询,以确保温度不会超过我们设定的上限,所有型号均为 85°C。可以将此值设定为较低值,但不能提高上限。当设备接近极限时,芯片(Arm、GPU)上各种频率和电压(有时)会下降。这将减少产生的热量,使温度维持在一定范围内。
当核心温度在 80°C 和 85°C 间,Arm 核心会逐渐降频。如果温度达到 85°C,那么 Arm 核心和 GPU 都会进行降频。
树莓派 3B+ 采用了新型 PCB 技术,能提供更好的散热性能,提高热质量。此外,还引入了软温度限制,旨在最大化延长设备在达到硬限制 85°C 之前的“高性能”时间。当达到软限制时,时钟速度从 1.4GHz 降至 1.2GHz,并略微降低操作电压。这减缓了温度升高的速度:我们以更长时间的 1.2GHz 代替了短暂运行的 1.4GHz。在默认情况下,软限制为 60°C:可通过 config.txt
中的参数 temp_soft_limit
进行更改。
树莓派 4B 沿用了树莓派 3B+ 的 PCB 技术,以帮助散热。目前尚未实施软限制。
注意
此 DVFS 讨论仅适用于树莓派 4B、400 和 计算模块 4。
树莓派 4 采取了动态电压频率调节(DVFS)。该技术使树莓派 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
。
注意
树莓派 5 已经移除了这个参数,并将始终处于模式 3。
此外,还采用了更细粒度的 CPU 调度器,用来更精细地控制 ARM 核心频率,这意味着 DVFS 效果更佳。现在的步进频率为 600MHz、750MHz、1000MHz 和 1500MHz。这些步进在 SoC 限流时可能有益,意味着几乎不会完全降至 600MHz,从而大幅改善了全负载时的性能。
默认的 CPU 调度器是 ondemand
。可以手动调用软件包 cpufrequtils
中的命令 cpufreq-set
更改调度器来减少空闲功耗:
$ sudo apt install cpufrequtils
$ sudo cpufreq-set -g powersave
由于树莓派设备使用的 SoC 架构,若在树莓派系统发行版中使用了上游的温度监控代码(如基于 Linux 的温度测量),可能并不准确。但是,命令 vcgencmd
能够提供准确且即时的 SoC 温度的实时数值,因为 vcgencmd
同 GPU 直接通信:
$ vcgencmd measure_temp
由于内置节流功能,不用散热片也不会造成 SoC 过热损坏。不过,安装散热片和小型风扇可缓解发热限流,改善性能。要获得最佳气流,略微改善散热效果,可考虑把树莓派竖着放。
用于辅助散热,树莓派 5 有两款官方风扇可选:
这两款均应插入至主板右上方的风扇连接器(四针 JST-SH PWM),位于 40 引脚 GPIO 排针和 USB 2.0 之间。风扇连接器与 USB 外围设备一同受电流限额。我们建议超频用户使用主动散热器外壳,因为它有更好的散热能力。
以上两种可选官方配件均由树莓派固件主动控制。随着树莓派的温度升高,风扇的反应如下:
在 50°C 以下,风扇不会转动(0% 速度)
在 50°C 时,风扇缓慢转动(30% 速度)
在 60°C 时,风扇转速提高至中速(50% 速度)
在 67.5°C 时,风扇转速提高至高速(70% 速度)
在 75°C 时,风扇转速达到全速(100% 速度)
温度下降时,应用相同的行为,伴有 5°C 的滞后性;当温度下降到低于上述每个阈值 5°C 时,风扇速度才会放缓。
在启动时,风扇会自动运转,以查看转速控制,并检查风扇是否旋转。如果可以,则启用设备树驱动 cooling_fan
。在默认情况下,该驱动位于 bcm2712-rpi-5-b.dtb
,但可以用 status=disabled
进行修改。
风扇连接器是一个间距 1 mm 的 JST-SH 插座,包含以下四个引脚:
1
+5V
红
2
PWM
蓝
3
GND
黑
4
Tach
黄
树莓派 4、400、5,计算模块 4、4S 计算机使用 EEPROM 启动系统。其他型号的树莓派 计算机使用位于启动文件系统中的 bootcode.bin
文件。
注意
在 GitHub 存储库
rpi-eeprom
中,你可以找到用于创建rpi-eeprom
的脚本和预编译的二进制文件。
如果在引导过程中出现错误,会用绿色 LED 灯传递故障信息。更新后的引导加载程序会在 HDMI 显示器上输出诊断信息。
有多种方法来更新你树莓派的引导程序。
树莓派操作系统会自动更新引导加载程序来进行重要的错误修复。要手动更新引导加载程序/更改启动顺序,请使用 raspi-config
。
树莓派启动盘制作器提供了一个图形界面,用于更新引导加载程序并选择引导模式。
下载树莓派启动盘制作工具
选择一张未使用的存储卡(引导加载程序镜像会格式化整张卡)
启动树莓派启动盘制作工具
选择 选择操作系统(Choose OS)
选择 Misc utility images
为你的树莓派选择 Bootloader
(树莓派 400 属于 4 系列)
选择引导模式:存储卡(建议)、USB、网络
选择 存储卡 然后 写入(Write)
单击 确认(Yes) 继续
使用新的镜像引导树莓派,请等待至少十秒钟
当绿色状态指示灯有规律的闪烁,且 HDMI 显示绿屏后,你就已成功写入引导程序了
断开树莓派的电源,拔出存储卡
raspi-config
来更新引导加载程序要在树莓派系统上更改启动模式、变动引导加载程序版本,请运行 raspi-config
。
更新树莓派系统,下载软件包 rpi-eeprom
的最新版本。
运行 sudo raspi-config
。
选择 Advanced Options。
选择 Bootloader Version。
选择 Default 可恢复出厂设置、选择 Latest 可获取最新发布的引导程序。
使用 sudo reboot
重启。
引导加载程序 default
版本即最新的出厂默认固件镜像。它提供了关键的错误修复、硬件支持,并且特性均在 latest 版本中经过测试,然后定期更新。latest 版引导加载程序的更新更为频繁,包含了最新的修复和改进。
专业用户可以切换到 latest 版引导加载程序以获得最新功能。
运行以下命令启动 raspi-config
。
$ sudo raspi-config
切换到 Advanced Options,然后选择 Bootloader Version。选择 Latest 并选择 Yes 确认。选择 Finish 确认重启。重启后,再次打开命令提示符更新你的系统:
$ sudo apt update
如运行 sudo rpi-eeprom-update
,你将看到引导加载程序的更新版本是 latest 发行版。
*** 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
注意
如果设置了
FREEZEVERSION
引导加载程序配置,则更新服务将跳过自动更新。这样可以避免在安装了多个操作系统、更换存储卡时逐个禁用更新服务的需要。
rpi-eeprom-update
树莓派操作系统使用脚本 rpi-eeprom-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
:用于支持新硬件、关键错误修复,并通过在 latest 版本测试过的新功能的定期更新。
latest
:当新功能可用时进行更新
由于发布状态字符串仅是一个子目录名,因此你可以创建自己的发行版本,例如固定发行或自定义网络引导配置。
注意
你可以通过编辑
/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 会在存储卡的启动分区的根目录中查找文件 recovery.bin
。如果能找到一个有效的 recovery.bin
,那么 ROM 就会执行这个文件,而非读取 EEPROM。该机制可确保始终能对引导加载程序闪存恢复出厂设置。
欲了解更多信息,请参阅 EEPROM 启动流程。
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 查找 recovery.bin
的功能,不支持 USB 大容量存储设备及 TFTP。而且,更新版本的引导加载程序已支持自更新功能,使引导加载程序能够自己重新刷新 SPI 闪存。请参阅引导加载程序配置页面上的 ENABLE_SELF_UPDATE
。
EEPROM 更新的临时文件会在启动时由 rpi-eeprom-update
服务自动删除。
若要获取有关 rpi-eeprom-update
配置文件的更多信息,请参阅 rpi-eeprom-update -h
。
引导加载程序和 VLI EEPROM 都支持硬件写保护。有关如何在更新 EEPROM 时启用此功能的更多信息,请参阅参数 eeprom_write_protect
。
从树莓派 4 引导加载程序 2020-04-16 版本开始,诊断信息会出现在 HDMI 显示器上。要查看诊断信息,请关闭树莓派 4,拔掉存储卡,然后重启。在接入的显示器上应该会出现类似如下的诊断信息。
该诊断页面也会出现在以下情况:引导加载程序无法引导插入的存储卡、无法进行网络引导;可能因为:存储卡中没有可引导的镜像、存储卡是假冒伪劣产品、网络引导配置错误。
只要显示了诊断页面,就只能通过重新插拔设备电源(即拔掉然后重新插上电源)来重启。
诊断页面最顶部的一行说明了树莓派型号、内存容量。二维码是指向下载页面的链接。
诊断信息如下:
bootloader
引导加载程序 git 版本—RO(如果 EEPROM 受写保护)—软件构建日期
update-ts
更新 EEPROM 配置的时间戳。在自更新模式下检查此时间戳,以避免更新到旧配置。
secure-boot
如果启用了安全启动,则显示处理器版本(B0/C0)和签名启动状态参数。否则,此行为空。
board
主板版本–序列号–以太网 MAC 地址
boot
模式(当前启动模式名称和编号)顺序(BOOT ORDER 配置)尝试(当前启动模式的重试次数)重启(通过启动模式列表的循环次数)。
SD
SD 卡检测状态(已检测/未检测)。
part
主引导记录主分区类型:LBA.
fw
如果存在,则 start.elf
和 fixup.dat
的文件名 (例如 start4x.elf
,fixup4x.dat
).
net
网络引导: 链路状态(上/下),客户端 IP 地址(ip),子网(sn),默认网关(gw)
tftp
网络引导:TFTP 服务器 IP 地址
display
指示是否检测到热插拔( HPD=1
),以及每个 HDMI 输出是否成功读取 EDID( EDID=ok
)。
可以使用参数 DISABLE_HDMI
禁用此显示器,请参阅引导加载程序配置。
注意
该功能仅用于诊断引导故障;它并非可交互的引导程序。如果你需要交互式引导程序,请考虑使用类似 U-Boot 的工具。
树莓派有多种不同的引导阶段。本文档解释了引导模式的工作原理,以及哪些引导模式支持 Linux 引导。
bootcode.bin
专用启动模式基于 BCM2837 的树莓派可从 USB 设备和以太网引导 - 也就是说,树莓派 2B v1.2,树莓派 3B 和树莓派 3B+(由于树莓派 3A+ 没有内置以太网接口,无法进行网络引导)。此外,所有早于树莓派 4 的树莓派型号可以使用仅 bootcode.bin
方法启用 USB 设备引导。
注意
自树莓派 4 以降,旗舰级设备不再使用
bootcode.bin
这个文件。因为这些设备使用了板载 EEPROM 芯片中的引导加载程序。更多信息,请参阅 EEPROM 引导流程和 SPI 引导 EEPROM 的文档。
把格式化存储卡为 FAT32,将最新的 bootcode.bin
复制到里面。把存储卡插入到树莓派中。从存储卡加载 bootcode.bin
以后,树莓派就能使用 USB 主机模式启动了。
这对于基于 BCM2835、BCM2836 芯片的树莓派 1、2 和 Zero 型号非常有用,在树莓派 3 无法启动的情况下(同烧录到 BCM2837A0 中的启动代码相比,最新的 bootcode.bin
为树莓派 3B 提供了额外的错误修复)。
若即使使用了这个 bootcode.bin
,你的大容量存储设备还是无法使用,请在存储卡上新建一个名为“timeout”的文件。这将使其等待大容量存储设备初始化的时间延长到 6 秒。
bootcode.bin
串口注意
适用于在树莓派 4 发布前的开发板。
有关使用 EEPROM 引导加载程序启用串口的信息,请参阅引导加载程序配置文档。
可以启用早期阶段的串口来调试引导问题(与上述 bootcode.bin
仅引导模式非常有用)。要做到这一点,请确保你的固件版本是新的(包括 bootcode.bin
)。要检查当前固件是否支持串口:
$ strings bootcode.bin | grep BOOT_UART
要从 bootcode.bin
启用串口:
$ sed -i -e "s/BOOT_UART=0/BOOT_UART=1/" bootcode.bin
接下来,将合适的 USB 串口线连接到计算机(尽管你可能会发现,最简单的方法就是使用 USB 串口线,因为它可以在无需设置烦人的 config.txt
的情况下直接使用树莓派)。在树莓派(计算模块)上使用单独的引脚 6、8 和 10(GND、GPIO14、GPIO15)。
然后在 Linux(macOS)上使用 screen
。在 Windows 上使用 putty 来连接到串口。
设置串口接收速率为 115200-8-N-1
,然后启动你的树莓派。你应该可即时从设备上获得 bootcode.bin
的串行输出。
USB 有两种独立的启动模式:
USB 设备启动
USB 主机启动
固件会根据 OTP 位在引导时选择两种模式中的一种。用两位控制 USB 引导。第一位启用 USB 设备引导,为默认设置;第二位启用 USB 主机引导。
如果设置了 USB 主机引导模式位,则处理器会读取 OTGID 引脚来决定是作为主机引导(驱动到零,就像在所有树莓派 A/B+ 上一样)还是作为设备引导(保持漂浮)。树莓派 Zero 通过 USB 连接器可以访问 OTGID 引脚;计算模块可以通过边缘连接器访问 OTGID 引脚。
其他某些 OTP 位可允许某些 GPIO 引脚选择引导模式。
注意
USB 引导适用于旗舰级的计算模块系列,Zero 系列和衍生的 A 款。
当启用此引导模式(通常在无法从存储卡引导后),树莓派 将其置为 USB 设备模式,等待主机发送的 USB 重置。在 Github 上可以找到示例代码,展示主机需如何与树莓派进行通信。
主机首先通过控制端点 0 向设备发送一个结构。这包含了启动的大小和签名(未启用安全性,因此无需签名)。其次,代码通过端点 1 传输(bootcode.bin
)。最后,设备将用以下代码之一回复:
0
- 成功
0x80
- 失败
注意
自树莓派计算模组 3、Zero 系列 2 W、树莓派 2B(1.2 版)、树莓派 3B 以及自树莓派 3B+ 以降,主机引导功能可在计算模块系列和所有旗舰系列设备上使用。树莓派 3A+ 支持大容量存储引导,但不支持网络引导。
USB 主机引导模式采用以下逻辑:
启用 USB 接口 并等待 D+ 线拉高,表示连接了 USB 2.0 设备(我们只支持 USB2.0
如果设备是一款集线器:
启用所有集线器的下游接口的电源
对于每个端口,最多循环两秒(如果 program_usb_boot_timeout=1
已设置,则为 5 秒)
释放复位并等待 D+ 被拉高以指示设备已连接
如果检测到设备:
发送“获取设备描述符”
如果 VID == SMSC
并且 PID == 9500
将设备添加到以太网设备列表
如果 class 接口是大容量存储设备
把设备添加到大容量存储设备列表
否则
枚举单个设备
浏览大容量存储设备列表
从大容量存储设备启动
浏览以太网设备列表
从以太网引导
在树莓派 3B,3A+ 和 3B+ 上,默认禁用主机引导。要启用 USB 主机引导,请将 program_usb_boot_mode=1
这一行添加到 /boot/firmware/config.txt
的末尾。
警告
任何对 OTP 的修改都是永久性的,无法撤销。 。 在树莓派 3A+ 上,将 OTP 位设置为启用 USB 主机引导模式将永久性地禁止其以 USB 设备模式启动。
注意
自计算模块 3,Zero 2 W 起的 Zero 系列,以及自树莓派 2B(版本 1.2)起的所有旗舰系列设备均可使用。
USB 大容量存储启动能让你从 USB 大容量存储设备(如闪存驱动器、USB 磁盘)启动树莓派。在连接 USB 设备时(尤其是硬盘和 SSD),需要注意它们的功耗要求。接入多个磁盘通常需要额外的外部电源,可以是带电源的硬盘盒、带供电的 USB 集线器。
注意
树莓派 4B 之前的型号存在已知问题,导致可能无法从某些 USB 设备启动。
树莓派 4 和更新款的旗舰系列设备以及自计算模块 4 和 4S 起,支持默认情况下的 USB 引导,只要在 BOOT_ORDER
配置中指定 USB 引导。
注意
早期版本的树莓派 4 可能需要更新引导加载程序才能从 USB 启动。
注意
计算模块 4 的早期版本可能需要更新引导加载程序才能从 USB 启动。
树莓派 3B+ 支持开箱即用的 USB 大容量存储启动。
在树莓派 2B v1.2,3A+,3B,Zero 2 W 和计算模块 3 和 3+ 上,必须先启用 USB 主机启动模式。才能从 USB 大容量存储启动和网络启动。
注意
树莓派 3A+ 和 Zero 2 W 不支持网络启动。 要启用这些设备的 USB 主机启动模式,请在 OTP(一次可编程)内存中设置 USB 主机位。要设置该位,请从包含以下行的存储卡引导
/boot/firmware/config.txt
。设置该位后,你可以在没有存储卡的情况下从 USB 启动。
警告
对 OTP(一次可编程)内存所做的一切修改都是永久性的,无法撤销。 。 在树莓派 3A+ 上,设置 OTP 位来启用 USB 主机启动模式将永久禁止该树莓派以 USB 设备模式启动。
使用内置树莓派系统的存储卡来编程 OTP 位。
要启用 USB 主机启动模式,请将以下行添加到 config.txt
中:
program_usb_boot_mode=1
然后使用 sudo reboot
重启你的树莓派。要检查 OTP 是否已正确编程,请运行以下命令:
$ vcgencmd otp_dump | grep 17:
17:3020000a
如果输出显示 0x3020000a
,则 OTP 已成功编程。如果看到不同的输出,请再次尝试编程过程。确保 config.txt
末尾没有空行。
你现在可以像从存储卡启动一样从 USB 大容量存储设备启动。有关更多信息,请参阅以下部分。
过程与存储卡相同:把操作系统镜像写入 USB 存储设备。
存储设备准备就绪后,连接驱动器并启动树莓派,需注意外部驱动器的额外 USB 电源需求。
大约 5 到 10 秒后,树莓派应该开始启动了。如果接入的显示器上出现彩虹屏。请确定未将存储卡插入树莓派,因为倘若插入了存储卡,树莓派将优先从存储卡启动。
查阅引导模式文档可了解引导顺序和备选引导模式(网络、USB 设备、GPIO 或存储卡启动)。
检查可引导 USB 设备的默认超时时间为 2 秒。某些闪存驱动器和硬盘启动速度过慢。可以将此超时时间延长到 5 秒(需在存储卡中新建文件 timeout
),但要注意某些设备可能需要更长时间来响应。
某些闪存驱动器采用了极为罕见的协议,引导码无法处理,因此造成不兼容。
bootcode.bin
——仅引导模式对于树莓派 2B v1.2、3A+、3B 和 3B+,如果你无法使用特定的 USB 设备来启动,你可以使用 bootcode.bin
专用启动模式。树莓派仍会从存储卡启动,但只会从存储卡中读取 bootcode.bin
;你操作系统的其余部分仍存储在 USB 设备。
在从 USB 大容量存储设备启动之前,请验证该设备在 Linux 下是否正常工作。使用存储卡引导,插入 USB 大容量存储设备。USB 设备应显示为可移动驱动器。这在使用 USB SATA 转换设备时尤其重要,该适配器可能由引导加载程序支持大容量存储模式,但如果 Linux 选择 USB 附加 SCSI-UAS 模式,则有概率不兼容。
使用硬盘驱动器(HDD)通常需要带供电的 USB 集线器。即使一切看起来正常,如果 USB 集线器没带电源,你可能仍会遇到间歇性故障。
在搜索可引导分区时,引导加载程序会同时扫描所有 USB 大容量存储设备,并选择首个响应的设备。如果引导分区没有找到合适的 start.elf
文件,则引导加载程序将尝试下一个可用设备。没有根据 USB 拓扑结构指定引导设备的方法;这将减缓引导速度,带来不必要的配置复杂性。
注意
可使用
config.txt
文件条件过滤器来选择复杂设备配置中的备用固件。
本节描述了树莓派 3B、3B+ 和 2B v1.2 上的网络引导工作原理。
在树莓派 4 和树莓派 5 上,网络引导是在 EEPROM 中的第二阶段引导加载程序中实现的。更多信息,请参阅树莓派 4 引导加载程序配置。
我们还有关于设置网络引导系统的教程。
仅适用于上述型号树莓派中内置的有线适配器进行网络引导。无线局域网引导不受支持,也不支持从其他有线网络设备引导。
要进行网络引导,引导 ROM 执行以下操作:
初始化板载以太网设备(Microchip LAN9500/LAN7500)
发送 DHCP 请求(使用厂商类别标识符 DHCP 选项 60 设置为 PXEClient:Arch:00000:UNDI:002001
)
接收 DHCP 回复
(可选)接收 DHCP 代理回复
ARP 到 tftpboot
服务器
ARP 回复包含 tftpboot
服务器以太网地址
TFTP RRQ bootcode.bin
服务器响应 TFTP 错误响应,并附带文本错误消息,文件未找到
服务器会回复包含文件头部块编号的数据块(512 B)中的第一个块,文件已存在
树莓派回复 TFTP ACK 数据包,包含块编号,并重复直到最后一个非 512 B 块
TFTP RRQ bootsig.bin
下载请求
这通常会产生报错 file not found
。这是预料之中的,TFTP 引导服务器应该能够处理它。
从此刻开始,bootcode.bin
代码继续加载系统。它将尝试访问的第一个文件是 <serial_number>/start.elf
。如果这不会导致错误,那么要读取的其他文件将会在前面加上 serial_number
。这很有用,因为它使你能够为你的树莓派创建具有不同 start.elf
/内核的独立目录。
要获取设备的序列号,你可以尝试使用这种引导模式,并查看使用 tcpdump / wireshark 访问的文件,或者你可以运行标准的树莓派系统存储卡和 cat /proc/cpuinfo
。
如果你将所有文件放入 TFTP 目录的根目录中,那么随后所有的文件都将从那里访问。
首先要检查的是 OTP 位是否被正确编程。为此,你需要将 program_usb_boot_mode=1
添加到 config.txt
,然后重启(使用可以正确引导到树莓派系统的标准存储卡)。完成后,你应该可以执行以下操作:
$ vcgencmd otp_dump | grep 17:
如果第 17 行包含 3020000a
,则 OTP 已正确编程。现在,你可以拔掉存储卡,插入以太网了,然后在树莓派上电约 5 秒后,以太网指示灯应该被点亮。
要在服务器上捕获以太网数据包,请在 tftpboot
服务器上(如果未使用,则在 DHCP 服务器上)使用 tcpdump
。否则,你将无法看到发送的数据包,因为网络交换机不是集线器!
$ sudo tcpdump -i eth0 -w dump.pcap
将从 eth0
写入文件 dump.pcap
中的所有内容。然后,你可以对数据包进行后处理或上传到 cloudshark 进行通信。
至少你应该看到一个类似以下内容的 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 中的一个错误,你可能需要在字符串末尾添加三个空格。
当供应商参数被正确指定时,你将看到随后发送的 TFTP RRQ 数据包。RRQ 可以通过第一个数据块或错误消息来回复,表明文件未找到。在少数情况下,他们甚至会收到第一个数据包,然后由 树莓派 中止传输(当检查文件是否存在时会发生这种情况)。下面的示例仅包括三个数据包:原始读取请求、第一个数据块(始终是包含一个标头和 512 B 数据的 516 B,尽管最后一个块始终少于 512 B 且可能为零长度),以及第三个数据包(包含与数据块中帧编号匹配的确认帧号)。
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
文件的存储卡外,没有其他解决方法。
树莓派将尝试进行五次 DHCP 请求,每次间隔五秒,总共持续 25 秒。如果服务器在此期间无法响应,树莓派将进入低功耗状态。除非使用存储卡上的 bootcode.bin
,否则没有解决办法。
在树莓派 3B+ (BCM2837B0) 中已修复。
DHCP 检查还检查了跳数值是否为 1
,而在 DHCP 中继情况下,它不会这样。
在树莓派 3A+ 中已修复。
在 DHCP 回复中,字符串“Raspberry Pi Boot”由于计算字符串长度的错误而需要占用额外三个空格。
在树莓派 3B+ 中已修复。
DHCP UUID 设置为常量值。
已在树莓派 3A+ 修复;该值设置为 32 位序列号。
树莓派只会在初始化阶段响应 ARP 请求;一旦开始传输数据,它将无法继续响应。
已在树莓派 3 A+ 修复。
在启动时,树莓派广播 DHCPDISCOVER 数据包。DHCP 服务器回复一个 DHCPOFFER 数据包。然后树莓派继续启动而不执行 DHCPREQUEST 或等待 DHCPACK。这可能导致两个不同设备被提供相同的 IP 地址并在未正确分配给客户端的情况下使用它。
不同的 DHCP 服务器在这种情况下有不同的行为。dnsmasq(取决于设置)将散列 MAC 地址以确定 IP 地址,并 ping 该 IP 地址以确保它尚未被使用。这减少了这种情况发生的机会,因为这需要在散列中发生碰撞。
注意
GPIO 引导模式仅适用于树莓派 3A+、3B、3B+,计算模块 3、3+。
老的树莓派可以配置:以在接通电源时使用连接到 GPIO 连接器的硬件选择启动模式。这是通过在 SoC 的 OTP 存储器中设置位来完成的。一旦设置了这些位,它们会永久性分配五个 GPIO,以便进行选择。只要设置了 OTP 位,就无法撤销。你应该仔细考虑是否启用此功能,因为这五个 GPIO 针脚将始终控制引导。尽管在树莓派引导后可以使用这些 GPIO 进行其他功能,但你必须进行额外设置,才能在树莓派引导时启用所需的启动模式。
要启用 GPIO 引导模式,请将以下行添加到 config.txt
文件中:
program_gpio_bootmode=n
其中 n
是你希望使用的 GPIO 的 bank。然后重启树莓派一次,以使用此设置编程 OTP。Bank 1 是 GPIO 22-26,Bank 2 是 GPIO 39-43。除非你有一个计算模块,否则必须使用 bank 1:Bank 2 上的 GPIO 仅在计算模块上可用。由于 OTP 位的排列方式,如果你首先为 Bank 1 编程 GPIO 引导模式,那么稍后可以选择 Bank 2。反之不成立:一旦选择 Bank 2 作为 GPIO 引导模式,就无法选择 Bank 1。
一旦启用了 GPIO 引导模式,树莓派将不再启动。你必须拉高至少有关一个引导模式的 GPIO 引脚,才能启动树莓派。
22
39
SD0
23
40
SD1
24
41
NAND(尚不支持 Linux)
25
42
SPI (尚不支持 Linux)
26
43
USB
以上表格中的 USB 选项同时选择 USB 设备引导模式和 USB 主机引导模式。要使用 USB 引导模式,必须在 OTP 存储器中启用。有关更多信息,请参阅 USB 设备引导和 USB 主机引导。
20
37
SD0
21
38
SD1
22
39
NAND(尚不支持 Linux)
23
40
SPI(尚不支持 Linux)
24
41
USB 设备
25
42
USB 主机:大容量存储设备
26
43
USB 主机:以太网
注意
各种启动模式按照 GPIO 线的数字顺序尝试,即 SD0,然后 SD1,然后 NAND 等等。
SD0 是博通的存储卡/MMC 接口。当 SoC 内部的引导 ROM 运行时,SD0 将始终连接到内置的 microSD 卡。在带有 eMMC 设备的计算模块上,SD0 连接到该设备;在精简版(Lite)计算模块上,SD0 可用于边缘连接器,并连接到 CMIO 载板上的 microSD 卡。SD1 是 Arasan 存储卡/MMC 接口,亦支持 SDIO。所有具有内置无线局域网的树莓派都使用 SD1 通过 SDIO 连接到无线芯片。
GPIO 针脚的默认上拉电阻为 50KΩ,详见 BCM2835 ARM 外围设备数据表第 102 页。推荐使用 5KΩ 的上拉电阻将 GPIO 针脚拉高:这样既可使 GPIO 正常工作,同时不会产生太多功耗。
NVMe(非易失性快速存储器)是通过 PCIe 总线进行外部存储访问的标准。你可以通过计算模块 4(CM4)IO 板、树莓派 5 上的 PCIe 槽连接 NVMe 驱动器。再通过一些额外配置,你就可以从 NVMe 驱动器启动了。
NVMe M.2 固态硬盘
一款 PCIe 转标准 M.2 的转接器
对于树莓派 5,我们推荐使用 M.2 HAT+,它能把树莓派的 PCIe FFC 槽转换为 M 键(Key)接口。
对于 CM4,可搜索“PCIe 3.0 ×1 转 M.2 NGFF M 键 SSD NVMe PCIe 转接器”
要检查你的 NVMe 驱动器是否正确连接,请从其他存储设备(如存储卡)引导你的树莓派,并运行 ls -l /dev/nvme*
。示例输出如下所示。
crw------- 1 root root 245, 0 Mar 9 14:58 /dev/nvme0
brw-rw---- 1 root disk 259, 0 Mar 9 14:58 /dev/nvme0n1
运行以下命令可查看你正在运行的固件版本:
$ sudo rpi-eeprom-update
对于树莓派 5,你需要使用 2023 年 12 月 6 日及之后发布的固件。
为了 CM4,NVMe 引导支持于 2021 年 7 月引入。你需要自那时起发布的以下版本的软件:
引导加载程序
VideoCore 固件
树莓派系统 Linux 内核
最新的树莓派系统发布包含你所需的一切。使用树莓派镜像制作工具可将树莓派系统镜像安装到你的驱动器上。
对于树莓派 5,你需要启动树莓派系统以编辑启动顺序。你可以从存储卡或 USB 驱动器启动树莓派来完成此步骤。即使更改启动设备,EEPROM 配置也会持久保留,因为 EEPROM 配置存储在板上本身。
使用树莓派配置命令行界面来更新启动加载程序:
$ sudo raspi-config
在 Advanced Options > Bootloader Version 下,选择 Latest。然后,单击 Finish 或按 Escape 键 可退出 raspi-config
。
运行以下命令可将固件更新至最新版本:
$ sudo rpi-eeprom-update -a
然后,使用 sudo reboot
重启。你的树莓派 5 应该会从 NVMe 启动。
对于 CM4,请使用 rpiboot
更新引导加载程序。你可以在 USB 启动 GitHub 存储库中找到构建 rpiboot
并配置 IO 板切换 ROM 到 usbboot 模式的说明。
对于搭载了 eMMC 的 CM4 版本,请确保你已将 NVMe 设置为引导顺序中的第一项。请记住在 recovery/boot.conf
中将 NVMe 引导模式 6
添加到 BOOT_ORDER
中。
当 SD 卡插槽为空时,CM4 Lite 会自动从 NVMe 引导。
BOOT_ORDER
EEPROM 配置中的 BOOT_ORDER
设置控制引导行为。对于 NVMe 引导,请使用引导模式 6
。有关更多信息,请参见树莓派引导加载程序配置。
以下是引导加载程序检测到 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
,而在“namespace(命名空间)”中显示为 /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 /
如果引导过程失败,请在 GitHub 存储库 rpi-eeprom
上提交问题,确保附上控制台输出以及引导过程中所有屏幕显示的内容。
网络安装功能使用以太网上的 HTTP 引导树莓派进入嵌入式树莓派启动盘制作工具。
除了网络安装,你还可能用 HTTP 下载的文件显式引导设备启动,即使禁用引导,网络安装也能用。
例如,你可以将这添加到你的 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。如果启用开机网络安装,则会使用相同的网址。如果 GPIO 8 未被拉低,则行为将保持不变。
[gpio8=0]
BOOT_ORDER=0xf7
HTTP_HOST=downloads.raspberrypi.org
NET_INSTALL_ENABLED=0
boot.img
和签名文件 boot.sig
是个包含引导文件系统的内存盘。详情请参阅 boot_ramdisk
。
如果启用安全启动并且未设置 HTTP_HOST
,则将忽略 BOOT_ORDER
中的 HTTP。
要使用 HTTP 引导,请更新至 2022 年 3 月 10 日和后续版本的引导程序。HTTP 引导需要有线以太网连接。
要使用定制 CA 证书,请更新至 2024 年 4 月 5 日和后续版本的引导程序。只有运行 BCM2712 CPU 的设备支持才定制 CA 证书。
所有 HTTP 下载必须签名。引导加载程序包含一个用于默认主机 fw-download-alias1.raspberrypi.com
上文件的公钥。除非设置了 HTTP_HOST
,并在 EEPROM 中内置公钥,否则该密钥将用于验证网络安装镜像。这能让你在自己的服务器上托管树莓派网络安装镜像。
警告
使用你自己的网络安装镜像将需要你对镜像进行签名,并将你的公钥添加到 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.img
和 boot.sig
放在你的网络服务器上,以使用自己签名的网络安装镜像。
为了安全起见,网络安装使用 HTTPS 从树莓派网站下载操作系统镜像。此功能使用我们在引导程序中内置的自有 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]
部分配置以下设置,替换为:
将 <你的网站>
替换为你的网站,例如 yourserver.org
将 <文件路径>
替换为托管在你的网站上的操作系统镜像的路径,例如 path/to/files
使用上面生成的哈希值 701bd97f67b0f5483a9734e6e5cf72f9a123407b346088638f597878563193fc,例如 <哈希值>
[all]
BOOT_UART=1
POWER_OFF_ON_HALT=0
BOOT_ORDER=0xf461
[gpio8=0]
BOOT_ORDER=0xf7
NET_INSTALL_ENABLED=0
HTTP_HOST=<你的网站>
HTTP_PATH=<文件路径>
HTTP_CACERT_HASH=<哈希值>
当你指定 HTTP_CACERT_HASH
时,网络安装将通过 HTTPS 下载镜像。没有哈希时,网络安装将使用 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
在网络启动过程中,你的树莓派应该使用 HTTPS 而非 HTTP。要查看由网络安装解析的完整的 HTTPS 下载链接,请查看引导输出:
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
如果启用了安全启动,则树莓派只能运行由客户私钥签名的代码。因此,如果你想要在安全启动的情况下使用网络安装、HTTP 启动模式,你必须使用自己的密钥签署 boot.img
并生成 boot.sig
,并在某处托管这些文件供下载。EEPROM 中的公钥将用于验证镜像。
如果启用安全启动且未设置 HTTP_HOST
,则网络安装和 HTTP 引导将被禁用。
有关安全启动的更多信息,请参阅 USBBOOT。
重要
此启动顺序仅适用于基于 BCM2837、BCM2837B0 的树莓派。在此之前的型号,树莓派将尝试存储卡引导,然后是 USB 设备模式引导。有关树莓派 4 和树莓派 5 的引导顺序,请参阅 EEPROM 引导流程部分。
树莓派 3 上的 USB 引导默认取决于所使用的版本。如果默认未启用 USB 引导模式,请参阅此页面获取有关启用 USB 引导模式的信息。
当 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 设备(2 秒)
设备已找到:
如果设备类型 == hub
递归每个设备
如果设备类型 == (大容量存储或 LAN951x)
存储在设备列表中
递归遍历每个大容量存储设备
如果找到 bootcode.bin
引导
递归遍历每个 LAN951x
DHCP / TFTP 引导
其他(设备模式启动)
启用设备模式,等待主机 PC 枚举
我们用 VID: 0a5c PID: 0x2763 回复 PC(树莓派 1、树莓派 2)或 0x2764 (树莓派 3)
注意
如果没有插入存储卡,SD 引导模式将在 5 秒钟后失败。为了缩短这个时间并更快地切换到 USB 模式,你可以插入空白的存储卡,或者使用上面描述的 GPIO 引导模式 OTP 设置,仅启用 USB。GPIO 的默认拉取在 ARM 外围设备数据手册的第 102 页上有定义。如果引导时的值不等于默认拉取值,则启用该引导模式。USB 枚举是一种使下游设备在集线器上获取电源,然后等待设备拉动 D+ 和 D- 线以指示其是 USB 1 还是 USB 2 的方法。这可能需要一段时间:对于某些设备,硬盘驱动器可能需要长达 3 秒的时间来启动并开始枚举过程。因为这是唯一能检测硬件连接的方法,所以我们必须等待的最短时间为两秒。如果设备在最大超时时间后仍未响应,则可以使用
program_usb_boot_timeout=1
在config.txt
中增加超时时间至五秒。大容量存储引导优先于以太网引导。不再需要第一个分区是 FAT 分区,因为大容量存储引导将继续搜索第一个分区之外的 FAT 分区。引导 ROM 现在还支持 GUID 分区,并已测试过使用 Mac、Windows 和 Linux 分区的硬盘。使用供应商 ID 0x0424 和产品 ID 0xec00 可以检测 LAN951x,这与独立的 LAN9500 设备不同,后者的产品 ID 是 0x9500/0x9e00。要使用独立的 LAN9500,需要添加 I²C EEPROM 以更改这些 ID 以匹配 LAN951x。
主要存储卡引导模式默认设置为 GPIO 49-53。可以在第二组引脚上从次要存储卡引导,即将次要存储卡连接到 GPIO 引脚。但是,我们尚未启用此功能。
NAND 引导和 SPI 引导模式的确能用,尽管它们还未完全支持 GPU。
USB 设备引导模式在出厂时默认启用,但 USB 主机引导模式只有在 program_usb_boot_mode=1
时才启用。一旦启用,处理器将使用处理器上的 OTGID 引脚的值来在这两种模式之间做出决定。在所有树莓派 B/B+ 上,OTGID 引脚被驱动为 0,因此一旦启用,就只能通过主机模式引导(无法再使用设备模式引导,因为 LAN951x 设备阻挡了路径)。
如果将 OTGID 引脚浮置(例如,插入 PC),则树莓派 Zero 或计算模块将作为 USB 设备引导启动,因此你可以将 bootcode.bin
推入设备中。相关 usbboot 代码可在 GitHub 上找到。
自树莓派 4 起,树莓派 旗舰设备使用 EEPROM 启动加载程序。与以前的产品相比,主要区别在于第二阶段启动加载程序是从 SPI 闪存 EEPROM 加载,而不是像以前的产品一样从 bootcode.bin
文件加载。
ROM(第一阶段)的引导流程如下:
SoC 上电
读取 OTP(一次性可编程存储器)以确定是否配置了 nRPIBOOT
GPIO
如果 nRPIBOOT
GPIO 为高电平或 OTP 未定义 nRPIBOOT
GPIO
检查 OTP 以查看是否可以从 SD/EMMC 加载 recovery.bin
如果启用了 SD recovery.bin
,则检查主 SD/EMMC 中的 recovery.bin
成功:运行 recovery.bin
并更新 SPI EEPROM
失败:继续
检查 SPI EEPROM 中的第二阶段加载程序
成功:运行第二阶段启动加载程序
失败:继续
如果成功
尝试从 USB 设备启动 加载 recovery.bin
成功:运行 recovery.bin
并更新 SPI EEPROM 或切换到 USB 大容量存储设备模式
失败:重试 USB 设备启动
注意
recovery.bin
是一款用于更新引导加载程序 SPI EEPROM 镜像的最小第二阶段程序。
本节介绍了第二阶段引导程序的高级流程。
请参阅引导程序配置 页面以获取有关每种引导模式的更多信息,以及引导文件夹 页面以了解此阶段加载的 GPU 固件文件的描述。
初始化时钟和 SDRAM
读取 EEPROM 配置文件
检查 PM_RSTS
寄存器以确定是否请求 HALT
检查 POWER_OFF_ON_HALT
和 WAKE_ON_GPIO
的 EEPROM 配置设置
如果 POWER_OFF_ON_HALT
为 1
且 WAKE_ON_GPIO
为 0
,则
使用电源管理芯片(PMIC)关闭系统电源
否则,如果 WAKE_ON_GPIO
为 1
,则
启用 GPIO3 的下降沿中断以便在 GPIO3 被拉低时唤醒
进入休眠
当为 True
(真)
从 EEPROM 配置文件中的 BOOT_ORDER
参数读取下一个引导模式
如果引导模式为 RESTART
,则
跳回到 BOOT_ORDER
字段中的第一个引导模式
否则如果引导模式为 STOP
,则
显示 start.elf
未找到的错误模式 并永久等待。
否则如果引导模式为 SD CARD
,则
尝试从存储卡加载固件
成功:运行固件
失败:继续
否则如果引导模式为 NETWORK
,则
使用 DHCP 协议请求 IP 地址
从 DHCP 或静态定义的 TFTP 服务器加载固件
如果未找到固件或发生超时或网络错误,则继续
否则如果引导模式为 USB-MSD
或引导模式为 BCM-USB-MSD
,则
当 USB 发现未超时时
检查 USB 大容量存储设备
如果找到新的大容量存储设备,则
对每个驱动器(LUN)
尝试加载固件
成功:运行固件
失败:前进到下一个驱动器(LUN)
否则如果引导模式为NVME
,则
扫描 PCIe 以查找 NVMe 设备,如果找到
尝试从 NVMe 设备加载固件
成功:运行固件
失败:继续
否则如果引导模式为 RPIBOOT
,则
尝试使用 USB 设备模式从 USB OTG 端口加载固件 ——参见USB 引导。RPIBOOT
模式没有超时。
电源按钮用于从 PMIC STANDBY、HALT 唤醒,而非 GPIO 3。
固件加载 start.elf
而不是 start.elf
。实际上,引导加载程序内置了嵌入版本的 start.elf
。
连接到 3A 电源时,默认禁用 USB 启动。在 /boot/firmware/config.txt
中设置 usb_max_current_enable=1
可启用 USB 启动。或者你可以在 USB 启动失败时,按一下电源按钮来临时启用 usb_max_current_enable
并继续引导。但是,如果是按电源按钮启用的,该设置在重启后将失效。
如果找到 pieeprom.upd
文件,固件启动之前也可以更新引导加载程序。有关引导加载程序更新的更多信息,请参阅引导加载程序 EEPROM 页面。
引导加载程序/固件提供了一个一次性标志,如果设置了该标志,会清除,但会导致加载 tryboot.txt
而不是 config.txt
。这种备用配置将指定待处理的操作系统更新固件、cmdline
、内核和 os_prefix
参数。因为在启动固件之前清除了该标志,所以崩溃或重置会导致在下次重启时加载原始的 config.txt
文件。
要设置 tryboot
标志,请在 reboot
命令中的分区号后添加 tryboot
。通常,分区号默认为 0
。但如果要添加额外的参数,则必须指定分区号。传递参数给 reboot
时始终使用引号:它只接受一个参数:
$ sudo reboot '0 tryboot'
所有树莓派型号都支持 tryboot,但是在树莓派 4 A 1.0 版本和 1.1 版本上,EEPROM 不能被写保护。这是因为旧款树莓派 4B 设备必须重置电源供应(会丢失 tryboot
状态),而这些信息正存储在 EEPROM。
若启用安全启动,则 tryboot 模式将导致加载 tryboot.img
而不是 boot.img
。
tryboot_a_b
模式如果 autoboot.txt
中的 tryboot_a_b
属性设置为 1,则加载的是 config.txt
而不是 tryboot.txt
。这是因为在更高级别(分区)已经进行了 tryboot 切换,因此在备用分区本身内部不需要具有 tryboot.txt
文件。
当从内置的 boot.img
镜像加载文件,tryboot_a_b
属性会被隐式设置为 1
。
在编辑引导加载程序配置之前,请更新你的系统以获取 rpi-eeprom 软件包的最新版本。
要查看当前的 EEPROM 配置,请运行以下命令:
$ rpi-eeprom-config
要编辑当前的 EEPROM 配置并将更新应用于最新的 EEPROM 版本,请运行以下命令:
$ sudo -E rpi-eeprom-config --edit
关于 EEPROM 更新过程的更多信息,请参阅启动 EEPROM。
本节描述引导加载程序中所有可用的配置项。语法与 config.txt
相同,但属性是特定于引导加载程序的。条件过滤器也受支持,除了 EDID 之外。
BOOT_UART
如果 1 则启用 GPIO 14 和 15 上的 UART 调试输出。将接收调试终端配置为 115200bps,8 位,无奇偶校验位,1 个停止位。
默认: 0
UART_BAUD
仅适用于树莓派 5。
更改引导加载程序 UART 的波特率。
支持的值: 9600、19200、38400、57600、115200、230400、460800、921600
默认: 115200
WAKE_ON_GPIO
若为 1
则 sudo halt 将在较低功耗模式下运行,直到 GPIO3 或 GLOBAL_EN 短接至地。
在树莓派 5 上,此设置并不相关,因为专用电源按钮可以始终用于唤醒来自 HALT 或 STANDBY。
默认: 1
POWER_OFF_ON_HALT
如果 1
和 WAKE_ON_GPIO=0
,那么 sudo halt
将关闭所有电源管理芯片(PMIC)输出。这是 halt
的最低功耗状态,但可能会导致某些扩展板出现问题,因为 5V 仍将处于开启状态。GLOBAL_EN 必须短接地来启动。
树莓派 400 有一个专用的电源按钮,即使处理器关闭也能工作。这个功能默认启用,但可设置 WAKE_ON_GPIO=2
来使用外部 GPIO 电源按钮,而不是专用电源按钮。
在树莓派 5 上,这将把 PMIC 置于 STANDBY 模式,其中所有输出都被关闭。无需设置 WAKE_ON_GPIO
,按下专用电源按钮将启动设备。
默认: 0
BOOT_ORDER
BOOT_ORDER
设置能对不同启动模式的优先级进行灵活配置。它表示为一个 32 位无符号整数,其中每个半 B 代表一个启动模式。启动模式按照从最低有效半 B 到最高有效半 B 的顺序尝试。
BOOT_ORDER
字段
BOOT_ORDER
属性定义了不同引导模式的顺序。它是从右到左读取的,最多可以定义八位数字。
0x0
SD CARD DETECT
尝试 SD 卡,然后等待卡检测指示卡已更改。现在已弃用,因为 0xf
( RESTART ) 可用。
0x1
SD CARD
SD 卡 (或计算模块 4 上的 eMMC)。
0x2
NETWORK
网络引导:请参阅网络引导服务器教程。
0x3
RPIBOOT
RPIBOOT:请参阅 usbboot。
0x4
USB-MSD
USB 大容量存储引导:请参阅 USB 大容量存储引导。
0x5
BCM-USB-MSD
通过 USB-C 插口从 USB 2.0 启动(CM4:CM4IO 板上的 USB-A 插口)。在树莓派 5 上不可用。
0x6
NVME
仅限于 CM4 和 Pi 5:从连接到 PCIe 接口的 NVMe SSD 启动。有关更多详细信息,请参阅 NVMe 启动。
0x7
HTTP
通过以太网上的 HTTP 引导。有关更多详细信息,请参阅 HTTP 引导。
0xe
STOP
停止并显示错误模式。需要电源循环以退出此状态。
0xf
RESTART
从 BOOT_ORDER
字段中的第一个引导模式重启,即循环。
RPIBOOT 与计算模块 4 同时使用,加载自定义调试镜像(例如,Linux RAM-disk)而不是正常的引导。这应该是最后的引导选项,因为它目前不支持超时或重试。
BOOT_ORDER
示例
BOOT_ORDER
说明
0xf41
首先尝试存储卡,然后是 USB-MSD,再重复(如果 BOOT_ORDER
为空时默认)
0xf14
首先尝试 USB,然后是存储卡,然后重复
0xf21
首先尝试存储卡,然后是网络,然后重复
0xf46
首先尝试 NVMe,然后是 USB 大容量存储设备,然后重复
MAX_RESTARTS
如果遇到 0xf
重启 ( RESTART ) 引导模式超过 MAX_RESTARTS
次数,则会触发看门狗复位。不建议一般使用这个,但在需要完全重置以解决硬件/网络接口故障的测试和远程系统上可能会有用。
默认值: -1
(无限)
SD_BOOT_MAX_RETRIES
在移动到由 BOOT_ORDER
定义的下一个引导模式之前,在 SD 引导失败后重试的次数。
-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
可选的点分十进制 IP 地址(例如 192.168.1.99
)用于 TFTP 服务器,覆盖来自 DHCP 请求的服务器 IP。
在家庭网络上,可能会发现这很有用,因为可以使用 tftpd-hpa
代替 dnsmasq
,其中宽带路由器是 DHCP 服务器。
默认: ""
TFTP_PREFIX
为了让每个树莓派都有唯一 TFTP 启动目录,引导加载程序会将文件名前缀添加到特定于设备的目录。如果在带前缀的目录中找不到 start4.elf
/start.elf
,则会清除前缀。
在早期型号上,序列号被用作前缀,但在树莓派 4 和 5 上,MAC 地址不再由序列号生成,这使得通过检查 DHCPDISCOVER 包自动创建 tftpboot
目录在服务器上变得困难。为了方便,TFTP_PREFIX
可以定义为 MAC 地址、固定值或序列号(默认)。
0
使用序列号,例如 9ffefdef/
1
使用 TFTP_PREFIX_STR
指定的字符串
2
使用 MAC 地址,例如 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)的串联(RPi4 0x34695052
适用于 树莓派 4 或 RPi5 0x35695052 适用于树莓派 5),板子版本(例如 0x00c03111
、0x00d04170
)(4 B),MAC 地址的最低有效 4 B 以及 4 B 的序列号。这旨在是独一无二的,同时也向 DHCP 服务器提供结构化信息,使得可以识别树莓派 4 和 5 计算机,而无需依赖以太网 MAC OUID。
指定 DHCP_OPTION97=0
可恢复旧行为,或指定非零十六进制值以指定自定义的 4 字节前缀。
默认值: 0x34695052
MAC_ADDRESS
用给定的值覆盖树莓派以太网 MAC 地址。例如 dc:a6:32:01:36:c2
默认: ""
MAC_ADDRESS_OTP
使用存储在客户 OTP 寄存器中的值覆盖树莓派以太网 MAC 地址。
例如,要使用存储在 Customer OTP 的行 0 和 1 中的 MAC 地址。
MAC_ADDRESS_OTP=0,1
第一个值(例如中的第 0 行)包含 OUI 和 MAC 地址的最高 8 位。第二个值(例如中的第 1 行)存储 MAC 地址的剩余 16 位。这与在制造时用于树莓派 MAC 地址的格式相同。
可以选择并以任意顺序组合任意两个客户行。
Customer OTP 行是 OTP 寄存器 36 到 43,在 vcgencmd otp_dump
输出中,所以如果前两行被编程如下,则 MAC_ADDRESS_OTP=0,1
就会给出一个 MAC 地址为 e4:5f:01:20:24:7e。
36:247e0000
37:e45f0120
默认值: ""
如果设置了 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=1
,HDMI 启动诊断显示将被禁用。其他非零值保留供将来使用。
默认: 0
HDMI_DELAY
跳过 HDMI 诊断显示,最多 N 秒(默认值 5
),除非发生致命错误。默认行为旨在避免在正常 SD/USB 引导时,引导加载程序诊断屏幕短暂出现。
默认: 5
ENABLE_SELF_UPDATE
启用引导加载程序从 TFTP/USB 大容量存储设备(MSD)引导文件系统中更新自身。
如果自更新已启用,则引导加载程序将在引导文件系统中查找更新文件(.sig
/.upd
)。如果更新镜像与当前镜像不同,则应用更新并重置系统。否则,如果 EEPROM 镜像是逐字节相同的,则引导将继续正常进行。
注:
2021 年之前的引导加载程序版本不支持 self-update
。
2022 年之前,SD 启动中未启用自更新功能。在树莓派 4 上,ROM 已经可以从存储卡加载 recovery.bin
。在 CM4 上,自更新和 recovery.bin
均不生效,需要使用 USB 启动(请参阅计算模块 EEPROM 引导程序文档)。
从 2022 年开始(beta 和稳定版),可以启用存储卡的自更新功能。
对于网络启动,请确保 TFTP 的 boot
目录可以通过 NFS 挂载,并且 rpi-eeprom-update
可以写入其中。
默认值: 1
FREEZE_VERSION
以前,此属性仅由 rpi-eeprom-update
脚本检查。但是,现在自更新已启用,引导加载程序还将检查此属性。如果设置为 1
,则将覆盖 ENABLE_SELF_UPDATE
以停止自动更新。要禁用 FREEZE_VERSION
,你必须使用带有 recovery.bin
的存储卡引导。
自定义 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
嵌入式树莓派制造者应用程序会在启动时下载一个 JSON 文件进行配置。
你可以更改内嵌的树莓派制作程序应用程序使用的 JSON 文件的网址,以便提供你自己的镜像。你可以通过参数 --repo
传递网址来测试标准的 树莓派 制作程序应用程序。
默认: 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 秒的启动时间,因此在某些嵌入式应用中禁用网络安装可能更为有利。
在树莓派 4 和树莓派 400 上默认为 1,在计算模块 4 上为 0。
NET_INSTALL_KEYBOARD_WAIT
如果启用了网络安装,则引导加载程序会尝试检测键盘和按 SHIFT 键以启动网络安装。你可以使用此属性更改此等待时间的长度(以毫秒为单位)。
将此设置为 0 将禁用对键盘的等待,尽管如果找不到引导文件且 USB 引导模式为 4 且处于 BOOT_ORDER
中,则仍可以启动网络安装。
注意
测试表明检测键盘和 SHIFT 至少需要 750 毫秒。
默认: 900
NETCONSOLE
- 高级日志记录NETCONSOLE
复制调试消息到网络接口。IP 地址和接口由 NETCONSOLE 字符串定义。
注意
NETCONSOLE
阻塞,直到以太网连接建立或超时发生。超时值为DHCP_TIMEOUT
,尽管除非请求网络引导,否则不会尝试 DHCP。
格式
有关更多信息,请参阅 Netconsole 文档。
src_port@src_ip/dev_name,dst_port@dst_ip/dst_mac
E.g. [email protected]/,6666@/
为了简化解析,引导加载程序要求每个字段分隔符都存在。必须指定源 IP 地址,但以下字段可以留空并分配默认值。
src_port - 6665
dev_name - "" (设备名称始终被忽略)
dst_port - 6666
dst_ip - 255.255.255.255
dst_mac - 00:00:00:00:00
通过将测试树莓派 4 连接到运行 WireShark 的另一个树莓派,并选择“udp.srcport == 6665”作为过滤器,然后选择 分析 → 跟随 → UDP 数据流 以 ASCII 日志形式查看数据的一种方式。
默认情况下不应启用 NETCONSOLE
,因为这可能会导致网络问题。可以通过 GPIO 过滤器按需启用。
# Enable debug if GPIO 7 is pulled low
[gpio7=0]
[email protected]/,6666@/
默认: "" (未启用)
最大长度: 32 个字符
PARTITION
如果未显式地由 reboot
命令 (例如 sudo reboot N
) 或 boot_partition=N
在 autoboot.txt
中设置,则可以使用 PARTITION
选项来指定引导分区号。用户可以按下按钮来从救援分区启动。
# Boot from partition 2 if GPIO 7 is pulled low
[gpio7=0]
PARTITION=2
默认值: 0
PSU_MAX_CURRENT
仅适用于树莓派 5。
如果设置,该参数指示固件跳过 USB 供电握手,并假定连接到了具有给定电流等级的电源。通常设置为 3000(小电流电源) 或 5000(大电流电源)。
默认: ""
USB_MSD_EXCLUDE_VID_PID
一个包含最多四个 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 读卡器。这仍在调整中,但可能有助于加快启动速度,如果连接了旧、慢设备以及包含 OS 的快速 USB-MSD 设备。
最小值: 100
默认: 2000
(2 秒)
USB_MSD_PWR_OFF_TIME
仅适用于树莓派 4。
在树莓派重启时,硬件会关闭 USB 电源。短暂的断电时间可能会导致某些 USB 设备出现问题,因此可以使用此参数强制执行较长的断电时间,就像在物理上拔掉电线一样。
在树莓派 4 版本 1.3 及更早版本上,要配置长关机需要启用 XHCI 控制器,因此实际上会先进行短关机,然后是较长的可配置关机。通过将此参数设置为 0
,可以跳过较长的可配置关机。
在更新的版本中,硬件会确保 USB 电源在重启后关闭,引导加载程序仅在此经过超时后才启用电源。这是在内存初始化后发生的,确保 USB 电源至少被断开 2 秒。因此,此参数一般对新的硬件版本没有影响。
最小值: 0
最大值: 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 控制器而无需提供专用的 SPI EEPROM 来存储 VL805 固件。
在计算模块 4 上,引导加载程序永远不会写入专用的 VL805 SPI EEPROM。此选项仅配置控制器从 SDRAM 加载固件。
如果 VL805 XHCI 控制器有专用的 EEPROM,请勿使用此选项。它将无法初始化,因为 VL805 ROM 将尝试使用专用的 SPI EEPROM(如果已安装)。
嵌入式 VL805 固件假定与树莓派 4B 相同的 USB 配置(两个 USB 3.0 端口和四个 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]
部分在读取 config.txt
GPU 固件 start4.elf
后,读取引导加载程序 EEPROM 配置并检查是否存在名为 [config.txt]
的部分。如果 [config.txt]
部分存在,则将从此部分开头到文件末尾的内容附加到内存中,以便与从引导分区读取的 config.txt
文件的内容组合。这可用于自动应用设置到每个操作系统,例如 dtoverlays
。
警告
如果你配置引导加载程序时出现无法引导的无效配置,则必须重新刷新引导加载程序 EEPROM 为有效配置以引导。
技巧
一些配置属性存储在
config.txt
中。有关这些属性的更多信息,请参阅配置属性。
在树莓派上使用 DPI 显示器
40 针通用输入/输出(GPIO)连接器可用于将显示并行接口(DPI)显示器连接到树莓派设备,作为使用专用显示串行接口(DSI)或高清多媒体接口(HDMI)的替代方案。
所有带有 40 针排针和计算模块的树莓派板都提供了高达 24 位并行 RGB 接口。此接口允许将并行 RGB 显示器连接到树莓派的 GPIO,无论是在 RGB24(每种红、绿和蓝色各 8 位)还是 RGB666(每种颜色 6 位)或 RGB565(5 位红色,6 位绿色和 5 位蓝色)模式下。
此接口由 GPU 固件控制,并可以通过用户通过特殊 config.txt
参数和启用正确的 Linux 设备树叠加层来进行编程。
树莓派 GPIO 的 Bank 0 上可选择的一个替代功能是 DPI(显示并行接口),这是一个简单的时钟并行接口(最多可提供 R、G 和 B 的 8 位;时钟、使能、水平同步和垂直同步)。此接口在 GPIO Bank 0 上作为替代功能 2(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
注意
DPI 输出引脚上的颜色值可以以 565、666 或 24 位模式显示(请参阅下表和参数
output_format
的dpi_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 引脚的所有其他外设叠加层。在 config.txt
中,请注意注释/关闭所有已启用的 I²C/SPI dtparams
:
dtparam=i2c_arm=off
dtparam=spi=off
内核模式设置(KMS)通用显示接口使输出能够接入任意显示器,只要你有合适的驱动程序。
自动检测能让你的树莓派与显示器连接,而无需手动配置设备树叠加层。在默认情况下已启用自动检测。你可以通过将以下行添加到 config.txt
来启用显示器自动检测:
display_auto_detect=1
用 0
替换 1
可禁用自动检测。当你连接启用自动检测的官方树莓派显示器时,KMS 会自动确定显示器,配置适当的显示设置。
注意
在树莓派系统 Bookworm 及更高版本中,先前用于设置 DPI 的
dpi_output_format
和dpi_timings
条目已被叠加层vc4-kms-dpi-generic
取代。
要使用除树莓派官方显示屏之外的其他显示屏,必须在配置文件中指定 dtoverlay
条目。面板制造商应在 Linux 内核代码中配置你的显示屏的时序,并提供叠加层来启用这些设置。请参阅 Adafruit Kippah 显示屏条目获取示例。以下示例演示如何在你的 txt 文件中为 Kippah 显示屏设置 dtoverlay
条目:
dtoverlay=vc4-kms-kippah-7inch-overlay
显示是时序通常在内核中定义,但你也可以在提供的 BSD 驱动程序中定义它们。如果你的面板在内核代码中缺乏定义的叠加层,则可以使用 BSD 驱动程序将显示定时定义为参数。这使你能够为显示屏手动配置设备树条目。
以下示例演示如何使用设备树参数定义定时:
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
注意
设备树行长度不得超过 80 个字符。当设置的行需要超过 80 个字符时,请将该参数的赋值拆分为多行。
参数显示树定义支持以下参数:
clock-frequency
显示时钟频率(Hz)
hactive
水平活动像素
hfp
水平上沿
hsync
水平同步脉冲宽度
hbp
水平下沿
vactive
纵向活动线
vfp
纵向上沿
vsync
纵向同步脉冲宽度
vbp
垂直下沿
hsync-invert
水平同步低电平
vsync-invert
垂直同步低电平
de-invert
数据使能低电平
pixclk-invert
负边沿像素时钟
rgb565
在 GPIO 0-19 上改变为 RGB565 输出
rgb666-padhi
在 GPIO 0-9,12-17 和 20-25 上改变为 RGB666 输出
rgb888
在 GPIOs 0-27 上更改为 RGB888 输出
bus-format
覆盖 MEDIA_BUS_FMT_*
值的总线格式,也被 rgbXXX 覆盖
backlight-gpio
定义用于背光控制的 GPIO(默认值:无)
你可以在所有当前的树莓派主板上找到一个 40 脚 GPIO(通用输入/输出)排针。主板上所有的 GPIO 排针间距均为 0.1 英寸(2.54 mm)。
注意
有 “H”后缀的 Zero 和 Pico 不带排针。
通用 I/O (GPIO) 引脚可配置为通用输入、通用输出,或者最多六种特殊交替设置之一,其功能取决于引脚。
注意
GPIO 引脚编号方案不按数字顺序排列。GPIO 引脚 0 和 1 位于板上(物理引脚 27 和 28),但保留供高级用途。
作为输出引脚指定的 GPIO 引脚可以设置为高电平(3.3V)/低电平(0V)。
作为输入引脚指定的 GPIO 引脚可以读取为高电平(3.3V)/低电平(0V)。使用内部上拉/下拉电阻器可以更轻松地实现其功能。GPIO2 和 GPIO3 引脚内置上拉电阻器,但对于其他引脚,可以在软件中进行配置。
可以通过打开终端窗口并运行命令 pinout
在树莓派上访问 GPIO 参考。此工具由 GPIO Zero Python 库提供,在树莓派系统中预装。
警告
尽管把简单的组件接入 GPIO 引脚是安全的,但要小心线路的连接方式。应该用电阻限制流经 LED 的电流。不要给 3.3V 的组件用 5V。不要把电机直连到 GPIO 引脚,应该使用 H 桥电路、电机控制板。
为了使用 GPIO 接口,你的用户必须是 gpio
组的成员。默认用户账户已经如此,但对于其他用户,你须使用以下命令手动加入:
$ sudo usermod -a -G gpio <username>
BCM2835 封装的 GPIO 在外设数据表中有时被称为“pads”,这是一个半导体设计术语,即“连接到外部世界的芯片”。
这些 pads 是可配置的 CMOS 推挽输出驱动器/输入缓冲器。可用于寄存器控制设置的包括:
内部上拉/下拉使能/失能
输出驱动强度
输入施密特触发器滤波
所有 GPIO 引脚在上电复位时恢复为通用输入。还应用了默认拉电状态,详细信息请参阅 Arm 外设数据手册中的备用功能表。大多数 GPIO 引脚都应用了默认拉电。
每个 GPIO 引脚在配置为通用输入时,可以配置为 Arm 的中断源。可配置多个中断产生源:
边沿敏感(高/低)
上升/下降沿
异步上升/下降沿
水平中断会保持中断状态,直到系统软件清除该中断(例如通过处理产生中断的附加外围设备)。
普通的上升/下降沿检测在检测中内置了少量的同步。在系统时钟频率下,引脚在三个周期窗口内采样,生成中断的标准是在稳定的转换中,即记录为 1 0 0 或 0 1 1。异步检测绕过此同步,以便检测非常窄的事件。
几乎所有的 GPIO 引脚的功能都能被修改。SoC 内部的外设模块可以选择出现在一组 GPIO 引脚中的一个及多个上,例如,I²C 总线可以配置为至少三个独立位置之一。当引脚配置为替代功能时,例如,控制驱动强度或施密特触发器等仍然适用。
大部分功能适用于所有引脚,个别仅适用于特定引脚:
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)
I²C
数据: (GPIO2); 时钟 (GPIO3)
EEPROM 数据: (GPIO0); EEPROM 时钟 (GPIO1)
串行
TX(GPIO14); RX(GPIO15)
主板上有两个 5V 针脚、两个 3.3V 针脚,以及一些接地针脚(GND),这些不能被重新配置。剩余的针脚都是通用的 3.3V 针脚,意味着输出被设置为 3.3V,输入是 3.3V 兼容的。
下表列出了针对 BCM2835、BCM2836、BCM2837 和 RP3A0 系列产品(例如树莓派 Zero 或树莓派 3+)的 GPIO 针脚的各种电压规格。有关计算模块的信息,请参阅相应的数据表。
Vɪʟ
低电压输入
-
-
-
0.9
V
Vɪʜ
高电压输入①
-
1.6
-
-
V
Iɪʟ
输入泄漏电流
Tᴀ = +85°C
-
-
5
μA
Cɪɴ
输入电容
-
-
5
-
电源
音量
输出低电压
Iᴏʟ = -2mA
-
-
0.14
V
Vᴏʜ
输出高电压②
Iᴏʜ = 2 mA
3.0
-
-
V
Iᴏʟ
输出低电流③
电压 = 0.4V
18
-
-
mA
Iᴏʜ
输出高电流③
Vᴏ = 2.3V
17
-
-
mA
上拉电阻
上拉电阻
-
50
-
65
kΩ
下拉电阻
下拉电阻
-
50
-
65
kΩ
①: 滞后效应已启用
②: 默认驱动强度 (8mA)
③: 最大驱动强度 (16mA)
下表显示了 BCM2711 系列产品(例如树莓派 4、400)上 GPIO 引脚的电压规格。有关计算模块的信息,请参阅相关数据表。
低电压输入
输入低电压
-
-
-
0.8
V
高电压输入
输入高电压①
-
2.0
-
-
V
Iɪʟ
输入漏电流
Tᴀ = +85℃
-
-
10
μA
Vᴏʟ
输出低电压②
Iᴏʟ = -4mA
-
-
0.4
V
Vᴏʜ
输出高电位②
Iᴏʜ = 4mA
2.6
-
-
V
Iᴏʟ
输出低电流③
Vᴏ = 0.4V
7
-
-
mA
输出高电流
输出高电流
Vᴏ = 2.6V
7
-
-
mA
Rᴘᴜ
上拉电阻
-
33
-
73
kΩ
Rᴘᴅ
下拉电阻
-
33
-
73
kΩ
①: 滞后效应已启用
②: 默认驱动强度 (4mA)
③: 最大驱动强度 (8mA)
GPIO 驱动强度并不表示最大电流,仅表示在此电流下 pad 仍将符合规范。你应该设置 GPIO 驱动强度以匹配所连接的设备,以便设备能够正常工作。
在 pad 内部有多个并联驱动器。如果将驱动强度设置为低(0b000
),则大多数驱动器将处于三态状态,因此不会对输出电流产生影响。如果增加驱动强度,则会并联更多驱动器。图表显示了该行为。
警告
对于树莓派 4、400,计算模块 4,当前级别是图表中显示数值的一半。
当前数值指定了在此电路板仍能满足规范的最大电流。
当前值不是垫片将提供的电流,也不是电流限制。
触点片输出是一个电压源:
如果设置为高电平,触点片将尝试将输出驱动到电源电压(3.3V)
该触点将尝试将输出引至高电平/低电平。成功取决于所连接设备的要求。如果该触点短接至地线,则无法输出高电平。它将尽可能输送尽可能多的电流,电流仅受内部电阻限制。
如果该触点输出高电平且短接至地线,在一段时间后将损坏。如果你将其连接至 3.3V 并输出低电平同样也是如此。
符合规格是由保证的电压水平确定的。由于引脚是数字的,因此有两个电压级别,高电平和低电平。I/O 接口有两个处理输出电平的参数:
Vᴏʟ,最大低电平电压(在 3.3V VDD IO 时为 0.14V)
Vᴏʜ,最小高电平电压(在 3.3V VDD IO 时为 3.0V)
Vᴏʟ=0.14V 意味着如果输出为低电平,则电压将 <= 0.14V。Vᴏʜ=3.0V 意味着如果输出为高电平,则电压将 >= 3.0V。
例如,驱动强度为 16mA 表示如果你将端口设置为高电平,可以吸收高达 16mA 电流,并且输出电压保证 >=Vᴏʜ。这也意味着,如果你将驱动强度设置为 2mA,但吸收了 16mA 电流,则电压将不会达到 Vᴏʜ,而会更低。事实上,可能不足以被外部设备识别为高电平。
GPIO 引脚的物理特性有更多信息。
注意
在计算模块设备上,可以将 VDD IO 从标准的 3.3V 更改。在这种情况下,Vᴏʟ 和 Vᴏʜ 将根据 GPIO 部分的表格进行更改。
树莓派 的 3.3V 电源为每个 GPIO 引脚的设计最大电流是 ~3mA。如果你将每个引脚的负载设定为 16mA,则总电流为 272mA。在此负载水平下,3.3V 电源将崩溃。会引发大电流脉冲,特别是如果有电容负载。脉冲将在附近的其他引脚之间反弹。这可能会对存储卡乃至内存行为造成干扰。
所有的键盘的电子元件均设计为 16mA。这是一个安全值,在此范围内你不会损坏设备。即使你将驱动强度设置为 2mA,然后负载为 16mA,也不会损坏设备。除此之外的最大安全电流都不保证。
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
1
3
HYST
启用输入滞后; 0 = 禁用; 1 = 启用
RW
1
2:0
DRIVE
驱动强度,请参见下面的详细列表
RW
3
请当心同时切换输出(SSO)限制,这些限制取决于设备以及 PCB 的质量和布局,去耦电容器的数量和质量,触点子上的负载类型(电阻,电容)以及树莓派无法控制的其他因素。
0 = 2mA
1 = 4mA
2 = 6mA
3 = 8mA
4 = 10mA
5 = 12mA
6 = 14mA
7 = 16mA
树莓派经常被用作其他产品的组件。本文档介绍了一些额外的功能,以便于使用你树莓派的其他功能。
在树莓派开发板计算机上使用一次性可编程内存
所有树莓派单板计算机(SBC)都内置了一次编程(OTP)存储器区域,实际上是主片上的一部分。正如其名称(one-time,一次性)暗示的那样,OTP 存储器只能被写入一次(即二进制 0
只能改为 1
)。一旦某位置 1
,就永远无法恢复为 0
。可将 OTP 的每一位都视为一根保险丝。对其进行编程即代表有意地熔断保险丝:这是一种不可逆的过程,因为你无法进入芯片内部去替换它!
本白皮书假定树莓派正在运行树莓派操作系统(OS),并且已完全更新最新固件和内核。
有许多可以使用的 OTP 值。要查看所有 OTP 值的列表,请运行以下命令:
$ vcgencmd otp_dump
这个转储中的一些有趣的行:
28 - 序列号
29 - 序列号的补码
30 - 板子修订号码
此外,从 36 到 43(包括 36 和 43),有八行 32 位供客户使用。
注意
在 BCM2712 设备上,这些数字是不同的。第 31 行是序列号,第 32 行是板子修订号码。客户行是 77 到 84(包括 77 和 84)。
一些这些行可以使用 vcmailbox
进行编程。这是一个 Linux 驱动程序界面,用于处理行的编程。要执行此操作,请参考文档和 vcmailbox
示例应用程序。
vcmailbox 应用程序可以直接在树莓派系统的命令行上使用。一个示例用法是:
$ vcmailbox 0x00010004 8 8 0 0
...会返回类似于:
0x00000020 0x80000000 0x00010004 0x00000008 0x800000008 0xnnnnnnnn 0x00000000 0x00000000
以上使用邮箱属性接口 GET_BOARD_SERIAL,请求大小为 8 B,响应大小为 8 B(发送两个整数作为请求 0,0
)。对此的响应将是两个整数(0x00000020
和 0x80000000
),后跟标签代码、请求长度、响应长度(第 31 位设为 1 表示它是响应),然后是 64 位序列号(其中最高 32 位始终为 0)。
警告
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 写邮箱的特殊参数来完成。
$ vcmailbox 0x00038021 8 8 0xffffffff 0xaffe0000
只要锁定,客户 OTP 值就无法修改。请注意,这个锁定操作是不可逆的。
可以使用以下命令将客户区域标记为只读。
$ vcmailbox 0x00030086 4 4 0
一次性密码仅在设备重置前锁定,因此每次启动时都需要重新应用一次性密码锁定。
可以完全阻止读取客户一次性密码位。这可以通过在一次性密码写邮箱中使用特殊参数来实现:
$ vcmailbox 0x00038021 8 8 0xffffffff 0xaffebabe
这个操作对于绝大多数用户来说可能没有什么用处,并且是不可逆的。
在 BCM2712 设备上,以太网、Wi-Fi 和蓝牙 MAC 地址在 OTP 存储器中设置。这些值可以随客户值而改变。
获取客户端的 MAC 地址 vcmailbox 0x00030082/3/4 6 6 0 0
,其中 2 是以太网,3 是 WiFi,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
,该访问权限仅限于树莓派系统上的 video
组。
树莓派计算机没有硬件保护密钥存储。建议将此功能与安全启动结合使用,以限制对这些数据的访问。
树莓派系统不支持加密根文件系统。
有关开源磁盘加密的更多信息,请参见 Cryptsetup。
rpi-otp-private-key
将密钥编程到 OTP 中。rpi-otp-private-key
脚本包装设备私钥 vcmailbox API,使得更容易以 OpenSSL 格式读取和写入密钥。
注意
usbboot 库包含你需要的所有工具,rpi-eeprom 作为 Git 子模块。
把这个 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>
。
读取所有行。
$ 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
所有树莓派范围使用的 SoC 都具有内置的一次可编程(OTP)存储器块。少数位置具有出厂程序化的数据。
OTP 存储器大小:
非 BCM2712 设备:66 个 32 位值
BCM2712 设备:192 个 32 位值
要显示 OTP 的内容,请运行以下命令:
$ vcgencmd otp_dump
此列表包含关于寄存器的公开信息。如果某个寄存器或位未在此定义,则表示它未公开。
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:启用从存储卡引导
位 22:设置用于引导的银行
位 28:启用 USB 设备引导
位 29:启用 USB 主机引导(以太网和大容量存储)
注意
在 BCM2711 上,引导模式由引导加载程序 EEPROM 配置而不是 OTP 定义。
18 启动模式寄存器的副本 28 序列号 29 ~(序列号) 30 修订代码 ① 33 电路板修订扩展 - 意义取决于电路板型号。这通过设备树在 /proc/device-tree/chosen/rpi-boardrev-ext
中提供,并且可以通过在 config.txt
中设置 board_rev_ext
来临时覆盖测试目的中的 OTP 值。
*计算模块 4
位 30:计算模块是否安装了 WiFi 模块
0 - Wi-Fi
1 - 没有 Wi-Fi
Bit 31:计算模块是否安装了 EMMC 模块
0 - EMMC
1 - 无 EMMC(Lite)
树莓派 400
位 0-7:piwiz 使用的默认键盘国家代码 36-43 客户 OTP 值 45 MPG2 解码密钥 46 WVC1 解码密钥
47-54 SHA256 RSA 公钥的安全引导
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
①还包含禁用过压、OTP 编程和 OTP 读取的位。
此列表包含关于寄存器的公开信息。如果此处未定义寄存器或位,则表示其非公开。
22 引导模式寄存器
第 1 位:从存储卡启动
第 2-4 位:从 SPI EEPROM 启动(以及哪些 GPIO)
位 10: 禁止从存储卡引导
位 11: 禁止从 SPI 引导
位 12: 禁止从 USB 引导
23 引导模式寄存器的副本
29 高级引导模式
0-7 位:SD 卡检测的 GPIO
位 8-15:用于 RPIBOOT 的 GPIO
序列号的低 32 位为 31
32 板上修订版本
33 板属性 - 其含义取决于板。这可通过设备树在 /proc/device-tree/chosen/rpi-boardrev-ext
中获取
35 序列号的高 32 位 全 64 位序列号可在 /proc/device-tree/serial-number
中获取
50-51 以太网 MAC 地址 这会传递到操作系统中的设备树中,例如 /proc/device-tree/axi/pcie@120000/rp1/ethernet@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 客户 OTP 值
86board 区域 - piwiz 使用的默认键盘区域代码。如果设置,则可通过设备树在 /proc/device-tree/chosen/rpi-country-code
中获取。
87-88 客户以太网 MAC 地址。如果设置,将覆盖 OTP 行 50-51。
89-90 客户 WiFi MAC 地址。如果设置,将覆盖 OTP 行 52-53。
89-90 客户蓝牙 MAC 地址 如果设置,将覆盖 OTP 行 54-55
109-114 工厂设备 UUID 目前是一个 16 位数字 id,应与设备上的条形码匹配。使用零字符填充并进行 c40 编码。
此项信息可通过设备树在 /proc/device-tree/chosen/rpi-duid
中获取。
树莓派连接器用于 PCIe
树莓派 5 在主板的右侧有一个 FPC 连接器。该连接器提供了 PCIe Gen 2.0 ×1 接口,用于连接高速外设。
将 PCIe HAT+ 设备连接到树莓派。你的树莓派应该会自动检测到该设备。要连接非 HAT+ 设备,请将其连接到树莓派,然后手动启用 PCIe。
有关 PCIe FPC 连接器引脚分配和创建第三方设备、配件和扩展板所需的其他详细信息,请参阅树莓派 PCIe 标准文档。建议同时阅读树莓派 HAT+ 规格说明。
注意
目前无法枚举位于在交换机后的 PCIe 设备。
默认情况下,除非连接到了 HAT+ 设备,否则不会启用 PCIe 连接器。要启用连接器,请将以下行添加到 /boot/firmware/config.txt
:
dtparam=pciex1
使用 sudo reboot
重启以使配置更改生效。
注意
你还可以使用别名 nvme。
默认情况下,树莓派设备不会从 PCIe 存储启动。要启用从 PCIe 启动,请更改引导加载程序配置中的 BOOT_ORDER
。使用以下命令编辑 EEPROM 配置:
$ sudo rpi-eeprom-config --edit
将 BOOT_ORDER
行替换为如下行:
BOOT_ORDER=0xf416
若要从非 HAT+ 设备启动,还需添加以下行:
PCIE_PROBE=1
保存更改后,使用 sudo reboot
重启你的树莓派以更新 EEPROM。
警告
树莓派 5 未获 3.0 速度认证。PCIe 3.0 连接可能不稳定。
config.txt
连接已被认证符合 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
使这些设置生效。
raspi-config
运行以下命令打开树莓派配置 CLI:
$ sudo raspi-config
完成以下步骤以启用 PCIe Gen 3.0 速度:
选择 Advanced Options。
选择 PCIe Speed。
选择 Yes 以启用 PCIe Gen 3 模式。
选择 Finish 以退出。
使用 sudo reboot
重启你的树莓派,以使这些设置生效。
注意
本小节仅适用于带有电源按钮的树莓派型号,如树莓派 5。
当你首次将树莓派插入电源时,不用按按钮,它可以自动引导并启动到操作系统。
如果你运行着桌面版树莓派,你可以通过短按电源按钮来执行彻底的关机。一个窗口将出现:询问你是否要关机、重启还是注销。
可选择菜单选项或者再次按下电源按钮,直接执行彻底关机。
注意
如果你运行着桌面版树莓派,则可以通过快速连按两下电源按钮来关闭计算机。如果你运行着无桌面界面的树莓派操作系统精简版,则按一下电源按钮即可触发关机流程。
如果树莓派主板已关闭但仍接入电源,按下电源按钮可重启。
注意
重置电源管理芯片(PMIC)也可以重启。连接扩展板会重置 PMIC。在连接扩展板之前,应始终断开设备与电源的连接。
要强制执行硬关机,请长按电源按钮。
J2 跳线帽
J2 跳线帽位于 RTC 电池连接器和主板边缘间。在此引出可以让你向树莓派 5 添加自己的电源按钮,方法是添加一个常开 (NO) 瞬时开关,将两个焊盘连接起来。短按此开关将执行与板载电源按钮相同的操作。
不同款式的树莓派电源供应要求有所不同。所有型号都需要 5.1V 供应,但通常根据型号需要提高电流。到树莓派 3 为止的所有型号需要一个 micro USB 电源连接器,而树莓派 4、树莓派 400 和树莓派 5 使用 USB-C 连接器。
每个树莓派消耗的电流取决于连接的外围设备。
对于树莓派 1、2、3,我们推荐使用 2.5A micro USB 适配器。对于树莓派 4、400,我们推荐使用 3A Type-C 适配器。对于树莓派 5,我们推荐使用 27W Type-C 电源适配器。
注意
所有型号的树莓派都不支持 USB-PPS。
注意
如果你使用第三方多接口的 USB-PD 电源适配器,在连接树莓派时,再插入其他设备会导致电源适配器与树莓派之间的重新协商。如果树莓派已开机,可无缝进行。但如果树莓派已关机,该协商可能造成树莓派重启。
树莓派 5 PoE 扩展版
树莓派 5 上的以太网插孔支持 PoE +,符合 IEEE 802.3at-2009 PoE 标准。
树莓派 4B 和 3B+ 上的以太网插孔支持 PoE,符合 IEEE 802.3af-2003 PoE 标准。
所有具有 PoE 兼容以太网插孔的树莓派型号都需要通过以太网端口绘制电源的扩展板。对于支持 PoE 的型号,我们建议使用 PoE 扩展板。对于支持 PoE + 的型号,我们建议使用 PoE + 扩展板。
树莓派 1A
700mA
500mA
200mA
树莓派 1B
1.2A
500mA
500mA
树莓派 1A+
700mA
500mA
180mA
树莓派 1B+
1.8A
1.2A
330mA
树莓派 2B
1.8A
1.2A
350mA
树莓派 3B
2.5A
1.2A
400mA
树莓派 3A+
2.5A
仅受电源、主板和连接器评级限制。
350mA
树莓派 3B+
2.5A
1.2A
500mA
树莓派 4B
3.0A
1.2A
600mA
树莓派 5
5.0A
1.6A(如果使用 3A 电源则为 600mA)
800mA
树莓派 400
3.0A
1.2A
800mA
树莓派 Zero
1.2A
仅受电源、板卡和连接器评级限制
100mA
树莓派 Zero W
1.2A
受电源、主板和连接器额定值的限制。
150mA
树莓派 Zero 2 W
2A
仅受电源、主板和连接器额定值限制。
350mA
注意
当连接到 5A,+5V(25W)的电源能力的适配器时,树莓派 5 可为下游 USB 外设提供 1.6A 的电源。当连接到其他兼容的电源时,树莓派 5 将限制下游 USB 设备的电源为 600mA。
大多数树莓派能提供足够的电流给 USB 外设,可供应大多数 USB 设备,如键盘、鼠标和适配器。然而,某些设备需要额外的电流,比如调制解调器、外置磁盘和大功率天线。如果要连接某 USB 设备,但是其电力需求超过了上表中指定的数值,请使用带外部供电的 USB 集线器。
如果你在树莓派上使用各种接口,其电力需求会增加。GPIO 引脚总共可安全供给 50mA;每个引脚最多可单独供给 16mA。HDMI 使用 50mA。相机模块需要 250mA。USB 键盘和鼠标可消耗从 100mA 到 1000mA 不等的电流。请检查你准备连接到树莓派的设备的功率,并相应购买适配器。如不确定,请使用带外部供电的 USB 集线器。
运行以下命令检查输出到 USB 的电力状态:
$ vcgencmd get_config usb_max_current_enable
以下表格总结了不同树莓派型号在各种工作负载期间所绘制的功率(A)量:
引导
最大
0.26
0.40
0.75
0.20
0.85
平均
0.22
0.22
0.35
0.15
0.7
闲置
平均
0.20
0.22
0.30
0.10
0.6
视频播放(H.264)
最大
0.30
0.36
0.55
0.23
0.85
平均
0.22
0.28
0.33
0.16
0.78
压力
最大
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
注意
这些测量基于标准的树莓派系统镜像(截至 2016 年 2 月 26 日,对于树莓派 4 为 2019 年 6 月),室温,树莓派接入了 HDMI 显示器、USB 键盘和 USB 鼠标。树莓派 3A 接入到了无线局域网接入点,树莓派 4 连接到了以太网。所有这些功耗测量均为近似值,并未考虑来自额外 USB 设备的功耗;如果接入了多个额外 USB 设备和扩展板,功耗很容易超过这些测量值。
树莓派 4 和计算模块 4 上的额外电源管理功能
树莓派 4 和 CM4 上采用了多种不同的电源管理芯片(PMIC)。所有这些电源管理芯片(PMIC)都提供了额外的功能,除了电压供应之外。本文档概述了如何在软件中使用这些功能。
在默认情况下,树莓派 5 关机后仍会消耗电力,约 1 至 1.4 瓦。可以减少这种功率消耗:手动编辑 EEPROM 配置:即 sudo rpi-eeprom-config -e
。将设置更改为以下内容:
BOOT_UART=1
POWER_OFF_ON_HALT=1
BOOT_ORDER=0xf416
在关机后,功耗应该会降至约 0.01 W。
自树莓派 B+(2014 年)以降的所有型号,除了 Zero 系列,均配备了低电压检测电路,如检测到供电电压低于 4.63 V(±5%),将在内核日志中打印一行信息。
如果你看到警告,请切换到更高质量的电源适配器和充电线。劣质电源会损坏存储设备甚至诱发树莓派产生未知行为。
电压会因多种原因而降低:你可能已将太多高需求的 USB 设备插入;电源适配器供应可能不足;接入适配器的充电线可能过细。
创建更具弹性的文件系统
树莓派设备经常用作数据存储和监控设备,通常在可能发生意外断电的地方使用。与所有计算设备一样,电力中断可能造成存储损坏。
本白皮书提供了一些参数,介绍了如何通过选择适当的文件系统和设置来防止在以上以及其他情况下的数据损坏,以确保数据完整性。
引导加载程序通过设备树 /proc/device-tree/chosen/power
传递有关电源供应的信息。用户通常不会直接阅读此信息。
max_current
最大电流(单位:mA)
PDO 转储——高级用户的调试
是否将电流限制器设置为高或低
在将控制权转移给操作系统之前,启动期间是否发生过 USB 过电流
重置事件电源管理芯片(PMIC)重置原因,如看门狗、过压或欠压、过温
电源管理芯片(PMIC)带有内置 ADC,可以测量供电电压 EXT5V_V 等等。使用以下命令查看 ADC 测量值:
$ vcgencmd pmic_read_adc
你无法看到 USB 电流或其他直接连接到 5V 的设备,因为这将绕过电源管理芯片(PMIC)。你不应该期望这些值加起来等于电源供应的瓦(w)数。但是,监视核心电压等事项可能很有用。
USB 规范要求 USB 设备不能向上游设备供电。如果 USB 设备向上游设备供电,则称为反向供电。通常是因为连接了劣质的带供电的 USB 集线器,并且会导致带电 USB 集线器向主机的 树莓派 供电。不建议这么做,因为通过集线器向树莓派供电会绕过树莓派中内置的保护电路,使其在发生电涌时易受损坏。
树莓派 5 内置了一个 RTC 模块。它通过位于 Type-C 电源连接器右侧,主板上的 J5(BAT)连接器接入电池供电。
J5 电池连接器
你可以设置唤醒闹钟,将主板切换至极低功耗状态(约 3mA)。达到闹钟时间时,主板将重新上电。这对像延时摄像这样的周期性任务非常有用。
编辑引导加载程序配置以支持唤醒警报的低功率模式:
$ sudo -E rpi-eeprom-config --edit
添加以下两行。
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)
注意
即使备用电池未接入 J5 连接器,RTC 仍然可用。
锂锰可充电 RTC 电池
官方电池配件是一枚可充电的锂锰硬币电池,配有预装的两针 JST-SH 插头和粘性安装触点。适用于在主板的主电源断开时为 RTC 供电。由于关机时的电流吸收为个位数 µA,可使用时间为几个月。
注意
我们不建议使用一次性(不可充电)的锂电池为 RTC 提供电源。RTC 的备用电流消耗比大多数专用 RTC 模块更高,这将导致电池的使用寿命缩短。
警告
不要使用锂离子电池作为 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 可用于连接各种外围设备:显示器、网络控制器(以太网、CAN 总线)、UART 等。这些设备最好由内核设备驱动程序支持,但 spidev API 允许用多种语言编写用户空间驱动程序。
树莓派 Zero, 1, 2 和 3 都有三个 SPI 控制器:
SPI1
,在所有树莓派的引脚上都有两个硬件芯片选择信号;还有一种仅适用于 Compute 模块的备用映射。
SPI2
,在除早期树莓派 1 A 和 A 之外的所有树莓派型号上都有三个硬件芯片选择信号。
SPI2
,也具有三个硬件芯片选择器,仅在计算模块 1、3 和 3+ 上可用。
在树莓派 4、400,计算模块 4 上,还有四个额外的 SPI 总线:SPI3 到 SPI6,每个总线都有两个硬件芯片选择器。这些额外的 SPI 总线可通过某些 GPIO 引脚的替代功能分配来使用。有关更多信息,请参阅 BCM2711 Arm 外围设备数据表。
BCM2835 Arm 外围设备数据表的第 10 章介绍了主控制器。第 2.3 章说明了辅助控制器。
SPI0
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 备用镜像(仅限计算模块,不包括 CM4)
MOSI
GPIO38
SPI0_MOSI
MISO
GPIO37
SPI0_MISO
SCLK
GPIO39
SPI0_SCLK
CE0
GPIO36
SPI0_CE0_N
CE1
GPIO35
SPI0_CE1_N
SPI1
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(仅适用于计算模块,不含 CM4)
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)
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)
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)
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)
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
信号名称缩写:
SCLK 串行时钟
CEchip 启用(通常称为芯片选择)
MOSI 主发送从接收
MISO 主接收从发送
MOMI 主在主出
标准模式
在标准 SPI 模式下,外设实现标准三线串行协议(SCLK,MOSI 和 MISO)。
双向模式
在双向 SPI 模式中,实现了相同的 SPI 标准,只是使用单根导线传输数据(MOMI),而不是标准模式下使用的两根导线(MISO 和 MOSI)。在这种模式下,MOSI 引脚充当 MOMI 引脚。
低速串行接口(LoSSI)模式
LoSSI 标准允许向外围设备(LCD)发出命令并在它们之间传输数据。LoSSI 命令和参数均为 8 位长,但额外的一位用于指示 B 是命令还是参数/数据。数据时此额外位设置为高位,命令时设置为低位。最终的 9 位值被串行化输出。LoSSI 常与 MIPI DBI 类型 C 兼容的 LCD 控制器一起使用。
注意
某些命令会触发 SPI 控制器自动读取,因此该模式不能用作多功能的 9 位 SPI。
轮询
中断
DMA
CLK 寄存器的时钟分频器 (CDIV) 字段设置了 SPI 时钟速度:
SCLK 核心时钟 / CDIV
如果 CDIV 设置为 0,则除数为 65536。除数必须是 2 的倍数,奇数向下舍入。请注意,由于模拟电气问题(上升时间、驱动强度等),并非所有可能的时钟速率都可用。
查看 Linux 驱动程序部分获取更多信息。
在 DMA 模式下操作时,与 CS 线的自动断言和取消断言相关的建立时间和保持时间如下:
CS 线将在传输的第一个字节的 msb 之前至少提前三个核心时钟周期。
CS 线将在最后的时钟脉冲的下降沿后至少延迟一个核心时钟周期取消断言。
默认的 Linux 驱动程序是 spi-bcm2835
。
在默认情况下,SPI0 已被禁用。要启用,请使用 raspi-config
,或确保 dtparam=spi=on
在 /boot/firmware/config.txt
中没有被注释掉。默认情况下,它使用两个芯片选择线,但可以使用 dtoverlay=spi0-1cs
将其减少到一个。还有 dtoverlay=spi0-2cs
;没有任何参数时,它等效于 dtparam=spi=on
。
要启用 SPI1,你可以使用 1、2 或 3 个芯片选择线。将适当的线添加到 /boot/firmware/config.txt
中:
#1 芯片选择
dtoverlay=spi1-1cs
#2 芯片选择
dtoverlay=spi1-2cs
#3 芯片选择
dtoverlay=spi1-3cs
类似的叠加层也适用于 SPI2、SPI3、SPI4、SPI5 和 SPI6。
驱动程序不使用硬件片选线,因为某些限制。相反,它可以使用任意数量的 GPIO 作为软件/GPIO 片选。这意味着你可以选择任何多余的 GPIO 作为 CS 线,所有这些 SPI 叠加层都包括该控制:详情请见 /boot/firmware/overlays/README
,或运行(例如) dtoverlay -h spi0-2cs
(可能有助于列出所有这些)。
速度
该驱动程序支持所有是核心时钟的偶数整除数的速度,尽管如上所述,并非所有这些速度都将支持数据传输,因为 GPIO 和连接的设备存在限制。作为经验法则,任何大于 50MHz 的速度都不太可能工作,但具体情况可能有所不同。
支持的模式位
SPI_CPOL 时钟极性
SPI_CPHA 时钟相位
SPI_CS_HIGH 芯片选择高电平
SPI_NO_CS1 每总线一个设备,无芯片选择
SPI_3WIRE 双向模式,数据输入输出引脚共享
双向模式,也称为 3 线模式,由 spi-bcm2835 内核模块支持。请注意,在此模式下,spi_transfer
结构体的 tx 或 rx 字段必须是 NULL 指针之一,因为只支持半双工通信。否则,传输将失败。spidev_test.c
的源代码未正确考虑此情况,因此在 3 线模式下根本无法工作。
支持的每字比特数
8 - 正常
9 - 支持使用 LoSSI 模式
传输模式
所有 SPI 总线均支持中断模式。SPI0 和 SPI3-6 还支持 DMA 传输。
SPI 驱动延迟
此线程讨论延迟问题。
spidev 提供了一个基于用户空间的单个 SPI CS 线接口。设备树用于指示 CS 线是由内核驱动模块驱动还是由 spidev 代表用户管理;不能同时两者都做。请注意,树莓派自己的内核对于使用设备树启用 spidev 更为宽松——上游内核会打印关于此类用法的警告,最终可能会彻底阻止之。
在 C 语言中使用 spidev
Linux 文档中有一个环回测试程序,可用作起点。请参阅故障排除部分。
在 Python 中使用 spidev
有几个 Python 库能访问 spidev,包括 spidev ( pip install spidev
:参见 https://pypi.org/project/spidev/) 和 SPI-Py ( https://github.com/lthiery/SPI-Py)。
使用 spidev 从像 bash 这样的 shell
以下命令写入二进制 1、2 和 3:
$ echo -ne "\x01\x02\x03" > /dev/spidev0.0
还有其他用户空间库可以通过直接操作硬件来提供 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 许可协议保护。
一般来说,所有 Linux 支持的设备,树莓派都能用,尽管在树莓派 4 之前的型号上有一些限制。
与所有计算机一样,树莓派上的 USB 端口提供的功率有限。USB 设备通常因电力问题而出现故障。要排除电力不足引发问题的可能性,请使用带供电的集线器把 USB 设备接入树莓派。
树莓派 Zero, 1
每端口各 500mA①
树莓派 2, 3, 4
所有端口共 1200mA
树莓派 5
若使用 3A 电源,电流为 600mA;若使用 5A 电源,电流为 1600mA
① 对于旧款树莓派 1 A,每端口限制为各 100mA。
树莓派 5 需要高质量 Type-C 电源适配器才能启动,最低为 +5V 3A(15W)。然而,用这样的电源适配器会限制外部设备的电流。如果你在首次启动时没有使用 +5V 5A 的电源适配器,操作系统会告警,将外部设备的电流限制为 600mA。
如果用户希望驱动大功率外设(如硬盘和固态硬盘),同时维持面对峰值工作负载仍有余量。应使用能够提供 +5V 5A(25W)的 USB-PD 电源适配器。如果树莓派 5 固件检测到了这样的电源适配器,它会把外设的 USB 电流限制缓解至 1.6A,为下游 USB 设备提供额外 5W 电力,同时为主板上电力预算提供额外的 5W 电力。
注意
USB 和风扇接口共用一笔电力预算。
树莓派 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 端口是一样的。
旧版树莓派 4 上的 USB Type C 接口使用的 USB 控制器,在默认情况下已被禁用。
树莓派 1 代 B+、树莓派 2 和树莓派 3 主板提供了四个 USB 2.0 端口。树莓派 Zero 主板配备一个 micro USB on-the-go (OTG) 端口。
树莓派 4 之前的型号上的 USB 控制器仅对某些设备提供基本支持,这会带来较高的软件处理开销。它仅支持一个根 USB 接口:所有连接设备的流量都通过此单一总线传输,该总线的最大速度为 480Mbps。
USB 2.0 规范定义了三种设备速度:低速、全速和高速。大多数鼠标和键盘是低速设备,大多数 USB 声音设备是全速设备,而大多数视频设备(网络摄像头/视频捕捉器)是高速设备。
若把多个高速 USB 设备同时接入树莓派,一般没有问题。
与低速和全速设备通信时产生的软件开销意味着同时活动的低速和全速设备数量会受限制。连接少量这些类型设备到树莓派不会造成问题。
在使用全速/低速设备(如大多数鼠标和键盘)时,与 USB 3.0 集线器一起使用的问题。大多数 USB 3.0 集线器硬件中存在的一个错误:意味着在连接到 USB 3.0 集线器的全速/低速设备时,树莓派 4 之前的型号无法与这些设备通信。
在通过 USB 3.0 集线器接入时,USB 2.0 高速设备(包括 USB 2.0 集线器)可正确运行。
避免将低速/全速设备连接到 USB 3.0 集线器。作为解决方法,将 USB 2.0 集线器插入 USB 3.0 集线器的下游端口,然后将低速设备连接,或者在树莓派和 USB 3.0 集线器之间使用 USB 2.0 集线器,然后将低速设备插入 USB 2.0 集线器。
旧的网络摄像头可能是全速设备。因为这些设备传输大量数据并产生额外的软件开销,无法保证可靠运行。作为解决方法,请尝试通过分辨率调用摄像头。
昂贵的发烧友级声卡通常会占用大量的 USB 带宽。不能保证 96kHz/192kHz DAC 的可靠性。作为一种解决方法,可强制输出流为 CD 音质(44.1kHz/48kHz 16 位),把带宽降低到可靠水平。
USB 2.0 和 3.0 集线器具有一种机制,用于与连接到其下游接口的全速/低速设备通信,即事务转换器 (TT)。此设备可缓冲来自主机的高速请求,并将它们以全速/低速传输给下游设备。USB 规范允许两种集线器配置:单个 TT (所有接口共用一个 TT) 和多个 TT (每端口一个 TT)。由于硬件限制,如果将大量全速/低速设备插入单个 TT 集线器,这些设备可能会表现的不大稳定。建议使用多个 TT 集线器与多个全速/低速设备进行接口处理。作为一种解决方法,可将全速和低速设备分散放置在树莓派自己的 USB 端口和单个 TT 集线器之间。
每个不同款的树莓派修订版都有一个唯一的修订代码。你可以通过运行以下命令,查找树莓派的修订代码:
$ cat /proc/cpuinfo
最后三行显示了硬件类型、修订代码和树莓派的唯一序列号。例如:
Hardware : BCM2835
Revision : a02082
Serial : 00000000765fc593
注意
所有树莓派计算机都报告为 BCM2835,即使是搭载 BCM2836、BCM2837、BCM2711 和 BCM2712 处理器的也一样。你不应该使用此字符串来检测处理器。可使用下面的信息解码修订代码,或
cat /sys/firmware/devicetree/base/model
。
树莓派的第一批型号从 0002 到 0015 分配了顺序十六进制修订代码:
0002
B
1.0
256MB
韵动电子
0003
B
1.0
256MB
韵动电子
0004
B
2.0
256MB
索尼英国
0005
B
2.0
256MB
佳世达
0006
B
2.0
256MB
韵动电子
0007
A
2.0
256MB
韵动电子
0008
A
2.0
256MB
索尼英国
0009
A
2.0
256MB
佳世达
000d
B
2.0
512MB
韵动电子
000e
B
2.0
512MB
索尼英国
000f
B
2.0
512MB
韵动电子
0010
B+
1.2
512MB
索尼英国
0011
CM1
1.0
512MB
索尼英国
0012
A+
1.1
256MB
索尼英国
0013
B+
1.2
512MB
英蓓特
0014
CM1
1.0
512MB
英蓓特
0015
A+
1.1
256MB/512MB
英蓓特
随着使用树莓派 2 的推出,引入了新样式的修订代码。不同于顺序的是,十六进制代码的每一位都代表修订码的一部分信息:
NOQuuuWuFMMMCCCCPPPPTTTTTTTTRRRR
N(位 31)
过压
0:允许过压
1:禁止过压
O (位 30)
OTP 程序①
0:允许 OTP 编程
1:禁止 OTP 编程
Q(位 29)
OTP 读取①
0:允许 OTP 读取
1:OTP 读取不允许
uuu(位 26-28)
未使用
未使用
W(位 25)
保修位②
0: 担保保修有效
1: 因超频而无效的保修保证
u (位 24)
未使用
未使用
F(位 23)
新标志
1:新风格修订
0:旧风格修订
MMM(位于第 20-22 位)
存储器大小
0:256MB
1: 512MB
2: 1GB
3: 2GB
4:4GB
5:8GB
CCCC(位于 16-19 位)
制造商
0: 索尼英国
1: 韵动电子
2: 英蓓特
3: 索尼日本
4: 英蓓特
5:Stadium
PPPP(位 12-15)
处理器
0: BCM2835
1: BCM2836
2: BCM2837
3: BCM2711
4: BCM2712
TTTTTTTT (位于 4-11 位)
类型
0:A
1:B
2:A+
3:B+
4:2B
5:Alpha(早期原型)
6:CM1
8:3B
9:Zero
a:CM3
c:Zero W
d:3B+
ext: e:3A+
f:仅供内部使用
10:CM3+
11:4B
12:Zero 2 W
13: 400
14:CM4
15:CM4S
16:仅供内部使用
17: 5
RRRR(位 0-3)
修订
0、1、2 等。
① 编程 OTP 位的信息。
② 在树莓派 4 上从未设置过保修位。
注意
此列表不是详尽无遗的:可能有正在使用的,但未出现在此表中的代码。请参阅下一节,了解如何使用修订代码来识别板子的最佳实践。
900021
A+
1.1
512MB
索尼英国
900032
B+
1.2
512MB
索尼英国
900092
Zero
1.2
512MB
索尼英国
900093
Zero
1.3
512MB
索尼英国
9000c1
Zero W
1.1
512MB
索尼英国
9020
3A+
1.0
512MB
索尼英国
90200
3A+
1.1
512MB
索尼英国
920092
Zero
1.2
512MB
英蓓特
920093
Zero
1.3
512MB
英蓓特
900061
CM1
1.1
512MB
索尼英国
a01040
2B
1.0
1GB
索尼英国
a01041
2B
1.1
1GB
索尼英国
a02082
3B
1.2
1GB
索尼英国
a020a0
CM3
1.0
1GB
索尼英国
a020d3
3B+
1.3
1GB
索尼英国
a020d4
3B+
1.4
1GB
索尼英国
a02042
2B(搭载 BCM2837)
1.2
1GB
索尼英国
a21041
2B
1.1
1GB
英蓓特
a22042
2B(搭载 BCM2837)
1.2
1GB
英蓓特
a22082
3B
1.2
1GB
英蓓特
a220a0
CM3
1.0
1GB
英蓓特
a32082
3B
1.2
1GB
索尼日本
a52082
3B
1.2
1GB
Stadium
a22083
3B
1.3
1GB
英蓓特
a02100
CM3+
1.0
1GB
索尼英国
a03111
4B
1.1
1GB
索尼英国
b03111
4B
1.1
2GB
索尼英国
b03112
4B
1.2
2GB
索尼英国
b03114
4B
1.4
2GB
索尼英国
b03115
4B
1.5
2GB
索尼英国
c03111
4B
1.1
4GB
索尼英国
c03112
4B
1.2
4GB
索尼英国
c03114
4B
1.4
4GB
索尼英国
c03115
4B
1.5
4GB
索尼英国
d03114
4B
1.4
8GB
索尼英国
d03115
4B
1.5
8GB
索尼英国
c03130
400
1.0
4GB
索尼英国
a03140
CM4
1.0
1GB
索尼英国
b03140
CM4
1.0
2GB
索尼英国
c03140
CM4
1.0
4GB
索尼英国
d03140
CM4
1.0
8GB
索尼英国
902120
Zero 2 W
1.0
512MB
索尼英国
b04170
5
1.0
2GB
索尼英国
c04170
5
1.0
4GB
索尼英国
d04170
5
1.0
8GB
索尼英国
在命令行,我们可以使用以下命令获取板卡的修订代码:
$ cat /proc/cpuinfo | grep Revision
Revision : c03111
在以上示例,我们有一个十六进制的修订代码 c03111
。将其转换为二进制,我们得到 0 0 0 000 0 0 1 100 0000 0011 00010001 0001
。上表已插入空格,为显示修订代码的各部分之间的边界。
从最低阶位开始,底部的四位(0-3)是板子的修订号,所以这块板子的修订号是 1。接下来的八位(4-11)是板子类型,在这种情况下是二进制 00010001
,十六进制 11,所以这是个树莓派 4B。使用相同的过程,我们可以确定处理器是 BCM2711,板子由索尼英国制造,并且内存为有 4GB。
很明显,有如此多的编程语言,不可能为所有的语言都举例,但这里有两个简单的例子,分别面向 C 和 Python。这两个例子都使用系统调用,运行一个 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) // 请注意,mem 字段中的 3 代表 2GB
printf("我们是 4B 机型,内存至少为 2GB !\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 : # 请注意, mem 字段中的 3 代表 2GB
print("我们是 4B 机型,内存至少为 2GB !")
为了避免在创建新的板卡版本时出现问题,请不要使用版本代码(例如 c03111 )。
一个天真的实现是使用支持的版本代码列表,将检测到的代码与该列表进行比较,以决定该设备是否受支持。当出现新的板卡版本或者生产地点发生变化时,这种方法就会失效:每次都会创建新的版本代码时,都不在支持的版本代码列表中。这将导致同一板卡类型的新版本被拒绝,尽管它们始终保持向后兼容。每当出现新版本时,你都必须发布一个包含新版本代码的新支持的版本代码列表——这是一项繁重的开发负担。
还请使用若干以下方法:
根据板型字段(3A、4B 等)进行过滤,该字段表示型号,但不表示修订版。
根据内存量字段进行过滤,因为内存容量大致对应板子的计算能力。
例如,你可以限制搭载了 2GB 和更大内存的树莓派 4B 型号。上一节的示例即采用这种推荐方法。
注意
请始终检查第 23 位,即“New”标志,确保修订代码是新版本,然后再检查其他字段。
在各个 Linux 发行版中,对 /proc/cpuinfo
的支持和格式会有所不同。要检查树莓派设备在 Linux 发行版(包括树莓派系统)上的型号和 CPU,请检查设备树:
$ cat /proc/device-tree/compatible | tr '\0' '\n'
raspberrypi,5-model-b
brcm,bcm2712
输出两个空值分隔的字符串值,每个字符串值包含逗号分隔的制造和型号。例如,树莓派 5 输出上述主板和 CPU 字符串。其对应以下值:
raspberrypi (主板制造商)
5-model-b (主板型号)
brcm (CPU 制造商)
bcm2712 (CPU 型号)
树莓派型号具有以下设备树数值:
树莓派 5
raspberrypi
5-model-b
brcm
bcm2712
树莓派 400
raspberrypi
400
brcm
bcm2711
树莓派计算模块 4
raspberrypi
4-compute-module
brcm
bcm2711
树莓派 4A
raspberrypi
4-model-a
brcm
bcm2711
树莓派 4B
raspberrypi
4-model-b
brcm
bcm2711
树莓派计算模块 3
raspberrypi
3-compute-module
brcm
bcm2837
树莓派 3A+
raspberrypi
3-model-a-plus
brcm
bcm2837
树莓派 3B+
raspberrypi
3-model-b-plus
brcm
bcm2837
树莓派 3B
raspberrypi
3-model-b
brcm
bcm2837
树莓派 2B
raspberrypi
2-model-b
brcm
bcm2836
树莓派计算模块
raspberrypi
compute-module
brcm
bcm2835
树莓派 A+
raspberrypi
model-a-plus
brcm
bcm2835
树莓派 A+
raspberrypi
model-b-plus
brcm
bcm2835
树莓派 A 修订版 2
raspberrypi
model-b-rev2
brcm
bcm2835
树莓派 A
raspberrypi
model-a
brcm
bcm2835
树莓派 A
raspberrypi
model-b
brcm
bcm2835
树莓派 Zero 2 W
raspberrypi
model-zero-2-w
brcm
bcm2837
树莓派 Zero
raspberrypi
model-zero
brcm
bcm2835
树莓派 Zero W
raspberrypi
model-zero-w
brcm
bcm2835