嵌入式linux开发——stm32mp1完成视觉检测(一)

这里从今天开始给自己挖坑然后慢慢填坑……

打算基于自己买的正点原子的stm32mp157开发板还有OV5640摄像头,完成一个视觉检测的项目,最基础的版本是直接OpenCV打开摄像头然后完成简单的检测;进阶版把sklearn训练的模型通过cpp读取然后显示;最终目标是跑之前训练好的yolo模型。

那么问题就可以分成以下几步走:

  1. 驱动移植:包括linux的基础驱动,OV5640驱动,LCD驱动等等
  2. OpenCV+QT的库移植
  3. Python的机器学习库sklearn的相关模型保存还有C++读取方法
  4. 深度学习yolo的C++读取方法

那么第一篇显然就是基础的驱动移植,正式内容就此展开!

linux驱动移植

这里直接看正点原子开源的教程就可以了,里面很详细的有讲解linux驱动的移植过程,总结一下就是以下几步骤:

  1. TF-A:这个是imx这个最常见初学嵌入式linux的开发板芯片所没有的,是一个安全系统,需要完成移植
  2. U_Boot:经典的导引加载系统
  3. Linux内核:可剪裁的操作系统
  4. 根文件系统:这里主要使用Buildroot制作加载

可以直接跟着教程一步步完成。

LCD驱动

完成基础的Linux操作系统搭建后,视觉检测项目就需要一个显示器,买的开发板上就有LCD显示器,可以同样跟着教程完成LCD的驱动移植用于显示图像。

OV5640驱动

这个是这篇文章的重点!!!虽然开发板的出产系统是自带驱动的,但是那个驱动太多了,QT的界面也是已经搭建好的,对于我想从头自己做项目的话,起不到学习作用,所以也是对着出厂设置来自行移植!

这里的话,我搜了网上的很多资料,因为stm32mp1系列的开发板,根据正点原子工作人员的讲法,当时ST公司是限制了其产量,所以用的人很少,大多数都是用imx或者直接rk系列芯片,mp1系列的相关资料就很少,我网上就只找到了华清有几个相关的摄像头驱动教程,但是是直接加载到内核,而且写的文件跟正点原子的风格还是不太一样的,本着自我学习的精神,我也是自己研究出来了怎么移植,而不是网上搜到的大多数基于正点原子出厂系统的使用

进入正题,看看如何完成OV5640驱动移植。

设备树修改

需要在相关的设备树dts和dtsi文件中加入相关的内容,涉及到摄像头接口dcmi节点,ov5640节点以及相关的电源和时钟节点信息。

dcmi接口

首先需要添加dcmi节点,这是一个摄像头接口所使用的节点,这里根据正点原子的GPIO口需要在stm32mp157d-atk.dtsi文件中加入以下内容:

&pinctrl {dcmi_pins_b: dcmi-1 {pins {pinmux = <STM32_PINMUX('H', 8,  AF13)>,/* DCMI_HSYNC */<STM32_PINMUX('B', 7,  AF13)>,/* DCMI_VSYNC */<STM32_PINMUX('A', 6,  AF13)>,/* DCMI_PIXCLK */<STM32_PINMUX('H', 9,  AF13)>,/* DCMI_D0 */<STM32_PINMUX('H', 10, AF13)>,/* DCMI_D1 */<STM32_PINMUX('H', 11, AF13)>,/* DCMI_D2 */<STM32_PINMUX('H', 12, AF13)>,/* DCMI_D3 */<STM32_PINMUX('H', 14, AF13)>,/* DCMI_D4 */<STM32_PINMUX('I', 4,  AF13)>,/* DCMI_D5 */<STM32_PINMUX('B', 8,  AF13)>,/* DCMI_D6 */<STM32_PINMUX('E', 6,  AF13)>;/* DCMI_D7 */bias-disable;};};dcmi_sleep_pins_b: dcmi-sleep-1 {pins {pinmux = <STM32_PINMUX('H', 8,  ANALOG)>,/* DCMI_HSYNC */<STM32_PINMUX('B', 7,  ANALOG)>,/* DCMI_VSYNC */<STM32_PINMUX('A', 6,  ANALOG)>,/* DCMI_PIXCLK */<STM32_PINMUX('H', 9,  ANALOG)>,/* DCMI_D0 */<STM32_PINMUX('H', 10, ANALOG)>,/* DCMI_D1 */<STM32_PINMUX('H', 11, ANALOG)>,/* DCMI_D2 */<STM32_PINMUX('H', 12, ANALOG)>,/* DCMI_D3 */<STM32_PINMUX('H', 14, ANALOG)>,/* DCMI_D4 */<STM32_PINMUX('I', 4,  ANALOG)>,/* DCMI_D5 */<STM32_PINMUX('B', 8,  ANALOG)>,/* DCMI_D6 */<STM32_PINMUX('E', 6,  ANALOG)>;/* DCMI_D7 */};};
};

