树莓派系统文件分析

4 minute read

Published:

本篇blog来分析和总结下树莓派系统文件以及他们的作用。使用的系统是Raspberry Pi OS with desktop

  • System: 64-bit
  • Kernel version: 6.1
  • Debian version: 12 (bookworm)

先看一下顶级目录/root有如下的文件和文件夹

其中,

  1. LICENCE.broadcom: 这是 Broadcom 公司的许可证文件,包含了与 Broadcom 相关的许可信息。
  2. bcm2710-rpi-*.dtbbcm2711-rpi-*.dtb: 这些是设备树二进制文件,它们描述了 Raspberry Pi 板上的硬件组件信息,如处理器、外设等。不同的文件对应于不同型号的 Raspberry Pi。
  3. cmdline.txt: 这个文件包含了内核启动时的命令行参数,例如根文件系统的位置、启动选项等。
  4. config.txt: 这是 Raspberry Pi 的配置文件,用于配置系统启动时的参数,如分辨率、内存分配等。
  5. fixup*.dat: 这些是固件文件,包含了一些用于修复和初始化硬件的固件信息。
  6. initramfs*: 这些文件是初始内存文件系统(Initial RAM Filesystem)的镜像,用于在启动过程中提供临时的文件系统。
  7. overlays/: 这个目录包含了一系列的设备树覆盖文件,可以在不修改主设备树的情况下对硬件进行配置。
  8. start*.elf: 这是 Raspberry Pi 启动加载器(bootloader)的主要组件之一,负责加载内核和启动树。
  9. System Volume Information/: 这是一个 Windows 特定的隐藏系统目录,通常会出现在 FAT 文件系统中。
  10. bootcode.bin: 这是 Raspberry Pi 启动加载器的一个关键组件,负责初始化硬件并加载 start*.elf 文件。
  11. issue.txt: 这是一个文本文件,包含了一些有关系统的信息。

总的来说,这些文件组成了树莓派系统的启动和配置环境,它们协同工作以确保系统能够正确启动并运行。

我们再来细致的看一下cmdline.txt的内容。cmdline.txt 是树莓派操作系统中一个非常重要的配置文件,它包含了启动内核时传递给内核的参数。具体来说,cmdline.txt 文件包含了一个命令行参数字符串,这些参数会在树莓派启动时传递给 Linux 内核。这些参数可以控制内核的行为,例如设置根文件系统的位置、指定启动模式等。

在我使用的debian bookworm版本系统中,cmdline.txt的内容是这样的:

console=serial0,115200 console=tty1 root=PARTUUID=f6a7c4bd-02 rootfstype=ext4 fsck.repair=yes rootwait quiet init=/usr/lib/raspberrypi-sys-mods/firstboot splash plymouth.ignore-serial-consoles

我们来解释一下其中的内容:

  1. console=serial0,115200:将串口0(也就是 UART 接口)设置为控制台,波特率为 115200。这意味着可以通过串口连接来进行通信和调试。
  2. console=tty1:在控制台 1(也就是图形用户界面)上显示系统信息。
  3. root=PARTUUID=f6a7c4bd-02:指定根文件系统的位置,这里是通过 PARTUUID(分区唯一标识符)来指定的。这确保了根文件系统会被正确地挂载。
  4. rootfstype=ext4:指定根文件系统的类型,这里是 ext4 文件系统。
  5. fsck.repair=yes:在启动时如果检测到文件系统错误,将自动尝试修复。
  6. rootwait:等待根文件系统准备好后再继续启动。
  7. quiet:禁止显示大量启动信息,使启动过程更为安静。
  8. init=/usr/lib/raspberrypi-sys-mods/firstboot:指定要运行的第一个初始化程序。这通常用于执行一些系统初始化的任务。
  9. splash:允许显示启动画面(如果系统配置了这个功能的话)。
  10. plymouth.ignore-serial-consoles:忽略串口控制台,以避免干扰启动画面的显示。

我们再来看一下config.txt文件。config.txt 是 Raspberry Pi 系统中的一个重要配置文件,用于控制硬件参数和设置。它位于启动分区中,由 bootloader 在启动时读取并应用。

