本文章为《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_D0 PH9 DCMI_D0 AF13
DCMI_D1 PH10 DCMI_D0 AF13
DCMI_D2 PH11 DCMI_D0 AF13
DCMI_D3 PH12 DCMI_D0 AF13
DCMI_D4 PH14 DCMI_D0 AF13
DCMI_D5 PI4 DCMI_D0 AF13
DCMI_D6 PB8 DCMI_D0 AF13
DCMI_D7 PE6 DCMI_D0 AF13
DCMI_RESET PA3 GPIO ANALOG
DCMI_PWDN PA4 GPIO ANALOG
DCMI_PIXCK PA6 DCMI_PIXCLK AF13
DCMI_VSYNC PB7 DCMI_VSYNC AF13
  1. 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 = <0x4c006000 0x400>;

interrupts = <GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>;

resets = <&rcc CAMITF_R>;

clocks = <&rcc DCMI>;

clock-names = "mclk";

dmas = <&dmamux1 75 0x400 0xe0000001>;

dma-names = "tx";

status = "disabled";

};

上述代码只对dcmi做了基本的初始化,并没有针对不同的硬件设计做适配,所以需结合硬件补全设备树节点信息。

参考帮助文档及内核中其它STM32MP157设备树中对于dcmi的定义,修改dcmi内容如下:

&dcmi {

status = "okay";

pinctrl-names = "default", "sleep";

pinctrl-0 = <&dcmi_pins_a>;

pinctrl-1 = <&dcmi_sleep_pins_a>;

port {

dcmi_0: endpoint {

remote-endpoint = <&ov5640_0>;

bus-width = <8>;

hsync-active = <0>;

vsync-active = <0>;

pclk-sample = <1>;

pclk-max-frequency = <77000000>;

};

};

};

由于stm32mp15-pinctrl.dtsi中对于DCMI管脚的定义与FS-MP1A实际使用管脚一致,所以无需修改

  1. CMOS Camera设备树节点

FS-MP1A支持多款COMS Camera,本节以ov5640为例:

参考文档:

Documentation/devicetree/bindings/media/i2c/ov5640.txt

参考帮助文档及内核中其它STM32MP157设备树中对于ov5640的定义,修改dcmi内容如下:

ov5640: camera@3c {

compatible = "ovti,ov5640";

reg = <0x3c>;

clocks = <&clk_ext_camera>;

clock-names = "xclk";

DOVDD-supply = <&v2v8>;

powerdown-gpios = <&gpioa 4 (GPIO_ACTIVE_HIGH | GPIO_PUSH_PULL)>;

reset-gpios = <&gpioa 3 (GPIO_ACTIVE_LOW | GPIO_PUSH_PULL)>;

rotation = <180>;

status = "okay";

port {

ov5640_0: endpoint {

remote-endpoint = <&dcmi_0>;

bus-width = <8>;

data-shift = <2>; /* lines 9:2 are used */

hsync-active = <0>;

vsync-active = <0>;

pclk-sample = <1>;

pclk-max-frequency = <77000000>;

};

};

};

  1. 2.8V电源定义

前文已经说过如何添加电源节点,本节不再重复,在根节点添加&v2v8节点,内容如下:

v2v8_audio: regulator-v2v8 {

compatible = "regulator-fixed";

regulator-name = "v2v8";

regulator-min-microvolt = <2800000>;

regulator-max-microvolt = <2800000>;

regulator-always-on;

regulator-boot-on;

};

  1. 24M时钟定义

参考文档:

Documentation/devicetree/bindings/clock/fixed-clock.yaml

参考帮助文档或内核中其他设备树文件,对于时钟的定义,增加内容如下:

clocks {

clk_ext_camera: clk-ext-camera {

#clock-cells = <0>;

compatible = "fixed-clock";

clock-frequency = <24000000>;

};

};

2.实验目的

熟悉基于Linux操作系统下的摄像头设备驱动移植配置过程。

3.实验平台

华清远见开发环境,FS-MP1A平台;

4.实验步骤

  1. 导入交叉编译工具链

linux@ubuntu:$ source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi

  1. 增加DCMI设备树节点

