全志V853移植imx335摄像头记录

本文详细介绍了IMX335传感器的移植过程,包括核对原理图、修改设备树、驱动文件、modules.mk以及S00MPP设置,同时记录了移植中遇到的I2C通讯和数据接收错误等问题及解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

本文就介绍了imx335 索尼sensor移植过程,本文禁止转载


一、imx335 sensor

1.最大支持5M/30fps

2.支持2/4lane mipi csi输出

3.支持10-bit / 12-bit A/D converter

4.支持HDR

5.输出RAW10 / RAW12

二、移植步骤

1.核对原理图,确认使用的I2C、mipi引脚

2.修改设备树board.dts

这里只使用2lane mipi CSI,注意sensor I2C地址,否则会报I2C通讯异常问题

代码如下(示例):

			sensor0:sensor@0 {
				device_type = "sensor0";
				sensor0_mname = "imx335_mipi";
				sensor0_twi_cci_id = <1>;
				sensor0_twi_addr = <0x34>;
				sensor0_mclk_id = <0>;
				sensor0_pos = "rear";
				sensor0_isp_used = <1>;
				sensor0_fmt = <1>;
				sensor0_stby_mode = <0>;
				sensor0_vflip = <0>;
				sensor0_hflip = <0>;
				sensor0_iovdd-supply = <&reg_aldo2>;
				sensor0_iovdd_vol = <1800000>;
				sensor0_avdd-supply = <&reg_bldo2>;
				sensor0_avdd_vol = <2800000>;
				sensor0_dvdd-supply = <&reg_dldo2>;
				sensor0_dvdd_vol = <1200000>;
				sensor0_power_en = <>;
				sensor0_reset = <&pio PA 18 1 0 1 0>;
				sensor0_pwdn = <&pio PA 19 1 0 1 0>;
				sensor0_sm_hs = <>;
				sensor0_sm_vs = <>;
				flash_handle = <&flash0>;
				act_handle = <&actuator0>;
				status	= "okay";
			};

2.修改imx335驱动文件

a.mipi接收改成2lane, sensor输出也改成2lane

b.配置sensor_win_sizes 

c.使用12bit AD,图像正常输出,能看到正常轮廓

代码如下(示例):

static struct sensor_win_size sensor_win_sizes[] = {
	 .width = 2592,
	 .height = 1920,
	 .hoffset = 0,
	 .voffset = 12,
	 .hts = 660,
	 .vts = 4500,
	 .pclk = 74250000,
	 .mipi_bps = 1188 * 1000 * 1000,
	 .fps_fixed = 25,
	 .bin_factor = 1,
	 .lp_mode = SENSOR_LP_DISCONTINUOUS,
	 .intg_min = 1 << 4,
	 .intg_max = (4500 - 10) << 4,
	 .gain_min = 1 << 4,
	 .gain_max = 2000 << 4,
	 .regs = sensor_12b_2592x1944_p25_regs,
	 .regs_size = ARRAY_SIZE(sensor_12b_2592x1944_p25_regs),
	 .set_size = NULL,
	 .top_clk = 310*1000*1000,
	 .isp_clk = 297*1000*1000,
}

static struct regval_list sensor_12b_2592x1944_p25_regs[] = {
	// 2592x1944-12bit-25fps
	{0x3000, 0x01}, //stanby
	{0x3002, 0x00}, //master mode
	{0x3004, 0x04},
	{0x3004, 0x00},
	//All pixel AD Conversion 12bit / Output 12 bit / 1188 Mbps /25fps
	{0x3018, 0x00}, //All-pixel scan mode
	{0x3030, 0x94}, //VMAX 4500
	{0x3031, 0x11}, //VMAX
	{0x3032, 0x00}, //VMAX
	{0x3034, 0x94}, //HMAX 660
	{0x3035, 0x02}, //HMAX
	{0x304c, 0x14}, //OPB_SIZE_V
	{0x304e, 0x00}, //HREVERSE
	{0x304f, 0x00}, //VREVERSE
    ................
}

