本文记录了在 Hailo15(H15H)平台上 bring up 一个新的 Sony IMX678 camera sensor
的完整过程,主要涉及 I2C 地址确认、GPIO reset 验证以及 sensor 时钟频率修改等步骤。
1. 确认 Sensor 的 I2C 地址
在 1.9.1 版本中,H15H 只支持一个 sensor。
首先我们通过以下命令查看 I2C0 总线上的设备:
i2cdetect -y 0 -r
确认 sensor 实际挂载在 I2C0 通道下,地址为 0x36,
因此需要修改设备树中的 reg。
sensor_0: camera-sensor@1a {
status = "ok";
compatible = "sony,imx334", "sony,imx664", "sony,imx675", "sony,imx678", "sony,imx715";
- reg = <0x1a>;
+ reg = <0x36>;
2. 确认 Reset GPIO 及其极性
根据原理图,sensor 的 reset pin 对应的是 GPIO4。
H15 支持通用的 GPIO 命令,如 gpiodetect、gpioinfo、gpioset
(某些 SoC 可能使用其他方式)。
可以通过如下命令,结合原理图进行确认:
gpioset gpiochip0 4=0
sleep 0.02
i2cdetect -y 0 -r
gpioset gpiochip0 4=1
sleep 0.02
i2cdetect -y 0 -r

通过对比 reset 前后 I2C 探测结果,可以判断:
- reset 信号是否真实连通
- reset 的有效电平是低有效还是高有效
最终设备树中 reset GPIO 的极性修改如下:
- reset-gpios = <&gpio0 4 GPIO_ACTIVE_HIGH>;
+ reset-gpios = <&gpio0 4 GPIO_ACTIVE_LOW>;
3. 修改 Sensor 输入时钟(24M → 27M)
H15H 标准 SBC 板使用的是 24MHz 晶振(CAM_0_CLK)。
但通过原理图确认,客户板上使用的是
OSC-SMD2520_4P,实际为 27MHz。
因此需要修改 DTS 中的时钟频率:
- clock-frequency = <24000000>;
+ clock-frequency = <27000000>;
同时,fixed-clock 也需要同步修改:
sensor_clk: sensor_clk {
compatible = "fixed-clock";
#clock-cells = <0>;
- clock-frequency = <24000000>;
+ clock-frequency = <27000000>;
};
另外,建议同时修改 IMX678 驱动源码中的默认输入时钟(是否必须尚未验证):
+++ b/drivers/media/i2c/imx678.c
@@ -107,8 +107,8 @@ enum imx678_input_clk_rate_code {
INPUT_CLK_13_5_MHZ,
};
-#define IMX678_INCLK_CODE INPUT_CLK_24_MHZ
-#define IMX678_INCLK_RATE 24000000
+#define IMX678_INCLK_CODE INPUT_CLK_27_MHZ
+#define IMX678_INCLK_RATE 27000000
可以通过如下命令查看最终设置的CLK
cat /sys/kernel/debug/clk/clk_summary | grep sensor_clk
注意事项
在通过 Yocto 尝试编译 kernel 时,我采用了如下方式来重新生成 fitImage:
devtool modify linux-yocto-hailo
devtool build linux-yocto-hailo
但这种方式在 camera sensor 相关部分仍然遗漏了一些driver的module,
导致部分地方不兼容。
推测原因可能是 kernel 版本包含小版本号所致:
5.15.325.15.32-yocto-standard-g5aaf14507b5a-dirty
(尚未完全验证)
此外,我还在 kernel 配置中增加了:
CONFIG_VIDEO_IMX678=y
该配置是否为必须项,目前同样尚未验证。
完
发表回复