以下是 config.txt 文件的一些常见用途:

  1. 分辨率和显示设置:可以通过修改 config.txt 来设置显示器的分辨率、刷新率和其他显示参数。
  2. 超频:可以在 config.txt 中配置 Raspberry Pi 的CPU、GPU和内存的超频参数,以提升性能。
  3. 内存分配:可以调整系统中内存的分配方式,例如将 GPU 内存大小调整为满足特定需求。
  4. 电源管理:可以通过 config.txt 控制供电管理的行为,例如禁用通过 USB 端口供电。
  5. 设备树配置:可以在 config.txt 中加载特定的设备树文件,以配置硬件或启用外部设备。
  6. 启动选项:可以设置启动时的一些选项,例如禁用 splash 屏幕、指定根文件系统等。
  7. Overlays:可以通过 config.txt 加载一些硬件特定的功能或功能模块,例如 GPIO 扩展板。
  8. 音频设置:可以配置音频参数,如选择音频输出设备或配置 I2S 音频等。

总的来说,config.txt 提供了一种在硬件级别上对 Raspberry Pi 进行配置和定制的方法,以满足特定应用或需求。然而,编辑此文件时应小心,因为错误的配置可能会导致系统启动问题或硬件损坏。

在我使用的debian bookworm版本系统中,config.txt文件的内容是这样的:

# For more options and information see
# http://rptl.io/configtxt
# Some settings may impact device functionality. See link above for details

# Uncomment some or all of these to enable the optional hardware interfaces
#dtparam=i2c_arm=on
#dtparam=i2s=on
#dtparam=spi=on

# Enable audio (loads snd_bcm2835)
dtparam=audio=on

# Additional overlays and parameters are documented
# /boot/firmware/overlays/README

# Automatically load overlays for detected cameras
camera_auto_detect=1

# Automatically load overlays for detected DSI displays
display_auto_detect=1

# Automatically load initramfs files, if found
auto_initramfs=1

# Enable DRM VC4 V3D driver
dtoverlay=vc4-kms-v3d
max_framebuffers=2

# Don't have the firmware create an initial video= setting in cmdline.txt.
# Use the kernel's default instead.
disable_fw_kms_setup=1

# Run in 64-bit mode
arm_64bit=1

# Disable compensation for displays with overscan
disable_overscan=1

# Run as fast as firmware / board allows
arm_boost=1

[cm4]
# Enable host mode on the 2711 built-in XHCI USB controller.
# This line should be removed if the legacy DWC2 controller is required
# (e.g. for USB device mode) or if USB support is not required.
otg_mode=1

[all]

我们来解释一下其中的内容:

  1. dtparam=audio=on: 启用音频功能,并加载 snd_bcm2835 驱动程序。
  2. camera_auto_detect=1: 当检测到摄像头时,自动加载相关的 overlay。
  3. display_auto_detect=1: 当检测到 DSI(显示接口)显示屏时,自动加载相关的 overlay。
  4. auto_initramfs=1: 如果发现 initramfs 文件,则自动加载。
  5. dtoverlay=vc4-kms-v3d: 启用 DRM VC4 V3D 驱动程序,用于图形渲染。
  6. max_framebuffers=2: 设置最大帧缓冲区数量为 2。
  7. disable_fw_kms_setup=1: 禁用固件在 cmdline.txt 中创建初始的 video 设置,使用内核的默认设置。
  8. arm_64bit=1: 启用 64 位模式。
  9. disable_overscan=1: 禁用对具有超扫描的显示器的补偿。
  10. arm_boost=1: 在固件/板子允许的情况下以最大速度运行。
  11. [cm4]: 标志着接下来的设置是专门为 Compute Module 4 设计的。

  12. otg_mode=1: 启用 2711 内置的 XHCI USB 控制器的主机模式。

  13. [all]: 标志着接下来的设置适用于所有 Raspberry Pi 设备。