3.修改modules.mk

define KernelPackage/vin-v4l2
  SUBMENU:=$(VIDEO_MENU)
  TITLE:=Video input support (staging)
  DEPENDS:=
  FILES:=$(LINUX_DIR)/drivers/media/v4l2-core/videobuf2-core.ko
  FILES+=$(LINUX_DIR)/drivers/media/v4l2-core/videobuf2-dma-contig.ko
  FILES+=$(LINUX_DIR)/drivers/media/v4l2-core/videobuf2-memops.ko
  FILES+=$(LINUX_DIR)/drivers/media/v4l2-core/videobuf2-v4l2.ko
  FILES+=$(LINUX_DIR)/drivers/media/platform/sunxi-vin/vin_io.ko
  FILES+=$(LINUX_DIR)/drivers/media/platform/sunxi-vin/modules/sensor/gc2053_mipi.ko
  FILES+=$(LINUX_DIR)/drivers/media/platform/sunxi-vin/modules/sensor/imx335_mipi.ko
#  FILES+=$(LINUX_DIR)/drivers/media/platform/sunxi-vin/modules/sensor_power/sensor_power.ko
  FILES+=$(LINUX_DIR)/drivers/media/platform/sunxi-vin/vin_v4l2.ko
  FILES+=$(LINUX_DIR)/drivers/input/sensor/da380/da380.ko
#  AUTOLOAD:=$(call AutoProbe,videobuf2-core videobuf2-dma-contig videobuf2-memops videobuf2-v4l2 vin_io gc2053_mipi vin_v4l2 da380.ko)
  AUTOLOAD:=$(call AutoProbe,videobuf2-core videobuf2-dma-contig videobuf2-memops videobuf2-v4l2 vin_io imx335_mipi vin_v4l2 da380.ko)

4.修改S00MPP

start() {
    printf "Load mpp modules\n"
    insmod $MODULES_DIR/videobuf2-core.ko
    insmod $MODULES_DIR/videobuf2-memops.ko
    insmod $MODULES_DIR/videobuf2-dma-contig.ko
    insmod $MODULES_DIR/videobuf2-v4l2.ko
    insmod $MODULES_DIR/vin_io.ko
 #   insmod $MODULES_DIR/sensor_power.ko
    insmod $MODULES_DIR/imx335_mipi.ko
    insmod $MODULES_DIR/vin_v4l2.ko
    insmod $MODULES_DIR/sunxi_aio.ko
    insmod $MODULES_DIR/sunxi_eise.ko
#   insmod $MODULES_DIR/vipcore.ko
}

5.重新编译驱动运行问题记录:

1.i2c通讯报错,用示波器量发现有波形输出,检测发现i2c地址配置不正确,修改后正常

2.启动i2c读取sensor数据,发现有时候sensor时钟不输出,发现i2c有时候数据不返回,经排查是排线使用太长,且不是等长设计

3、sensor成功启动后,clk、data有输出,表示sensor已经工作,但运行camerademo后接收数据异常,这种提示接收数据异常,先排查硬件,示波器量data看是否有输出,软件配置导致问题是sensor输出lane和配置接收lane不一致导致,修改一致后接收正常

