Skip to content

计算模块连接和启用外围设备指南

请注意,除非另有明确说明,否则这些说明将在计算模块和计算模块 3 模块+ IO板上相同地工作。

介绍

本指南旨在帮助使用计算模块(和计算模块 3 )的开发人员掌握如何将外围设备连接到计算模块引脚的方法,以及如何对软件进行更改以使这些外围设备正常工作。

计算模块(CM)和计算模块 3 (CM3)包含在芯片(SoC)或"处理器",内存和 eMMC 上的树莓派 BCM2835(或 CM3 的 BCM2837 )系统。 eMMC与 SD 卡相似,但被焊接到板上。与 SD 卡不同,eMMC专为用作磁盘而设计,并具有使其在这种使用情况下更加可靠的额外功能。 SoC的大多数引脚(GPIO,两个 CSI 摄像头接口,两个 DSI 显示接口,HDMI等)都是免费提供的,可以根据用户认为合适的方式进行布线(或者,如果不使用,通常可以保持未连接状态)。计算模块是与 DDR2 SODIMM尺寸兼容的模块,因此应该可以使用任何 DDR2 SODIMM插槽(请注意,引脚排列与实际的 SODIMM 内存模块不同)。

要使用计算模块,用户需要设计一个(相对简单的)"主板",该主板可以为计算模块供电(最低 3 .3V和 1 .8V),并将引脚连接到用户应用所需的外设。

树莓派为计算模块(称为计算模块 IO 板,或 CMIO 板)提供了最小的主板,该模块为模块供电,带出 GPIO 到引脚接头,并将摄像头和显示接口带到 FFC 连接器。它还提供 HDMI ,USB和" ACT" LED,并且能够通过 USB 从 PC 或树莓派对模块的 eMMC 进行编程。

本指南首先说明了引导过程以及如何使用设备树来描述所连接的硬件。这些是使用 Compute Module进行设计时必须了解的基本知识。然后,它提供了一个有效的示例,该示例将 I2C 和 SPI 外设连接到 CMIO (或 CM3 的 CMIO V3)板上,并创建了使两个外设都在 Linux 下工作所需的设备树文件(从香草树莓派 OS映像开始)。

BCM283x GPIO

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

在计算模块上,Bank 0和 Bank 1均可免费使用。 Bank 2用于 eMMC 和 HDMI 热插拔检测以及 ACT LED/USB启动控制。

在正在运行的系统上查看每个 GPIO 引脚的状态(它们设置的功能以及该引脚上的电压电平)非常有用,这样您就可以查看系统是否按预期设置。如果您想查看设备树是否按预期工作,或者在硬件调试期间查看引脚状态,这将特别有用。

树莓派提供了 raspi -gpio软件包,该软件包是用于破解和调试 GPIO 的工具(注意:您需要以 root 身份运行它)。 要安装raspi-gpio

sudo apt安装 raspi -gpio

如果apt找不到raspi-gpio软件包,则需要先进行更新:

sudo apt update

要获得有关raspi-gpio的帮助,请使用 help 参数运行它:

sudo raspi-gpio help

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

sudo raspi-gpio get

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

sudo raspi-gpio功能> gpio-funcs.csv

BCM283x引导过程

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

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

树莓派和计算模块板上使用的 BCM283x 器件具有三个阶段的引导过程:1. GPU DSP退出复位状态,并从小型内部 ROM (引导 ROM )执行代码。该代码的唯一目的是通过一个外部接口加载第二阶段引导加载程序。在树莓派或计算模块上,此代码首先在 SD 卡(eMMC)上查找第二阶段引导加载程序;它希望将其称为" bootcode.bin",并且位于第一个分区(必须为 FAT32 )上。如果未找到 SD 卡或未找到" bootcode.bin",则 Boot ROM会处于等待状态,并处于" USB boot"模式,等待主机通过 USB 接口为其提供第二阶段的引导加载程序。 2.第二阶段引导加载程序(sdcard上的 bootcode .bin或 USB 引导的 usbbootcode .bin)负责设置 LPDDR2 SDRAM接口和各种其他关键系统功能,然后加载并执行主 GPU 固件(再次在主 SD 卡分区上称为" start.elf")。

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

设备树

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

在 Pi 或计算模块上,SD/eMMC的第一个 FAT 分区中有多个文件是二进制"设备树"文件。这些二进制文件(通常带有扩展名" .dtb")是由设备树编译器根据人类可读的文本描述(通常带有扩展名" .dts"的文件)编译而成的。