我们再更进一步解释一下上面的几个名词:

  • overlay: 在 Raspberry Pi 上,”overlay” 指的是一种可以动态加载和卸载的硬件配置文件。这些配置文件包含了设备树片段和参数,可以用来配置和启用特定的硬件功能或接口,例如摄像头、显示屏、传感器等。通过使用 overlay,你可以在不需要重新编译内核的情况下,动态地调整硬件配置,从而增强 Raspberry Pi 的灵活性和可配置性。这使得在不同的项目或场景中,可以轻松地切换和配置不同的硬件组件。

  • initramfs文件:initramfs 是一个临时的根文件系统,用于在 Linux 内核引导时提供必要的文件和工具,以便在实际的根文件系统挂载之前执行一些初始化任务。具体来说,initramfs 可以包含一些必要的设备驱动、文件系统工具、网络配置等,以确保系统能够正常启动和挂载真正的根文件系统。在 Raspberry Pi 中,auto_initramfs=1 的配置表示如果在 /boot/firmware 目录下发现了 initramfs 文件,就会在启动时自动加载它。使用 initramfs 的一个常见情况是在引导过程中可能需要解密根文件系统,或者进行一些需要提前初始化的操作。通过在 initramfs 中提供必要的工具和配置,可以确保系统能够顺利启动。总的来说,initramfs 是一个用于引导时期的临时文件系统,允许在正式的根文件系统挂载之前进行一些初始化和准备工作。

  • dtoverlay=vc4-kms-v3d:dtoverlay 是 Raspberry Pi 系统中用于加载设备树覆盖(Device Tree Overlay)的一个配置参数。

    设备树覆盖是一种在运行时修改设备树的机制,它允许你动态地添加、修改或删除设备树中的设备节点或属性,而无需重新编译整个设备树。通过在 config.txt 文件中使用 dtoverlay 参数,你可以加载特定的设备树覆盖,以对硬件进行配置或启用特定的功能。vc4-kms-v3d表示启用DRM VC4 V3D 驱动程序,用于图形渲染。DRM 表示 Direct Rendering Manager,它是 Linux 内核的一个子系统,用于管理图形硬件设备并提供直接的渲染支持。vc4 是指 Broadcom 公司开发的一款用于树莓派的图形处理器芯片(Broadcom VideoCore 4),它集成了 3D 图形处理器和视频解码器。V3D 是 VideoCore 4 的 3D 图形引擎部分,它负责处理与三维图形相关的任务,包括渲染、变换、纹理映射等。”kms” 代表 “Kernel Mode Setting”,它是一种在 Linux 内核层面进行显示设置的技术。KMS 允许内核控制显卡的显示设置,包括分辨率、刷新率等,而不再依赖于 X 服务器或其他用户空间工具来进行显示设置。通过 dtoverlay=vc4-kms-v3d 这条配置,启用了 Raspberry Pi 上的 VC4 显卡以及DRM 驱动程序,并将其配置为使用 KMS 技术进行显示设置,以便使用 VideoCore 4 的 3D 图形引擎进行硬件加速的图形渲染。这样的设置可以提高图形性能,特别是对于需要处理复杂图形的应用程序和游戏而言。

  • otg_mode=1: 启用 2711 内置的 XHCI USB 控制器的主机模式。2711 指的是树莓派的芯片型号。具体来说,它指的是树莓派4(Raspberry Pi 4)使用的 Broadcom BCM2711 SoC(系统芯片)。XHCI 是一种 USB 控制器接口的标准。全称为 “eXtensible Host Controller Interface”,它支持超速传输和低功耗。这种接口通常用于主机设备,比如连接外部 USB 设备(如鼠标、键盘、硬盘等)的主板 USB 控制器。通过将 otg_mode=1 添加到 config.txt 中,启用了树莓派4上内置的 USB 3.0 控制器,将其配置为支持主机模式,使你可以连接其他 USB 设备到树莓派。

我们再来看一下overlays文件夹。这个目录包含了一系列的设备树覆盖文件,可以在不修改主设备树的情况下对硬件进行配置。设备树(Device Tree)是一种描述硬件平台信息的数据结构,它以一种结构化的方式描述了系统中各个硬件组件之间的关系和属性。设备树文件通常以.dts.dtb为扩展名。

在嵌入式系统中,特别是在一些复杂的系统-on-chip(SoC)中,存在着大量的硬件组件,如处理器、外设、总线等。这些组件之间的连接和属性关系可能非常复杂。设备树的目的是将这些硬件信息抽象出来,以便内核在启动时能够正确地识别和配置硬件。

设备树的作用包括:

  1. 硬件描述: 设备树文件描述了硬件平台的组件以及它们之间的连接关系。这包括了处理器、内存、外设等。
  2. 抽象层: 设备树提供了一个硬件描述的抽象层,使得相同的内核镜像可以在不同的硬件平台上运行。
  3. 热插拔和动态配置: 设备树允许系统在运行时检测和配置硬件组件,从而支持热插拔和动态配置。
  4. 系统移植和开发简化: 设备树允许在不修改内核源代码的情况下将内核移植到不同的硬件平台上,从而简化了开发和移植的工作。

设备树的工作方式如下:

  1. 编写设备树源文件(.dts): 这是一个类似于脚本的文件,描述了硬件的结构、属性和连接关系。
  2. 编译设备树源文件(.dts): 使用设备树编译器(dtc)将设备树源文件编译成二进制的设备树文件(.dtb)。
  3. 内核启动时加载设备树: 内核在启动时会加载设备树文件,以获取硬件配置信息。
  4. 内核根据设备树配置硬件: 内核使用设备树文件中描述的信息来配置硬件组件。