这一部分相当于给定了dcmi接口所使用的GPIO口的定义。

然后在stm32mp157d-atk.dts中加入如下内容:

&dcmi {status = "okay";pinctrl-names = "default", "sleep";pinctrl-0 = <&dcmi_pins_b>;pinctrl-1 = <&dcmi_sleep_pins_b>;port {dcmi_0: endpoint {remote-endpoint = <&ov5640_0>;bus-width = <8>;hsync-active = <0>;vsync-active = <0>;pclk-sample = <1>;pclk-max-frequency = <77000000>;};};
};

这里就是在设备树中添加了dcmi的节点,连接到了ov5640的节点,并且定义了一些属性内容,这一部分只要复制过来就可以了。

ov5640

需要在设备树节点中添加ov5640节点,这里可以去参考Documentation/devicetree/bindings/media/i2c/ov5640.txt,里面有通过i2c驱动ov5640需要在设备树中添加内容的示例,基于示例以及正点原子开发板的出厂配置,可以在stm32mp157d-atk.dts添加如下内容:

&i2c5 {	pinctrl-names = "default", "sleep";pinctrl-0 = <&i2c5_pins_a>;pinctrl-1 = <&i2c5_pins_sleep_a>;i2c-scl-rising-time-ns = <100>;i2c-scl-falling-time-ns = <7>;status = "okay";/delete-property/dmas;/delete-property/dma-names;ov5640: camera@3c {compatible = "ovti,ov5640";reg = <0x3c>;clocks = <&clk_ext_camera>;clock-names = "xclk";DOVDD-supply = <&v2v8>;powerdown-gpios = <&gpioe 11 (GPIO_ACTIVE_HIGH | GPIO_PUSH_PULL)>;reset-gpios = <&gpioe 1 (GPIO_ACTIVE_LOW | GPIO_PUSH_PULL)>;rotation = <180>;status = "okay";port {ov5640_0: endpoint {remote-endpoint = <&dcmi_0>;bus-width = <8>;data-shift = <2>;hsync-active = <0>;vsync-active = <0>;pclk-sample = <1>;pclk-max-frequency = <77000000>;};};};
};

这里就是把txt的内容拉过来,然后适配一下gpio的节点就可以了。

辅助节点

通过对ov5640的节点,可以发现需要时钟定义以及2.8V的电源定义,所以在stm32mp157d-atk.dts的根节点添加如下内容:

clocks {clk_ext_camera: clk-ext-camera {#clock-cells = <0>;compatible = "fixed-clock";clock-frequency = <24000000>;};};v2v8: regulator-v2v8 {compatible = "regulator-fixed";regulator-name = "v2v8";regulator-min-microvolt = <2800000>;regulator-max-microvolt = <2800000>;regulator-always-on;regulator-over-current-protection;};

之后就顺利的完成了设备树的内容一致啦。

Linux内核

这里的话其实也不用改,我按照教程学习Linux驱动的时候,按照教程移植过来的内核里面,menuconfig里面是已经把改配置的都已经配置好了。这里就我截个图,如果没配置就按照下面配置一下:

-> Device Drivers
-> <M> Multimedia support
-> V4L platform devices
-> <M> STM32 Digital Camera Memory Interface (DCMI) support
-> Device Drivers
-> <M> Multimedia support
-> I2C Encoders, decoders, sensors and other helper chips
-> <M> OmniVision OV5640 sensor support
我这边是把他都编译成模块化去生成动态加载的ko文件,之后去drivers文件夹里面复制到开发板就可以了。

以上操作均完成后就重新编译,命令如下:

make dtbs uImage LOADADDR=0XC2000040 -j16

最终移植加载

这一步也是很重要的,需要把如下的ko文件全部移动到开发板的/lib/modules/5.4.31中:

/drivers/media/i2c/ov5640.ko
/drivers/media/mc/mc.ko
/drivers/media/v4l2-core/vediodev.ko
/drivers/media/v4l2-core/v4l2-fwnode.ko
/drivers/media/v4l2-core/videobuf2-common.ko
/drivers/media/v4l2-core/videobuf2-memops.ko
/drivers/media/v4l2-core/videobuf2-v4l2.ko
/drivers/media/v4l2-core/videobuf2-dma-contig.ko
/drivers/media/platform/stm32/stm32-dcmi.ko

然后进去之后就只要输入以下命令就可以:

cd /lib/modules/5.4.31
modprobe stm32-dcmi.ko
modprobe ov5640.ko

大功告成!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/228879.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLOV8:最新探测物体状态综合指南

YLOLV8是最新的以YOO为基础的物体检测模型,提供最先进的性能。 利用前几部《yolo》,yolov8更快速更准确&#xff0c;同时为训练模式提供统一的框架 物体检测实例分割影像分类 到编写本文件时,许多功能还没有被添加到超催化剂YLOLV8存储库中。这包括训练有素的模型的一整套导…

Axure元件的介绍使用以及登录界面和个人简历的绘制

目录 一、Axure元件介绍 1.1 简介 1.2 特点 1.3 元件操作 二、基本元件的使用 2.1 矩形和圆形 2.2 图片 2.2.1 图片元件特点 2.2.2 具体操作 2.3 占位符 2.3.1 使用规范方法举例 2.4 文本元件 2.4.1 图示 2.5 热区 2.5.1 图示 2.5.2 热区辅助页面排版 2.6 线段…

Redis7--基础篇8(集群cluster)

1. 集群&#xff08;cluster&#xff09;介绍 由于数据量过大&#xff0c;单个Master复制集难以承担&#xff0c;因此需要对多个复制集进行集群&#xff0c;形成水平扩展每个复制集只负责存储整个数据集 的一部分&#xff0c;这就是Redis的集群&#xff0c;其作用是提供在多个…

Extra-terrestrial Intelligence

题目名字 Extra-terrestrial Intelligence 题意 给定一01序列&#xff0c;试问其中的 1 是否等距.若等距则输出YES,否则输出NO 思路 该代码首先检查字符串 aa 是否全为 ‘1’&#xff0c;如果是&#xff0c;则结束。否则&#xff0c;它开始处理字符串&#xff0c;将所有连续的…

2023人物专访【中国新时代艺坛楷模】徐大龙盆景艺术专题报道

随着社会经济的发展和人们审美观念的改变&#xff0c;苏派盆景艺术以其精湛的技艺和独特的艺术魅力&#xff0c;又成为了中外盆景界的一大亮点。今天来聊聊江南盆景艺术专家徐大龙先生。 徐大龙&#xff0c;江苏常州人&#xff0c;「复兴之路&#xff0c;强国有我」50位爱国奉献…

web(HTML之表单练习)

使用HTML实现该界面&#xff1a; 要求如下&#xff1a; 用户名为文本框&#xff0c;名称为 UserName&#xff0c;长度为 15&#xff0c;最大字符数为 20。 密码为密码框&#xff0c;名称为 UserPass&#xff0c;长度为 15&#xff0c;最大字符数为 20。 性别为两个单选按钮&a…

Web安全漏洞分析—文件包含

在当今数字化时代&#xff0c;随着Web应用程序的广泛应用&#xff0c;网络安全问题愈加凸显。其中&#xff0c;文件包含漏洞作为一种常见但危险的安全隐患&#xff0c;为恶意攻击者提供了可乘之机。在这篇博客中&#xff0c;我们将深入探讨文件包含漏洞的本质、攻击手法以及应对…

PMP项目管理 - 沟通管理

系列文章目录 PMP项目管理 - 质量管理 PMP项目管理 - 采购管理 PMP项目管理 - 资源管理 PMP项目管理 - 风险管理 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in…

LVS-DR部署

目录 LVS的工作模式及其工作过程 NAT模式&#xff08;VS-NAT&#xff09; 直接路由模式&#xff08;VS-DR&#xff09; IP隧道模式&#xff08;VS-TUN&#xff09; DR模式 LVS负载均衡群集的分析及特点 数据包流向分析 DR 模式的特点 LVS-DR部署实例 LVS-DR模式部署流…

ESP32网络开发实例-使用nlohmann/json库数据解析

使用nlohmann/json库数据解析 文章目录 使用nlohmann/json库数据解析1、JSON简介2、 nlohmann/json库介绍与移植3、一个简单的示例4、嵌套 JSON 对象和数组5、JSON序列化6、JSON 反序列化7、获取 JSON 对象的键值8、JSON 扁平化(Flatten)9、解析HTTP JSON响应在本文中,我们将…

2023最新最全【PostMan】安装教程

为了验证接口能否被正常访问&#xff0c;我们常常需要使用测试工具&#xff0c;来对数据接口进行检测。 好处&#xff1a;接口测试工具能让我们在不写任何代码的情况下&#xff0c;对接口进行调用和调试。 下载并安装PostMan 首先&#xff0c;下载并安装PostMan&#xff0c;请…

吊炸天,腾讯开源的一站式微服务解决方案

项目介绍 Spring Cloud Tencent 是腾讯开源的一站式微服务解决方案。 Spring Cloud Tencent 实现了Spring Cloud 标准微服务 SPI&#xff0c;开发者可以基于 Spring Cloud Tencent 快速开发 Spring Cloud 云原生分布式应用。 Spring Cloud Tencent 的核心依托腾讯开源的一站式…

Git-瑞吉外卖

什么是GIt? 分布式版本控制工具&#xff0c;用来管理源代码文件。分布式主要体现在两种仓库&#xff08;本地仓库、远程仓库&#xff09;。 git的作用&#xff1f; 代码回溯、版本切换&#xff08;切换不同框架&#xff09;、多人协作、远程备份 基本命令&…

SpringBoot零基础入门到项目实战——学习路线规划与目录结构

文章目录 第一部分&#xff1a;Spring Boot基础第二部分&#xff1a;Web开发与RESTful API第三部分&#xff1a;数据访问与持久化第四部分&#xff1a;安全与身份验证第五部分&#xff1a;高级主题第六部分&#xff1a;测试总结与扩展实战项目练习 &#x1f389;欢迎来到Spring…

Base64编码解码(文本与文件)

目录 1.什么是base64 2.在java中使用base64 3.在js中使用base64 1.什么是base64 base64编码就是将字符串以每3个比特&#xff08;bit&#xff09;的字节子序列拆分为4个6比特&#xff08;bit&#xff09;的字节子序列&#xff08;这个6比特是有效字节&#xff0c;最左边两个…

xilinx原语介绍及仿真——ODELAYE2

7系列IO模块相关的结构如图1所示&#xff0c;前文对IOB、IDELAYE2、ILOGIC、OLOGIC进行了讲解&#xff0c;还剩下ISERDESE2、OSERDESE2、ODELAYE2原语&#xff0c;本文对ODELAYE2进行讲解&#xff0c;该原语只有HP bank才有&#xff0c;即7系列FPGA的A7系列没有ODELAYE2结构&am…

探索太空深渊:计算机技术在航天领域的无限可能

探索太空深渊&#xff1a;计算机技术在航天领域的无限可能 一、引言 在21世纪的科技浪潮中&#xff0c;太空探索和计算机技术无疑是两个最为璀璨夺目的领域。它们各自的发展都足以改变人类社会的未来&#xff0c;而当这两者交汇时&#xff0c;所激发出的创新和变革更是超乎我…

git-lfs基本知识讲解

目录 1. 基本知识2. 安装 1. 基本知识 git-lfs 是 Git Large File Storage 的缩写&#xff0c;是 Git 的一个扩展&#xff0c;用于处理大文件的版本控制。 它允许你有效地管理和存储大型二进制文件&#xff0c;而不会使 Git 仓库变得过大和不稳定。以下是一些与 git-lfs 相关…

Java:自定义Enum

Java 枚举是一个特殊的类&#xff0c;一般表示一组常量&#xff0c;比如一年的 4 个季节&#xff0c;一年的 12 个月份&#xff0c;一个星期的 7 天&#xff0c;方向有东南西北等。 一、常量&#xff1a; Java 枚举类使用enum关键字来定义&#xff0c;各个常量使用逗号“,”来…

IIS如何本地部署网站,作为局域网内的服务器

文章目录 IIS本地部署WebService1.使用IIS及WebService的原因:2.相关文件说明及网络条件说明&#xff1a;&#xff08;1&#xff09;文件说明&#xff1a;&#xff08;2&#xff09;网络条件说明&#xff1a; 3.IIS安装与配置&#xff1a;第一步&#xff1a;安装第二步&#xf…