本页目录

  • 设备树覆盖配置
  • I2C配置示例
  • 通过I2C连接BME280传感器
  • 编译覆盖
  • SPI配置示例
  • 出厂模式
  • 故障排除

OAK4 SoM 开发指南

Luxonis OAK4 SoM 设备支持灵活的外设配置,用户可以在多种引脚上启用或禁用 I2C、SPI 和 UART 功能。默认情况下,大多数引脚配置为通用 I/O(GPIO)。然而,用户可以将支持的引脚重新配置为外设接口。需要注意的是,并非所有引脚都支持所有外设。下表列出了可用的 QUPv3 和 I2CHUB 引擎以及各自的配置方式。如果您的用例需要表中未列出的配置,或者引脚标记为“当前未开放”,请联系 Luxonis 技术支持以帮助创建具有不同开放选项的自定义配置。
QUPv3 引擎模式引脚备注
QUPv3_SE0I2C
  • SDA: GPIO28
  • SCL: GPIO29
QUPv3_SE1SPI
  • MISO: GPIO32
  • MOSI: GPIO33
  • SCLK: GPIO34
  • CS0: GPIO35
QUPv3_SE2SPI
  • MISO: GPIO36
  • MOSI: GPIO37
  • SCLK: GPIO38
  • CS0: GPIO39
  • CS1: GPIO40
  • CS2: GPIO41
  • CS3: GPIO42
QUPv3_SE3//当前未开放
QUPv3_SE4I2C
  • SDA: GPIO44
  • SCL: GPIO45
默认启用
QUPv3_SE5I2C
  • SDA: GPIO52
  • SCL: GPIO53
QUPv3_SE6//当前未开放
QUPv3_SE7UART
  • TX: GPIO26
  • RX: GPIO27
QUPv3_SE8I2C
  • SDA: GPIO0
  • SCL: GPIO1
QUPv3_SE9I3C
  • SDA: GPIO60
  • SCL: GPIO61
QUPv3_SE10SPI
  • MISO: GPIO64
  • MOSI: GPIO65
  • SCLK: GPIO66
  • CS0: GPIO67
QUPv3_SE11SPI
  • MISO: GPIO68
  • MOSI: GPIO69
  • SCLK: GPIO70
  • CS0: GPIO71
QUPv3_SE12I2C
  • SDA: GPIO2
  • SCL: GPIO3
默认启用
QUPv3_SE13//当前未开放
QUPv3_SE14UART
  • CTS: GPIO76
  • RFR: GPIO77
  • TX: GPIO78
  • RX: GPIO79
高速 UART,硬件流控制
QUPv3_SE15//当前未开放
I2CHUB_SE0//当前未开放
I2CHUB_SE1//当前未开放
I2CHUB_SE2I2C
  • SDA: GPIO20
  • SCL: GPIO21
默认启用
I2CHUB_SE3I2C
  • SDA: GPIO22
  • SCL: GPIO23
I2CHUB_SE4I2C
  • SDA: GPIO4
  • SCL: GPIO5
I2CHUB_SE5//当前未开放
I2CHUB_SE6//当前未开放
I2CHUB_SE7//当前未开放
I2CHUB_SE8//当前未开放
I2CHUB_SE9//当前未开放

设备树覆盖配置

外设配置通过设备树覆盖(DTO)实现,这些覆盖在启动时应用。覆盖必须放置在设备上的 /persist/custom/dtbo 目录中。系统启动时,会应用此目录中的所有覆盖以达到所需的引脚配置。此文件夹中的文件在OTA更新后仍会保留,不会被删除。

I2C配置示例

通过I2C连接BME280传感器

