Dear nxp fae;
我使用i.mx6q sabresd移植adv7180时、遇到一下问题,项目比较紧急,还希望您们能够多多帮助。
系统是android6.0,内核是4.1.15
附件一为dts,
附件二是内核配置
附件三为模块加载顺序和出错部分
之前使用非模块加载,直接配置进内核,出现:
DBG sensor data is at c1255f50
但是没有提示到adv7180加载到i2c上成功、是不是由于i2c错误引起啦驱动不能正常工作?
目前已经协助硬件正在排查,还希望能够得到您们指导,
将不胜感激!
Hello black,
我们的Sabre Auto 板子已经支持了ADV7180,Sabre Auto板子的device tree文件是:
linux-imx-4.9.88/arch/arm/boot/dts/imx6qdl-sabreauto.dtsi,要在device tree里支持ADV7180,只需要 这几个步骤:
1. I2C的不用配置。开发板用I2C3
pinctrl_i2c3: i2c3grp {
fsl,pins = <
MX6QDL_PAD_GPIO_3__I2C3_SCL 0x4001b8b1
MX6QDL_PAD_EIM_D18__I2C3_SDA 0x4001b8b1
>;
};
2. ADV7180挂载I2C3 bus的节点
&i2c3 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_i2c3>;
status = "okay";
adv7180: adv7180@21 {
compatible = "adv,adv7180";
reg = <0x21>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_ipu1_1>;
clocks = <&clks IMX6QDL_CLK_CKO>;
clock-names = "csi_mclk";
DOVDD-supply = <®_3p3v>; /* 3.3v, enabled via 2.8 VGEN6 */
AVDD-supply = <®_3p3v>; /* 1.8v */
DVDD-supply = <®_3p3v>; /* 1.8v */
PVDD-supply = <®_3p3v>; /* 1.8v */
pwn-gpios = <&max7310_b 2 0>; /* 这是使用了扩展的GPIO,你要检查一下7180 DRIVER,是否你不用这个 */
csi_id = <0>;
mclk = <24000000>;
mclk_source = <0>;
cvbs = <1>;
};
3. CSI0复用(如果你是8bit的,那么复用CSI0_DAT12~CSI0_DAT19,硬件也连接到这8个脚上)
pinctrl_ipu1_1: ipu1grp-1 { /* parallel port 16-bit */
fsl,pins = <
MX6QDL_PAD_CSI0_DAT4__IPU1_CSI0_DATA04 0x80000000
MX6QDL_PAD_CSI0_DAT5__IPU1_CSI0_DATA05 0x80000000
MX6QDL_PAD_CSI0_DAT6__IPU1_CSI0_DATA06 0x80000000
MX6QDL_PAD_CSI0_DAT7__IPU1_CSI0_DATA07 0x80000000
MX6QDL_PAD_CSI0_DAT8__IPU1_CSI0_DATA08 0x80000000
MX6QDL_PAD_CSI0_DAT9__IPU1_CSI0_DATA09 0x80000000
MX6QDL_PAD_CSI0_DAT10__IPU1_CSI0_DATA10 0x80000000
MX6QDL_PAD_CSI0_DAT11__IPU1_CSI0_DATA11 0x80000000
MX6QDL_PAD_CSI0_DAT12__IPU1_CSI0_DATA12 0x80000000
MX6QDL_PAD_CSI0_DAT13__IPU1_CSI0_DATA13 0x80000000
MX6QDL_PAD_CSI0_DAT14__IPU1_CSI0_DATA14 0x80000000
MX6QDL_PAD_CSI0_DAT15__IPU1_CSI0_DATA15 0x80000000
MX6QDL_PAD_CSI0_DAT16__IPU1_CSI0_DATA16 0x80000000
MX6QDL_PAD_CSI0_DAT17__IPU1_CSI0_DATA17 0x80000000
MX6QDL_PAD_CSI0_DAT18__IPU1_CSI0_DATA18 0x80000000
MX6QDL_PAD_CSI0_DAT19__IPU1_CSI0_DATA19 0x80000000
MX6QDL_PAD_CSI0_PIXCLK__IPU1_CSI0_PIXCLK 0x80000000
MX6QDL_PAD_CSI0_MCLK__IPU1_CSI0_HSYNC 0x80000000
MX6QDL_PAD_CSI0_VSYNC__IPU1_CSI0_VSYNC 0x80000000
>;
};
你最好在adv7180的probe里加上调试信息,以确认是否I2C找到它了;另外adv7180的I2C地址是否正确也要检查一下。无论如何,I2C找不到adv7180就是没有办法继续调下去。
所以,对比一下imx6qdl-sabreauto.dtsi,是不是什么地方出了问题。
另外:如果你不把模块编译进内核,那么你可以试试modprobe 加载.ko驱动(如果insmod 不行的话),最后调试好,你还是要把它编译进内核的。
BR,
weidong
Hi Wigros,
非常感谢您的帮助,我这边昨天上午已经调试成功。我是使用模块加载的形式,主要失败的原因是处在模块加载的顺序上
具体步骤:
insmod v4l2-int-device.ko 此步必须先执行
insmod adv7180_tvin.ko
insmod ipu_prp_enc.ko
insmod ipu_bg_overlay_sdc.ko
insmod ipu_fg_overlay_sdc.ko
insmod ipu_csi_enc.ko
insmod ipu_still.ko
insmod mxc_v4l2_capture.ko
再使用mxc-v4l2-tvin测试即可,但是最大的疑问就是我之前使用直接编译进内核为何不行,顺序会影响结果?
正如您所说,最后我还是要编译进内核,您是否有更好的建议。
再次对您表示感谢!!!
不错,干得好! 编译进内核是个好的选择!
伟东
Hi Wigros
非常感谢、我昨天这边已经调试成功啦,我的i2c和设备树都没有问题。
我昨天具体是使用模块加载的方法成功的。我最大的错误就是把加载模块的顺序搞错啦。
正确顺序是:
insmod v4l2-int-device.ko 这一步必须放在第一位,此步骤是初始化v4l2
insmod adv7180_tvin.ko
insmod ipu_prp_enc.ko
insmod ipu_bg_overlay_sdc.ko
insmod ipu_bg_overlay_sdc.ko
insmod ipu_csi_enc.ko
insmod ipu_still.ko
insmod mxc_v4l2_capture.ko
再使用mxc-v4l2-tvin 测试即可。
现在唯一的疑问是为啥我使用非模块化编进内核无法使用,是否是由于顺序的影响?