在第一个(FAT)分区中的标准树莓派 OS映像上,您会找到两种不同类型的设备树文件,一种仅由 GPU 使用,其余的是每种基于 BCM283x 的 Pi 产品的标准 ARM 设备树文件:

dt-blob.bin(由 GPU 使用) bcm2708-rpi-b.dtb(用于 Pi 型号 A 和 B ) bcm2708-rpi-b-plus.dtb(用于 Pi 型号 B +和 A +) bcm2709-rpi-2-b.dtb(用于 Pi 2模型 B ) bcm2710-rpi-3-b.dtb(用于 Pi 3模型 B ) bcm2708-rpi-cm.dtb(用于 Pi 计算模块) *bcm2710-rpi-cm3.dtb(用于 Pi 计算模块 3 )

注意默认情况下dt-blob.bin不存在,因为有一个'default'版本被编译到start.elf中,但是对于 Compute Module项目,通常需要提供dt-blob.bin(会覆盖默认的内置文件)。

请注意," dt-blob.bin"为已编译的设备树格式,但仅由 GPU 固件读取以设置 GPU 独有的功能-参见下文。

创建 dt -blob.bin的指南在here。 树莓派的 Linux 设备树的综合指南位于此处

在启动过程中,用户可以通过 config .txt中的 device _tree参数指定要使用的特定 ARM 设备树,例如,将 device _tree = mydt.dtb行添加到 config .txt中,其中 mydt .dtb `是要加载的 dtb 文件,而不是标准 ARM dtb文件之一。尽管用户可以为其计算模块产品创建完整的设备树,但建议的添加硬件的方法是使用覆盖(请参阅下一节)。

除了加载 ARM dtb之外,start.elf还支持通过 config .txt中的 dtoverlay 参数来加载其他设备树" overlays",例如,根据需要添加尽可能多的dtoverlay = myoverlay行作为 overlays 。 config.txt,注意叠加层生活在/overlays中,并带有-overlay.dtb'后缀,例如/overlays/myoverlay-overlay.dtb`。启动数据之前,将覆盖层与基本 dtb 文件合并,然后再将数据传递给 Linux 内核。

覆盖层用于将数据添加到(名义上)描述非特定于板卡的硬件的基本 dtb 。这包括使用的 GPIO 引脚及其功能以及所连接的设备,以便可以加载正确的驱动程序。约定是在树莓派上,应使用覆盖图描述与 Bank0 GPIO相连的所有硬件(GPIO头)。在计算模块上,应在覆盖文件中描述与 Bank0 和 Bank1 GPIO相连的所有硬件。您不必遵循这些约定:您可以如前所述将所有信息滚动到一个 dtb 文件中,替换为bcm2708-rpi-cm.dtb。但是,遵循约定意味着您可以使用"标准" 树莓派 OS版本,其标准基础 dtb 以及所有特定于产品的信息都包含在单独的覆盖中。有时基本 dtb 可能会更改-通常以不会破坏叠加层的方式-这就是为什么建议使用叠加层的原因。

dt-blob.bin当 start .elf运行时,它首先读取名为 dt -blob.bin的东西。这是设备树 Blob 的一种特殊形式,它告诉 GPU 如何(初始)设置 GPIO 引脚状态,以及有关由 GPU 控制(拥有)而不是通过 Linux 在 Linux 上使用的 GPIO /外设的任何信息。手臂。例如,树莓派相机外围设备由 GPU 管理,GPU需要对 I2C 接口的独占访问权才能与之对话,以及几个控制引脚。大多数 Pi 板和计算模块上的 I2C0 标称保留用于 GPU 专用。有关 GPU 应该将哪个 GPIO 引脚用于 I2C0 以及控制相机功能的信息,请参阅dt-blob.bin

注意:" start.elf"固件具有"内置"默认值" dt-blob.bin",如果在第一个 FAT 分区的根目录上未找到" dt-blob.bin",则使用该默认值。大多数计算模块项目都希望提供自己的自定义dt-blob.bin。请注意," dt-blob.bin"指定了用于 HDMI 热插拔检测的引脚,尽管在计算模块上永远不要改变。它还可以用于将 GPIO 设置为 GPCLK 输出,并指定启动时 GPU 可以使用的 ACT LED。将来可能会添加其他功能。有关dt-blob.bin的信息,请参见here

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,其中包含许多其他的系统设置选项(请参阅here以获取全面指南)。

