配置

raspi-config

raspi-config 可帮助您配置Raspberry Pi。对 raspi-config 的更改将修改 /boot/firmware/config.txt 和其他配置文件。

Getting started

要从桌面GUI打开配置工具,请转到 首选项 > 树莓派配置

或者,运行以下命令通过终端访问配置工具:

$ sudo raspi-config
Tip
一些高级配置在 raspi-config CLI中可用,但在Raspberry Pi配置GUI中不可用。

要从终端导航配置工具:

  • 使用上下箭头键在设置列表中滚动。

  • 使用 RightTab 访问 <Select><Finish> 选项。

  • 使用 LeftTab 返回设置列表。

  • 输入一个字母以按字母顺序跳转。例如,输入 E 可以跳转到时区列表中的’Europe'。

raspi-config main screen

配置引导、登录和网络过程的一部分,以及其他系统级别的更改。

Wireless LAN

配置Wi-Fi SSID和密码。

Audio

指定音频输出目的地。

Password

更改您的密码。

有关详细信息,请参阅 修改用户密码

Hostname

在网络上设置此Raspberry Pi的可见 mDNS 名称。

Boot/Auto login

使用自动登录到当前用户帐户的选项启动到控制台或桌面。

Network at boot

在继续引导之前等待网络连接。

Splash screen

启用或禁用启动时显示的启动屏幕。

Power LED

如果您的Raspberry Pi型号允许,请更改电源LED的行为。

Browser

更改默认网络浏览器。

Display options

Underscan

Note
运行Wayland时不可用。

如果屏幕上显示的初始文本从边缘消失,请启用过扫描以调整边框。在某些显示器上,尤其是显示器上,禁用过扫描将使图片充满整个屏幕并删除黑色边框。

Screen blanking

启用或禁用屏幕消隐。

VNC resolution

定义要在 headless 设置中使用的视频分辨率。

Composite

启用或禁用合成视频。

4Kp60 HDMI

为HDMI输出启用或禁用4Kp60分辨率。

Interface options

启用和禁用各种物理和虚拟接口。

SSH

启用或禁用远程终端访问您的树莓派使用SSH。

SSH允许您从另一台计算机远程访问Raspberry Pi的命令行。SSH默认禁用。有关SSH的更多信息,请参阅 SSH documentation

RPi Connect

启用或禁用 Raspberry Pi Connect,无需手动网络配置即可远程访问您的Raspberry Pi。

VNC

启用或禁用WayVNC或RealVNC虚拟网络计算服务器。

SPI

启用或禁用SPI接口和SPI内核模块的自动加载。

I2C

启用或禁用I2C接口和I2C内核模块的自动加载。

Serial port

在串行连接上启用或禁用shell和内核消息。

1-Wire

启用或禁用1线接口,通常用于DS18B20温度传感器。

Remote GPIO

启用或禁用对GPIO引脚的远程访问。

Performance options

Overclock

如果您的Raspberry Pi型号允许,请对CPU进行超频。即使在同一型号中,各个Raspberry Pi设备之间的超频潜力也会有所不同。超频过高可能会导致不稳定。

Warning
超频可能会缩短Raspberry Pi的使用寿命。 如果超频到一定程度会导致系统不稳定,请尝试更适度的超频。在启动期间按住 Shift 键以暂时禁用超频。

GPU memory

更改GPU可用的内存量。

Overlay file system

启用或禁用只读文件系统。

Fan

自定义GPIO连接的 Raspberry Pi 4 Case Fan 的行为。不适用于其他风扇型号。

Localisation options

配置位置和国家相关选项。

Locale

选择一个区域设置,例如 en_GB.UTF-8 UTF-8

Time zone

Region/City 格式设置您的当地时区,例如“欧洲/伦敦”。键入一个字母以跳转到列表中的该字母。

Keyboard

打开一个菜单,您可以在其中选择键盘布局。更改通常会立即生效,但可能需要重新启动。键入一个字母以跳转到列表中的该字母。

WLAN country

为您的无线网络设置国家代码。

Advanced options

Warning
对高级选项的更改可能会阻止您的Raspberry Pi按预期工作。除非Raspberry Pi工程师指示,否则避免配置高级选项。

Expand filesystem

扩展您的操作系统分区以填满整个存储设备,为您提供更多用于文件的空间。重新启动您的Raspberry Pi以完成此操作。通常,Raspberry Pi操作系统在首次启动时运行此操作。如果您将操作系统克隆到比原始存储设备容量更大的单独存储设备,此选项可能很有用。

Warning
没有确认步骤。选择该选项立即开始分区扩展。

Network interface names

启用或禁用可预测的网络接口名称。

Network proxy settings

配置网络的代理设置。

Boot order

在Raspberry Pi 4及更高版本上,指定在未检测到SD卡或SSD时是从USB或网络启动。有关详细信息,请参阅 bootloader配置

Bootloader version

在Raspberry Pi 4及更高版本上,切换到最新的引导ROM软件。或者,如果最新版本导致问题,您可以恢复出厂默认值。

Wayland

在X11和Wayland后端之间切换,并选择一个窗口管理器。由于Raspberry Pi OS_Bookworm_,所有Raspberry Pi型号默认使用labwc运行Wayland。

要在树莓派4运行早于_Bookworm_的树莓派操作系统版本之前在树莓派模型上使用Wayland,请将 wayland=on 添加到 /boot/firmware/cmdline.txt

Audio config

在PulseAudio和PipeWire音频后端之间切换。在树莓派书虫之前,树莓派操作系统使用PulseAudio。

Update

将此工具更新到最新版本。

About raspi-config

显示 raspi-config 的描述。

Finish

退出 raspi-config。如有必要,raspi-config 会在您退出时要求您重新启动。第一次实施更改时,重新启动以确保您的更改生效。

non-interactive raspi-config

raspi-config 工具还支持非交互式选项和标志,它们完全在命令行上更改选项,而无需视觉组件。Raspberry Pi型号之间的可用选项可能不同。

$ sudo raspi-config nonint <command> <arguments> [optional-argument]
Note
01 的含义因选项而异。在将值传递给选项之前,请始终检查留档。

System options

Wireless LAN

配置Wi-Fi SSID和密码。

$ sudo raspi-config nonint do_wifi_ssid_passphrase <ssid> <passphrase> [hidden] [plain]

如果需要,传递无线网络名称(SSID)和密码。以下标志是可选的:

<hidden> 选项表示SSID的可见性。如果网络广播打开的SSID,则通过 0 或省略该选项。如果您的SSID被隐藏,则通过 1。默认为 0

<plain>`选项表示是否用额外的引号来封装给定的口令。大多数用户可以忽略该选项:作为一个实现细节,`raspi-config 可能需要在将口令传递给系统其他部分之前添加引号,<plain> 值为`0` 表示已经存在引号。如果值为 1,则表示不存在引号,实施时应根据需要添加引号。默认值为 1。要传递此选项,必须指定 <hidden> 的值。

例如,运行以下命令连接到:

  • 名为 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'
  • 名为 myssid 的非隐藏网络,并使用口令 mypassphrase,在口令中已额外添加了引号:

$ sudo raspi-config nonint do_wifi_ssid_passphrase myssid '"mypassphrase"' 0 0

Audio

指定音频输出目的地。

$ sudo raspi-config nonint do_audio <N>

在树莓派4B,您可以使用以下选项:

  • 0: bcm2835 headphone jack

  • 1: vc4-hdmi-0

  • 2: vc4-hdmi-1

有关可能的 <N> 值的完整列表,请参阅此选项的交互式 raspi-config 版本中使用的数字。

Password

更改您的密码。

有关详细信息,请参阅 Change a user’s password

$ sudo raspi-config nonint do_change_pass
Note
此功能使用全屏交互界面,即使从CLI选项运行也是如此。

Hostname

在网络上设置此Raspberry Pi的可见 mDNS 名称。

$ sudo raspi-config nonint do_hostname <hostname>

Boot/Auto login

在启动时选择以下行为:

  • 是否启动到控制台或桌面

  • 开机时树莓派是否自动登录当前用户账户

$ sudo raspi-config nonint do_boot_behaviour <B1/B2/B3/B4>
  • B1: 启动到控制台,需要登录

  • B2: 启动到控制台,自动登录

  • B3: 启动到桌面,需要登录

  • B4: 启动到桌面,自动登录

Network at boot

在让引导继续之前等待网络连接。

$ sudo raspi-config nonint do_boot_wait <0/1>
  • 0: 启动时不等待网络连接

  • 1: 等待网络连接后启动

Splash screen

启用或禁用启动时显示的启动屏幕。

$ sudo raspi-config nonint do_boot_splash <0/1>
  • 0:启用启动画面

  • 1:禁用闪屏

Power LED

如果您的Raspberry Pi型号允许,请更改电源LED的行为。

$ sudo raspi-config nonint do_leds <0/1>
  • 0 :磁盘活动的闪存

  • 1 :始终保持电源LED亮着

Browser

更改默认网络浏览器。选择当前未安装的网络浏览器将不起作用。

$ sudo raspi-config nonint do_browser <chromium-browser/firefox>

Display options

Underscan

Note
运行Wayland时不可用。

如果屏幕上显示的初始文本从边缘消失,请启用过扫描以调整边框。在某些显示器上,尤其是显示器上,禁用过扫描将使图片充满整个屏幕并删除黑色边框。

$ sudo raspi-config nonint do_overscan_kms <device> <enabled>

设备:

  • 1: HDMI-1

  • 2: HDMI-2

启用:

  • 0: enable overscan

  • 1: disable overscan

Screen blanking

启用或禁用屏幕消隐。

$ sudo raspi-config nonint do_blanking <0/1>
  • 0 :启用息屏

  • 1 :禁用息屏

VNC resolution

headless 设置中定义用于VNC的视频分辨率。

$ sudo raspi-config nonint do_vnc_resolution <width>x<height>

Composite

启用或禁用复合视频输出。

在树莓派4上:

$ sudo raspi-config nonint do_pi4video <V1/V2/V3>
  • V1 :启用4Kp60 HDMI输出

  • V2 :启用复合视频输出

  • V3 :禁用4Kp60和复合输出

在其他型号上:

$ sudo raspi-config nonint do_composite <0/1>
  • 0 :启用合成视频

  • 1 :禁用合成视频

Interface options

SSH

启用或禁用远程终端访问您的树莓派使用SSH。

SSH允许您从另一台计算机远程访问Raspberry Pi的命令行。有关SSH的更多信息,请参阅 SSH documentation

$ sudo raspi-config nonint do_ssh <0/1>
  • 0 : 启用 SSH

  • 1 : 禁用 SSH ==== Raspberry Pi Connect

启用或禁用 Raspberry Pi Connect,无需手动网络配置即可远程访问您的Raspberry Pi。

$ sudo raspi-config nonint do_rpi_connect <0/1>
  • 0: 启用 Raspberry Pi Connect

  • 1: 禁用 Raspberry Pi Connect

VNC

启用或禁用虚拟网络计算(VNC)服务器。有关VNC的更多信息,请参阅 VNC documentation

$ sudo raspi-config nonint do_vnc <0/1>
  • 0 : 启用 VNC

  • 1 : 禁用 VNC

SPI

启用或禁用SPI接口和SPI内核模块的自动加载。

$ sudo raspi-config nonint do_spi <0/1>
  • 0 : 启用 SPI

  • 1 : 禁用 SPI

I2C

启用或禁用I2C接口和I2C内核模块的自动加载。

$ sudo raspi-config nonint do_i2c <0/1>
  • 0 : 启用 I2C

  • 1 : 禁用 I2C

Serial Port

启用或禁用串行连接硬件。

$ sudo raspi-config nonint do_serial_hw <0/1>
  • 0 :启用串行端口

  • 1 :禁用串行端口

Serial console

在串行连接上启用或禁用shell和内核消息。

$ sudo raspi-config nonint do_serial_cons <0/1>
  • 0 :启用串行端口控制台

  • 1 :禁用串行端口控制台

1-wire

启用或禁用达拉斯1线接口。这通常用于DS18B20温度传感器。

$ sudo raspi-config nonint do_onewire <0/1>
  • 0 : 启用 1-wire

  • 1 : 禁用 1-wire

Remote GPIO

启用或禁用对GPIO引脚的远程访问。

$ sudo raspi-config nonint do_rgpio <0/1>
  • 0 : 启用远程 GPIO

  • 1 : 禁用远程 GPIO

Performance options

Overclock

如果您的Raspberry Pi型号允许,请对CPU进行超频。即使在同一型号中,各个Raspberry Pi设备之间的超频潜力也会有所不同。超频过高可能会导致不稳定。

Warning
超频可能会缩短Raspberry Pi的使用寿命。 如果超频到一定程度会导致系统不稳定,请尝试更适度的超频。启动时按住*Shift*键可暂时禁用超频。
$ sudo raspi-config nonint do_overclock <setting>

此命令接受以下 <setting> 值:

  • None :无超频(默认)

  • Modest :超频至最大值的 50%

  • Medium :超频至最大值的 75%

  • High :超频至最大值的 100%

  • Turbo :超频至最大值的 125%

GPU memory

更改GPU可用的内存量。

$ sudo raspi-config nonint do_memory_split <megabytes>

Overlay file system

启用或禁用只读文件系统。

$ sudo raspi-config nonint do_overlayfs <0/1>
  • 0 :启用只读文件系统

  • 1 :禁用只读文件系统

Fan