修改arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi文件,在文件末尾添加如下内容:

&dcmi {

status = "okay";

pinctrl-names = "default", "sleep";

pinctrl-0 = <&dcmi_pins_a>;

pinctrl-1 = <&dcmi_sleep_pins_a>;

port {

dcmi_0: endpoint {

remote-endpoint = <&ov5640_0>;

bus-width = <8>;

hsync-active = <0>;

vsync-active = <0>;

pclk-sample = <1>;

pclk-max-frequency = <77000000>;

};

};

};

  1. 增加OV5640节点

修改arch/arm/dts/stm32mp15xx-fsmp1x.dtsi文件,在I2C5节点中添加OV5640设备信息,红色字体为增加内容:

&i2c5 {

pinctrl-names = "default", "sleep";

pinctrl-0 = <&i2c5_pins_a>;

……

ov5640: camera@3c {

compatible = "ovti,ov5640";

reg = <0x3c>;

clocks = <&clk_ext_camera>;

clock-names = "xclk";

DOVDD-supply = <&v2v8>;

powerdown-gpios = <&gpioa 4 (GPIO_ACTIVE_HIGH | GPIO_PUSH_PULL)>;

reset-gpios = <&gpioa 3 (GPIO_ACTIVE_LOW | GPIO_PUSH_PULL)>;

rotation = <180>;

status = "okay";

port {

ov5640_0: endpoint {

remote-endpoint = <&dcmi_0>;

bus-width = <8>;

data-shift = <2>; /* lines 9:2 are used */

hsync-active = <0>;

vsync-active = <0>;

pclk-sample = <1>;

pclk-max-frequency = <77000000>;

};

};

};

};

  1. 增加2.8V电源和24M时钟

修改arch/arm/dts/stm32mp15xx-fsmp1x.dtsi文件,在根节点最后添加2.8V电源和24M时钟,红色字体为增加内容:

/ {

memory@c0000000 {

device_type = "memory";

reg = <0xc0000000 0x20000000>;

};

……

v2v8: regulator-2p8v {

compatible = "regulator-fixed";

regulator-name = "v2v8";

regulator-min-microvolt = <2800000>;

regulator-max-microvolt = <2800000>;

regulator-always-on;

regulator-boot-on;

};

clocks {

clk_ext_camera: clk-ext-camera {

#clock-cells = <0>;

compatible = "fixed-clock";

clock-frequency = <24000000>;

};

};

};

  1. 配置内核

配置内核支持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

  1. 编译内核及设备树

linux@ubuntu:$ make -j4 uImage dtbs LOADADDR=0xC2000040

  1. 重启测试

将编译好的设备树和内核镜像拷贝到/tftpboot目录下,通过tftp引导内核,系统启动后启动信息中包含如下信息:

在屏幕的界面上选择“Camera preview”应用进入摄像头预览程序,启动界面后即可看到摄像头实时采集的图像。

硬件平台:华清远见FS-MP1A开发板(STM32MP157)

部分开发教程下载:加QQ群459754978,群文件里有。

部分视频课程收看:华清远见研发中心的个人空间_哔哩哔哩_Bilibili

淘宝购买链接:华清远见stm32mp157 linux开发板stm32单片机arm开发嵌入式学习板

手机淘宝分享码:复制本行文字打开手淘₤T4FPXn3YYJ2₤

