天津网站制作哪家好薇,专业做域名的网站,华为等五家公司,惠州网站排名提升前言
今天#xff0c;就着摄像头的调试#xff0c;从嵌入式工程师的角度#xff0c;介绍如何从无到有#xff0c;一步一步地调出一款设备。 摄像头型号#xff1a;OV2640
开发步骤
分为 2 个阶段 5 个步骤 阶段一#xff1a; 设备树、驱动、硬件 阶段二#xff1a; 应…前言
今天就着摄像头的调试从嵌入式工程师的角度介绍如何从无到有一步一步地调出一款设备。 摄像头型号OV2640
开发步骤
分为 2 个阶段 5 个步骤 阶段一 设备树、驱动、硬件 阶段二 应用程序、测试
Step 1设备树
a) 摄像头用到了 I2C 和 CSI 接口所以要在 pinctrl 节点中添加这两种接口的引脚定义其中 I2C 使用的是 I2C1 b) 添加 CSI 节点 arch/arm/boot/dts/sun8i-v3s.dtsi pio: pinctrl1c20800 { i2c1_pins: i2c1-pins {pins PE21, PE22;function i2c1;};//omit-if-no-refcsi1_mclk_pin: csi1-mclk-pin {pins PE1;function csi;};csi1_clk: csi1-clk0 {pins PE0,PE2,PE3;bias-disable;function csi;};csi1_8bit: csi1-8bit0 {pins PE6,PE7,PE8,PE9,PE10,PE11,PE12,PE13,PE14,PE15;bias-disable;function csi;};}soc {csi1: csi1cb4000 {compatible allwinner,sun8i-v3s-csi;reg 0x01cb4000 0x3000;interrupts GIC_SPI 84 IRQ_TYPE_LEVEL_HIGH;clocks ccu CLK_BUS_CSI,ccu CLK_CSI1_SCLK,ccu CLK_DRAM_CSI;clock-names bus, mod, ram;resets ccu RST_BUS_CSI;status okay;};};c) 使能 I2C 和 CSI 节点 arch/arm/boot/dts/sun8i-v3s-licheepi-zero-dock.dts
i2c1 {pinctrl-0 i2c1_pins;pinctrl-names default;clock-frequency 400000;status okay;ov2640: camera30 {compatible ovti,ov2640;reg 0x30;pinctrl-names default;pinctrl-0 csi1_mclk_pin;clocks ccu CLK_CSI1_MCLK;clock-names xvclk;assigned-clocks ccu CLK_CSI1_MCLK;assigned-clock-rates 24000000;port {ov2640_0: endpoint {remote-endpoint csi1_ep;bus-width 10;};};};
};csi1 {status okay;pinctrl-names default;pinctrl-0 csi1_clk csi1_8bit;port {csi1_ep: endpoint {remote-endpoint ov2640_0;hsync-active 0;vsync-active 0;bus-width 10;pclk-sample 1;};};};Step 2驱动
使能内核编译选项 Device Drivers Multimedia support I2C Encoders, decoders, sensors and other helper chips* OmniVision OV2640 sensor support注意
要先禁用Device Drivers Multimedia support[ ] Autoselect ancillary drivers (tuners, sensors, i2c, spi, frontends)不然无法显示I2C Encoders, decoders, sensors and other helper chips
选项Step 3硬件
焊接 24P FPC 翻盖下接排线连接器 焊接 2.8V LDO、1.5V LDO 焊接电阻电容 测量短路、测量电压、确认外设好坏
Step 4应用程序
需要用到 i2c-tools、ffmped、fswebcam 在 buildroot Target Packets 中添加
Step 5测试
step 5.1I2C 测试
先用 I2C 工具检测摄像头的 I2C 信息
# i2cdetect -y 10 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
#没有检测到 I2C 设备SOC 测 I2C 软件是好的因为 /dev/i2c-1 设备已产生并且使用 I2C 工具操作 I2C 控制器也没报错 所以可能出现问题的节点 a) SOC I2C 引脚没有输出 I2C 信号 b) 摄像头 I2C 引脚没有收到 I2C 信号 c) 摄像头收到 I2C 信号但是没有做出响应 d) 摄像头 I2C 做出响应但是 SOC 解析失败 排查 a) 使用逻辑分析仪抓 SOC I2C 引脚信号发现 SOC 正常发出 I2C 信号遍历地址 0~0x77 的设备但是没有收到任何一个响应 b) 使用万用表量摄像头 I2C 引脚到 SOC I2C 引脚的通断导通没问题 c) 从上述两点可知问题原因是摄像头收到 I2C 信号但是没有做出响应 继续排查 c1) 检查摄像头供电使用万用表测量电源电压正常 c2) 难道是摄像头坏了遂将 OV2640 插在 ESP32-CAM 板子上进行测试可以正常摄像所以摄像头是好的 c3) dmesg 显示
[ 1.158234] i2c /dev entries driver
[ 1.162410] sun8i-v3s-pinctrl 1c20800.pinctrl: 1c20800.pinctrl supply vcc-pe not found, using dummy regulator
[ 1.175129] ov2640 0-0030: Product ID error fa:fa难道是 vcc-pe 引脚没有电压 使用万用表测量发现电压正常 网上搜索该问题发现可以正常检测到 I2C 的内核 log 中也有该警告所以应该不是该问题导致 c4) 网上搜到一篇文章《camera调试i2c不通如何排查》介绍了排查 I2C 地址、引脚、供电、reset 引脚、powdn 引脚、上电时序、MCLK 等步骤我跟着流程依次检查最后看到 MCLK 时灵光乍现依稀记得设备树中有配置 MCLK 参数的地方 ov2640: camera30 {compatible ovti,ov2640;reg 0x30;pinctrl-names default;pinctrl-0 csi1_mclk_pin;clocks ccu CLK_CSI1_MCLK;clock-names xvclk;assigned-clocks ccu CLK_CSI1_MCLK; // 这两行assigned-clock-rates 24000000; // 这两行port {ov2640_0: endpoint {remote-endpoint csi1_ep;bus-width 10;};};};这份节点参数我是从网上找的一般 V3S 的晶振使用的是 24MHz 的而我使用的是 26MHz 的问题应是这里改成 26000000重新测试
[ 1.158263] i2c /dev entries driver
[ 1.163342] sun8i-v3s-pinctrl 1c20800.pinctrl: 1c20800.pinctrl supply vcc-pe not found, using dummy regulator
[ 1.176419] ov2640 1-0030: ov2640 Product ID 26:42 Manufacturer ID 7f:a2
[ 1.183768] i2c i2c-1: OV2640 Probed# i2cdetect -y 10 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --可以检测到摄像头 I2C 设备了。
step 5.2拍照测试
fswebcam -S 20 -d /dev/video0 -p UYVY -r 800x600 --dumpframe dump.bin fswebcam.jpg发现没有 /dev/video0 设备 在网上搜了下产生 /dev/video0 设备的内核编译选项如下图需要使能 Allwinner V3s Camera Sensor Interface driver 可是我发现我的 buildroot 中 V4L platform devices 下面并没有该选项 最终通过在源码的 Kconfig 文件中搜索 Allwinner V3s 再跟着关键字 VIDEO_SUN6I_CSI在 menuconfig 中一步步搜索将依赖的编译选项都使能后终于该选项出现了。使能后/dev/video0 设备就出现了
# ls /dev/video0 -lh
crw------- 1 root root 81, 0 Jan 1 00:00 /dev/video0拍照测试
fswebcam -S 20 -d /dev/video0 -p UYVY -r 800x600 --dumpframe dump.bin fswebcam.jpg录像测试
ffmpeg -f video4linux2 -s 800x600 -r 30 -i /dev/video0 test.avistep 5.3消除横纹
可以看到上面拍摄的照片和视频有一道道的横纹网上搜索发现许多人都遇到了这个问题基本明确问题原因是电源纹波导致我尝试换了几颗电源滤波电容还是没能消除横纹这个硬件问题后面随缘去解吧缩短布线是个有效的措施。
至此摄像头调试功能部分已 OK性能调优 TO BE DONE一般再也不 DONE。。。。