自定义连接GPIO的 Raspberry Pi 4 Case Fan 的行为。此设置不适用于其他风扇型号。

$ sudo raspi-config nonint do_fan <0/1> [gpio] [onTemp]
  • 0 :启用风扇

  • 1 :禁用风扇

gpio 默认为 14

onTemp 默认为 80摄氏度

Localisation options

Locale

选择一个区域设置,例如 en_GB.UTF-8 UTF-8

$ sudo raspi-config nonint do_change_locale <locale>

有关可能的 <locale> 值的完整列表,请参阅此选项的交互式 raspi-config 版本中使用的缩写。

Time zone

Region/City 格式设置您的当地时区,例如“欧洲/伦敦”。

$ sudo raspi-config nonint do_change_timezone <timezone>

有关可能的 <timezone> 值的完整列表,请参阅此选项的交互式 raspi-config 版本中使用的缩写。

Keyboard

设置您的键盘布局。更改通常会立即生效,但可能需要重新启动。

$ sudo raspi-config nonint do_configure_keyboard <keymap>

有关可能的 <keymap> 值的完整列表,请参阅此选项的交互式 raspi-config 版本中使用的缩写。

WLAN country

为您的无线网络设置国家代码。

$ sudo raspi-config nonint do_wifi_country <country>

有关可能的 <country> 值的完整列表,请参阅此选项的交互式 raspi-config 版本中使用的缩写。

Advanced options

Warning
对高级选项的更改可能会阻止您的Raspberry Pi按预期工作。除非Raspberry Pi工程师指示,否则避免配置高级选项。

Expand filesystem

扩展您的操作系统分区以填满整个存储设备,为您提供更多用于文件的空间。重新启动Raspberry Pi以完成此操作。通常,Raspberry Pi操作系统在首次启动时运行此操作。如果您将操作系统克隆到比原始存储设备容量更大的单独存储设备,此选项可能很有用。

Warning
没有确认步骤。选择该选项立即开始分区扩展。
$ sudo raspi-config nonint do_expand_rootfs

Network interface names

启用或禁用可预测的网络接口名称。

$ sudo raspi-config nonint do_net_names <0/1>
  • 0 :启用可预测的网络接口名称

  • 1 :禁用可预测的网络接口名称

Network proxy settings

配置网络的代理设置。

$ sudo raspi-config nonint do_proxy <SCHEMES> <ADDRESS>

Boot order

在Raspberry Pi 4及更高版本上,指定在没有SD卡的情况下是从USB还是网络引导。有关详细信息,请参阅 bootloader configuration 部分。

$ sudo raspi-config nonint do_boot_order <B1/B2/B3>

根据您的设备,您可以从以下选项中进行选择:

  • B1 :SD 卡启动 - 如果可用,则从 SD 卡启动,否则从 NVMe 启动,否则从 USB 启动

  • B2 :NVMe/USB 启动 - 如果可用,则从 NVMe 启动,否则从 USB 启动,否则从 SD 卡启动

  • B3 :网络启动 - 如果已插入,则从 SD 卡启动,否则从网络启动

Bootloader version

在Raspberry Pi 4及更高版本上,切换到最新的引导ROM软件。或者,如果最新版本导致问题,您可以恢复出厂默认值。

$ sudo raspi-config nonint do_boot_rom <E1/E2>
  • E1 :使用最新的启动 ROM

  • E2 :使用出厂默认设置

Wayland

在X11和Wayland后端之间切换,并选择一个窗口管理器。由于Raspberry Pi OS_Bookworm_,所有Raspberry Pi型号默认使用labwc窗口管理器运行Wayland。

要在树莓派4运行早于_Bookworm_的树莓派操作系统版本之前在树莓派模型上使用Wayland,请将 wayland=on 添加到 /boot/firmware/cmdline.txt

$ sudo raspi-config nonint do_wayland <W1/W2>
  • W1 :使用 X11 后端

  • W2 :使用 Wayland 后端

  • W3 : 使用带有 Wayland 后端的 labwc 窗口管理器

Note
要在 Raspberry Pi 4 之前的 Raspberry Pi 型号上使用 Wayland,您还必须将 wayland=on 添加到 /boot/firmware/cmdline.txt

Audio config

使用此选项在PulseAudio和PipeWire音频后端之间切换。在树莓派操作系统书虫之前,树莓派操作系统使用PulseAudio。

$ sudo raspi-config nonint do_audioconf <1/2>
  • 1 :使用 PulseAudio 后端

  • 2 :使用 PipeWire 后端

Update

将此工具更新到最新版本。

$ sudo raspi-config nonint do_update

显示

要配置 Raspberry Pi 使用非默认显示模式,请手动设置分辨率或旋转。

支持 HDMI 显示器

对于大多数 HDMI 显示器,Raspberry Pi OS 使用显示器支持的最高分辨率和刷新率。

Raspberry Pi Zero、Zero W 和 Zero 2 W 有一个迷你 HDMI 端口,因此您需要迷你 HDMI 转全尺寸 HDMI 的导线或适配器。

从 Raspberry Pi 4B 开始的旗舰机型和键盘机型有两个微型 HDMI 端口,因此您需要为每台要连接的显示器准备一条微型 HDMI 转全尺寸 HDMI 的导线或适配器。在打开 Raspberry Pi 之前连接电缆。

自 Raspberry Pi 4B 开始的旗舰机型、自 CM4 开始的计算模块(CM4S 除外)以及键盘机型最多可驱动两台显示器。

4 系列设备以 60Hz 的刷新率支持高达 1080p 的分辨率,或以 30Hz 的刷新率支持两台 4K 显示器。如果将显示器连接到 HDMI0 端口,并在 /boot/firmware/config.txt 中设置 hdmi_enable_4kp60=1 标志,还能以 60Hz 的刷新率驱动一台 4K 显示器。

5 系列设备无需额外配置,即可以 60hz 的刷新率支持多达两台 4K 分辨率的显示器。

设置分辨率和旋转

在 Raspberry Pi 桌面上,打开 Preferences 菜单,选择 Screen Configuration 实用程序。你会看到连接到 Raspberry Pi 的显示器的图形显示。右键单击要修改的显示屏,然后选择一个选项。单击 Apply 并关闭 Screen Configuration 以保存更改。

或者, 使用以下命令打开 Screen Configuration 组件:

$ raindrop
Tip

如果你的系统不包含 `raindrop`可以使用以下命令安装:

$ sudo apt install raindrop

旧版本的 Raspberry Pi OS 使用名为 arandr 的不同屏幕配置实用程序。要卸载 arandr,请运行以下命令:

$ sudo apt purge arandr

手动设置分辨率和旋转

确定显示设备名称

要手动配置分辨率和旋转,需要知道显示设备的名称。要确定设备名称,请运行以下命令显示连接设备的信息:

$ kmsprint | grep Connector

设置自定义分辨率

要设置自定义分辨率,请使用我们的屏幕配置工具 raindrop。如果您的Raspberry Pi OS安装尚未包含 raindrop(例如,如果您仍在使用以前的屏幕配置工具 arandr),您可以从 apt 或推荐软件GUI下载 raindrop

设置自定义旋转

要设置自定义分辨率,请使用我们的屏幕配置工具 raindrop。如果您的Raspberry Pi OS安装尚未包含 raindrop(例如,如果您仍在使用以前的屏幕配置工具 arandr),您可以从 apt 或推荐软件GUI下载 raindrop

如果运行 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 选项指定要旋转的设备。

Note
要通过 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

控制台分辨率和旋转

要更改 Raspberry Pi 在控制台模式下的分辨率和旋转,请使用 KMS 设置。更多信息,请参阅 configuring the kernel command line. NOTE: 当使用多台显示器的控制台模式时,所有连接的显示器共享相同的旋转设置。

音频

Raspberry Pi OS 有多种音频输出模式: 默认情况下,Raspberry Pi OS 将音频输出到 HDMI 1。

默认情况下,Raspberry Pi OS 将音频输出到 HDMI 1。如果没有 HDMI 输出,Raspberry Pi OS 将音频输出到耳机插孔或连接的 USB 音频设备。

更改音频输出

本节介绍在 Raspberry Pi OS 中配置音频输出的不同方法。

通过桌面音量控制

右键单击系统托盘上的音量图标,打开 音频输出选择器。该界面可让您选择音频输出设备。单击音频输出设备可将音频输出切换到该设备。

专业音频设备配置文件

在音频输出选择器中查看音频设备时,您可能会看到名为 Pro Audio 的设备配置文件。该预案在每个音频设备上都会显示最大数量的通道,让您可以更好地控制信号的路由。除非您需要对音频输出进行微调控制,否则请使用其他设备配置文件。

有关专业音频配置文件的更多信息,请访问 PipeWire常见问题

通过 raspi-config

要使用 raspi-config 更改音频输出,请运行以下命令:

$ sudo raspi-config

您将看到一个配置屏幕。完成以下步骤更改音频输出:

  1. 选择 System options 并按下 Enter.

  2. 选择 Audio 选项并按下 Enter.

  3. 选择所需模式,按 Enter 键选择该模式。

  4. 按向右箭头键退出选项列表。选择 Finish 退出配置工具。

配置网络

Raspberry Pi OS提供了用于设置无线连接的图形用户交互界面(GUI),Raspberry Pi OS Lite和headless机器的用户可以通过 nmcli 从命令行设置无线网络。

Note
从 Raspberry Pi OS Bookworm 开始,网络管理器是默认的网络配置工具。早期版本的 Raspberry Pi OS 使用 dhcpd 和其他工具进行网络配置。

连接到无线网络

使用桌面

通过菜单栏右端的网络图标访问网络管理器。如果您使用的是具有内置无线连接的Raspberry Pi,或者如果插入了无线加密狗,请单击此图标以显示可用无线网络列表。如果您看到消息’No APs found - scanning…​',请等待几秒钟,网络管理器应该会找到您的网络。

Note
具有双频无线功能的设备会自动禁用联网功能,直到您分配了一个无线局域网国家。自 Raspberry Pi 3B+ 开始的旗舰机型、自 CM4 开始的计算模块和键盘机型支持双频无线。要设置无线局域网国家,请从首选项菜单打开 Raspberry Pi 配置应用程序,选择 Localisation,然后从菜单中选择您所在的国家。
wifi2

右侧的图标显示网络是否安全,并给出信号强度的指示。单击您要连接的网络。如果网络是安全的,一个对话框将提示您输入网络键:

key

输入键并单击 OK,然后等待几秒钟。网络图标将短暂闪烁以显示正在建立连接。连接后,图标将停止闪烁并显示信号强度。

连接到隐藏网络

要使用隐藏网络,请导航至网络菜单中的 高级选项 > 连接到隐藏的 Wi-Fi 网络: To use a hidden network, navigate to Advanced options > Connect to a hidden Wi-Fi network in the network menu:

高级选项中的连接到隐藏的wi-fi网络选项

然后,输入隐藏网络的SSID。询问您的网络管理员您的网络使用哪种类型的安全性;虽然大多数家庭网络目前使用WPA和WPA2个人安全性,但公共网络有时使用WPA和WPA2企业安全性。选择您网络的安全类型,然后输入您的密码:

隐藏wi-fi网络认证

单击 Connect 按钮以启动网络连接。

使用命令行

本指南将帮助您在不使用图形工具的情况下从终端在Raspberry Pi上配置无线连接。不需要额外的软件。

Note
本指南应适用于WEP、WPA、WPA2或WPA3网络,但可能不适用于企业网络。
启用无线网络

重新安装后,您必须指定使用设备的国家/地区。这允许您的设备为5GHz网络选择正确的频段。指定无线LAN国家/地区后,您可以使用Raspberry Pi的内置无线网络模块。

为此,请使用命令行 raspi-config 工具设置您的无线LAN国家/地区。运行以下命令:

$ sudo raspi-config

使用箭头键选择 Localisation options 菜单项。选择 WLAN country 选项。 使用箭头键从下拉列表中选择您的国家/地区。按 Enter 选择您的国家/地区。

您现在应该可以访问无线网络。运行以下命令以检查您的Wi-Fi是否已启用:

$ nmcli radio wifi

如果此命令返回文本 "enabled",则您已准备好配置连接。如果此命令返回 "disabled",请尝试使用以下命令启用Wi-Fi:

$ 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和密码连接到网络。

连接网络

运行以下命令配置网络连接,将"<example_ssid>"占位符替换为要配置的网络名称:

$ sudo nmcli --ask dev wifi connect <example_ssid>

根据提示输入网络密码。

输入密码后,Raspberry Pi 应该会自动连接网络。

如果出现 "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出现在同一行中。

Note
您可以在 /etc/NetworkManager/system-connections/ 目录中手动编辑您的连接配置。
连接到不安全的网络

如果连接的网络不使用密码,请运行以下命令:

$ sudo nmcli dev wifi connect <example_ssid>
Warning
不安全的无线网络会将您的个人信息置于危险之中。尽可能使用安全的无线网络或 VPN。
连接到隐藏网络

如果使用的是隐藏网络,请在运行 nmcli 时将 "hidden"(隐藏)选项指定为 "yes"(是):

$ sudo nmcli --ask dev wifi connect <example_ssid> hidden yes
设置网络优先级

如果您的设备同时检测到多个已知网络,它可以连接任何检测到的已知网络。使用优先级选项强制您的Raspberry Pi选择某些网络。您的设备将连接到具有最高优先级的范围内的网络。运行以下命令查看已知网络的优先级:

$ 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

