Compute Module 硬件

Datasheet和原理图

CM4

处理器模块4(CM4)是处理器模块(CM)的最新版本,对于所有当前和未来的开发,均推荐使用CM4。

Note
暂不提供CM4的原理图,但提供CM4 IO 板的原理图(可以在CM4 IO 板 Datasheet中查看)

提供一个可用的 KiCad PCB 设计套件:

老产品

Raspberry Pi CM1、CM3和CM3L预计将在2026年1月及之后停产,CM3+提供了更高性能的散热和更多的闪存选择。

Raspberry Pi CM3+和CM3+ Lite预计将在2026年1月及之后停产。

CM1、CM3 和 CM3L 的原理图

CMIO(Compute Module IO 板)原理图:

CMCDA(Compute Module camera/display adapter 板)原理图:

欠压检测

Raspberry Pi的老产品使用的欠压检测电路原理图。

Under-voltage detect

CMIO板的设计文件

用于CM4的CMIO板

CM4 IO板的datasheet中介绍了其设计数据。

还有一个 KiCad PCB 设计套件可用:

老产品

CMCDA(Compute Module camera/display adapter 板)设计数据:

烧录处理器模块eMMC

处理器模块(CM)包含一个连接到主SD卡接口的板载eMMC,本指南介绍了如何通过CMIO将数据写入eMMC存储。

请参见 处理器模块(CM) Datasheet中的对应内容。

Important
对于CM3、CM3+ 和 CM4 的大规模配置,建议使用 Raspberry Pi 处理器模块(CM)配置系统.

烧录eMMC的步骤

烧录处理器模块(CM) eMMC时, 需要一台Linux系统(推荐Raspberry Pi系统或者Ubuntu系统)或者Windows系统(推荐Windows 10)的电脑。对于BCM2837 (CM3),支持使用Mac系统。

Note
BCM2835(CM1) 启动加载程序中存在一个漏洞(向主机返回错误的USB数据包)。大多数USB主机似乎忽略了这个良性漏洞并且工作正常;但是,我们确实遇到一些USB端口由于此漏洞而无法正常工作的情况。我们不太明白为什么某些端口不能正常工作,因为似乎与接口是USB2还是USB3无关(我们已经看到这两种类型都可以工作),但可能与主机控制器和驱动程序有关。此漏洞已在 BCM2837 中修复。

[[Setting up the CMIO board]] === 设置CMIO 板

CM4

确保处理器模块(CM)正确安装在IO 板上,且安装时需要平放在 IO 板上。

  • 确保安装了IO 板跳线中J2 (禁用eMMC启动)的 `nRPI_BOOT`跳线。

  • 使用一根micro USB 线将 IO 板上的micro USB 从端口 J11 连接到主机设备。

  • 无需上电。

CM1和CM3

确保处理器模块(CM)已正确安装在IO 板上,安装时应与电路板平行,且接合夹卡入到位。

  • 确保 J4(USB 从启动使能)设置为 EN 状态。

  •  使用一根micro USB 线将 IO 板上的micro USB 从端口 J15 连接到主机设备。

  • 无需上电。

Windows用户

在 Windows系统下,安装程序可自动安装所需的驱动程序和启动工具。或者用户可以通过Cygwin编译并运行或手动安装驱动程序。

Windows 安装程序

对于仅仅想在Windows下启用CM eMMC作为大容量存储设备的用户,建议使用独立安装程序。本安装程序已在64位 Windows 10系统上进行了测试。

请确保在安装程序运行时未写入任何USB设备。

  1. 下载并运行 Windows安装程序 以安装驱动程序和启动工具。

  2. 将USB设备插入USB从端口,确保已按上述方式设置主板。

  3. 给主板上电;Windows系统会自动检测硬件并安装驱动程序。

  4. 驱动程序安装完成后,运行以前安装的 RPiBoot.exe 工具。

  5. 几秒钟后,处理器模块(CM)eMMC将在Windows下作为磁盘(USB 大容量存储设备)弹出。

在主机上构建 rpiboot

有关构建和运行最新版本的 `rpiboot`的说明记录在Github上的 usbboot 自述 文件中。

写入eMMC (Windows)

rpiboot 完成后,一个新的USB大容量存储驱动器将出现在Windows中。 建议使用 Raspberry Pi Imager 将镜像写入驱动器.

确保 J4(USB 从启动使能)/J2 (nRPI_BOOT) 分别被设置为disabled状态和将任何内容插入USB从端口。IO 板重新上电后,处理器模块(CM)将从eMMC启动。

写入eMMC (Linux)

rpiboot 完成后, 会有一个新的磁盘弹出;在Raspberry Pi上,通常是 /dev/sda`路径,也可能是其他位置,如 `/dev/sdb, 所以在运行 rpiboot 之前检查 /dev/ 或 运行 lsblk ,这样可以看到具体发生的变化.

你现在需要将原始的操作系统镜像 (如 Raspberry Pi OS) 写入设备。 注意:镜像大小不同,执行命令所需要的时间不同:(将 /dev/sdX 更改为适当的设备。)

sudo dd if=raw_os_image_of_your_choice.img of=/dev/sdX bs=4MiB

