评论凡科网站建设怎么样,wordpress模板 户外钓鱼类网站,免费ppt模板 网站开发,制作图网店标摄像头介绍品牌#xff1a;Omnivision型号#xff1a;CMK-OV13850接口#xff1a;MIPI像素#xff1a;1320WOV13850彩色图像传感器是一款低电压、高性能1/3.06英寸1320万像素CMOS图像传感器#xff0c;使用OmniBSI?技术提供了单-1320万像素#xff08;42243136)摄像头的…摄像头介绍 品牌Omnivision型号CMK-OV13850接口MIPI像素1320WOV13850彩色图像传感器是一款低电压、高性能1/3.06英寸1320万像素CMOS图像传感器使用OmniBSI?技术提供了单-1320万像素4224×3136)摄像头的功能。通过串行摄像头控制总线SCCB)接口的控制它提供了全帧、下采样、开窗的10位MIPI图像。OV13850拥有一个能够在10位1320万像素分辨率下以每秒24帧fps)的速度运行的图像阵列用户可以完全控制图像质量、格式和输出数据传输。所有需要的图像处理功能包括曝光控制、白平衡、缺陷像素消除等都可以通过SCCB接口进行编程。 此外OmniBSI图像传感器使用专有的传感器技术通过减少或消除固定图案噪声、污迹等常见的图像污染光源来提高图像质量从而产生干净、完全稳定的彩色图像。为了提供定制信息OV13850包括一个单编程OPT)存储器。OV13850拥有最多4车道的MIPI接口。 硬件连接方式如下图摄像头的I2C接口使用RK3568的I2C4引脚RESET, PWRDOWN使用普通IO口三路电源供电使用LDOLDO由普通IO来控制使能用于控制上电时序。图像传输接口使用CSI2, 4lan MIPI接口。RK3568设备树修改 OV13850的设备树修改可以参考其他芯片的设备树在RK3568 Linux SDK中可以搜索到很多主要是就是配置OV13850使用的复位控制引脚I2C通信引脚PWDNB引脚三路电源上电控制引脚CIF_CLK时钟引脚如下面的I2C部分的设备树调试OV13850时应首先从I2C调试开始I2C通了后才会加载MIPI部分的驱动。i2c4 {status okay;clock-frequency 400000;ov13850: ov1385010 {compatible ovti,ov13850;status okay;reg 0x10;clocks cru CLK_CIF_OUT;clock-names xvclk;power-domains power RK3568_PD_VI;pinctrl-names rockchip,camera_default,rockchip,camera_sleep;pinctrl-0 cif_clk;pinctrl-1 cam0_sleep_pins;//pinctrl-2 cif_clk;avdd-supply avdd_2v8_camera_power; /* 2.8v */dvdd-supply dvdd_1v2_camera_power; /* 1.2v */dovdd-supply dovdd_1v8_camera_power; /* 1.8v *//* reset and pwdn */reset-gpios gpio1 RK_PD1 GPIO_ACTIVE_HIGH;pwdn-gpios gpio1 RK_PD2 GPIO_ACTIVE_HIGH;rockchip,camera-module-index 0;rockchip,camera-module-facing back;rockchip,camera-module-name CMK-CT0116;rockchip,camera-module-lens-name Largan-50013A1;lens-focus vm149c;port {ov13850_out0: endpoint {remote-endpoint mipi_in_ucam0;data-lanes 1 2 3 4;};};};vm149c: vm149c0c {compatible silicon touch,vm149c;status okay;reg 0x0c;rockchip,camera-module-index 0;rockchip,camera-module-facing back;rockchip,vcm-start-current 20; // 马达的启动电流rockchip,vcm-rated-current 80; // 马达的额定电流rockchip,vcm-step-mode 13; // 马达驱动 ic 的电流输出模式};};/*camera avdd 2.8V LDO poweren*/avdd_2v8_camera_power:avdd-2v8-camera-regulator {compatible regulator-fixed;regulator-name avdd_2v8_camera_power;enable-active-high;gpio gpio3 RK_PA7 GPIO_ACTIVE_HIGH;pinctrl-names default;pinctrl-0 avdd2v8_camera_en_pin;//regulator-always-on;};/*camera dvdd 1.2V LDO poweren*/dvdd_1v2_camera_power:dvdd-1v2-camera-regulator {compatible regulator-fixed;regulator-name dvdd_1v2_camera_power;enable-active-high;gpio gpio3 RK_PC5 GPIO_ACTIVE_HIGH;pinctrl-names default;pinctrl-0 dvdd1v2_camera_en_pin;//regulator-always-on;};/*camera dovdd 1.8V LDO poweren*/dovdd_1v8_camera_power:dovdd-1v8-camera_regulator {compatible regulator-fixed;regulator-name dovdd_1v8_camera_power;enable-active-high;gpio gpio3 RK_PC1 GPIO_ACTIVE_HIGH;pinctrl-names default;pinctrl-0 dovdd1v8_camera_en_pin;//regulator-always-on;};MIPI部分的设备树可以参考原来开发板上提供的XC7160摄像头来修改使用full mode 即4lan CSI2接口最后修改的如下。csi2_dphy_hw {status okay;
};csi2_dphy0 {status okay;ports {#address-cells 1;#size-cells 0;port0 {reg 0;#address-cells 1;#size-cells 0;mipi_in_ucam0: endpoint0 {reg 0;remote-endpoint ov13850_out0;data-lanes 1 2 3 4;};};port1 {reg 1;#address-cells 1;#size-cells 0;csidphy_out: endpoint0 {reg 0;remote-endpoint isp0_in;};};};
};rkisp_vir0 {status okay;port {#address-cells 1;#size-cells 0;isp0_in: endpoint0 {reg 0;remote-endpoint csidphy_out;};};
};rkisp_vir1 {status disabled;
};csi2_dphy1 {status disabled;/** dphy1 only used for split mode,* can be used concurrently with dphy2* full mode and split mode are mutually exclusive*/
};csi2_dphy2 {status disabled;/** dphy2 only used for split mode,* can be used concurrently with dphy1* full mode and split mode are mutually exclusive*/
};rkisp {status okay;
};rkisp_mmu {status okay;
}; 硬件由于是公司第一次做驱动第一次调所以调试过程中肯定会遇到问题。果不然设备树改好后上电I2C通信不上即无法使用0x10的地址来识别摄像头。而且识别的摄像头I2C从机地址是0x0b,0x0C其中0x0C是摄像头内的一个芯片AD5823, 对应的驱动程序就是设备树中的vm149c。经过使用 sudo i2ctransfer -f -y 4 w20x0c 0x30 0x0a r2 读取摄像头ID寄存器0x300A 测试发现摄像头返回的是0x30 0x0A,总结出来的规律就是读任何寄存器都返回的是寄存器的地址。 由于一时找不到软件的问题就让硬件使用示波器测试了一下三路电源上电的时序是avdd先上之后是dovdd和dvdd根据手册上电之间的延时大于0ns即可如下图。示波器测量显示上电顺序是按照avdd,dovdd,dvdd的顺序之间的延时为50us, 这个延时就是程序执行先后打开各路电源的运行时间。 之后又测量了I2C的时钟数据线也未发现问题测量了一下CIF_CLKOUT信号这个信号是由RK3568输出给摄像头的时钟频率是24M由于摄像头I2C初始读取ID失败后会关闭电源与时钟所以24M的时钟只是在初始化时有一会就没有了。 硬件测试也没有找到问题那看来还得接着找软件的问题当然看了不少csdn文章之后又研究了一下ov13850的驱动程序ov13850.c重点看了一下__ov13850_power_on函数这个函数。static const char * const ov13850_supply_names[] {avdd, /* Analog power */dovdd, /* Digital I/O power */dvdd, /* Digital core power */
};static int __ov13850_power_on(struct ov13850 *ov13850)
{int ret;u32 delay_us;struct device *dev ov13850-client-dev;//硬件设计中摄像头的三路电源全是分别控制的所以此power_gpio没有引脚对应也没有设备树if (!IS_ERR(ov13850-power_gpio))gpiod_set_value_cansleep(ov13850-power_gpio, 1);usleep_range(1000, 2000);//pins_default对应设备树中的cif_clk用于初始RK3568输出的24M时钟此程序用于配置时钟引脚的为时钟输出功能if (!IS_ERR_OR_NULL(ov13850-pins_default)) {ret pinctrl_select_state(ov13850-pinctrl,ov13850-pins_default);if (ret 0)dev_err(dev, could not set pins\n);}//设置xvclk时钟为24Mret clk_set_rate(ov13850-xvclk, OV13850_XVCLK_FREQ);if (ret 0)dev_warn(dev, Failed to set xvclk rate (24MHz)\n);if (clk_get_rate(ov13850-xvclk) ! OV13850_XVCLK_FREQ)dev_warn(dev, xvclk mismatched, modes are based on 24MHz\n);ret clk_prepare_enable(ov13850-xvclk);if (ret 0) {dev_err(dev, Failed to enable xvclk\n);return ret;}if (!IS_ERR(ov13850-reset_gpio))//复位信号输出为无效即如果设备树中reset-gpios gpio1 RK_PD1 GPIO_ACTIVE_HIGH此时输出的电源就是低电平gpiod_set_value_cansleep(ov13850-reset_gpio, 0);//打开摄像头供电的三路电源电源的打开的顺序按照ov13850_supply_names数组中定义的顺序由于设备树中使用的regulaor来控制电源所以这部分代码有效ret regulator_bulk_enable(OV13850_NUM_SUPPLIES, ov13850-supplies);if (ret 0) {dev_err(dev, Failed to enable regulators\n);goto disable_clk;}if (!IS_ERR(ov13850-reset_gpio))//复位信号输出为有效即如果设备树中reset-gpios gpio1 RK_PD1 GPIO_ACTIVE_HIGH此时输出的电源就是高电平gpiod_set_value_cansleep(ov13850-reset_gpio, 1);usleep_range(500, 1000);if (!IS_ERR(ov13850-pwdn_gpio))//pwdn_gpio信号输出为有效即如果设备树中pwdn-gpios gpio1 RK_PD1 GPIO_ACTIVE_HIGH此时输出的电源就是高电平gpiod_set_value_cansleep(ov13850-pwdn_gpio, 1);/* 8192 cycles prior to first SCCB transaction */delay_us ov13850_cal_delay(8192);usleep_range(delay_us, delay_us * 2);return 0;disable_clk:clk_disable_unprepare(ov13850-xvclk);return ret;
} 上面的程序看懂了下面开始使用万用表来测量reset,pwdn这两个引脚的状态由于摄像头初始化失败后会进行power_off操作所以为了测量上电时电平是否正常把__ov13850_power_off函数中代码关闭使之一直保持在上电状态。 程序改好后下载测量果然发现pwdn这个信号电平不对这个信号串联了一个22欧姆的电阻测量这两个电阻两边的电压一端是0V, 一端是1.8V电阻坏了换一个新的同时检查了一下其他电阻有也坏的一起更换。换好后发现电平信号是低电平电阻两端都是低电平对着上电时序一下上电后应该为高电平才对修改设备树pwdn-gpios gpio1 RK_PD2 GPIO_ACTIVE_LOW; --pwdn-gpios gpio1 RK_PD2 GPIO_ACTIVE_HIGH;同样对比了一个reset管脚也是设备树的配置成低电平了。编译程序开机摄像头驱动成功加载了能够识别到摄像头芯片的ID, 加载了视频驱动设备video0-video8, media0。 总结调试遇到的问题硬件问题与软件问题都有所以一定要2方面都去查找。硬件问题就是电阻坏了。软件问题是开始设备树写的并不对先后调整了很多次最后才调试出来的。其他要说的一点就是OV13850驱动程序的reset,pwrdn引脚的有效电平问题与其他芯片驱动的有效电平的意思正好相反reset信号是在低电平时复位pwrdn信号是在低电平时有效所以原来设备树中写成GPIO_ACTIVE_LOW的方式是符合常理的是驱动程序中把电平的高低有效用反了实际最应该修改驱动程序ov13850.c中的程序的reset, pwrdn信号的控制电平。显示效果显示效果如下此时摄像头只能显示天花板上面的灯其他物体无法成像只有在强光照射下才能成像因此还需要做进一步的调试。特别鸣谢 在调试摄像头的过程中参考了很多csdn朋友写的文章感谢各位的分享我也以分享的方式回馈大家。具体参考链接如下RK3566调试GC2053_火柴棍mcu的博客-CSDN博客(24条消息) 摄像头ov13850移植笔记_布道师Peter的博客-CSDN博客(7条消息) 关于RK3399平台OV13850摄像头调试的问题_ov13850摄像头好吗_溯之源的博客-CSDN博客