飞凌嵌入式ElfBoard ELF1板卡-开发板适配之CSI
其他
 
677 人阅读
|
0 人回复
|
2025-02-22 
 
 
 
 
| 
 | 
 
 
i.MX6ULL的CSI(CMOS Sensor Interface),即,CMOS传感器接口,是一种摄像头并行数据接口,支持8-bit/10-bit/16-bit Bayer,YUV,YCrCb,RGB数据输入,也支持CCIR656格式数据输入。ELF 1开发板支持8位并行DVP接口的数字摄像头OV5640。 
硬件原理 
 
 
 
CSI_DATA0—CSI_DATA7是CSI数据信号引脚; 
CSI_PIXCLK是像素时钟; 
CSI_MCLK为摄像头提供主时钟,保证功能实现; 
CSI_HSYNC、CSI_VSYNC作为摄像头的行场扫描模式信号,提供行场信息; 
IIC2_SDA和IIC2_SCL用来配置摄像头设备地址为0x30; 
CSI_PWDN是CSI的电源使能引脚,由SN74HC595D扩展芯片控制。 
IOMUX配置 
NXP官方的i.MX6ULL EVK板,使用的CSI接口与ELF 1开发板一致,所以,已经配置好CSI接口和I2C2的的IOMUX: 
 
 
修改设备节点 
ELF 1的摄像头和NXP官方使用的方案一致,都是OV5640摄像头,但硬件设计略有区别,需要做出一些改动。 
根节点下csi节点: 
 
I2C2节点下内容如下,Elf1底板上给OV5640做了硬件复位,无需软件复位,因此,需要对设备树做出一些修改,去掉复位部分以及修改电源引脚: 
        ov5640: ov5640@3c { 
                compatible = "ovti,ov5640"; 
                reg = <0x3c>; 
                pinctrl-names = "default"; 
                pinctrl-0 = <&pinctrl_csi1>; 
                clocks = <&clks IMX6UL_CLK_CSI>; 
                clock-names = "csi_mclk"; 
                pwn-gpios = <&gpio_spi 4 1>; 
              /* rst-gpios = <&gpio_spi 5 0>;*/ 
                csi_id = <0>; 
                mclk = <24000000>; 
                mclk_source = <0>; 
                status = "okay"; 
                port { 
                        ov5640_ep: endpoint { 
                                remote-endpoint = <&csi1_ep>; 
                        }; 
                }; 
        }; 
效果如下: 
 
reg = <0x3c>;摄像头设备的I2C地址 
clocks = <&clks IMX6UL_CLK_CSI>;配置CSI时钟 
clock-names = "csi_mclk";时钟名称 
pwn-gpios = <&gpio_spi 4 1>;摄像头电源使能引脚,由SN74HC595D 的QE控制。 
rst-gpios = <&gpio_spi 5 0>;摄像头复位引脚,此引脚没有用到,所以注释掉此属性。 
csi_id = <0>;CSI ID 
mclk = <24000000>;摄像头主时钟设置为24M 
mclk_source = <0>;时钟源 
配置OV5640驱动 
在内核源码当中已经集成了OV5640的驱动,路径为:drivers/media/platform/mxc/subdev/ov5640.c。但这个驱动需要修改后才能使用,在ELF 1的资料包当中,提供了修改好的版本,路径为:ELF 1开发板资料包\02-Linux 源代码\02-1 驱动源码\07_ov5640\ov5640.c。您可以直接使用我们修改好的驱动,也可以参考以下内容自行修改。 
一、修改drivers/media/platform/mxc/subdev/ov5640.c 
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ vi drivers/media/platform/mxc/su\bdev/ov5640.c 
注释掉probe函数当中申请复位引脚的内容: 
 
注释掉ov5640_reset函数当中硬件复位的操作: 
 
去掉rst_gpio的变量: 
 
二、配置OV5640: 
使用make menuconfig打开图形化配置界面: 
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ make menuconfig 
找到以下位置: 
Device Drivers  
-> Multimedia support 
-> V4L platform devices 
修改如下,将ov5640驱动编译成模块: 
 
找到以下位置并进行修改: 
 
注意,由于OV5640的电源使能用到了74HC595扩展出的GPIO,需要检查74HC595的驱动有没有编译进内核,如果没有编译,会导致模块加载报找不到pwn引脚。因此需要检查以下两处配置是否编译进内核: 
 
 
三、替换配置文件 
通过make menuconfig修改的内容写入到了.config文件,当使用make imx6ull_elf1_defconfig配置内核源码时,.config文件会被覆盖,因此,需要替换原有的imx6ull_elf1_defconfig。 
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ cp .config arch/arm/configs/imx6ul\l_elf1_defconfig 
 
编译测试 
编译内核和设备树并拷贝到开发板: 
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ ./build.sh 
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ scp arch/arm/boot/zImage   root\@172.16.0.175:/run/media/mmcblk1p1/ 
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ scp arch/arm/boot/dts/imx6ull-elf\1-emmc.dtb root@172.16.0.175:/run/media/mmcblk1p1/ 
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ scp drivers/media/platform/mxc/s\ubdev/ov5640_camera.ko root@172.16.0.175:~/ 
进行sync操作后重启开发板: 
 
在测试之前,先接上OV5640摄像头到开发板和LCD屏。 
 
将OV5640接到开发板测试: 
加载模块: 
root@ELF1:~# insmod ov5640_camera.ko   
1-003c supply DOVDD not found, using dummy regulator 
1-003c supply DVDD not found, using dummy regulator 
1-003c supply AVDD not found, using dummy regulator 
CSI: Registered sensor subdevice: ov5640 1-003c 
查看可用的视频设备: 
root@ELF1:~# v4l2-ctl -d  /dev/video0 --all 
测试摄像头: 
root@ELF1:~# gst-launch-1.0 -v v4l2src device=/dev/video0 ! "video/x-raw, format=(st\ring)YUY2, width=(int)640, height=(int)480, framerate=(fraction)15/1" ! videoconvert ! f\bdevsink 
 
 |   
 
  
  
  
 
 
 | 
| 
 | 
| 
 | 
| 
 | 
 |