镜像写入完成后,拔下并重新插入USB;可以看到`/dev` 中出现两个分区(对于Raspberry Pi操作系统)。总之,可以看到类似如下内容:

/dev/sdX    <- Device
/dev/sdX1   <- First partition (FAT)
/dev/sdX2   <- Second partition (Linux filesystem)

现在可以正常挂载 /dev/sdX1/dev/sdX2 分区。

确保 J4(USB从启动使能)/J2 (nRPI_BOOT) 分别被设置为禁用状态和未将任何内容插入USB从端口。IO 板重新上电后,处理器模块(CM)将从eMMC启动。

处理器模块4 (CM4) 启动加载程序

CM4上的默认启动加载程序配置旨在支持 CM4 IO 板 上的启动和开发,制造时刷新的软件版本可能不是最新版本。对于最终产品,请考虑:

  • 选择并验证特定的启动加载程序版本。`usbboot`仓库中的版本始终是最新的稳定版本。

  • 配置启动设备 (例如网络启动). 请参见 启动加载程序配置 指南中的`BOOT_ORDER` 部分的内容。

  • 在启动加载程序 EEPROM 上启用硬件写保护,以确保无法在远程/无法访问的产品上修改启动加载程序。

注意: CM4 ROM不会从SD/EMMC运行 recovery.bin ,默认情况下不启用 rpi-eeprom-update 服务。 EMMC是不可移动,且无效的 recovery.bin 文件会阻止系统启动,所以默认情况下不启动rpi-eeprom-update服务是必要的。 这可以被覆盖并与 自更新 模式一起使用,其中引导加载程序可以从USB MSD或网络启动进行更新。但是自更新模式不是原子更新,如果在更新EEPROM时发生电源故障,则是不安全的。

烧录NVMe / 其他存储设备.

新的基于Linux的 大容量存储设备 支持烧录NVMe、EMMC和USB块设备。 比使用 rpiboot 固件驱动程序更快,并且还为设备提供了UART控制台,以便于调试。

具体内容请参见 CM4 rpiboot 扩展

修改启动加载程序配置

修改CM4 启动加载程序配置:-

  • cd 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 文件烧录到CM4.

烧录启动加载程序EEPROM - CM4

烧录启动加载程序EEPROM需要遵循与烧录EMMC相同的硬件设置,同时需要确保EEPROM_nWP引脚未被拉低。一旦烧录完成,EEPROM_nWP引脚可能会再次被拉低。

# Writes recovery/pieeprom.bin to the bootloader EEPROM.
./rpiboot -d recovery

故障排除

已发现少数的CM3s 存在启动问题,已经追溯到创建FAT32分区的方法,结果表明是由于BCM2835/6/7和新版本eMMC设备之间的时间差异造成的。故推荐如下的分区方法:

sudo parted /dev/<device>
(parted) mkpart primary fat32 4MiB 64MiB
(parted) q
sudo mkfs.vfat -F32 /dev/<device>
sudo cp -r <files>/* <mountpoint>

连接和启用外围设备

Note
除非另有明确说明,否则本章使用说明适用于CM1、CM3、CM1 IO 板和CM3 IO 板。

本指南旨在帮助使用CM1(和CM3)的开发人员掌握如何将外设连接到CM引脚,以及如何配置软件使这些外设正常工作。

CM1和CM3包含Raspberry Pi的BCM2835(或用于CM3的BCM2837)片上系统 (SoC) 或 或 '处理器'、内存和eMMC。eMMC类似于SD卡,但焊接在电路板上。与SD卡不同,eMMC专门设计用作磁盘,并具有额外的功能,使其在本应用场景中更加可靠。SoC的大多数引脚(GPIO,两个CSI摄像头接口,两个DSI显示接口,HDMI等)都是免费可用的,并且可以根据用户认为合适的方式进行连接(或者,如果不使用,通常可以不连接)。处理器模块(CM)是 DDR2 SODIMM 外形兼容的模块,因此任何 DDR2 SODIMM 插槽都是可用的。

Note
引脚排列与实际的SODIMM内存模块不同。

为了使用处理器模块(CM),用户需要设计一个(相对简单的)'主板',它可以为处理器模块(CM)提供电源(最低 3.3V和1.8V),并将引脚连接到用户应用所需的外围设备。

Raspberry Pi 为处理器模块(CM)提供了一个最小的主板(称为CM IO 板或 CMIO 板),该主板为CM供电,将 GPIO引出到pin header,并将相机和显示器接口连接到 FFC 连接器。其提供HDMI、USB和和“ACT” LED灯,并具备通过PC或Raspberry Pi的USB对模块的eMMC进行编程。

本指南首先介绍启动过程以及如何使用设备树来描述连接的硬件;这些是使用处理器模块(CM)进行设计时需要了解的基本内容。同时,本指南也提供了一个使用示例,将 I2C 和 SPI 外设连接到 CMIO(或 CM3 的 CMIO V3)板,并创建使两个外设在 Linux 下工作所需的设备树文件,从创建普通的 Raspberry Pi OS 镜像开始。

BCM283x GPIOs

BCM283x 有三组通用输入/输出 (GPIO) 引脚:Bank 0上有28个引脚、Bank 1上有18个引脚和Bank2上有8个引脚,总共有 54 个引脚。这些引脚可以用作真正的GPIO引脚,即软件可以将它们设置为输入或输出、读取和/或设置状态,并将它们用作中断;也可以将它们设置为“备用功能”,例如I2C、SPI、I2S、UART、SD卡等。

在处理器模块上(CM),Bank 0 和Bank 1 都是免费可用的,Bank 2 用于 eMMC、、HDMI 热插拔检测和 ACT LED/USB启动控制。

在正在运行的系统上,查看每个GPIO引脚的状态(它们设置的功能以及引脚上的电压电平)是非常有用的,可以帮助确认系统是否按需求设置。如果要查看设备树是否按需求工作,或在硬件调试期间查看引脚状态,此操作特别有用。

Raspberry Pi提供了用于破解和调试GPIO工具的软件包 raspi-gpio

Note
你需要以root身份运行 raspi-gpio

安装 raspi-gpio:

sudo apt install raspi-gpio

如果 apt 不能发现 raspi-gpio 包, 则需要先进行更新:

sudo apt update

要获得 raspi-gpio`帮助, 请运行 `help 参数:

sudo raspi-gpio help

例如, 要查看所有GPIO引脚当前功能和电平,请使用:

sudo raspi-gpio get
Note
raspi-gpio 可与 funcs 参数一起使用,以获取每个引脚所支持的GPIO功能。 它将打印出CSV格式的表格. 这个想法是将表通过管道传输到一个 .csv 文件,然后使用例如Excel加载此文件:
sudo raspi-gpio funcs > gpio-funcs.csv

BCM283x 启动过程

BCM283x 器件由 VideoCore GPU 和 ARM CPU 内核组成。GPU是一个由 DSP 处理器和硬件加速器组成的系统,用于成像、视频编码和解码、3D 图形和图像合成。

在 BCM283x 器件中,首先启动的是 GPU 中的 DSP 内核,其负责启动主 ARM 处理器之前的常规设置和内务管理。

Raspberry Pi和处理器模块(CM) 板上使用的 BCM283x 器件具有三阶段启动过程:

  1. GPU DSP退出复位并执行小型内部 ROM(启动 ROM)中的代码,该代码的唯一目的是通过其中一个外部接口加载第二阶段引导加载程序。在Raspberry Pi或CM上,此代码首先在 SD 卡 (eMMC) 上查找第二阶段引导加载程序;它期望被称为`bootcode.bin`并位于第一个分区(必须是 FAT32)。如果未找到SD卡或未找到`bootcode.bin`,则启动ROM将处于’USB 启动’模式并等待,等待主机通过USB接口为其提供第二阶段启动加载程序。

  2. 第二阶段启动加载程序(SD卡上的`bootcode.bin`或usb引导的`usbbootcode.bin`)负责设置LPDDR2 SDRAM接口和各种其他关键系统功能,然后加载和执行主GPU固件(称为`start.elf`还是在主SD卡分区上)。

  3. start.elf`接管并负责进一步的系统设置和启动ARM处理器子系统,并包含在GPU的各个部分上运行的固件。它首先读取`dt-blob.bin`以确定初始GPIO引脚状态和GPU特定的接口和时钟,然后解析`config.txt。然后,在启动ARM子系统并将设备树数据传递给启动Linux kernel之前,它加载ARM设备树文件(例如,用于CM1的`bcm2708-rpi-cm.dtb`)和`config.txt`中指定的任何设备树覆盖。

设备树

设备树 是一种特殊的编码方式,用于编码有关连接到系统的硬件(以及所需的驱动程序)的所有信息。

在Raspberry Pi或处理器模块(CM)上,SD/eMMC的第一个FAT分区中有几个文件是二进制’Device Tree’文件。这些二进制文件(通常带有扩展名`.dtb`)是由设备树编译器从人类可读的文本描述(通常是带有扩展名`.dts`的文件)编译的。

在第一个(FAT)分区中的标准 Raspberry Pi OS镜像上,您会发现两种不同类型的设备树文件,一种仅由GPU使用,其余是每个基于BCM283x的Raspberry Pi产品的标准ARM设备树文件:
  • dt-blob.bin (由GPU使用)

  • bcm2708-rpi-b.dtb (用于Raspberry Pi 1 Models A和B)

  • bcm2708-rpi-b-plus.dtb (用于Raspberry Pi 1 Models B+和A+)

  • bcm2709-rpi-2-b.dtb (用于Raspberry Pi 2 Model B)

  • bcm2710-rpi-3-b.dtb (用于Raspberry Pi 3 Model B)

  • bcm2708-rpi-cm.dtb (用于Raspberry Pi Compute Module 1)

  • bcm2710-rpi-cm3.dtb (用于Raspberry Pi Compute Module 3)

Note
dt-blob.bin 默认不存在,因为start.elf`中编译了一个 'default' 版本。 但对于处理器模块项目,通常需要提供一个 dt-blob.bin (它覆盖默认的内置文件)。
Note
`dt-blob.bin`采用已编译的设备树格式,但仅由 GPU 固件读取以设置 GPU 独有的功能-见下文。

在启动过程中,用户可以通过`config.txt`中的`device_tree`参数指定要使用的特定ARM设备树,例如添加`device_tree=mydt.dtb`行至`config.txt`,其中`mydt.dtb`是要加载的dtb文件,而不是标准的ARM dtb文件。虽然用户可以为他们的处理器模块(CM)产品创建完整的设备树,但推荐的添加硬件的方式是使用覆盖(参见下一节)。

除了加载ARM dtb之外,start.elf 支持通过 config.txt 中的 dtoverlay 参数加载额外的设备树 'overlays' ,例如根据需要向 config.txt 中添加与overlays一样多的 dtoverlay=myoverlay 行。请注意overlays位于 /overlays 并带有后缀 -overlay.dtb ,如 /overlays/myoverlay-overlay.dtb 。当Linux kernel启动时,在数据被传到内核之前,Overlays会与基本的dtb文件合并。

Overlays用于将数据添加至基本的dtb中,该dtb(名义上)描述非特定于主板的硬件。 这包括使用的GPIO引脚及其功能,以及连接的设备,以便加载正确的驱动程序。惯例是,在Raspberry Pi上,所有连接到Bank 0 GPIO(GPIO接头)的硬件都应该用覆盖来描述。 在处理器模块(CM)上,连接到Bank0和Bank1 GPIOs的所有硬件都应在覆盖文件中进行描述。您不必遵循这些约定:您可以将所有信息整合到一个dtb文件中,如前所述,替换 bcm2708-rpi-cm.dtb 。但是,遵循这些约定意味着您可以使用 '标准' Raspberry Pi OS版本,其标准基础dtb和所有特定于产品的信息都包含在一个单独的覆盖中。有时,基本dtb可能会改变——通常不会破坏覆盖——这就是建议使用覆盖的原因。

dt-blob.bin

start.elf 运行时, 首先读取名为 dt-blob.bin 的东西。这是一种特殊形式的设备树blob,它告诉GPU如何(最初)设置GPIO引脚状态,以及关于由GPU控制(拥有)的GPIO/外设的任何信息,而不是通过Linux在ARM上的使用。例如,Raspberry Pi相机外设由GPU管理,GPU需要独占访问I2C接口才能与之通信,还需要几个控制引脚。大多数Raspberry Pi板和处理器模块(CM)上的I2C0名义上是专供GPU使用的。 有关GPU应该将哪些GPIO引脚用于I2C0以及控制相机功能的信息来自 dt-blob.bin

Note
start.elf 固件有一个 '内置的' 默认 dt-blob.bin ,如果在第一个FAT分区的根上未找到 dt-blob.bin ,则会使用这个默认 dt-blob.bin 。大多数处理器模块(CM)项目都希望提供自己的自定义 dt-blob.bin 。请注意 dt-blob.bin 指定哪个引脚用于HDMI热插拔检测,尽管这在处理器模块(CM)上不会改变。它还可以用来将GPIO设置为GPCLK输出,并指定GPU在启动时可以使用的ACT LED。将来可能会添加其他功能。

minimal-cm-dt-blob.dts 是一个示例 .dts 设备树文件,用于设置HDMI热插拔检测和 ACT LED,并将所有其他 GPIO 设置为具有默认拉取的输入。

要将 minimal-cm-dt-blob.dts 编译为 dt-blob.bin ,请使用设备树编译器 dtc:

dtc -I dts -O dtb -o dt-blob.bin minimal-cm-dt-blob.dts

ARM Linux 设备树

start.elf 读取 dt-blob.bin 并设置初始引脚状态和时钟后,它会读取 config.txt, 其中包含许多其他系统设置选项。

读取 config.txt 后,将读取另一个特定于硬件运行板的设备树文件: 对于CM1是 bcm2708-rpi-cm.dtb, 对于CM3是 bcm2710-rpi-cm.dtb 。 这个设备树文件是一个标准的ARM Linux设备树文件,它详细描述了硬件是如何连接到处理器的: SoC中存在哪些外围设备以及外围设备的位置,具体使用了哪些GPIO,且这些GPIO有什么功能和分别连接了哪些物理设备。该文件将适当地设置GPIO,如果pin状态与 dt-blob.bin 中的不同,将覆盖 dt-blob.bin 中设置的pin状态。它还会尝试加载特定设备的驱动程序。

虽然 bcm2708-rpi-cm.dtb 文件可用于加载所有连接的设备,但建议处理器模块(CM)用户不要使用该文件。 相反,使用标准Raspberry Pi操作系统软件镜像中提供的文件,并使用自定义 'overlay' 文件添加设备,如前所述。 bcm2708-rpi-cm.dtb 文件包含各种外设(I2C、SPI、I2S等)的(禁用)条目并且缺少GPIO引脚定义,除了eMMC/SD卡外设有GPIO定义并被启用,因为它总是在相同的引脚上。 这个想法是,单独的覆盖文件将启用所需的接口,描述所使用的引脚,还描述所需的驱动程序。 start.elf 固件将读取 bcm2708-rpi-cm.dtb 并将其与覆盖数据合并,然后在Linux内核启动时将合并的设备树提供给Linux内核。

设备树源和编译

Raspberry Pi OS镜像提供编译的dtb文件, 但源dts文件在哪里? 他们位于 GitHub 上的Raspberry Pi Linux内核分支中。可查看 arch/arm/boot/dts 文件夹。

一些默认的覆盖dts文件位于 arch/arm/boot/dts/overlays 中。可连接到Raspberry Pi操作系统镜像中的 Raspberry Pi 的标准硬件的相应覆盖,其位于 /overlays 目录中的FAT分区上。注意:假设BANK0上有某些引脚用于Raspberry Pi。一般来说,使用这些标准覆盖的源代码作为创建自己的覆盖的指南,除非您将要使用的GPIO引脚与硬件使用的Raspberry Pi的GPIO引脚相同。

将这些dts文件编译为dtb文件需要最新版本的 设备树编译器 dtc。在Raspberry Pi上安装适当版本的方法是运行:

sudo apt install device-tree-compiler

如果您正在构建自己的内核,那么构建主机也会在 scripts/dtc 中获得一个版本。您可以通过将覆盖层添加到 arch/arm/boot/dts/overlays 中的 Makefile 中,并使用 'dtbs' 目标来安排自动构建覆盖层。

设备树调试

当 Linux 内核在 ARM 内核上启动时,GPU 会为其提供一个完全组装的设备树,该设备树由基本 dts 和任何覆盖层组装而成。这个完整的设备树可通过 /proc/device-tree 中的 Linux proc 接口获得,其中节点变为目录,属性变为文件。

您可以使用 dtc 将其写出为人类可读的 dts 文件以进行调试。您可以看到完全组装的设备树,这通常非常有用:

dtc -I fs -O dts -o proc-dt.dts /proc/device-tree

如前面在 GPIO 部分所述,使用 raspi-gpio 查看 GPIO 引脚的设置以检查它们是否符合需求也非常有用:

raspi-gpio get

如果出现问题,也可以通过转储 GPU 日志消息找到有用的信息:

sudo vcdbg log msg

通过将 dtdebug=1 添加到 config.txt ,可以在输出中包含更多诊断信息。

举例

Note
请使用Raspberry Pi论坛上的 设备树子论坛 询问与设备树相关的问题。

对于这些简单的例子,我使用了CMIO板,其通过跳线连接外围设备。

对于每个示例,我们假设CM1 + CMIO或CM3 + CMIO3板在处理器模块(CM)上安装了最新的Raspberry Pi OS Lite版本。

此处的示例需要互联网连接,因此建议使用 USB HUB+键盘+无线网络或者插入 CMIO USB 端口的以太网。

请在Raspberry Pi 设备树子论坛 上发布任何问题、错误或疑问。

示例 1 - 将 I2C RTC 连接到 BANK1 引脚

在这个简单的示例中,我们将NXP PCF8523实时时钟(RTC)连接到CMIO板BANK1 GPIO引脚:3V3、GND、GPIO44上的I2C1_SDA和GPIO45上的I2C1_SCL 。

下载 minimal-cm-dt-blob.dts 并将其复制到 SD 卡 FAT 分区,当处理器模块(CM)启动时该分区位于/boot。

编辑 minimal-cm-dt-blob.dts 并将GPIO44 和 GPIO45 的引脚状态更改为带上拉的 I2C1:

sudo nano /boot/minimal-cm-dt-blob.dts

更改行:

pin@p44 { function = "input"; termination = "pull_down"; }; // DEFAULT STATE WAS INPUT NO PULL
pin@p45 { function = "input"; termination = "pull_down"; }; // DEFAULT STATE WAS INPUT NO PULL

为:

pin@p44 { function = "i2c1"; termination = "pull_up"; }; // SDA1
pin@p45 { function = "i2c1"; termination = "pull_up"; }; // SCL1
Note
我们可以使用默认的 dt-blob.dts ,当加载特定驱动程序时,Linux设备树将在Linux内核启动时(重新)配置这些引脚,故你可以根据需要修改 dt-blob.dts 。推荐将将 dt-blob.dts 配置为为需求的GPIO,因为其会在GPU启动时阶段被快速设置为最终状态,但此操作不是必须的。你可能会发现,在某些情况下,需要在GPU启动时配置引脚,因此当加载Linux驱动程序时,它们处于特定的状态。例如,复位线可能需要保持在正确的方向。

编译 dt-blob.bin:

sudo dtc -I dts -O dtb -o /boot/dt-blob.bin /boot/minimal-cm-dt-blob.dts

获取 example1-overlay.dts 并将其放入 /boot 然后编译:

sudo dtc -@ -I dts -O dtb -o /boot/overlays/example1.dtbo /boot/example1-overlay.dts
Note
如果你要使用外部引用编译 dts 文件,则`dtc` 命令行中的 '-@' 是必需的。

编辑 /boot/config.txt 并添加行:

dtoverlay=example1

现在保存并重新启动。

重新启动后,您会在 /dev 中看到一个 rtc0 条目。运行:

sudo hwclock

将返回硬件时钟时间,而不是错误信息。

示例 2 - 在 BANK28 上连接 ENC60J0 SPI 以太网控制器

在此示例中,我们使用 /boot/overlays 中已有的覆盖之一将 ENC28J60 SPI 以太网控制器添加到 BANK0。以太网控制器连接到SPI引脚CE0、MISO、MOSI和SCLK(分别为GPIO8-11),以及用于下降沿中断的GPIO25、GND和3V3。

在这个例子中,我们不建议更改 dt-blob.bin ,但如果你想修改也是支持的。我们可以学习到Linux 设备树设置引脚的方法。

编辑 /boot/config.txt 并添加行:

dtoverlay=enc28j60

现在保存并重新启动。

重新启动后,你会在/dev中看到一个 rtc0 条目。运行如下命令:

sudo hwclock

将返回硬件时钟时间,而不是错误。

你还需要检测以太网连接状态:

ping 8.8.8.8

连接正常。

最后运行:

sudo raspi-gpio get

应显示 GPIO8-11 已更改为 ALT0 (SPI) 函数。

连接Raspberry Pi 相机模块

Note

本章使用说明适用于高级用户,如果有任何不清楚的地方,请使用 Raspberry Pi 相机论坛 寻求技术支持。

除非另有明确说明,否则本章使用说明适用于连接至CMIO 板的CM1和CM3。CM4的操作不同,请参见对应的部分。

处理器模块(CM)包含两个 CSI-2 相机接口,分别为CAM0和CAM1。其中CAM0有2个数据通道,而 CAM1有4个数据通道。CM IO 板免费提供这两个接口。请注意,标准的Raspberry Pi设备使用 CAM1,但仅公开2个数据通道。

请注意,相机模块 不支持 支持热插拔,需要在电源关闭时才能进行连接或断开的操作。

更新系统

相机软件正在不断开发中,在使用这些说明之前,请确保你的系统是最新版本的。

sudo apt update
sudo apt full-upgrade

加密芯片

使用处理器模块(CM)驱动相机时,将OM5647、IMX219或HQ相机模块直接连接到CM载板时,无需合成Raspberry Pi设计的相机板上使用的加密芯片。Raspberry Pi固件将自动检测处理器模块(CM),并允许在没有加密芯片的情况下与相机模块进行通信。

快速入门指南

连接单个相机:

  1. 关闭计处理器模块(CM)的电源。

  2. 在处理器模块(CM)上运行 sudo raspi-config 并启用相机。

  3. 通过使用Raspberry Pi Zero相机线缆,将 RPI-CAMERA板和相机模块连接到 CAM1 端口。

    Connecting the adapter board
  4. (仅适用于CM1和CM3)将 GPIO 引脚连接在一起,如下图所示。

    GPIO connection for a single camera
  5. 给处理器模块(CM)上电并运行 sudo wget https://datasheets.raspberrypi.com/cmio/dt-blob-cam1.bin -O /boot/dt-blob.bin

  6. 最后,重新启动以读取 dt-blob.bin 文件。

连接2个相机,请参照连接单个相机相同的步骤操作,再增加如下步骤:

  1. 关闭电源后,对 CAM0 重复步骤3(连接单个相机的步骤)。

  2. (仅适用于 CM1 和 CM3)连接第2个相机的 GPIO 引脚。 GPIO connection with additional camera

  3. (仅限CM4) 将跳线添加到 J6。

  4. 通电并运行 sudo wget https://datasheets.raspberrypi.com/cmio/dt-blob-dualcam.bin -O /boot/dt-blob.bin

  5. 重启以读取 dt-blob.bin 文件。

Note
默认接线使用GPIO2和GPIO3来控制主相机。这些 GPIO 也可用于I2C,但这样做会导致冲突,相机可能无法正常工作。如果您希望使用默认接线的相机,请不要通过 dtparam=i2c_arm=on 使能I2C。

软件支持

提供的相机应用程序 raspividraspistill ,并具有 -cs (--camselect) 选项来指定应使用哪个相机。

如果要基于 MMAL API 编写自己的相机应用程序,则可以使用 MMAL_PARAMETER_CAMERA_NUM 参数设置当前相机。例如

MMAL_PARAMETER_INT32_T camera_num = {{MMAL_PARAMETER_CAMERA_NUM, sizeof(camera_num)}, CAMERA_NUMBER};
status = mmal_port_parameter_set(camera->control, &camera_num.hdr);

高级问题

CMIO板的每一个相机接口采用22-Pin 0.5mm间距的FFC连接器,其中CAM0 是2通道接口,CAM1 是4通道接口。标准Raspberry Pi使用15-Pin 1mm间距的FFC连接线,因此需要一个适配器(部件号为RPI-CAMERA)或Raspberry Pi Zero相机连接线。

CM1和CM3 的 CMIO 板与CM4 的 CMIO 板连接相机的方法不同,下文进行单独说明。

CM1 和 CM3

在CMIO 板上,需要将Raspberry Pi操作系统所需的 GPIO 和 I2C 接口桥接到 CAM1 连接器。 通过使用跳线将 GPIO 从 J6 GPIO 连接器连接到 J1 连接器上的 CD1_SDA/SCL 和 CAM0_IO1/5 引脚来实现的。

Note
如下提供的引脚编号仅作为示例。如果需要,两个相机可以共享LED 和SHUTDOWN引脚。

SDA 和 SCL 引脚必须是 GPIO 0 和 1、GPIO 28 和 29 或 GPIO 44 和 45,并且每个相机必须是单独的。

连接Raspberry Pi相机 (到 CAM1)的步骤
  1. 将0.5mm间距22-Pin FFC连接器(包含在RPI-CAMERA板中)连接到 CAM1 连接器(柔性触点面朝下),也可以使用Raspberry Pi Zero相机连接线来连接。

  2. 将 RPI-CAMERA 适配器板连接到 0.5mm间距22-Pin FFC连接器的另一端(柔性触点面朝下)。

  3. 将Raspberry Pi相机连接到RPI-CAMERA适配器板上另一个更大的15-Pin 1mm间距 FFC连接器 (Raspberry Pi相机柔性上的触点必须朝上) 。

  4. 将CD1_SDA(J6 针脚 37)连接到 GPIO0(J5 针脚 1)。

  5. 将CD1_SCL(J6 针脚 39)连接到 GPIO1(J5 针脚 3)。

  6. 将CAM1_IO1(J6 针脚 41)连接到 GPIO2(J5 针脚 5)。

  7. 将CAM1_IO0(J6 针脚 43)连接到 GPIO3(J5 针脚 7)。

请注意,括号中的数字是常规的物理引脚编号,从左到右和从上到下的编号。丝印上的数字对应于Broadcom SoC GPIO编号。

连接第二个Raspberry Pi相机相机(到 CAM0)的步骤

参考以上连接到CAM1的步骤将第2个相机连接到CAM0。

连接 I2C 和 GPIO 线路。

  1. 将CD0_SDA(J6 针脚 45)连接到 GPIO28(J6 针脚 1)。

  2. 将CD0_SCL(J6 针脚 47)连接到 GPIO29(J6 针脚 3)。

  3. 将CAM0_IO1(J6 针脚 49)连接到 GPIO30(J6 针脚 5)。

  4. 将CAM0_IO0(J6 针脚 51)连接到 GPIO31(J6 针脚 7)。

CM4

在CM4 IO板上,CAM1连接器已连接到GPIO44和GPIO45 上的I2C,shutdown线已连接到 GPIO 扩展器上的GPIO5,且未连接LED信号。除了将22-Pin FFC连接器连接到 CAM1 连接器(柔性触点面朝下)外,使用 CAM1 无需更改硬件。

连接第2个Raspberry Pi相机(到 CAM0),必须在 J6 上以垂直方向添加两个跳线。CAM0 连接器与 CAM1连接器共用shutdown线。

配置默认引脚状态 (所有处理器模块(CM)变体)

们用于相机的GPIO在CM上默认为输入模式,为了覆盖默认设置并告诉系统这些是相机要使用的引脚,我们需要创建一个 dt-blob.bin 文件(在系统启动时由固件加载)。该文件是根据包含所需设置的源dts文件构建的,并放置在启动分区上。

后文提供了 << 示例设备树源文件 >>,这些使用本章节描述的默认接线。

源dts的 pins_cm { } (CM1)、pins_cm3 { } (CM3) 或 pins_cm4 { } (CM4) 部分中的 pin_config 部分需要将摄像机的LED和电源使能引脚设置为输出:

pin@p2  { function = "output"; termination = "no_pulling"; };
pin@p3  { function = "output"; termination = "no_pulling"; };

如果需要告诉固件使用哪些引脚以及要查找多少个相机,请将以下内容添加到该 pin_defines 部分:

pin_define@CAMERA_0_LED { type = "internal"; number = <2>; };
pin_define@CAMERA_0_SHUTDOWN { type = "internal"; number = <3>; };
pin_define@CAMERA_0_UNICAM_PORT { type = "internal"; number = <1>; };
pin_define@CAMERA_0_I2C_PORT { type = "internal"; number = <0>; };
pin_define@CAMERA_0_SDA_PIN { type = "internal"; number = <0>; };
pin_define@CAMERA_0_SCL_PIN { type = "internal"; number = <1>; };

缩进和换行符并不重要,因此示例文件扩展了这些块以提高可读性。

处理器模块(CM)的 pin_config 部分需要配置第2个相机的 LED 和电源使能引脚:

pin@p30 { function = "output"; termination = "no_pulling"; };
pin@p31 { function = "output"; termination = "no_pulling"; };

在 dts 文件的处理器模块(CM) pin_defines 部分中,将 NUM_CAMERAS 参数更改为 2 并添加以下内容:

pin_define@CAMERA_1_LED { type = "internal"; number = <30>; };
pin_define@CAMERA_1_SHUTDOWN { type = "internal"; number = <31>; };
pin_define@CAMERA_1_UNICAM_PORT { type = "internal"; number = <0>; };
pin_define@CAMERA_1_I2C_PORT { type = "internal"; number = <0>; };
pin_define@CAMERA_1_SDA_PIN { type = "internal"; number = <28>; };
pin_define@CAMERA_1_SCL_PIN { type = "internal"; number = <29>; };

示例设备树源文件

将DTS文件编译为设备树blob

dts 文件进行所有必需的更改后,需要对其进行编译并将其放置在设备的启动分区上。

有关执行此操作的说明请参见 引脚配置 页面。

连接官方7英寸显示屏

Note
本章使用说明适用于高级用户, 如果有任何不清楚的地方,请使用 Raspberry Pi 处理器模块(CM)论坛 获取技术帮助。

在开始之前,请确保你的系统软件已更新。CM1、CM3 和CM4 采用的连接方法是相同的,但所需的物理设置存在细微差别。连接方法的步骤仅适用于特定平台。

Warning
Raspberry Pi Zero相机连接线不能用作RPI-DISPLAY适配器的替代品,因为它的接线不同。
Warning
请注意,显示器接口 支持热插拔,需要在电源关闭时才能进行连接或断开的操作。

快速入门 (仅显示)

连接到DISP1

  1. 通过22-Pin转15-Pin的显示适配器将显示器连接到CMIO板上的DSIP1端口

  2. (仅适用于 CM1 和 CM3)用跳线将这些引脚连接在一起:

     GPIO0 - CD1_SDA
     GPIO1 - CD1_SCL
  3. 给处理器模块(CM)上电并运行如下命令::

    sudo wget https://datasheets.raspberrypi.com/cmio/dt-blob-disp1-only.bin -O /boot/dt-blob.bin

  4. 重启以读取 dt-blob.bin 文件。

连接到DISP0

  1. 通过22-Pin转15-Pin的显示适配器将显示器连接到CMIO板上的 DISP0端口。

  2. (仅适用于 CM1 和 CM3)用跳线将这些引脚连接在一起:

     GPIO28 - CD0_SDA
     GPIO29 - CD0_SCL
  3. 给处理器模块(CM)上电并运行如下命令:

    sudo wget https://datasheets.raspberrypi.com/cmio/dt-blob-disp0-only.bin -O /boot/dt-blob.bin

  4. 重启以读取 dt-blob.bin 文件。

快速入门 (显示器和相机)

启用显示器和1个相机:*

  1. 通过22-Pin转15-Pin的显示适配器(称为 RPI-DISPLAY)将显示器连接到CMIO板上的DISP1端口。

  2. 通过22-Pin转15-Pin的显示适配器(称为 RPI-DISPLAY)将相机模块连接到CMIO板上CAM1端口,也可以使用Raspberry Pi Zero相机连接线来连接。

  3. (仅适用于 CM1 和 CM3)用跳线将这些引脚连接在一起:

     GPIO0 - CD1_SDA
     GPIO1 - CD1_SCL
     GPIO2 - CAM1_IO1
     GPIO3 - CAM1_IO0

    GPIO connection for a single display and Camera Modules (请注意,此图像需要更新以删除多余的跳线并使用标准接线(2&3而非4&5) )

  4. 给处理器模块(CM)上电并运行如下命令:

    sudo wget https://datasheets.raspberrypi.com/cmio/dt-blob-disp1-cam1.bin -O /boot/dt-blob.bin

  5. 重新启动以读取文件 dt-blob.bin

启用显示器和2个相机:*

  1. 按照上述步骤连接显示器和一个相机。

  2. 通过22-Pin转15-Pin的显示适配器(称为 RPI-DISPLAY)将相机模块连接到CMIO板上CAM0端口,也可以使用Raspberry Pi Zero相机连接线来连接。

  3. (仅适用于 CM1 和 CM3)用跳线将这些引脚连接在一起:

     GPIO28 - CD0_SDA
     GPIO29 - CD0_SCL
     GPIO30 - CAM0_IO1
     GPIO31 - CAM0_IO0
  4. (仅适用于 CM4)将跳线添加到 J6。

  5. 给处理器模块(CM)上电并运行如下命令:

    sudo wget https://datasheets.raspberrypi.com/cmio/dt-blob-disp1-cam2.bin -O /boot/dt-blob.bin

  6. 重启以读取 dt-blob.bin 文件。

    Camera Preview on the 7 inch display (请注意,此图像需要更新以显示两个相机模块和标准接线)

软件支持

启用触摸屏无需额外配置,当成功检测到屏幕后,触摸界面即可使用。

如果你希望禁用触摸屏并仅使用显示屏,则可以将 disable_touchscreen=1 命令添加到 /boot/config.txt 中。

要使固件即使在连接后也忽略显示,请添加 ignore_lcd=1 到 /boot/config.txt。

固件配置

固件在dt-blob.bin文件中查找用于屏幕的相关配置,其查看pin_number@定义为:

DISPLAY_I2C_PORT
DISPLAY_SDA
DISPLAY_SCL
DISPLAY_DSI_PORT

I2C端口、SDA和SCL引脚编号是确定的,DISPLAY_DSI_PORT可以连接DSI1和DSI0端口,其中默认连接DSI1端口。

dts 文件进行所有必需的更改后,需要对其进行编译并将其放置在设备的启动分区上。

有关执行此操作的说明,请参见 引脚配置 页面。