STM32MP157 Linux系统移植开发篇17:Linux内核摄像头驱动移植相关推荐

  1. p750tm安装linux系统,Android 开发环境(虚拟机,LINUX, secureCRT)安装过程.pdf

    Android 开发环境(虚拟机,LINUX, secureCRT)安装过程 Android linux 开发环境(虚拟机,LINUX, secureCRT )安装过程 注意 由于selinux 打开 ...

  2. 嵌入式linux系统应用开发

    关于嵌入式系统   平时大家说的嵌入式其实范围比较广的,是一种软硬件可裁剪,以应用为中心开发的专用系统,硬件平台可以是单片机,或者以ARM系列的处理器.单片机一般直接裸奔程序,不过现在有了好多基于单片 ...

  3. STM32MP157 Linux系统移植开发篇4: BootLoader(Uboot)移植

    本文章为<STM32MP157 Linux系统移植开发篇>系列中的一篇,笔者使用的开发平台为华清远见FS-MP1A开发板(STM32MP157开发板).stm32mp157是ARM双核,2 ...

  4. STM32MP157 Linux系统移植开发篇14:Linux内核RGB LCD驱动移植

    本文章为<STM32MP157 Linux系统移植开发篇>系列中的一篇,笔者使用的开发平台为华清远见FS-MP1A开发板(STM32MP157开发板).stm32mp157是ARM双核,2 ...

  5. STM32MP157 Linux系统移植开发篇11:Linux HDMI驱动移植

    本文章为<STM32MP157 Linux系统移植开发篇>系列中的一篇,笔者使用的开发平台为华清远见FS-MP1A开发板(STM32MP157开发板).stm32mp157是ARM双核,2 ...

  6. stm32mp1安装linux系统,stm32mp1linux开发环境搭建(cortex a7)

    原标题:stm32mp1linux开发环境搭建(cortex a7) 写在前面: 本文章为<STM32MP1系列教程之Cortex-A7开发篇>系列中的一篇,全系列总计11篇.笔者使用的开 ...

  7. 开发板通过usb连linux,虚拟机Linux系统和开发板通过USB转串口连接的两种方法

    通过USB转串口连接虚拟机中的Linux系统和开发板,开始时候总是出现错误,显示什么串口重叠,最后求助高手帮我通过其他连接方式解决了问题,今天在网上查找资料,终于明白了开始错误的原因:开发板提供的驱动 ...

  8. 基于linux的应用开发视频教程,基于LINUX+ARM的视频系统的应用和开发

    摘要: 随着经济的发展,人民生活水平的提高,嵌入式智能产品越来越多的进入到到我们生活领域,这些产品不仅给我们带来方便,同时也在改变着我们的生活,并且嵌入式产品界面和视频的开发也越来越受到关注,成为研究 ...

  9. 嵌入式LINUX系统程序开发

    嵌入式LINUX系统程序开发 1.Ubuntu 18.04镜像源配置 2.Ubuntu上用gcc进行编写程序 2.1.gcc的安装 2.2.gcc的常用命令 2.3.编译运行程序 3.Windows下 ...

最新文章

  1. [您有新的未分配科技点]可,可,可持久化!?------0-1Trie和可持久化Trie普及版讲解...
  2. spring与mybatis三种整合方法
  3. Design Pattern in Java[Challenge 2.1]
  4. WebSphere Application Server 5.0在Linux平台上中文界面乱码问题的解决
  5. 新手零基础入门小程序之万达电影
  6. 关于Platinum库的MediaRender具体C++代码实现探讨
  7. modelsim安装教程
  8. Obsidan之数学公式的输入
  9. Python修改Word文件设置所有图片都居中对齐
  10. MAC——本机域名[localhost]配置
  11. Task07: 凸优化;梯度下降;优化算法进阶 学习笔记
  12. 基于微信点餐外卖小程序设计与实现 开题报告
  13. ruoyi-vue集成积木报表
  14. 什么是虚拟机(virtual machine)
  15. 【UFUN开发板评测】小巧而不失精致,简单而不失内涵——uFun开发板开箱爆照
  16. 行为模式--子类沙箱
  17. 移动硬盘只能识别一个分区,另一个变为RAW的解决办法
  18. ROM、RAM、Flash的区别
  19. 一周信创舆情观察(10.11~10.17)
  20. 后台产品的数据可视化图表产品设计

热门文章

  1. PostgreSql pg_restore 用法
  2. spring下载教程
  3. word中标题黑色实心框删除
  4. 因果关系的倒置(1)
  5. PHP命名空间 namespace 及导入 use 的用法
  6. python popen sqlplus_Python用subprocess的Popen来调用系统命令
  7. ABAP 获取状态的两个函数 STATUS_TEXT_EDIT 和 STATUS_READ 的简单介绍
  8. docker inspect 详解
  9. 已经2022年了为什么还是有人不知道网上投稿发新闻的方法?
  10. 开源网格划分程序资源链接