[  321.468714] [VIN]__sunxi_tdm_reset:tdm_rx0 reset!!!
[  321.482502] [VIN_ERR]tdm0 rx0 frame error! width is 931, height is 0
[  321.489623] [VIN]__sunxi_tdm_reset:tdm_rx0 reset!!!
[  321.495104] [VIN_ERR]tdm0 rx0 frame error! width is 0, height is 0
[  321.502028] [VIN]__sunxi_tdm_reset:tdm_rx0 reset!!!
[  321.515834] [VIN_ERR]tdm0 rx0 frame error! width is 931, height is 0
[  321.522955] [VIN]__sunxi_tdm_reset:tdm_rx0 reset!!!
[  321.528435] [VIN_ERR]tdm0 rx0 frame error! width is 0, height is 0
[  321.535359] [VIN]__sunxi_tdm_reset:tdm_rx0 reset!!!
[  321.549168] [VIN_ERR]tdm0 rx0 frame error! width is 931, height is 0
[  321.556290] [VIN]__sunxi_tdm_reset:tdm_rx0 reset!!!
[  321.561771] [VIN_ERR]tdm0 rx0 frame error! width is 0, height is 0
[  321.568695] [VIN]__sunxi_tdm_reset:tdm_rx0 reset!!!
[  321.582519] [VIN_ERR]tdm0 rx0 frame error! width is 931, height is 0
[  321.589641] [VIN]__sunxi_tdm_reset:tdm_rx0 reset!!!

完整代码请看:https://download.csdn.net/download/chenbincba168/87610785

总结

注意imx335的寄存器配置,必须按照datasheet说明配置

调试过程必须先确认硬件接线,示波器量信号

CMOS_CHECK_POINTER(pstAeSnsDft); IMX335_SENSOR_GET_CTX(ViPipe, pstSnsState); CMOS_CHECK_POINTER(pstSnsState); if (IMX335_5M_30FPS_12BIT_LINEAR_MODE == pstSnsState->u8ImgMode) { u32Fll = IMX335_VMAX_5M_30FPS_12BIT_LINEAR; U32MaxFps = 30; pstSnsState->u32FLStd = u32Fll*U32MaxFps/DIV_0_TO_1_FLOAT(gu32STimeFps); } else if (IMX335_5M_30FPS_10BIT_WDR_MODE == pstSnsState->u8ImgMode) { u32Fll = IMX335_VMAX_5M_30FPS_10BIT_WDR; U32MaxFps = 30; pstSnsState->u32FLStd = u32Fll*U32MaxFps/DIV_0_TO_1_FLOAT(gu32STimeFps); if (0 != (pstSnsState->u32FLStd % 4)) { pstSnsState->u32FLStd = pstSnsState->u32FLStd - (pstSnsState->u32FLStd % 4) + 4; //Because FSC value an integer multiple of 8 } pstSnsState->u32FLStd = pstSnsState->u32FLStd*2; } else if (IMX335_4M_30FPS_10BIT_WDR_MODE == pstSnsState->u8ImgMode) { u32Fll = IMX335_VMAX_4M_30FPS_10BIT_WDR; U32MaxFps = 30; pstSnsState->u32FLStd = u32Fll*U32MaxFps/DIV_0_TO_1_FLOAT(gu32STimeFps); if (0 != (pstSnsState->u32FLStd % 4)) { pstSnsState->u32FLStd = pstSnsState->u32FLStd - (pstSnsState->u32FLStd % 4) + 4; //Because FSC value an integer multiple of 8 } pstSnsState->u32FLStd = pstSnsState->u32FLStd*2; } else if (IMX335_4M_25FPS_10BIT_WDR_MODE == pstSnsState->u8ImgMode) { u32Fll = IMX335_VMAX_4M_25FPS_10BIT_WDR; U32MaxFps = 25; pstSnsState->u32FLStd = u32Fll*U32MaxFps/DIV_0_TO_1_FLOAT(gu32STimeFps); if (0 != (pstSnsState->u32FLStd % 4)) { pstSnsState->u32FLStd = pstSnsState->u32FLStd - (pstSnsState->u32FLStd % 4) + 4; //Because FSC value an integer multiple of 8 } pstSnsState->u32FLStd = pstSnsState->u32FLStd*2; } else { u32Fll = IMX335_VMAX_5M_30FPS_12BIT_LINEAR; U32MaxFps = 30; pstSnsState->u32FLStd = u32Fll*U32MaxFps/DIV_0_TO_1_FLOAT(gu32STimeFps); } //pstSnsState->u32FLStd = u32Fll;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ccacba168

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值