默认情况下,Raspberry Pi OS会尝试通过DHCP自动配置所有网络接口,如果DHCP失败,则会回退到169.254.0.0/16范围内的自动私有地址。

设置静态IP地址

要为 Raspberry Pi 分配静态 IP 地址,请在路由器上为它保留一个地址。你的 Raspberry Pi 将继续通过 DHCP 分配地址,但每次收到的地址都是一样的。通过将 Raspberry Pi 的 MAC 地址与 DHCP 服务器中的静态 IP 地址关联,可以分配一个 "固定 "地址。

配置自动息屏

您可以将 Raspberry Pi 配置为在一段时间不活动后自动息屏。默认情况下,启用自动息屏后,Raspberry Pi OS 会在十分钟不活动后自动息屏。

桌面

您可以使用 Raspberry Pi 配置菜单中的 Screen Blanking 选项来控制自动息屏。

Raspberry Pi 配置

单击菜单栏中的 Raspberry Pi 按钮。导航到 Preferences > Raspberry Pi Configuration

从桌面打开 Raspberry Pi 配置菜单

选择 Display 选项卡。将 Screen Blanking 单选按钮切换到开启位置。按 OK 确认您的选择。

在 Raspberry Pi 配置菜单中切换自动息屏

CLI

您可以使用 raspi-config CLI 工具启用和禁用自动息屏。运行以下命令打开该工具:

$ sudo raspi-config

使用箭头键导航并使用 Enter 键进行选择。选择 显示选项 > 自动息屏 。使用箭头键选择 以启用自动息屏,或选择 以禁用自动息屏。

控制台

Raspberry Pi Configuration 使用的 dpms_timeout 自动息屏配置仅影响桌面会话。在 控制台模式 下,当您的 Raspberry Pi 连接到显示器和键盘且只有一个终端用于输入时,请在内核命令行中使用 consoleblank 设置。

设置控制台模式自动息屏

要更改控制台模式自动息屏配置,请以管理员身份在文本编辑器中打开 /boot/firmware/cmdline.txt

$ sudo nano /boot/firmware/cmdline.txt

您可以在此处调整 Raspberry Pi OS 息屏之前的秒数。例如,添加 consoleblank=600 以在 600 秒不活动后禁用显示输出。将值设置为 0 以永不自动息屏。

cmdline.txt 的更改仅在重新启动后生效。使用以下命令重新启动 Raspberry Pi:

$ sudo reboot

查看当前自动息屏设置

您可以使用以下命令显示当前控制台息屏时间(以秒为单位):

$ cat /sys/module/kernel/parameters/consoleblank

Users

更改用户密码

您可以通过 raspi-config 应用程序或命令行更改当前用户账户的密码:

$ sudo raspi-config

选择option 2,然后按照说明更改密码。

或者使用 passwd 应用程序:

$ passwd

添加用户

要添加新用户,请输入以下命令,用新用户的用户名替换 <username> 占位符:

$ sudo adduser <username>

出现提示时,输入新用户的密码。

新用户的主目录位于 /home/<username>/

要授予新用户必要的权限(如 sudo),请运行以下命令将用户添加到相关的用户组,并用新用户的用户名替换占位符 <username>

$ sudo usermod -a -G adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,input,netdev,gpio,i2c,spi <username>

要检查权限是否已成功授予,请运行以下命令,用新用户的用户名替换 <username> 占位符:

$ sudo su - <username>

如果上述命令运行成功,则说明已成功为用户配置了权限。

删除用户

要删除用户,请运行以下命令,用要删除的用户名替换 <username> 占位符:

$ sudo deluser -remove-home <username>

该命令将删除用户及其主目录。如果想保留用户的主目录,运行该命令时不要使用 -remove-home 选项。

更改默认用户

要更改启动时自动登录 Raspberry Pi 的用户,请运行以下命令:

$ sudo raspi-config

选择 option 1, Boot/Auto login。重新启动,使更改生效。

外部存储

您可以将外部硬盘、SSD或U盘连接到Raspberry Pi上的任何USB端口,然后挂载文件系统以访问存储在其上的数据。

默认情况下,您的Raspberry Pi会在 /media/pi/<HARD-DRIVE-LABEL> 位置自动挂载一些流行的文件系统,例如FAT、NTFS和HFS+。

Note
Raspberry Pi OS Lite 未使能自动挂载。

要将存储设备始终挂载到您选择的特定位置,您必须手动挂载它。

安装存储设备

您可以将存储设备挂载到特定的文件夹位置。通常在 /mnt 文件夹中执行此操作,例如 /mnt/mydisk 。请注意,该文件夹必须为空。

将存储设备插入Raspberry Pi上的USB端口,并使用以下命令列出Raspberry Pi上的所有磁盘分区:

$ sudo lsblk -o UUID,NAME,FSTYPE,SIZE,MOUNTPOINT,LABEL,MODEL

Raspberry Pi使用挂载点 //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 文件以定义Raspberry Pi启动时自动挂载存储设备的位置。在 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

fstype 替换为您在执行上述步骤时找到的文件系统类型,例如: ntfs

如果文件系统类型是FAT或NTFS,请在 nofail 之后添加, umask=000` -这将允许所有用户对存储设备上的每个文件进行完全读/写访问。

现在您已经在 fstab 中设置了一个存储设备,您可以在连接或不连接存储设备的情况下启动Raspberry Pi。但是在拔下设备之前,您必须关闭Raspberry Pi,或者手动卸载存储设备。

Note
如果您在Raspberry Pi启动时没有连接存储设备,则需要额外的90秒才能启动。您可以通过在 nofail 之后立即添加 x-system.device-timeout=30 来缩短时间。这会将超时更改为30秒,这表示系统在放弃尝试挂载磁盘之前只会等待30秒。

有关每个Linux命令的更多信息,请参阅使用 man 命令的特定手册页。例如, man fstab

卸载存储设备

当Raspberry Pi关闭时,系统会负责卸载存储设备,以便安全地拔掉它。如果要手动卸载设备,可以使用以下命令:

$ sudo umount /mnt/mydisk

如果您收到 'target is busy' 的错误,这意味着存储设备正在使用,无法卸载。如果没有显示错误,您现在可以安全地拔掉设备。

处理 'target is busy'

关闭所有打开存储设备上文件的程序。如果您打开了终端,请确保您不在安装存储设备的目录中,也不在存储设备的子目录中。

如果您仍然无法卸载存储设备,您可以使用 lsof 工具检查设备上哪个程序打开了文件。您需要首先使用 apt 安装 lsof

$ sudo apt update
$ sudo apt install lsof

使用lsof:

$ lsof /mnt/mydisk

内核命令行 (cmdline.txt)

Linux 内核在启动过程中接受一系列命令行参数。在 Raspberry Pi 上,该命令行定义在启动分区中一个名为 cmdline.txt 的文件中。您可以使用任何文本编辑器编辑该文本文件。

$ sudo nano /boot/firmware/cmdline.txt
Important
cmdline.txt 中的所有参数放在同一行。不要使用换行符。

要查看启动时传递给内核的命令行,请运行以下命令:

$ cat /proc/cmdline

由于 Raspberry Pi 固件会在启动内核前更改命令行,因此该命令的输出将与 cmdline.txt 中的内容不完全一致。

命令行选项

内核命令行参数有很多,其中一些是由内核本身定义的。其他由内核可能正在使用的代码定义,例如 Plymouth splash。

标准条目

console

定义串行控制台。通常有两个条目:

  • console=serial0,115200

  • console=tty1

root

定义根文件系统的位置,例如 root=/dev/mmcblk0p2 表示多媒体卡块 0 分区 2。

rootfstype

定义 rootfs 使用的文件系统类型,例如 rootfstype=ext4

quiet

将内核日志的默认级别设置为 KERN_WARNING,这样在启动过程中,除了非常严重的日志信息外,所有日志信息都会被抑制。

设置KMS显示模式

设置 KMS 显示模式

早期版本的 Raspberry Pi OS 不再支持传统固件和 FKMS 显示模式。取而代之的是,最近的操作系统版本使用 KMS(内核模式设置)。

如果 cmdline.txt 中没有 video' 条目,Raspberry Pi OS 将使用 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= 条目的第一部分 - 包括:

Video Option Display

HDMI-A-1

HDMI 1 (HDMI 0 on silkscreen of Raspberry Pi 4B, HDMI on single HDMI boards)

HDMI-A-2

HDMI 2 (HDMI 1 on silkscreen of Raspberry Pi 4B)

DSI-1

DSI or DPI

Composite-1

Composite

其他条目

本节包含一些可以在内核命令行中使用的其他条目。此列表并不详尽。

splash

通过Plymouth模块告诉启动使用闪屏。

plymouth.ignore-serial-consoles

如果启用了Plymouth模块,通常会阻止启动信息出现在任何可能存在的串行控制台上。此标记会告诉Plymouth忽略所有串行控制台,使启动信息再次可见,就像Plymouth未运行时一样。

dwc_otg.lpm_enable=0

关闭 "dwc_otg "驱动程序中的 "链接电源管理(LPM)",该驱动程序用于驱动 Raspberry Pi 电脑处理器中内置的 USB 控制器。在 Raspberry Pi 4 上,该控制器默认为禁用,并且只连接到 USB C 型电源输入连接器。Raspberry Pi 4 上的 USB-A 端口由单独的 USB 控制器驱动,不受此设置影响。

dwc_otg.speed

设置 Raspberry Pi 电脑处理器内置 USB 控制器的速度。dwc_otg.speed=1` 将设置为全速(USB 1.0),比高速(USB 2.0)慢。除非在排除 USB 设备故障时,否则不应设置该选项。

smsc95xx.turbo_mode

启用/禁用有线网络驱动程序的涡轮模式。smsc95xx.turbo_mode=N 关闭涡轮模式。

usbhid.mousepoll

指定鼠标轮询间隔。如果无线鼠标速度慢或不稳定,使用 usbhid.mousepoll=0 将其设置为 0 可能会有帮助。

drm.edid_firmware=HDMI-A-1:edid/your_edid.bin

用 `/usr/lib/firmware/edid/your_edid.bin`中的内容覆盖显示器的内置 EDID。

本地化您的 Raspberry Pi

您可以使用 raspi-config 工具配置 Raspberry Pi 操作系统的用户界面语言、键盘布局和时区。

保护您的树莓派

在这里,我们描述了一些提高Raspberry Pi安全性的常用方法。

更改用户密码

sudo 为前缀的命令以超级用户身份运行。默认情况下,超级用户不需要密码。不过,您可以要求所有以 sudo 运行的命令都输入密码,从而提高 Raspberry Pi 的安全性。

要强制 sudo 需要密码,请为您的用户帐户编辑 nopasswd sudoers文件,将文件名中的 <username> 占位符替换为您的用户名:

$ sudo visudo /etc/sudoers.d/010_<username>-nopasswd

<username> 条目更改为以下内容,将 <username> 替换为您的用户名:

<username> ALL=(ALL) PASSWD: ALL

保存文件。您的新首选项应立即生效。

更新树莓派操作系统

只有最新的操作系统发行版才包含所有最新的安全修复。请始终将您的设备 updated 保持在 Raspberry Pi OS 的最新版本。

自动更新 SSH 服务器

如果您使用SSH连接到Raspberry Pi,则值得添加专门更新SSH服务器的 cron 作业。以下命令可能作为每日 cron 作业运行,可确保您立即获得最新的SSH安全修复,独立于正常的更新过程。

$ apt install openssh-server

提高SSH安全性

SSH 是远程访问 Raspberry Pi 的常用方法。默认情况下,SSH 需要用户名和密码。要使 SSH 更加安全,请使用 基于密钥的身份验证

启用和禁用 SSH 用户

通过更改 sshd 配置,你还可以 允许拒绝 特定用户。

$ sudo nano /etc/ssh/sshd_config

在文件末尾添加、编辑或附加以下行,其中包含您希望允许登录的用户名:

AllowUsers alice bob

您还可以使用 DenyUsers 来专门阻止某些用户名登录:

DenyUsers jane john

更改后,使用以下命令重启 sshd 服务,使更改生效:

$ sudo systemctl restart ssh

安装防火墙

有许多防火墙解决方案可供Linux使用。大多数使用底层 iptables 项目来提供数据包过滤。该项目位于Linux网络过滤系统之上。默认情况下, iptables 安装在树莓派操作系统上,但没有设置。设置它可能是一项复杂的任务,一个提供比 iptables 更简单界面的项目是 防火墙(UFW)。这是Ubuntu中的默认防火墙工具,可以安装在您的树莓派上:

$ sudo apt install ufw

ufw 是一个命令行工具,不过也有一些图形用户界面可供使用。请注意,ufw 需要以超级用户权限运行,因此所有命令前都要加上 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 )以获取以下命令以外的完整详细信息。

使用TCP限制ssh端口上的登录尝试。如果IP地址在过去30秒内尝试连接6次或更多次,这将拒绝连接:

$ sudo ufw limit ssh/tcp

拒绝从192.168.2.1地址访问端口30

$ sudo ufw deny from 192.168.2.1 port 30

安装 fail2ban

当把 Raspberry Pi 用作服务器时,你必须设置防火墙以允许服务器流量。http://www.fail2ban.org[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

这将启用 Fail2ban 检查可疑的 ssh 活动,包括系统日志检查,并允许在阻止活动前重试六次。

同一文件中的 [default] 部分定义了默认禁止操作 iptables-multiport,当达到检测阈值时,该操作将运行 /etc/fail2ban/action.d/iptables-multiport.conf 文件:

# Default banning action (e.g. iptables, iptables-new,
# iptables-multiport, shorewall, etc) It is used to define
# action_* variables. Can be overridden globally or per
# section within jail.local file
banaction = iptables-multiport

多端口禁止所有端口的所有访问。action.d 文件夹包含许多可供选择的动作配置文件,您可以用它们来定制服务器对可疑活动的反应。

例如,要在尝试三次失败后永久禁止一个 IP 地址,可将 [ssh] 部分中的 maxretry 值改为 3,并将 bantime 设为负数:

[ssh]
enabled  = true
port     = ssh
filter   = sshd
backend  = systemd
maxretry = 3
bantime  = -1

设置headless树莓派

headless Raspberry Pi在没有显示器、键盘或鼠标的情况下运行。要运行headless Raspberry Pi,您需要一种从另一台计算机访问它的方法。要远程访问您的Raspberry Pi,您需要将Raspberry Pi连接到网络,并通过该网络访问Raspberry Pi。

要将Raspberry Pi连接到网络,您可以通过以太网将设备插入有线连接或连接无线网络。

要通过该网络访问您的Raspberry Pi,请使用SSH。通过SSH连接后,如果您喜欢图形桌面环境,可以使用 raspi-config 来使能 VNC

如果您从头开始设置Raspberry Pi,请在 imaging process 期间设置无线网络和SSH。如果您已经设置了Raspberry Pi,则可以使用 raspi-config 配置SSH。

Warning
根据您使用的 Raspberry Pi 型号和 SD 卡类型,您的 Raspberry Pi 首次启动和连接到无线网络可能需要长达五分钟的时间。

连接到有线网络

要在首次启动时连接到有线网络,请通过以太网插入headless Raspberry Pi,如果您的Raspberry Pi型号没有网口,请使用以太网适配器。您的Raspberry Pi将自动连接到网络。

连接到无线网络

要在 headless Raspberry Pi 中首次启动时配置无线网络访问,请使用 Raspberry Pi Imager 中的高级设置菜单。输入首选无线网络的SSID和密码。您的Raspberry Pi将在首次启动时使用这些凭据连接到网络。某些无线适配器和某些Raspberry Pi板不支持5GHz网络;检查无线模块的文档,以确保与选择的网络兼容。

Note
以前版本的Raspberry Pi OS使用 wpa_supplicant.conf 文件,该文件可以放置在引导文件夹中以配置无线网络设置。此功能从 Raspberry Pi OS Bookworm 开始不可用。

远程访问

如果没有键盘或显示器,您需要一种方法来 远程控制 您的headless Raspberry Pi。首次启动时,唯一可用的选项是SSH。要在新安装的Raspberry Pi OS上启用SSH,请选择以下方法之一:

  • 在 Raspberry Pi Imager 的操作系统自定义菜单中启用SSH,然后输入用户名和密码

  • 在 SD 卡第一个分区(标为 bootfs)的根目录下创建名为 ssh 的文件,然后按照下面部分的说明使用 userconf.txt 手动配置用户

有关详细信息,请参阅 设置SSH服务器。通过SSH连接后,如果您喜欢图形桌面环境,可以使用 raspi-config启用VNC

手动配置用户

在 SD 卡第一部分的根目录下(文件系统标记为 bootfs),创建一个名为 userconf.txt 的文件。

此文件应包含一行文本,由 <username>:<password> 组成:您想要的用户名,后跟冒号,后跟您想要使用的密码的 加密 表示。

Note
<username> 只能包含小写字母、数字和连字符,并且必须以字母开头。它不能超过31个字符。

要生成加密密码,请在另一台计算机上使用 OpenSSL。打开终端并输入以下内容:

$ openssl passwd -6

出现提示时,输入您的密码并进行验证。然后,此命令将输出提供的密码的加密版本。

在 Raspberry Pi 上托管无线网络

Raspberry Pi 可以使用无线模块托管自己的无线网络。如果您通过以太网端口(或第二个无线模块)将 Raspberry Pi 连接到互联网,则连接到无线网络的其他设备可以通过 Raspberry Pi 访问互联网。

考虑使用 10.x.x.x IP 块的有线网络。您可以将 Raspberry Pi 连接到该网络,并在使用另一个 IP 块(例如 192.168.x.x )的单独网络上为无线客户端提供服务。

在下图中,请注意笔记本电脑存在于与路由器和有线客户端分开的 IP 块中:

host a network

使用此网络配置,无线客户端都可以通过 Raspberry Pi 路由器相互通信。但是,无线网络上的客户端无法直接与有线网络上的客户端(Raspberry Pi 除外)交互;无线客户端存在于与为有线客户端提供服务的网络分开的私有网络中。

Note
Raspberry Pi 5、4、3、Zero W 和 Zero 2 W 可以使用内置无线模块托管无线网络。没有内置模块的 Raspberry Pi 型号可使用单独的无线加密狗支持该功能。

启用热点

要在命令行上创建托管无线网络,请运行以下命令,将 <example-network-name><example-password> 占位符替换为您自己的值:

$ sudo nmcli device wifi hotspot ssid <example-network-name> password <example-password>

使用另一个无线客户端(例如笔记本电脑或智能手机)连接到网络。查找 SSID 与 <example-network-name> 匹配的网络。输入您的网络密码,您应该可以成功连接到网络。如果您的 Raspberry Pi 通过以太网连接或第二个无线适配器访问互联网,您应该能够访问互联网。

禁用热点

要禁用热点网络并恢复使用 Pi 作为无线客户端,请运行以下命令:

$ sudo nmcli device disconnect wlan0

禁用网络后,运行以下命令重新连接到另一个 Wi-Fi 网络:

$ sudo nmcli device up wlan0
Tip
有关连接无线网络的更多信息,请参阅 配置网络

使用 Raspberry Pi 作为网桥

默认情况下,Raspberry Pi 托管的无线网络与通过以太网连接的父网络分开存在。在这种安排下,连接到父网络的设备无法直接与连接到 Raspberry Pi 托管的无线网络的设备通信。如果您希望连接的无线设备能够与父网络上的设备通信,您可以将 Raspberry Pi 配置为 网桥。建立网络桥接后,连接到 Pi 托管无线网络的每个设备都会在父网络中分配一个 IP 地址。

在下图中,笔记本电脑与路由器和有线客户端存在于同一 IP 网段中:

bridge network

以下步骤介绍了如何在 Raspberry Pi 上设置网络桥接,以启用无线客户端和父网络之间的通信。

首先,创建一个网络桥接接口:

$ 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
  • 如果您尚未创建无线热点连接,请使用单个命令创建一个新接口并将其添加到网桥,将 <hotspot-ssid> <hotspot-password> 占位符替换为您选择的热点和密码:

    $ sudo nmcli connection add con-name 'Hotspot' \
        ifname wlan0 type wifi slave-type bridge master bridge0 \
        wifi.mode ap wifi.ssid <hotspot-ssid> wifi-sec.key-mgmt wpa-psk \
        wifi-sec.proto rsn wifi-sec.pairwise ccmp \
        wifi-sec.psk <hotspot-password>

配置好网桥后,就该激活它了。运行以下命令激活网桥:

$ sudo nmcli connection up Bridge

并运行以下命令开始托管您的无线网络:

$ sudo nmcli connection up Hotspot

您可以使用 nmcli device 命令来验证网桥、以太网接口和无线热点接口是否都处于活动状态。

Tip
一旦连接到热点,使用 arp-scan 等工具检查父网络上的设备是否可访问。

使用代理服务器

proxy server 是客户端设备和互联网之间的中介。 要将 Raspberry Pi 配置为代理服务器客户端,请按照本节的说明操作。

您将需要:

  • 您的代理服务器的IP地址或主机名和端口

  • 您的代理的用户名和密码(如果需要)

配置您的Raspberry Pi

您需要设置三个环境变量(http_proxy、https_proxy 和 no_proxy),以便您的Raspberry Pi知道如何访问代理服务器。

打开一个终端窗口,并使用 nano 打开文件 /etc/environment

$ sudo nano /etc/environment

将以下内容添加到 /etc/environment 文件以创建 http_proxy 变量:

export http_proxy="http://<proxy_ip_address>:<proxy_port>"

<proxy_ip_address><proxy_port> 占位符替换为代理的 IP 地址和端口。

Note

如果代理需要用户名和密码,请使用以下格式添加:

export http_proxy="http://<username>:<password>@proxyipaddress:proxyport"

<username><password> 占位符替换为您用来与代理进行身份验证的用户名和密码。

为环境变量 https_proxy输入相同的信息:

export https_proxy="http://username:password@proxyipaddress:proxyport"

创建no_proxy环境变量,这是一个逗号分隔的地址列表,您的Raspberry Pi不应将代理用于:

export no_proxy="localhost, 127.0.0.1"

现在您的 /etc/environment 文件应该如下所示:

export http_proxy="http://username:password@proxyipaddress:proxyport"
export https_proxy="http://username:password@proxyipaddress:proxyport"
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 保存并退出。

重启你的树莓派

重新启动您的Raspberry Pi以使更改生效。您现在应该能够通过代理服务器访问Internet。

boot 文件夹内容

Raspberry Pi OS将引导文件存储在SD卡的第一个分区上,使用FAT文件系统。

启动时,每个Raspberry Pi都会从引导分区加载各种文件,以便在Linux内核启动之前启动各种处理器。

在引导时,Linux将引导分区挂载为 /boot/firmware/

Note
Bookworm 之前,树莓派操作系统将引导分区存储在 /boot/ 。从 Bookworm 开始,引导分区位于 /boot/firmware/

bootcode.bin

引导加载程序,由SoC在引导时加载。它执行一些非常基本的设置,然后加载其中一个 start*.elf 文件。

Raspberry Pi 4和5不使用bootcode.bin。它已被 板载EEPROM 中的引导代码代替。

start*.elf

二进制固件块加载到 SoC 中的 VideoCore GPU 上,然后接管启动过程。

start.elf

基本固件。

start_x.elf

包含额外的编解码器。

start_db.elf

用于调试。

start_cd.elf

固件的精简版,删除了对编解码器和 3D 等硬件模块的支持以及调试日志支持;它还施加了初始帧缓冲区限制。如果在 config.txt 中指定了 gpu_mem=16,则会自动使用精简版固件。

start4.elf , start4x.elf , start4db.elfstart4cd.elf 是特定于Raspberry Pi 4系列(Model 4B, Pi 400, Compute Module 4 和 Compute Module 4S)的同功能固件文件。

有关如何使用这些文件的详细信息,请参阅 config.txt 文档.

Raspberry Pi 5 不使用 elf 文件。固件独立包含在引导加载程序EEPROM中。

fixup*.dat

与上一节中列出的 start*.elf 文件配对的链接器文件。

cmdline.txt

启动时传入内核的 kernel command line

config.txt

包含用于设置Raspberry Pi的许多配置参数。有关详细信息,请参阅 config.txt 文档.。

Important
Raspberry Pi 5 要求启动分区中有一个非空的 config.txt 文件。

issue.txt

基于文本的内务信息,包含发行版的日期和 git commit ID。

initramfs*

初始ramdisk的内容。这会在挂载真正的根文件系统之前将临时根文件系统加载到内存中。

从 Bookworm 开始,Raspberry Pi OS 默认包含一个 initramfs 文件。要启用初始 ramdisk,请在 config.txt 中使用 auto_initramfs 关键字进行配置。

sshssh.txt

如果存在该文件,则在启动时启用 SSH。否则 SSH 默认为禁用。文件内容并不重要。即使是空文件也能启用 SSH。

Note
内容无关紧要。即使是一个空文件也可以使能SSH。

设备树blob文件 ( *.dtb )

设备树blob文件包含Raspberry Pi各种型号的硬件定义。这些文件在引导 基于检测到的Raspberry Pi模型

内核文件 ( *.img )

与树莓派型号对应的各种 kernel 内核文件:

文件名 处理器 型号 说明

kernel.img

BCM2835

Pi Zero, Pi 1

kernel7.img

BCM2836, BCM2837

Pi Zero 2 W, Pi 2, Pi 3

后续Pi 2使用BCM2837

kernel7l.img

BCM2711

Pi 4, CM4, CM4S, Pi 400

大型物理地址扩展 (LPAE)

kernel8.img

BCM2837、BCM2711、BCM2712

Pi Zero 2 W, Pi 2 (后续版本), Pi 3, CM3, Pi 3+, CM3+, Pi 4, CM4, CM4S, Pi 400, CM5, Pi 5, Pi 500

64位内核。带有BCM2836的Raspberry Pi 2不支持64位内核。

kernel_2712.img

BCM2712

Pi 5, CM5, Pi 500

Pi 5优化的 64-bit kernel

Note
对于运行 32 位内核的系统,lscpu 报告的 CPU 架构为 armv7l;对于运行 64 位内核的系统,aarch64 报告的 CPU 架构为 armv7larmv7l 中的 l`指的是小端 CPU 架构,而不是 `kernel7l.img 文件名中的 l 所表示的 LPAE

overlays 文件夹

包含设备树overlay。这些用于配置各种硬件设备,例如第三方声卡。通过修改 config.txt 中的配置选择这些overlay。有关详细信息,请参阅 Device Trees, overlays and parameters

LED闪烁警告

如果Raspberry Pi由于某种原因无法启动或必须关闭,在许多情况下,LED会闪烁特定次数以指示发生了什么。LED会闪烁多次长时间闪烁(0或更多),然后产生短时间闪烁,以指示确切的状态。在大多数情况下,该模式会在两秒钟的间隙后重复。