假设您想使用GPIO52(SDA)和GPIO53(SCL)连接博世BME280压力传感器。根据上表,这些引脚由QUPv3 SE5引擎管理。要启用此接口,请在工作目录中创建设备树覆盖(例如 bme280.dts):
Dts
1/dts-v1/;
2/plugin/;
3
4/ {
5  fragment@0 {
6    target = <&qupv3_se5_i2c>;
7    __overlay__ {
8      status = "ok";
9      #address-cells = <1>;
10      #size-cells = <0>;
11
12      bme280@76 {
13        compatible = "bosch,bme280";
14        reg = <0x76>;
15      };
16    };
17  };
18};
关键行是 status = "ok";,它实际启用所选的I2C引擎。没有它,外设将保持禁用状态。
注意: 对于 target,QUP引擎使用 &qupv3_seX_i2c,HUB引擎使用 &qupv3_hub_i2cX,其中 X 是引擎索引。

编译覆盖

使用SDK Docker容器编译源文件。在工作目录内运行以下命令:
Command Line
1docker run --rm \
2  -v /etc/passwd:/etc/passwd:ro \
3  -v /etc/shadow:/etc/shadow:ro \
4  -v "$PWD":"$PWD" \
5  -w "$PWD" \
6  --user=$(id -u):$(id -g) --group-add 27 \
7  luxonis/luxonis-os-rvc4:<SDK_version>-public \
8  /bin/bash -c "dtc -@ -I dts -O dtb -o bme280.dtbo bme280.dts"
注意: <SDK_version> 必须与目标设备刷写的OS版本一致(例如 1.8.0)。如果您使用的是最新的OS版本,也可以使用 latest
将编译好的 .dtbo 文件传输到目标设备:
Command Line
1scp /app/test-overlay/bme280.dtbo user@<device-ip>:/persist/custom/dtbo/
然后重启设备。启动时,覆盖将自动应用。通过检查 /sys/bus/i2c/devices/ 来验证I2C设备是否已注册。

SPI配置示例

启用SPI接口的过程类似。以下是在QUPv3 SE1上启用SPI的DTO示例:
Dts
1/dts-v1/;
2/plugin/;
3
4/ {
5  fragment@0 {
6    target = <&qupv3_se1_spi>;
7    __overlay__ {
8      status = "ok";
9    };
10  };
11};
编译并传输覆盖:
Command Line
1docker run --rm \
2  -v /etc/passwd:/etc/passwd:ro \
3  -v /etc/shadow:/etc/shadow:ro \
4  -v "$PWD":"$PWD" \
5  -w "$PWD" \
6  --user=$(id -u):$(id -g) --group-add 27 \
7  luxonis/luxonis-os-rvc4:latest-public \
8  /bin/bash -c "dtc -@ -I dts -O dtb -o spi-overlay.dtbo spi-overlay.dts"
Command Line
1scp spi_se1.dtbo user@<device-ip>:/persist/custom/dtbo/
重启设备后,SPI接口即应启用。

出厂模式

出厂模式是Luxonis OS的一种模式,使设备在工厂环境中易于使用。它对于测试设备非常有用。它可以在任何类型的OAK4设备上启用,但对于使用SoM开发的人尤其有用,这些SoM默认也以出厂模式发货。出厂模式会移除 root 用户的密码,并允许使用空密码通过SSH登录(无密码登录)。通过创建 /persist/factory/enabled 文件(文件内容无关紧要)进入出厂模式。启动时,如果找到此文件,出厂模式即被触发。要恢复并退出出厂模式,在系统上运行此命令:
Command Line
1rm /persist/factory/enabled && cp -r /persist/factory/original_files/* / && rm -rf /persist/factory/original_files && sync && reboot
下次启动时,系统将以正常模式运行,默认root密码为 oelinux123,SSH密码登录被禁用。

故障排除

如果尝试了不受支持的外设配置——例如将外设分配给不兼容的QUPv3引擎——设备可能无法启动。在这种情况下,TrustZone引擎阻止了系统继续运行。要恢复:
  1. 进入紧急下载模式(EDL)
  2. 使用已知良好的镜像重新刷写设备。
有关如何执行完整OS刷写的步骤,请查看以下页面:完整OS刷写为了帮助调试,请使用 dmesg 检查内核消息:
Command Line
1dmesg | less
查找与设备树解析、外设激活或安全策略违规相关的错误。可选地,检查设备树覆盖加载脚本的日志:
Command Line
1journalctl -u apply-overlays.service