目录
前言
本文就介绍了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 = <®_aldo2>;
sensor0_iovdd_vol = <1800000>;
sensor0_avdd-supply = <®_bldo2>;
sensor0_avdd_vol = <2800000>;
sensor0_dvdd-supply = <®_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说明配置
调试过程必须先确认硬件接线,示波器量信号