Long flashes Short flashes Status

0

3

Generic failure to boot

0

4

start*.elf not found

0

7

Kernel image not found

0

8

SDRAM failure

0

9

Insufficient SDRAM

0

10

In HALT state

2

1

Partition not FAT

2

2

Failed to read from partition

2

3

Extended partition not FAT

2

4

File signature/hash mismatch - Pi 4 and Pi 5

3

1

SPI EEPROM error - Pi 4 and Pi 5

3

2

SPI EEPROM is write protected - Pi 4 and Pi 5

3

3

I2C error - Pi 4 and Pi 5

3

4

Secure-boot configuration is not valid

4

3

RP1 not found

4

4

Unsupported board type

4

5

Fatal firmware error

4

6

Power failure type A

4

7

Power failure type B

配置 UART

Raspberry Pi 上有两种类型的 UART - PL011 和 mini UART。PL011 是一款功能强大、广泛兼容 16550 的 UART,而 mini UART 的功能集则有所减少。

Raspberry Pi 上的所有 UART 都仅为 3.3V - 如果将它们连接到 5V 系统,则会发生损坏。可以使用适配器连接到 5V 系统。或者,可以从各种第三方获得低成本的 USB 转 3.3V 串行适配器。

Raspberry Pi Zero、1、2 和 3

Raspberry Pi Zero、1、2 和 3 各包含两个 UART,如下所示:

名称 类型

UART0

PL011

UART1

mini UART

Raspberry Pi 4 和 400

Raspberry Pi 4 Model B 和 400 有另外四个 PL011,默认情况下处于禁用状态:

名称 类型

UART0

PL011

UART1

mini UART

UART2

PL011

UART3

PL011

UART4

PL011

UART5

PL011

Raspberry Pi 5

Raspberry Pi 5 有另外四个 PL011,默认情况下处于禁用状态:

名称 类型

UART0

PL011

UART1

PL011

UART2

PL011

UART3

PL011

UART4

PL011

Raspberry Pi 5 没有Mini-UART。

CM1、CM3、CM3+ 和 CM4

第一代计算模块以及计算模块 3 和计算模块 3+ 有两个 UART,而计算模块 4 有六个 UART,如上所述。

在所有型号的计算模块上,UART 默认处于禁用状态,可以使用设备树覆盖明确启用。您还可以指定要使用的 GPIO 引脚,例如:

dtoverlay=uart1,txd1_pin=32,rxd1_pin=33

主 UART

在 Raspberry Pi 上,GPIO 14(发送)和 15(接收)上有一个 UART 被选择为主 UART。默认情况下,这也是 Linux 控制台可能使用的 UART。请注意,GPIO 14 是 GPIO 针座上的第 8 针,而 GPIO 15 是第 10 针。

在 Raspberry Pi 5 上,主 UART 为调试接头。

辅助 UART

辅助 UART 通常不存在于 GPIO 连接器上。默认情况下,辅助 UART 连接到组合无线 LAN/蓝牙控制器的蓝牙侧,在包含此控制器的型号上。

主 UART 和辅助 UART

下表总结了各种 Raspberry Pi 设备上 UART 的分配:

型号 主/控制台 辅助/蓝牙

Raspberry Pi Zero

UART0

UART1

Raspberry Pi Zero W / Raspberry Pi Zero 2 W

UART1

UART0

Raspberry Pi 1

UART0

UART1

Raspberry Pi 2

UART0

UART1

Raspberry Pi 3

UART1

UART0

Compute Module 3 & 3+

UART0

UART1

Raspberry Pi 4

UART1

UART0

Raspberry Pi 5

UART10

<dedicated UART>

Raspberry Pi OS 上的 Linux 设备:

Linux 设备 说明

/dev/ttyS0

mini UART

/dev/ttyAMA0

first PL011 (UART0)

/dev/serial0

primary UART

/dev/serial1

secondary UART

/dev/ttyAMA10

Raspberry Pi 5 Debug UART

/dev/serial0/dev/serial1 是指向 /dev/ttyS0/dev/ttyAMA0 的符号链接。

在 Raspberry Pi 5 上, /dev/serial0 是指向 /dev/ttyAMA10 的符号链接。

由于 Bookworm 中的更改,默认情况下不存在 /dev/serial1 。 您可以通过在 config.txt 中设置以下值来重新启用 serial1

dtparam=krnbt=off
Tip
此选项将来可能无法在所有型号上工作。 仅在您的用例没有其他替代方案时才使用此选项。

Mini-UART 和 CPU 核心频率

Note
如果 mini UART 是主 UART 或蓝牙被禁用,则默认情况下会禁用 mini UART。

为了使用Mini-UART,您需要将 Raspberry Pi 配置为使用固定的 VPU 核心时钟频率。这是因为Mini-UART 时钟与 VPU 核心时钟相连,因此当核心时钟频率发生变化时,UART 波特率也会发生变化。可以将 enable_uartcore_freq 设置添加到 config.txt 以更改Mini-UART 的行为。下表总结了可能的组合:

Mini UART set to core clock Result

primary UART

variable

mini UART disabled

primary UART

fixed by setting enable_uart=1

mini UART enabled, core clock fixed to 250MHz, or if force_turbo=1 is set, the VPU turbo frequency

secondary UART

variable

mini UART disabled

secondary UART

fixed by setting core_freq=250

mini UART enabled

The default state of the enable_uart flag depends on which UART is the primary UART:

Primary UART Default state of enable_uart flag

mini UART

0

first PL011 (UART0)

1

禁用Linux串行控制台

默认情况下,主通用异步收发设备被分配到Linux控制台。如果您希望将主通用异步收发设备用于其他目的,您必须重新配置Raspberry Pi OS。这可以通过使用 raspi-config 来完成:

  • 启动 raspi-config: sudo raspi-config

  • 选择选项 3 - Interface Options

  • 选择选项 P6 - Serial Port

  • 在提示 Would you like a login shell to be accessible over serial? 时,回答 "否"

  • 在提示 Would you like the serial port hardware to be enabled? 时,回答 "是"

  • 退出 raspi-config 并重启 Raspberry Pi 以使更改生效

为Linux启用早期控制台

尽管Linux内核在引导过程中相对较早地启动了UART,但在基础设施的一些关键部分启动之后仍然需要很长时间。如果不访问当时的内核日志消息,则很难诊断这些早期阶段的故障。要启用对其中一个UART的 earlycon ,可根据哪个 UART 是主 UART,在 cmdline.txt 中添加以下选项之一:

对于 Raspberry Pi 5, earlycon 输出只出现在 3 针调试连接器上,配置如下:

earlycon=pl011,0x107d001000,115200n8

对于Raspberry Pi 4, Compute Module 4, Compute Module 4S, 和 Pi 400:

earlycon=uart8250,mmio32,0xfe215040
earlycon=pl011,mmio32,0xfe201000

对于Raspberry Pi 2, 3, 3+, Zero 2 W, Compute Module 3, 和 Compute Module 3+:

earlycon=uart8250,mmio32,0x3f215040
earlycon=pl011,mmio32,0x3f201000

对于Raspberry Pi 1, Zero, Zero W, 和 Compute Module 1:

earlycon=uart8250,mmio32,0x20215040
earlycon=pl011,mmio32,0x20201000

波特率默认为115200bps。

Note
选择错误的早期控制台会阻碍Raspberry Pi启动。

UART和设备树

各种通用异步收发设备树覆盖定义可以在 内核GitHub 中找到。两个最有用的overlay disable-bt miniuart-bt

disable-bt 禁用蓝牙设备并使第一个PL011(UART0)成为主要的通用异步收发设备。您还必须禁用初始化调制解调器的系统服务,使其不连接到通用异步收发设备,使用 sudo systemctl disable hciuart

miniuart-bt 将蓝牙功能切换为使用 mini UART,并使第一个PL011(UART0)成为primary UART。请注意,这可能会降低最大可用波特率(请参阅下面的迷你通用步异步收发设备限制)。您还必须使用 force_turbo=1core_freq=250 将VPU核心时钟设置为固定频率。

overlay uart2uart3uart4uart5 用于在Raspberry Pi 4上启用另外四个UART。文件夹中还有其他通用异步收发设备特定的overlay。有关设备树overlay的详细信息,请参阅 /boot/firmware/overays/README ,或运行 dtoverlay-h overlay-name 以获取描述和使用信息。

您可以在config.txt文件中添加一行以应用 Device Tree overlay。请注意,文件名的 -overlay.dts 部分已被删除。例如:

dtoverlay=disable-bt

PL011和 mini-UART

PL011 UART和 mini-UART有一些区别。

mini-UART的FIFO较小。加上缺乏流量控制,这使得它更容易在更高的波特率下丢失字符。它的能力通常也不如PL011,主要是因为它的波特率链接到 VPU 时钟速度。

与PL011相比,微型通用异步收发设备的具体缺陷是:

  • 无断线检测

  • 无成帧错误检测

  • 无奇偶校验位

  • 无接收超时中断

    mini-UART和PL011的BCM2835实现都没有DCD、DSR、DTR或RI信号。

有关mini UART的更多文档,请参见 SoC外围设备文档

Device Trees, overlays, 和 parameters

Raspberry Pi 内核和固件使用设备树(DT)来描述硬件。这些设备树可能包括用于控制板上功能的 DT 参数。DT 覆盖层允许对可选的外部硬件进行描述和配置,它们还支持更多控制参数。

固件加载器( start.elf 及其变体)负责加载DTB(Device Trees Blob-机器可读的DT文件)。它根据产品型号选择要加载的版本,并进行修改。这种方式避免了对许多只有微小的差异DTB的需求,

读取 config.txt 中用户提供的参数,以及所有 overlay 及其参数,然后使用它们。加载程序检查结果来确认(例如)控制台将使用哪个通用异步收发设备(如果有)。最后它启动内核,并传递一个指向合并后DTB的指针。

Device Trees

Device Trees(Device Tree,DT)是对系统中硬件的描述。它应该包括基本CPU的名称、内存配置和所有外设(内部和外部)。DT不应该用于描述软件,尽管通过给出的硬件模块,它通常会加载对应驱动程序模块。

Note
这有助于记住DT应该是操作系统中立的,所以任何特定于Linux的东西都不应该存在。

Device Trees 将硬件配置表示为节点的层次结构。每个节点可能包含属性和子节点。属性被命名为字节数组,其中可能包含字符串、数字(大端)、任意字节序列以及它们的任何组合。通过类比文件系统,节点是目录,属性是文件。树中节点和属性的位置可以使用路径来描述,斜杠作为分隔符,单个斜杠 ( / ) 表示根。

基本DTS语法

Device Trees通常用称为Device Trees源(DTS)的文本形式编写,并保存在带有 .dts 后缀的文件中。DTS语法类似于C,带有用于分组的大括号和每行末尾的分号。请注意,DTS在关闭大括号后需要分号:就像C语言中的 struct 而不是函数。编译后的二进制格式称为 Flattened Device Tree(FDT)或 Device Tree Blob (DTB),并存储在 .dtb 文件中。

以下是一个简单的 .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>; /* each number (cell) is a uint32 */
        child-node1 {
            my-cousin = <&cousin>;
        };
    };
};

/node2 {
    another-property-for-node2;
};

这棵树包含:

  • 必需的标头: /dts-v1/

  • 包含另一个DTS文件,通常命名为 *.dtsi ,类似于C中的 .h 头文件

  • 单个根节点: /

  • 几个子节点: node1node2

  • node1的一些子节点: child-node1child-node2

  • 标签 ( cousin ) 和对该标签的引用 ( &cousin )

  • 几个分散的属性

  • 一个重复节点( /node2

属性是简单的键值对,其值可以为空,也可以包含任意字节。虽然数据类型未在数据结构中编码,但有一些基本datasheet示可以在 Device Trees 源文件中表示。

文本字符串(以NUL结尾)用双引号表示:

string-property = "a string";

单元格是由尖括号分隔的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>; /* each number (cell) is a uint32 */
    another-property-for-node2;
    child-node1 {
        my-cousin = <&cousin>;
    };
};

因此,一个 .dtsi 可以覆盖设备树中的多个位置或为其提供默认值。

标签和引用

树的一部分通常需要引用另一个部分,有四种方法可以做到这一点:

Path strings

与文件系统路径类似,例如 /soc/i2s@7e203000 是 BCM2835 和 BCM2836 中 I2S 设备的完整路径。标准 API 不会创建类似 `/soc/i2s@7e203000/status`这样的属性路径:而是首先找到一个节点,然后选择该节点的属性。

Phandles

在节点的 phandle 属性中分配给节点的唯一 32 位整数。由于历史原因,你可能还会看到一个多余的、匹配的 linux,phandle。phandle 按顺序编号,从 1 开始;0 不是有效的 phandle。当 DT 编译器在整数上下文中遇到对节点的引用时,通常会以标签的形式分配它们。对使用 phandle 的节点的引用会被简单地编码为相应的整数(单元格)值;没有标记表明它们应被解释为 phandle,因为这是由应用程序定义的。

Labels

就像 C 语言中的标签给代码中的一个位置命名一样,DT 标签也给层次结构中的一个节点命名。编译器会引用标签,并在字符串上下文(&node)中将其转换为路径,在整数上下文(<&node>)中将其转换为phandles;原始标签不会出现在编译输出中。请注意,标签不包含任何结构;它们只是平面全局名称空间中的标记。