总的来说,设备树是一种在嵌入式系统中描述硬件配置的强大工具,它允许内核在不同的硬件平台上运行,从而提高了系统的可移植性和灵活性。

下面我们用一个具体的例子来看一下设备树文件。

假设我们有一个树莓派 3 Model B+,我们将使用设备树文件来描述它的GPIO引脚以及一个LED灯连接到了其中一个引脚上。

首先,我们编写一个设备树源文件(.dts):

/dts-v1/;
/plugin/;

/ {
    compatible = "brcm,bcm2835";

    fragment@0 {
        target = <&gpio>;
        __overlay__ {
            led_pin: led_pin {
                brcm,pins = <16>; // GPIO Pin Number
                brcm,function = <1>; // 1 is OUTPUT mode
            };
        };
    };
};

这个设备树源文件描述了以下信息:

  • 使用了 brcm,bcm2835 兼容性标识,表明这是适用于 BCM2835 SoC 的设备树文件。
  • 在设备树的第一个片段(fragment@0)中,我们将描述 GPIO 控制器(gpio)的属性。
  • __overlay__ 块内部,我们定义了一个名为 led_pin 的节点,该节点表示一个LED灯连接的GPIO引脚。
  • brcm,pins = <16>; 表示这个LED连接在 GPIO 16 引脚上。
  • brcm,function = <1>; 表示这个引脚将被配置为输出模式。

接下来,我们使用设备树编译器(dtc)将这个设备树源文件编译成二进制的设备树文件(.dtbo):

dtc -@ -I dts -O dtb -o led-overlay.dtbo led-overlay.dts

这将生成一个名为 led-overlay.dtbo 的二进制设备树文件。

最后,将生成的设备树文件加载到树莓派的 /boot/overlays 目录中,并在 config.txt 文件中添加一行来引用它:

dtoverlay=led-overlay

这样,在下一次启动时,设备树将会被内核加载,并配置相应的GPIO引脚以控制LED。

再来看一下/root/overlays文件夹里面的内容

overlays文件夹里面的内容相对多一些。/boot/overlays 文件夹中的文件是用于加载设备树覆盖(Device Tree Overlays)的配置文件。设备树覆盖允许在运行时动态地修改设备树,以便支持不同的硬件配置或功能。

以下是其中一些常见的设备树覆盖文件及其作用:

  1. ads1015.dtbo: 支持 ADS1015 类模数转换器。
  2. ads1115.dtbo: 支持 ADS1115 类模数转换器。
  3. gpio-fan.dtbo: 支持连接到 GPIO 的风扇。
  4. i2c-gpio.dtbo: 提供了通过 GPIO 模拟 I2C 总线的功能。
  5. spi0-0cs.dtbo, spi0-1cs.dtbo, spi0-2cs.dtbo: 针对 SPI0 总线的不同配置,例如启用/禁用片选线。
  6. spi1-1cs.dtbo, spi1-2cs.dtbo, spi1-3cs.dtbo: 针对 SPI1 总线的不同配置。
  7. spi2-1cs.dtbo, spi2-2cs.dtbo, spi2-3cs.dtbo: 针对 SPI2 总线的不同配置。
  8. spi3-1cs.dtbo, spi3-2cs.dtbo, spi3-2cs-pi5.dtbo: 针对 SPI3 总线的不同配置,包括针对特定硬件(如 Pi 5)的配置。
  9. spi4-1cs.dtbo, spi4-2cs.dtbo: 针对 SPI4 总线的不同配置。
  10. spi5-1cs.dtbo, spi5-1cs-pi5.dtbo, spi5-2cs.dtbo, spi5-2cs-pi5.dtbo: 针对 SPI5 总线的不同配置,包括针对特定硬件(如 Pi 5)的配置。
  11. uart0.dtbo, uart0-pi5.dtbo, uart1.dtbo, uart1-pi5.dtbo, uart2.dtbo, uart2-pi5.dtbo, uart3.dtbo, uart3-pi5.dtbo, uart4.dtbo, uart4-pi5.dtbo, uart5.dtbo: 针对不同 UART(串口)接口的配置。
  12. w1-gpio.dtbo, w1-gpio-pullup.dtbo: 支持 1-Wire 总线的 GPIO 配置。
  13. imx*.dtbo是树莓派支持的CMOS传感器型号的设备树覆盖文件。

这些文件允许用户根据实际需要动态地加载或卸载硬件模块,从而使树莓派适应各种不同的硬件配置。加载设备树覆盖时,可以通过修改 /boot/config.txt 文件,添加一行类似于 dtoverlay=<overlay-name> 的配置来指定使用哪个覆盖文件。