STM32MP157 Linux系统移植开发篇17:Linux内核摄像头驱动移植 | 您所在的位置:网站首页 › 华清远见QT课程视频 › STM32MP157 Linux系统移植开发篇17:Linux内核摄像头驱动移植 |
本文章为《STM32MP157 Linux系统移植开发篇》系列中的一篇,笔者使用的开发平台为华清远见FS-MP1A开发板(STM32MP157开发板)。stm32mp157是ARM双核,2个A7核,1个M4核,A7核上可以跑Linux操作系统,M4核上可以跑FreeRTOS、RT-Thread等实时操作系统,STM32MP157开发板所以既可以学嵌入式linux,也可以学stm32单片机。针对FS-MP1A开发板,除了Linux系统移植篇外,还包括其他多系列教程,包括Cortex-A7开发篇、Cortex-M4开发篇、扩展板驱动移植篇、Linux应用开发篇、FreeRTOS系统移植篇、Linux驱动开发篇、硬件设计篇、人工智能机器视觉篇、Qt应用编程篇、Qt综合项目实战篇等。欢迎关注,更多stm32mp157开发教程及视频,可加技术交流Q群459754978,感谢关注。关于FS-MP1A开发板:手机淘宝分享码:复制本行文字打开手淘₤T4FPXn3YYJ2₤链接:https://item.taobao.com/item.htm?id=622457259672 1.实验原理DCMI(Digital Camera Interface),DCMI是一个同步并行接口,能够从外部8bit、10bit、12bit或14bit的CMOS摄像头接收高速数据流,支持不同的数据格式:YCbCr4:2:2/RGB565渐进式视频和压缩数据(JPEG)。 FS-MP1A可以外接8bit的COM Camera,接口定义如下: 接口与MPU管脚对应关系如下: 原理图网络编号对应管脚管脚功能管脚功能码DCMI_D0PH9DCMI_D0AF13DCMI_D1PH10DCMI_D0AF13DCMI_D2PH11DCMI_D0AF13DCMI_D3PH12DCMI_D0AF13DCMI_D4PH14DCMI_D0AF13DCMI_D5PI4DCMI_D0AF13DCMI_D6PB8DCMI_D0AF13DCMI_D7PE6DCMI_D0AF13DCMI_RESETPA3GPIOANALOGDCMI_PWDNPA4GPIOANALOGDCMI_PIXCKPA6DCMI_PIXCLKAF13DCMI_VSYNCPB7DCMI_VSYNCAF13 DCMI设备树节点参考文档: Documentation/devicetree/bindings/media/st,stm32-dcmi.txt Documentation/devicetree/bindings/media/video-interfaces.txt 内核中ST对STM32MP15x系列芯片的设备树资源了做了定义,可参见: arch/arm/boot/dts/stm32mp151.dtsi stm32mp151中dcmi定义如下: dcmi: dcmi@4c006000 { compatible = "st,stm32-dcmi"; reg = ; interrupts = ; resets = ; clocks = ; clock-names = "mclk"; dmas = ; dma-names = "tx"; status = "disabled"; }; 上述代码只对dcmi做了基本的初始化,并没有针对不同的硬件设计做适配,所以需结合硬件补全设备树节点信息。 参考帮助文档及内核中其它STM32MP157设备树中对于dcmi的定义,修改dcmi内容如下: &dcmi { status = "okay"; pinctrl-names = "default", "sleep"; pinctrl-0 = ; pinctrl-1 = ; port { dcmi_0: endpoint { remote-endpoint = ; bus-width = ; hsync-active = ; vsync-active = ; pclk-sample = ; pclk-max-frequency = ; }; }; }; 由于stm32mp15-pinctrl.dtsi中对于DCMI管脚的定义与FS-MP1A实际使用管脚一致,所以无需修改 CMOS Camera设备树节点FS-MP1A支持多款COMS Camera,本节以ov5640为例: 参考文档: Documentation/devicetree/bindings/media/i2c/ov5640.txt 参考帮助文档及内核中其它STM32MP157设备树中对于ov5640的定义,修改dcmi内容如下: ov5640: camera@3c { compatible = "ovti,ov5640"; reg = ; clocks = ; clock-names = "xclk"; DOVDD-supply = ; powerdown-gpios = ; reset-gpios = ; rotation = ; status = "okay"; port { ov5640_0: endpoint { remote-endpoint = ; bus-width = ; data-shift = ; /* lines 9:2 are used */ hsync-active = ; vsync-active = ; pclk-sample = ; pclk-max-frequency = ; }; }; }; 2.8V电源定义前文已经说过如何添加电源节点,本节不再重复,在根节点添加&v2v8节点,内容如下: v2v8_audio: regulator-v2v8 { compatible = "regulator-fixed"; regulator-name = "v2v8"; regulator-min-microvolt = ; regulator-max-microvolt = ; regulator-always-on; regulator-boot-on; }; 24M时钟定义参考文档: Documentation/devicetree/bindings/clock/fixed-clock.yaml 参考帮助文档或内核中其他设备树文件,对于时钟的定义,增加内容如下: clocks { clk_ext_camera: clk-ext-camera { #clock-cells = ; compatible = "fixed-clock"; clock-frequency = ; }; }; 2.实验目的熟悉基于Linux操作系统下的摄像头设备驱动移植配置过程。 3.实验平台华清远见开发环境,FS-MP1A平台; 4.实验步骤 导入交叉编译工具链linux@ubuntu:$ source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi 增加DCMI设备树节点修改arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi文件,在文件末尾添加如下内容: &dcmi { status = "okay"; pinctrl-names = "default", "sleep"; pinctrl-0 = ; pinctrl-1 = ; port { dcmi_0: endpoint { remote-endpoint = ; bus-width = ; hsync-active = ; vsync-active = ; pclk-sample = ; pclk-max-frequency = ; }; }; }; 增加OV5640节点修改arch/arm/dts/stm32mp15xx-fsmp1x.dtsi文件,在I2C5节点中添加OV5640设备信息,红色字体为增加内容: &i2c5 { pinctrl-names = "default", "sleep"; pinctrl-0 = ; …… ov5640: camera@3c { compatible = "ovti,ov5640"; reg = ; clocks = ; clock-names = "xclk"; DOVDD-supply = ; powerdown-gpios = ; reset-gpios = ; rotation = ; status = "okay"; port { ov5640_0: endpoint { remote-endpoint = ; bus-width = ; data-shift = ; /* lines 9:2 are used */ hsync-active = ; vsync-active = ; pclk-sample = ; pclk-max-frequency = ; }; }; }; }; 增加2.8V电源和24M时钟修改arch/arm/dts/stm32mp15xx-fsmp1x.dtsi文件,在根节点最后添加2.8V电源和24M时钟,红色字体为增加内容: / { memory@c0000000 { device_type = "memory"; reg = ; }; …… v2v8: regulator-2p8v { compatible = "regulator-fixed"; regulator-name = "v2v8"; regulator-min-microvolt = ; regulator-max-microvolt = ; regulator-always-on; regulator-boot-on; }; clocks { clk_ext_camera: clk-ext-camera { #clock-cells = ; compatible = "fixed-clock"; clock-frequency = ; }; }; }; 配置内核配置内核支持ov5640,并列出主要选项,如下 linux@ubuntu:$ make menuconfig Device Drivers ---> Multimedia support ---> [*] V4L platform devices ---> STM32 Digital Camera Memory Interface (DCMI) support I2C Encoders, decoders, sensors and other helper chips ---> OmniVision OV5640 sensor support 编译内核及设备树linux@ubuntu:$ make -j4 uImage dtbs LOADADDR=0xC2000040 重启测试将编译好的设备树和内核镜像拷贝到/tftpboot目录下,通过tftp引导内核,系统启动后启动信息中包含如下信息: 在屏幕的界面上选择“Camera preview”应用进入摄像头预览程序,启动界面后即可看到摄像头实时采集的图像。 硬件平台:华清远见FS-MP1A开发板(STM32MP157) 部分开发教程下载:加QQ群459754978,群文件里有。 部分视频课程收看:华清远见研发中心的个人空间_哔哩哔哩_Bilibili 淘宝购买链接:华清远见stm32mp157 linux开发板stm32单片机arm开发嵌入式学习板 手机淘宝分享码:复制本行文字打开手淘₤T4FPXn3YYJ2₤ |
CopyRight 2018-2019 实验室设备网 版权所有 |