Aliases

与标签类似,但它们作为一种索引形式出现在 FDT 输出中。它们存储为 /aliases 节点的属性,每个属性将别名映射为路径字符串。虽然别名节点出现在源代码中,但路径字符串通常是作为对标签 (&node)的引用出现,而不是全部写出。将路径字符串解析为节点的 DT API 通常会查看路径的第一个字符,将不以斜线开头的路径视为别名,必须首先使用 /aliases 表将其转换为路径。

Device Tree 语义

如何构建Device Trees,以及如何最好地使用它来捕获某些硬件的配置,是一个庞大而复杂的主题。有许多可用的资源,其中一些如下所列,但有几点值得强调:

  • compatible 属性是硬件描述和驱动程序软件之间的联系。当操作系统遇到具有 compatible 属性的节点时,它会在其设备驱动程序数据库中查找它以找到最佳匹配项。在Linux,这通常会自动加载驱动程序模块,但前提是它已经被适当标记并且没有被列入黑名单。

  • status 属性表示设备是启用还是禁用。如果 statusokokay 或缺失,则表示设备已启用。否则,"status "应为 "disabled",这样设备就被禁用了。将状态设置为 "disabled "的设备放在 .dtsi 文件中可能很有用。派生配置可以包含该 .dtsi 文件,并将所需设备的状态设置为 okay

Device Tree overlays

片上系统(SoC)是一个非常复杂的设备;一个完整的 Device Trees 可能有数百行长。更进一步,把SoC和其他组件放在一块板上只会让事情变得更加复杂。为了保持这种可管理性,对于有相同组件的相关设备,把公共元素放在 .dtsi 文件中是有意义的,这些元素可能包含在多个 .dts 文件中。

当像Raspberry Pi这样的系统还支持可选的插件附件(如HAT)时,问题就会增加。最终,每个可能的配置都需要一个Device Trees来描述它,但是一旦你考虑到所有不同的基本模型和大量可用的附件,组合的数量就会开始迅速增加。

除非您想学习如何为Raspberry Pis编写overlays,否则您可能更愿意跳过 Use Device Trees

Fragments

DT overlay 包含许多片段,每个片段都针对一个节点及其子节点。虽然这个概念听起来很简单,但一开始语法似乎很奇怪:

//启用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,这是Raspberry Pi SoC的基本架构;如果 overlay 使用了Raspberry Pi 4的功能,则应该使用 brcm,bcm2711 ,否则就应该使用 brcm,bcm2835 ,它可用于所有Raspberry Pi overlays。然后是第一个(仅在本例中)片段。片段应从0开始按顺序编号。不遵守这一点可能会导致部分或全部片段被遗漏。

每个片段由两部分组成:一个 target 属性,标识要应用overlay的节点;和 __overlay__ 本身,其主体被添加到目标节点。上面的例子可以解释为它是这样写的:

/dts-v1/;
/plugin/;

/ {
    compatible = "brcm,bcm2835";
};

&i2s {
    status = "okay";
    test_ref = <&test_label>;
    test_label: test_subnode {
        dummy;
    };
};

使用新的 dtc 版本,你就可以完全按照上面的方法编写示例,并获得相同的输出,但有些自制工具还不能理解这种格式。您可能希望在标准 Raspberry Pi 操作系统内核中包含的任何overlay都应暂时以旧格式编写。

如果之后加载overlay,将该overlay与标准Raspberry Pi基础Device Trees(例如 bcm2708-rpi-b-plus.dtb )合并的效果是通过将其状态更改为 okay 来启用I2S接口。但是如果您尝试使用以下方式编译此overlay:

$ 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可能会说 0xdebef )。编译器还添加了一个 phandle 属性,其中包含一个唯一的(到这个overlay)小整数来指示节点有一个标签,并用相同的小整数替换对标签的所有引用。

在 fragment 之后有三个新节点:

  • __symbols__ 列出了 overlay 中使用的标签(此处为 test_label ),以及通往标签节点的路径。这个节点是如何处理未解决符号的关键。

  • __fixups__ 包含一个属性列表,它将未解决符号的名称映射到片段中需要用目标节点的 phandle 进行修补的单元格的路径列表,一旦找到目标节点。在本例中,路径指向 target0xffffffffff 值,但片段可能包含其他未解决的引用,需要额外的修补。

  • __local_fixups__ 保存了 overlay 中存在的任何标签引用的位置-- test_ref 属性。之所以需要这样做,是因为执行合并的程序必须确保 phandle 编号是连续和唯一的。

[part1.3 第 1.3 节] 中说 "原始标签不会出现在编译输出中",但使用 -@ 开关时并非如此。相反,每个标签都会在 __symbols__ 节点中产生一个属性,将标签映射到路径,这与 aliases 节点完全相同。事实上,这种机制非常相似,以至于在解析符号时,如果没有 __symbols__ 节点,Raspberry Pi 载入器也会搜索 "aliases "节点。这曾一度很有用,因为提供足够的别名可以让非常旧版本的 dtc 被用来构建基础 DTB 文件,但幸运的是,这已经成为历史了。

Device Trees参数

为了避免需要大量的Device Treesoverlay,并减少用户修改外围设备DTS文件的需要,树莓派加载器支持一项新功能——Device Trees参数。这支持使用命名参数对DT进行微小的更改,类似于内核模块从 modprobe 和内核命令行接收参数的方式。参数可以通过基本 DTB 和 overlay 来引出,包括HAT overlay。

在DTS中通过向根添加一个 __overrides__ 节点来定义参数。它包含属性,其名称是所选参数名称,其值是一个序列,包括目标节点的phandle(对标签的引用)和指示目标属性的字符串;支持字符串、整数(单元格)和布尔属性。

字符串参数(String parameters)

字符串参数是这样声明的:

name = <&label>,"property";

其中 labelproperty 被合适的值替换。字符串参数可以修改其目标属性。

请注意,名为 status 的属性会被特殊处理;非 0/true/yes/on 的值会转换为字符串 "okay",而 0/false/no/off 则会变成 "disabled"

整数参数(Integer parameters)

整数参数声明如下:

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 , propertyoffset 由合适的值代替;偏移量以字节为单位指定,相对于属性的起点(默认为十进制),前面的分隔符决定了参数的大小。与以前的实现不同,整数参数可以指向不存在的属性或超出现有属性末尾的偏移量。

布尔参数(Boolean parameters)

Device Trees将布尔值编码为零长度属性;如果存在,则该属性为真,否则为假。它们是这样定义的:

boolean_property; // Set 'boolean_property' to true

如果不定义一个属性,该属性就会被赋值为 false。布尔参数也是这样声明的,用合适的值代替 labelproperty 占位符:

name = <&label>,"property?";

反转布尔值在以与常规布尔值相同的方式应用输入值之前反转输入值;它们的声明类似,但使用 表示反转:

name = <&label>,"<property>!";

布尔参数可以创建或删除属性,但不能删除基础 DTB 中已存在的属性。

字节字符串参数(Byte string parameters)

字节字符串属性是任意的字节序列,如 MAC 地址。它们接受十六进制字节字符串,字节之间可以有冒号,也可以没有冒号。

mac_address = <&ethernet0>,"local_mac_address[";

选择 [ 来匹配声明字节字符串的DT语法:

local_mac_address = [aa bb cc dd ee ff];
具有多个目标的参数(Parameters with multiple targets)

在某些情况下,在设备树的多个位置设置相同的值会很方便。与创建多个参数的笨拙方法相比,我们可以通过串联的方式为单个参数添加多个目标,如下所示:

__overrides__ {
    gpiopin = <&w1>,"gpios:4",
              <&w1_pins>,"brcm,pins:0";
    ...
};

(示例取自 w1-gpio overlay)

Note
甚至可以用一个参数针对不同类型的属性。您可以合理地将 "enable "参数连接到 "status "字符串、包含 0 或 1 的单元格以及适当的布尔属性。
文字赋值(Literal assignments)

DT 参数机制允许对同一参数的多个目标进行修补,但由于必须将相同的值写入所有位置(格式转换和反布尔值的否定除外),因此实用性受到限制。增加嵌入式字面赋值后,一个参数可以写入任意值,与用户提供的参数值无关。

赋值在声明的末尾出现,并由 = 表示:

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行更有趣,因为该值显示为整数(单元格)值。DT编译器在编译时计算整数表达式,这可能很方便(特别是如果使用宏值),但单元格也可以包含对标签的引用:

//强制LED在内部GPIO控制器上使用GPIO。
exp_led = <&led1>,"gpios:0=",<&gpio>,
          <&led1>,"gpios:4";

使用overlay时,标签通常根据基础 DTB 进行解析。最好将多部分参数拆分到多行,这样更容易阅读 - 随着单元格值分配的增加,这变得更加必要。

请注意,除非应用参数,否则参数不起任何作用 - 查找表中的默认值会被忽略,除非在使用参数名称时没有赋值。

查找表(Lookup tables)

查找表允许在使用参数输入值之前对其进行转换。它们充当关联数组,就像switch/case语句一样:

phonetic = <&node>,"letter{a=alpha,b=bravo,c=charlie,d,e,='tango uniform'}";
bus      = <&fragment>,"target:0{0=",<&i2c0>,"1=",<&i2c1>,"}";

一个没有 =value 的键表示使用该键作为值,一个前面没有键的 = 表示在没有匹配的情况下使用默认值,用逗号(或任何地方的空 key=value 对)开始或结束的列表表示应使用未匹配的输入值,否则,找不到匹配的值出现错误。

Note
单元格整数值后的表格字符串中的逗号分隔符是隐式的,显式添加逗号分隔符会产生空对(见上文)。
Note
由于查找表对输入值进行操作,而字面赋值会忽略输入值,因此无法将两者结合起来—​查找声明中结尾 } 后的字符会被视为错误。
Overlay/fragment 参数(Overlay/fragment parameters)

所描述的DT参数机制有许多限制,包括缺乏创建整数数组的简单方法,以及无法创建新节点。克服其中一些限制的一种方法是有条件地包含或去除某些片段。

通过将 __overlay__ 节点重命名为 __dormant__ ,可以将片段从最终合并过程中排除(禁用)。参数声明语法已扩展为允许否则非法的零目标phandle指示以下字符串包含片段或overlay范围内的操作。到目前为止,已经实现了四个操作:

+<n>    // Enable fragment <n>
-<n>    // Disable fragment <n>
=<n>    // Enable fragment <n> if the assigned parameter value is true, otherwise disable it
!<n>    // Enable fragment <n> if the assigned parameter value is false, otherwise disable it

例子:

just_one    = <0>,"+1-2"; // Enable 1, disable 2
conditional = <0>,"=3!4"; // Enable 3, disable 4 if value is true,
                          // otherwise disable 3, enable 4.

i2c-rtc overlay 使用这种技术。

特殊属性(Special properties)

有几个属性名在被参数锁定后会得到特殊处理。其中一个你可能已经注意到了-- status --会将布尔值转换为 okay 为真、 disabled 为假。

赋值给 bootargs 属性会追加而不是覆盖它—​这就是如何将设置添加到内核命令行的方法。

reg 属性用于指定设备地址—​内存映射硬件块的位置、I2C 总线上的地址等。子节点的名称应以十六进制地址限定,并使用 @ 作为分隔符:

bmp280@76 {
    reg = <0x77>;
    ...
};

分配给 reg 属性时,父节点名称的地址部分将被替换为分配的值。这可用于防止多次使用相同 overlay 时节点名称冲突 — i2c-gpio overlay 就使用了这种方法。

name 属性是一个伪属性—​它不应该出现在 DT 中,但对其赋值可以改变父节点的名称。与 reg 属性一样,该属性可用于为节点赋予唯一的名称。

overlay 映射文件(The overlay map file)

基于BCM2711 SoC设计的Raspberry Pi 4带来了许多变化;其中一些变化是额外的接口,一些是对现有接口的修改(或删除)。有专门为Raspberry Pi 4设计的新 overlay, 他们在旧硬件上没有意义,例如支持新SPI、I2C和通用异步收发设备接口的overlay,老的overlay将无法工作,即使它们仍然控制着新设备上相关的功能。

因此,我们需要一种方法,为硬件不同的多个平台量身定制 overlay。要在单个 .dtbo 文件中支持所有平台,就需要大量使用隐藏("休眠")片段,并改用按需符号解析机制,这样就不会因为缺少不需要的符号而导致故障。一个更简单的解决方案是根据当前平台,添加一个将 overlay 名称映射到多个实现文件之一的工具。

overlay 映射是固件在启动时加载的文件。它以DTS源代码格式 - overlay_map.dts 编写,编译为 overlay_map.dtb 并存储在 overlays 目录中。

这是当前映射文件的摘录(详见 完整文件):

/ {
    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";
    };
};

每个节点都有一个需要特殊处理的overlay的名称。每个节点的属性要么是平台名称,每个节点都有一个需要特殊处理的overlay名称。每个节点的属性要么是平台名称,要么是少数特殊指令之一。overlay ,map支持以下平台名称:

  • bcm2835 用于所有围绕 BCM2835、BCM2836、BCM2837 和 RP3A0 SoC 构建的 Raspberry Pis

  • 用于 Raspberry Pi 4B、CM4、CM4S 和 Pi 400 的 bcm2711

  • 用于 Raspberry Pi 5、CM5 和 Pi 500 的 bcm2712