读取 config .txt文件后,读取另一个特定于硬件运行的主板的设备树文件:对于计算模块,这是bcm2708-rpi-cm.dtb,对于计算模块是bcm2710-rpi-cm.dtb。 CM3。该文件是标准的 ARM Linux设备树文件,其中详细说明了如何将硬件连接到处理器:SoC中存在哪些外围设备以及在何处使用哪些 GPIO ,这些 GPIO 具有什么功能以及连接了哪些物理设备。该文件将适当地设置 GPIO ,并覆盖在 dt -blob.bin中设置的引脚状态。它还将尝试加载特定设备的驱动程序。

尽管" bcm2708-rpi-cm.dtb"文件可用于加载所有连接的设备,但对于计算模块用户,建议不要使用此文件。相反,请使用标准树莓派 OS软件映像中提供的映像,并使用自定义的"覆盖"文件添加设备,如前所述。 bcm2708-rpi-cm.dtb文件包含各种外设(I2C,SPI,I2S等)的(禁用)条目,并且没有 GPIO 引脚定义,除了具有 GPIO 定义并已启用的 eMMC /SD卡外设,因为它总是在相同的引脚上。想法是,单独的覆盖文件将启用所需的接口,描述所使用的引脚以及所需的驱动程序。在将合并后的设备树引导至 Linux 内核之前,start.elf固件将读取 bcm2708 -rpi-cm.dtb并将其与覆盖数据合并。

设备树的源代码和编译

树莓派 OS映像提供了已编译的 dtb 文件,但是源 dts 文件在哪里?它们位于GitHub上的树莓派 Linux内核分支中。查看" arch/arm/boot/dts"文件夹。

一些默认的覆盖 dts 文件位于" arch/arm/boot/dts/overlays"中。可以连接到树莓派 OS映像中的 树莓派 的标准硬件的相应覆盖物位于/overlays目录的 FAT 分区上。请注意,它们假定在 BANK0 上使用某些引脚,因为它们在树莓派上使用。通常,除非您使用与将硬件插入树莓派的 GPIO 接头中所使用的相同的 GPIO 引脚,否则请使用这些标准覆盖图的来源作为创建自己的指南。

将这些 dts 文件编译为 dtb 文件需要设备树编译器" dtc"的最新版本。更多信息可以在here中找到,但是在 Pi 上安装适当版本的简单方法是运行:

sudo apt安装设备树编译器

如果您正在构建自己的内核,那么构建主机还会在scripts/dtc中获得一个版本。您可以通过以下方式来自动构建叠加层:将其添加到" arch/arm/boot/dts/overlays"中的" Makefile"中,并使用" dtbs" make目标。

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

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

dtc -I fs -O dts -o proc-dt.dts/proc /设备树

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

raspi-gpio得到

如果看起来有些不对劲,也可以通过转储 GPU 日志消息找到有用的信息:

sudo vcdbg日志消息

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

获得帮助

请使用树莓派论坛上的设备树子论坛来询问与设备树有关的问题。

例子

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

对于每个示例,我们假定 CM + CMIO或 CM3 + CMIO3板均在 CM 上全新安装了树莓派 OS Lite最新版本。请参阅说明此处

此处的示例需要 Internet 连接,因此建议将 USB 集线器,键盘以及无线 LAN 或以太网加密狗插入 CMIO USB端口。

请在树莓派 设备树子论坛上发布任何问题,错误或问题。

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

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

下载minimum-cm-dt-blob.dts,并将其复制到 CM 启动时复制到"/boot"中的 SD 卡 FAT 分区中。

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

sudo 纳米/boot/minimal-cm-dt-blob.dts

换行:

pin @ p44 {function =" input";终止=" pull_down"; }; //默认状态未输入
pin @ p45 {function =" input";终止=" pull_down"; }; //默认状态未输入

至:

pin @ p44 {function =" i2c1";终止=" pull_up"; }; //SDA1
pin @ p45 {function =" i2c1";终止=" pull_up"; }; //SCL1

注意:我们可以不加更改地使用此 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

注意dtc命令行中的'-@'。如果要使用外部引用编译 dts 文件,则这是必要的,因为覆盖层往往是这样。

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

dtoverlay = example1

现在保存并重新启动。

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

sudo hwclock

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

示例 2 -在 BANK0 上连接 ENC28J60 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)功能。

安装一个或多个摄像头

要安装一个或多个摄像机,请参阅文档此处