没有值的平台名称(空属性)表示当前 overlay 与平台兼容;例如, uart5bcm2711 平台兼容。平台的非空值是替代请求 overlay 的替代 overlay 的名称;在BCM2712上使用 disable-bt 会加载 disable-bt-pi5 。overlay 节点中未包含的任何平台都与该 overlay 不兼容。映射文件中未提及的任何 overlay 都假定与所有平台兼容。

第二个示例节点 "disable-bt-pi5 "可以从 "disable-bt "的内容中推断出来,但这种智能是用于构建文件,而不是解释文件。

uart5 overlay 仅在BCM2711上有意义。

如果平台未列出 overlay ,则可能适用以下特殊指令之一:

  • renamed 指令指示 overlay 的新名称(应与原名称基本兼容),但也会出现重命名记录。

  • deprecated "指令包含一条简短的解释性错误信息,该信息将在常用前缀 overlay '...' is deprecated: 之后记录。

重命名和特定平台的链式实现是可能的,但要注意避免循环!

请记住:只需要列出异常-没有 overlay 节点意味着默认文件应用于所有平台。

Debugging 中介绍了如何从固件获取诊断消息。

dtoverlaydtmerge 实用程序已扩展为支持映射文件:

  • dtmerge 从基础 DTB 中的兼容字符串中提取平台名称。

  • dtoverlay/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; // Defaults to true
                       // bool2 defaults to 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";
    };
};

对于更多的例子,大量的 overlay 源文件被托管在 Raspberry PiLinuxGitHub存储库 中。

导出标签(Export labels)

固件中的 dtoverlay 处理以及使用 "dtoverlay" 工具的运行时 dtoverlay 应用,都将 dtoverlay 中定义的标签视为该 dtoverlay 的私有标签。这避免了为标签创建全局唯一名称(使标签保持简短),并允许多次使用同一 dtoverlay 而不发生冲突(前提是使用了一些技巧 - 请参阅 Special properties )。

有时,创建带有一个overlay的标签并从另一个overlay使用它是非常有用的。自2020年2月14日以来发布的固件能够将某些标签声明为全局标签 - __exports__ 节点:

    ...
    public: ...

    __exports__ {
        public; // Export the label 'public' to the base DT
    };
};

应用此 dtoverlay 时,加载程序会删除除已导出符号之外的所有符号,在本例中为 public ,并重写路径以使其相对于包含标签的片段的目标。在此之后加载的 dtoverlay 可以引用 &public

overlay 应用顺序(Overlay application order)

在大多数情况下,应用片段的顺序并不重要,但对于修补自身的 dtoverlay (其中片段的目标是overlay中的标签,称为 dtoverlay 内片段),这变得很重要。在较旧的固件中,片段严格按从上到下的顺序应用。自2020年2月14日发布固件后,片段分两次应用:

  • 首先应用和隐藏以其他片段为目标的片段。

  • 然后应用规则片段。

这种拆分对于运行中的 dtoverlay 尤其重要,因为第一步发生在 dtoverlay 实用程序中,第二步由内核执行(内核不能处理overlay内片段)。

在树莓派上使用Device Trees(Using Device Trees on Raspberry Pi)

DTB、overlays 和 config.txt(DTBs, overlays and config.txt

在 Raspberry Pi 上,加载器("start.elf "映像之一)的工作是将overlay层与适当的基础设备树结合起来,然后将完全解析的设备树传递给内核。基本设备树与 start.elf 一起位于 FAT 分区(Linux 中为 /boot/firmware/ )中,名为 bcm2711-rpi-4-b.dtbbcm2710-rpi-3-b-plus.dtb 等。请注意,某些型号(3A+、A、A+)将分别使用 "b "对应的型号(3B+、B、B+)。这种选择是自动的,允许在各种设备中使用相同的 SD 卡映像。

Note
DT 和 ATAG 是互斥的,将 DT blob 传递给无法理解它的内核会导致启动失败。固件将始终尝试加载 DT 并将其传递给内核,因为自 rpi-4.4.y 以来的所有内核如果没有 DTB 就无法运行。您可以通过在 config.txt 中添加 device_tree= 来覆盖此设置,这会强制使用 ATAG,这对于简单的裸机内核非常有用。

加载器现在支持使用 bcm2835_defconfig 进行构建,它选择上游的 BCM2835 支持。此配置将构建 bcm2835-rpi-b.dtbbcm2835-rpi-b-plus.dtb 。如果这些文件与内核一起复制,则加载器将默认尝试加载其中一个 DTB。

为了管理Device Trees和 overlays,加载程序支持许多 config.txt 指令:

dtoverlay=acme-board
dtparam=foo=bar,level=42

加载程序会在固件分区中查找 overlays/acme-board.dtbo ,Raspberry Pi OS 将其安装在 /boot/firmware/ 上。然后它将搜索参数 foolevel ,并为它们分配指示的值。

加载程序还将搜索带有编程 EEPROM 的附加 HAT,并从那里加载支持 overlay - 直接加载或按名称从 overlays 目录中加载;这无需任何用户干预。

有多种方法可以判断内核正在使用Device Trees:

  • 启动过程中的内核信息 "Machine model:(机器型号:)"具有特定板卡的值,如 "Raspberry Pi 2 Model B",而不是 "BCM2709"。

  • 存在 /proc/device-tree ,其中包含的子目录和文件与 DT 的节点和属性完全一致。

使用Device Trees,内核将自动搜索并加载支持已启用设备的模块。因此,通过为设备创建适当的 DT overlay,您可以节省设备用户编辑 /etc/modules 的时间;所有配置都放在 config.txt 中,对于 HAT,甚至该步骤也是不必要的。但请注意,分层模块(例如 i2c-dev )仍需要指明加载。

另一方面,由于平台设备只有在 DTB 请求时才会创建,因此不再需要将以前由于板支持代码中定义的平台设备而加载的模块列入黑名单。事实上,当前的 Raspberry Pi OS 镜像不附带黑名单文件(某些 WLAN 设备除外,因为有多个驱动程序可用)。

DT 参数(DT parameters)

如上所述,DT 参数是一种方便对设备配置进行细微更改的方法。当前基础 DTB 支持启用和控制板载音频、I2C、I2S 和 SPI 接口的参数,而无需使用专用 overlay。在使用中,参数如下所示:

dtparam=audio=on,i2c_arm=on,i2c_arm_baudrate=400000,spi=on
Note
可以在同一行上放置多个分配,但请确保不超过 80 个字符的限制。

如果您的overlay定义了一些参数,则可以在后续行中指定这些参数,如下所示:

dtoverlay=lirc-rpi
dtparam=gpio_out_pin=16
dtparam=gpio_in_pin=17
dtparam=gpio_in_pull=down

…​或附加到 overlay 行,如下所示:

dtoverlay=lirc-rpi,gpio_out_pin=16,gpio_in_pin=17,gpio_in_pull=down

dtoverlay 参数的作用域只到下一个 dtoverlay 被加载为止。如果 dtoverlay 和基本 DTB 都导出了同名参数,则 dtoverlay 中的参数优先;建议避免这样做。要使用基础 DTB 导出的参数,请使用以下命令结束当前的 overlay 作用域:

dtoverlay=

特定于电路板的标签和参数(Board-specific labels and parameters)

Raspberry Pi 板有两个 I2C 接口。它们名义上是分开的:一个用于 ARM,一个用于 VideoCore(GPU)。在几乎所有型号上, i2c1 属于 ARM,而 i2c0 属于 VC,它用于控制摄像头和读取 HAT EEPROM。但是,B 型有两个早期版本,它们的角色互换了。

为了能够在所有 Raspberry Pi 上使用一组 overlay 和参数,固件创建了一些特定于板的 DT 参数。这些是:

i2c/i2c_arm
i2c_vc
i2c_baudrate/i2c_arm_baudrate
i2c_vc_baudrate

这些是 i2c0i2c1i2c0_baudratei2c1_baudrate 的别名。建议只在确实需要时才使用 i2c_vci2c_vc_baudrate - 例如,在对 HAT EEPROM 编程时(最好使用软件 I2C 总线,并使用 i2c-gpio overlay)。启用 i2c_vc 会导致 Raspberry Pi 摄像头或 Raspberry Pi 触摸显示器无法正常工作。

对于编写 overlay 的人来说,同样的混淆现象也适用于I2C DT节点上的标签。因此,您应该编写:

fragment@0 {
    target = <&i2c_arm>;
    __overlay__ {
        status = "okay";
    };
};

任何使用数字变体的 overlay 都将被修改为使用新的别名。

HAT 和 Device Trees

Raspberry Pi HAT是一个带有嵌入式EEPROM的附加板,专为具有40引脚排针的Raspberry Pi设计。EEPROM包括启用电路板所需的所有 DT overlay (或从文件系统加载的 overlay 名称),此 overlay 还可以引出参数。

在加载基础 DTB 之后,固件会自动加载 HAT overlay ,因此在加载任何其他 overlay 之前,或者在使用 dtoverlay= 结束 overlay 范围之前,可以访问其参数。如果出于某种原因您想禁止加载 HAT overlay ,请将 dtoverlay= 放在所有 dtoverlaydtparam 指令之前。

动态Device Trees(Dynamic Device Tree)

从 Linux 4.4 开始,树莓派内核支持overlay和参数的动态加载。兼容内核管理应用于 基础 DTB 之上的 overlay 堆栈。更改会立即反映在 /proc/device-tree 中,并可能使模块被加载,平台设备被创建和销毁。

上面 堆栈 这个词的使用很重要—— overlay 只能在堆栈顶部添加和删除;更改堆栈中下面的东西需要首先删除它上面的所有东西。

有一些用于管理 overlay 的新命令:

dtoverlay 命令

dtoverlay 是一个命令行实用程序,它在系统运行时加载和删除 overlay ,以及列出可用的 overlay 并显示它们的帮助信息。

使用 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 等效项不同, overlay 的所有参数都必须包含在同一个命令行中 - dtparam 命令仅用于基础 DTB 的参数。

更改内核状态(添加和删除内容)的命令需要root权限,因此您可能需要在命令前加上 sudo 。只有运行时应用的overlay和参数可以卸载 - 固件使用的 overlay 或参数会被 "嵌入",因此它不会被 dtoverlay 列出,也不能被删除。

dtparam 命令

dtparam 创建并加载一个 overlay ,其效果与在 config.txt 中使用 dtparam 指令基本相同。在用法上,它与称为 -dtoverlay 大致相同,但也有一些不同之处: dtparam 会列出基本 DTB 所有已知参数的帮助信息。dtparam 命令的帮助仍可使用 ` dtparam -h 。在指明要删除的参数时,只能使用索引号(而不能使用名称)。并非所有 Linux 子系统都会对运行时添加的设备做出响应—​I2C、SPI 和声音设备可以工作,但有些则不行。

编写支持运行时的 overlay 的指南

设备对象的创建或删除由添加或删除节点触发,或者由节点状态从禁用更改为启用触发,反之亦然。没有 status 属性意味着节点已启用。

不要在片段中创建会覆盖基础 DTB 中现有节点的节点,内核会重命名新节点,使其独一无二。如果要更改现有节点的属性,请创建一个针对该节点的片段。

ALSA 不会阻止其编解码器和其他组件在使用中被卸载。如果删除的编解码器仍被声卡使用,那么删除 overlay 就会导致内核异常。实验发现,设备的删除顺序与 overlay 中片段的删除顺序相反,因此将声卡的节点放在组件的节点之后,可以实现有序关闭。

注意事项

在运行时加载 overlay 是内核的最新功能,在撰写本报告时,还没有从用户空间加载 overlay 的公认方法。通过将这一机制的细节隐藏在命令之后,用户可以避免在不同的内核接口标准化后发生变化。

  • 有些 overlay 在运行时比其他 overlay 更好用。设备树的部分内容只在启动时使用,使用 overlay 更改这些内容不会产生任何影响。

  • 应用或删除某些 overlay 可能会导致意想不到的行为,因此应谨慎操作。这也是需要 "sudo "的原因之一。

  • 如果有东西正在使用 ALSA,卸载 ALSA 卡的 overlay 可能会导致停滞,LXPanel 音量滑块插件就有这种效果。为了能够移除声卡的 overlay , lxpanelctl 工具新增了两个选项-- alsastopalsastart - 它们分别在加载或卸载 overlay 之前和之后从辅助脚本 dtoverlay-predtoverlay-post 中调用。

  • 移除 overlay 不会导致已加载模块被卸载,但可能会导致某些模块的引用计数降为零。运行两次 rmmod -a 会导致卸载未使用的模块。

  • 必须以相反的顺序移除 overlay 。命令允许你移除较早的 overlay ,但所有中间的 overlay 都会被移除并重新应用,这可能会产生意想不到的后果。

  • 只探测设备树顶层的节点和总线节点的子节点。对于运行时添加的节点,还有一个限制条件,即总线必须注册以接收添加和删除子节点的通知。不过,也有一些例外情况会打破这一规则并造成混乱:内核会明确扫描整个树中的某些设备类型(时钟和中断控制器是两个主要类型),以便(对于时钟)提前初始化和/或(对于中断控制器)按特定顺序初始化。这种搜索机制只在启动过程中进行,因此对运行时由 overlay 添加的节点不起作用。因此,建议 overlay 将固定时钟节点放在树的根部,除非能保证 overlay 在运行时不会被使用。

支持的 overlay 和参数

有关支持的overlay和参数列表,请参阅 /boot/firmware/overays.dtbo 文件旁边的 README 文件。它会及时添加和更改保持最新的状态。

固件参数

固件使用特殊的 /chosen 节点在引导加载程序和/或固件与操作系统之间传递参数。除非另有说明,否则每个属性都存储为 32 位整数。

overlay_prefix

(string) config.txt 选择的 overlay_prefix 字符串。

os_prefix

(string)config.txt 选取的 os_prefix 字符串。

rpi-boardrev-ext

扩展电路板修订代码来自 OTP 行 33

rpi-country-code

PiWiz 使用的国家代码。仅限 Raspberry Pi 400。

rpi-duid

(string) 仅限 Raspberry Pi 5。PCB 上 QR 码的字符串表示。

Common bootloader properties /chosen/bootloader

除非另有说明,否则每个属性都存储为 32 位整数。

boot-mode

用于加载内核的启动模式。从此查看 BOOT_ORDER 支持的值。

partition

启动时使用的分区号。如果加载的是 boot.img ramdisk,则指的是内存盘加载的分区,而不是内存盘中的分区号。

pm_rsts

启动时 PM_RSTS 寄存器的值。

tryboot

如果启动时设置了 tryboot 标志,则设为 1

Power supply properties /chosen/power

仅限 Raspberry Pi 5。除非另有说明,否则每个属性都存储为 32 位整数。

max_current

电源可提供的最大电流(毫安)。固件会报告 USB-C、USB-PD 或 PoE 接口指示的值。对于台式电源(例如连接到 GPIO 头),在引导加载程序配置中定义 PSU_MAX_CURRENT,以指示电源电流能力。

power_reset

仅限 Raspberry Pi 5。表明 PMIC 复位原因的位字段。

原因

0

过电压

1

欠压

2

温度过高

3

启用信号

4

看门狗

rpi_power_supply

(two 32-bit integers) Raspberry Pi 27W 官方电源的 USB VID 和产品 VDO(如果已连接)。

usb_max_current_enable

如果 USB 端口电流限制器在启动过程中设置为低限值,则为零;如果启用了高限值,则为非零。如果电源要求最大电流为 5A 或在 config.txt 中强制设置了 usb_max_current_enable=1 ,则会自动启用高电平。

usb_over_current_detected

如果 USB 启动期间发生 USB 过流事件,则为非零。

usbpd_power_data_objects

(binary blob containing multiple 32-bit integers) 在 USB-PD 协商过程中,引导加载程序接收到的原始二进制 USB-PD 对象(仅限固定电源)。要捕获这些信息以用于错误报告,请运行 hexdump -C /proc/device-tree/chosen/power/usbpd_power_data_objects

格式由 https://usb.org/document-library/usb-power-delivery [USB Power Delivery] 规范定义。

BCM2711 and BCM2712 specific bootloader properties /chosen/bootloader

以下属性针对 BCM2711 和 BCM2712 SPI EEPROM 引导加载程序。除非另有说明,否则每个属性都存储为 32 位整数。

build_timestamp

EEPROM 引导加载程序的 UTC 生成时间。

capabilities

该位字段描述当前引导加载程序支持的功能。在引导加载程序 EEPROM 配置中启用某项功能(如 USB 启动)之前,可以用它来检查该功能是否受支持。

功能

0

USB boot 使用VLI USB主机控制器

1

网络启动

2

TRYBOOT_A_B 模式

3

TRYBOOT

4

USB boot 使用BCM2711 USB主机控制器

5

RAM disk - boot.img

6

NVMe boot

7

Secure Boot

update_timestamp

rpi-eeprom-update 设置的 UTC 更新时间戳。

signed

如果启用了安全启动,该位字段将不为零。各个位表示当前的安全启动配置。

描述

0

SIGNED_BOOT 在EEPROM配置文件中定义。

1

保留

2

ROM开发密钥已被撤销,参见 revoke_devkey

3

客户公钥摘要已写入OTP,参见 program_pubkey

4…​31

保留

version

(string) 引导加载程序的 Git 版本字符串。

BCM2711和BCM2712 USB启动属性 /chosen/bootloader/usb

如果系统是从 USB 启动的,则会定义以下属性。这些属性可用于唯一标识 USB 启动设备。每个属性都存储为 32 位整数。

usb-version

USB 主要协议版本(2 或 3)。

route-string

设备的 USB 路由字符串标识符,由 USB 3.0 规范定义。

root-hub-port-number

启动设备连接的根集线器端口号,可能通过其他 USB 集线器连接。

lun

大容量存储设备的逻辑单元编号。

NVMEM nodes

固件通过 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

别名,该别名指向一个 NVMEM 设备,该设备以二进制格式存储引导加载器 EEPROM 公钥(如果定义了)的副本。 rpi-bootloader-key-convert实用程序可用于将数据转换为 PEM 格式,以便与 OpenSSL 配合使用。

更多信息,请参阅 secure-boot

故障排除

调试

加载程序将跳过丢失的 overlay 和错误参数,但如果出现严重错误,例如丢失或损坏的基础 DTB 或失败的 overlay 合并,则加载程序将回退到非DT引导。如果发生这种情况,或者您的设置没有按您的预期运行,则值得检查加载程序的警告或错误:

$ sudo vclog --msg

可以通过将 dtdebug=1 添加到 config.txt 来启用额外的调试。

您可以导出DT当前状态的可读表示,如下所示:

$ dtc -I fs /proc/device-tree

这对于查看将 overlay 合并到底层树上的效果很有用。

如果内核模块未按预期加载,请检查它们是否未在 /etc/modprobe.d/raspi-Blacklist.conf 中列入黑名单;使用Device Trees时不需要列入黑名单。如果没有显示任何异常,您还可以通过搜索 /lib/modules/<version>/modules.alias 以获取 compatible 值来检查模块是否导出了正确的别名。否则,您的驱动程序可能会丢失:

.of_match_table = xxx_of_match,

或:

MODULE_DEVICE_TABLE(of, xxx_of_match);

否则, depmod 就会失败,或者更新的模块尚未安装在目标文件系统上。

使用 dtmergedtdiffovmerge 测试 overlay

除了 dtoverlaydtparam 命令之外,还有一个用于将 overlay 应用于DTB的实用程序- dtmerge 。要使用它,您首先需要获取您的基础 DTB ,可以通过以下两种方式之一获得:

/proc/device-tree 中的实时DT状态生成它:

$ dtc -I fs -O dtb -o base.dtb /proc/device-tree

这将包括您到目前为止应用的任何 overlay 和参数,无论是在 config.txt 中还是在运行时加载它们,这可能是您想要的,也可能不是您想要的。或者:

/boot/firmware/ 中的源DTB复制它。这不包括 overlay 和参数,但也不包括固件的任何其他修改。为了允许测试所有 overlay , dtmerge 实用程序将创建一些特定于板的别名( i2c_arm 等),但这意味着合并的结果将包含比您预期的更多与原始DTB的差异。解决这个问题的方法是使用dt合并来进行复制:

$ dtmerge /boot/firmware/bcm2710-rpi-3-b.dtb base.dtb -

- 表示不存在 overlay 名称)。

您现在可以尝试应用 overlay 或参数:

$ 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>;

您还可以比较不同的 overlay 或参数。

$ 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 {
https://github.com/raspberrypi/utils[Utils] 存储库包括另一个DT实用程序- `ovmerge` 。与 `dtmerge` 不同, `ovmerge` 结合了文件并以源代码形式应用overlay。因为overlay永远不会被编译,所以标签会被保留,结果通常更具可读性。它还具有许多其他技巧,例如列出文件包含顺序的能力。

强制使用特定Device Trees

如果您有默认 DTB 不支持的特殊需求,或者您只是想尝试编写自己的 DTB,您可以告诉加载器加载类似这样的备用 DTB 文件:

device_tree=my-pi.dtb

禁用Device Trees使用

Raspberry PiLinux内核中需要使用Device Trees。对于裸机和其他操作系统,可以通过添加以下内容来禁用DT使用:

device_tree=

config.txt

快捷方式和语法变体

加载器理解一些快捷方式:

dtparam=i2c_arm=on
dtparam=i2s=on

可以缩短为:

dtparam=i2c,i2s

i2ci2c_arm 的别名,假设为 =on )。它仍然接受长格式版本: device_tree_overlaydevice_tree_param

config.txt 中可用的其他 DT 命令

device_tree_address:: 用于更改固件加载设备树(非 dt-blob)的地址。默认情况下,固件会选择一个合适的位置。

device_tree_end:: 为加载的设备树设置(排他性)限制。默认情况下,设备树可以增长到可用内存的尽头,这几乎肯定是需要的。

dtdebug:: 如果非零,则为固件的设备树处理开启一些额外的日志记录。

enable_uart:: 启用主/控制台 UART(Raspberry Pi 3、4、400、Zero W 和 Zero 2 W 上为 ttyS0,其他情况下为 ttyAMA0 - 除非与 miniuart-bt 等覆层交换)。如果主 UART 为 ttyAMA0,则`enable_uart`默认为 1(启用),否则默认为 0(禁用)。这是因为必须阻止内核频率发生变化,否则 ttyS0 将无法使用,因此 enable_uart=1 意味着 core_freq=250(除非 force_turbo=1)。在某些情况下,这会影响性能,因此默认关闭。

overlay_prefix:: 指定加载覆盖层的子目录/前缀—​默认为 "overlay/"。注意尾部的"/"。如果需要,你可以在最后的"/"后面添加一些内容,为每个文件添加一个前缀,不过这不大可能需要。

DT可以控制更多端口。有关详细信息,请参阅 section 3

进一步的帮助

如果您已经阅读了本文档,但仍未找到 "设备树 "问题的答案,我们可以提供帮助。通常可以在 Raspberry Pi 论坛上找到作者,尤其是 Device Tree 论坛。

更改默认引脚配置

Note
已弃用通过用户提供的设备树blob自定义默认引脚配置。

引导过程中的设备引脚

在启动序列期间,GPIO引脚会执行各种操作。

  • 上电-引脚默认为具有默认拉动的输入,如 datasheet 中所述

  • 通过引导程序设置

  • 通过 bootcode.bin 设置

  • 通Plymouth过 dt-blob.bin 设置

  • 通过 config.txt 中的 GPIO 命令 进行设置

  • 附加固件引脚(如 UARTS)

  • 内核/设备树

在软重置时,除默认拉动外,其他程序相同,默认拉动仅在开机重置时应用。

整个过程可能需要几秒钟。在此期间,GPIO 引脚可能不会处于所连接外设(如 dt-blob.binconfig.txt 中定义)预期的状态。由于不同的 GPIO 引脚有不同的默认拉动方式,因此应为外设执行以下*项之一:

  • 选择一个 GPIO 引脚,该引脚在复位时按外设的要求默认拉动

  • 延迟外设的启动时间,直至操作完成

  • 添加适当的上拉/下拉电阻器

提供自定义设备树blob

为了将设备树源( .dts )文件编译为设备树blob( .dtb )文件,必须通过运行 sudo apt installdevice-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用于在引导时配置二进制blob(VideoCore)。Linux内核当前未使用它。dt-blob可以配置所有版本的Raspberry Pi(包括Compute Module)以使用替代设置。以下部分在dt-blob中有效:

videocore

本节包含所有VideoCore blob信息。所有后续部分都必须包含在本节中。

pins_*

基于特定的Raspberry Pi型号,有许多单独的 pins_* 部分,即:

  • pins_rev1 : Rev1 引脚设置。由于移动了 I2C 引脚,因此存在一些差异。

  • pins_rev2 : Rev2 引脚设置。其中包括 P5 上的额外编解码器引脚。

  • pins_bplus1 : Raspberry Pi 1 Model B+ rev 1.1,包括完整的 40 引脚连接器。

  • pins_bplus2 : Raspberry Pi 1 Model B+ rev 1.2,交换了低功耗和 lan-run 引脚。

  • pins_aplus : Raspberry Pi 1 Model A+,缺少以太网。

  • pins_2b1 : Raspberry Pi 2 Model B rev 1.0;通过 I2C0 控制 SMPS。

  • pins_2b2 : Raspberry Pi 2 Model B rev 1.1;通过 42 和 43 上的软件 I2C 控制 SMPS。

  • pins_3b1 : Raspberry Pi 3 Model B rev 1.0

  • pins_3b2 : Raspberry Pi 3 Model B rev 1.2

  • pins_3bplus : Raspberry Pi 3 Model B+

  • pins_3aplus : Raspberry Pi 3 Model A+

  • pins_pi0 : Raspberry Pi Zero

  • pins_pi0w : Raspberry Pi Zero W

  • pins_pi02w : Raspberry Pi Zero 2 W

  • pins_cm : Raspberry Pi Compute Module 1。它的默认值是芯片的默认值,因此是有关芯片默认上拉/下拉的有用信息来源。

  • pins_cm3 : Raspberry Pi Compute Module 3

  • pins_cm3plus : Raspberry Pi Compute Module 3+

  • pins_cm4s : Raspberry Pi Compute Module 4S

  • pins_cm4 : Raspberry Pi Compute Module 4

每个 pins_* 部分都可以包含 pin_configpin_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 设置为运行于 1.96608GHz 的源 VCO(该 VCO 的限制频率为 600MHz - 2.4GHz),将 APER 通道更改为 /4,并将 GPCLK0 配置为通过 APER 从 PLLA 获取。这将为音频编解码器提供产生 48000 频率范围所需的 12288000Hz 频率。

示例设备树源文件

固件库包含一个 master Raspberry Pi blob,其他固件通常都是从它衍生出来的。

本页内容