【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第三十五章 嵌入式开发概述及环境构建

news2024/10/11 22:05:51

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7+单核cortex-M4异构处理器,既可用Linux、又可以用于STM32单片机开发。开发板采用核心板+底板结构,主频650M、1G内存、8G存储,核心板采用工业级板对板连接器,高可靠,牢固耐用,可满足高速信号环境下使用。共240PIN,CPU功能全部引出:底板扩展接口丰富底板板载4G接口(选配)、千兆以太网、WIFI蓝牙模块HDMI、CAN、RS485、LVDS接口、温湿度传感器(选配)光环境传感器、六轴传感器、2路USB OTG、3路串口,CAMERA接口、ADC电位器、SPDIF、SDIO接口等


第三篇 嵌入式 Linux 驱动开发篇

第一部分 Linux 驱动初探

三十五嵌入式开发概述及环境构建

35.1嵌入式 linux 开发介绍

  Linux 是一个开放、灵活、跨平台的操作系统,上至庞大的数据中心,下至可放于掌心中的嵌入式设备, 无处没有 Linux 的身影。更为重要的是, Linux 是一个与 Unix 既一脉相承又与时俱进的系统。可以说, 上世纪 70 年代学习的 Unix 知识和技巧,在今天仍然大有用武之地,这与 Windows 平台的开发形成了鲜 明的对比。程序员不用担心今天微软出一个 .net,明天又出一个 F#,使得自己过去学习的成果付之东流。 成为一名精通 Linux 驱动程序设计的高级程序员一直是不少朋友孜孜以求的目标。要入门 Linux 环境 下的驱动编程,关键是要看对、选对、学会正确的书籍。可以说,如果你选对了 Linux 驱动编程的入门书籍, 配合你在程序设计工作中的刻苦钻研,成为一名精通 Linux 驱动程序设计的高级程序员并非一件可望不可 及的事情。但如果各位程序员朋友没有选对正确的书籍,则你的职业生涯之路就可能面临坎坷。本书我们 将以理论加实践的方式重点讲解嵌入式 Linux 驱动的框架,了解驱动开发通用的流程和方法,进而掌握从应 用程序到驱动程序的调用流程。在使用本教程学习驱动开发的过程中,会涉及迅为的很多开发板,将更多的焦点转移到了驱动编程背后的内核原理,并试图从 Linux 内核的上百个驱动子系统中寻找出内部规律,以 培养读者举一反三的能力,让你能“一通百通”,了解写驱动的通用的方法之后,在工作中很容易在其他 板子上面使用这些知识。Linux 内核有上百个驱动子系统,傻子才会一个目录一个目录地去看,一个目录一个目录地从头学起。我们势必要寻找各种驱动子系统的共性,摸索规律。 从浩如烟海的知识体系、不断更新的软件版本中终生学习,不断攻克一个个挑战,获取新养分,寻找 新灵感,这实在是黑暗的码农生涯中不断闪现的璀璨光芒。Linux 的内核版本不断更新,出现了 Linux 3.0、 Linux 3.1、Linux 3.2、…、Linux 3.19、Linux 4.0、Linux 4.1,变化的是软件的架构,不变的是 Linus 的热情。 我们将以设备树版本的内核为例进行讲解。如果有好的基础,以优秀程序员极强的学习能力,应该很快就 可以掌握这些新知识。机制没有变,变化的只是策略,因此学习能力也是优秀程序员的又一个重要品质。 没有人生下来就是天才,良好的学习能力也是通过后天的不断学习培养的。可以说,学得越多的人,学新 东西的速度一定越快,学习能力也变得越强。因为,知识的共通性实在太多。 本书分为四个部分,第一部分是 linux 驱动初探,第二部分是 linux 内核裁剪与定制,第三部分是 linux 驱动基础,第四部分是 linux 驱动进阶,这四个部分是环环相扣,一脉相承的,所以与本文档配套的视频不能跳,要踏踏实实,一步一个脚印。趋向于激进、浮躁的内心会使得我们难以静下心来研究技术,做技术 的人,从来没有终南捷径,拼得就是坐冷板凳的傻劲。 Linux 设备驱动的学习是一项浩繁的工程,学习 linux 驱动要求我们有足够的学习恒心和毅力。动手实践 永远是学习任何软件开发的最好方法,学习 Linux 设备驱动也不例外。阅读经典书籍和参与 Linux 社区的讨 论也是非常好的学习方法。Linux 内核源代码中包含了一个 Documentation 目录,其中包含了一批内核设计 文档,全部是文本文件。学习 Linux 设备驱动的一个注意事项是要避免管中窥豹、只见树木不见森林,因为 各类 Linux 设备驱动都从属于一个 Linux 设备驱动的架构,单纯而片面地学习几个函数、几个数据结构是不 可能理清驱动中各组成部分之间的关系的。因此,Linux 驱动的分析方法是点面结合,将对函数和数据结构 的理解放在整体架构的背景之中。

35.2 嵌入式 linux 环境构建

俗话说“工欲善其事,必先利其器”,为了方便进行 Linux 设备驱动的开发和调试,我们首先要搭建 linux 驱动开发环境。驱动程序是依赖于 linux 内核的,如果您是在STM32MP157平台上进行驱动开发,必须先在Ubuntu 中下载,配置,编译开发板 STM32MP157平台所使用的 linux 内核。大家可以参考开发板的使用手 册完成下面的部分。

硬件环境构建

  • 开发板连接线:调试串口线,OTG 烧写数据线,网线,电源线
  • 开发板烧写镜像

软件环境构建

  • 下载设备树内核源码,window 和 Ubuntu 下各放一份。
  • Windows下安装sourceinsight创建内核源码工程,这是用来浏览内核,编辑驱动的软件

Ubuntu下:安装工具链,配置,编译Linux内核源码

本教程中使用的是STM32MP157开发板。Ubuntu的开发环境是 Ubuntu18

本教程使用的内核源码是linux-5.4.31

交叉编译器使用的是:gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf

35.2.1 编译设备树源码

了方便大家编译设备树源码,本章节将介绍如何编译STM32MP157内核源码(编译之前参考STM32MP157开发板使用手册第九章搭建编译环境)

首先,进入源码解压的到的/home/topeet/work/linux-5.4.31目录下,如下图所示:

然后我们使用命令“./create.sh”进行编译如下图所示: 

编译完成如下图所示: 

 

编译完成生成的 kernel 镜像是“output/”目录下的“uImage”,生成的设备树镜像是“output//dts”目录下的 “stm32mp157a-itop.dtb、stm32mp157a-itop-rgb-043.dtb、 stm32mp157a-itop-lvds-070.dtb  stm32mp157a-itop-rgb-050.dtb、 stm32mp157a-itop-lvds-097.dtb 、 stm32mp157a-itop-rgb-070.dtb、stm32mp157a-itop-lvds-101.dtb”,如图所示: 

但我们最后要烧写的是opt目录下的bootfs.ext4文件,将该文件对我们默认的/home/image烧写镜像目录下bootfs.ext4文件进行覆盖,如下图所示: 

 

然后我们对该镜像进行烧写,我们在这里为了方便,使用linux版本的烧写工具,进行烧写。

如果使用我们提供好的环境,则在任意目录下使用命令“stm32.sh”打开该烧写文件(如果没用使用我们编译好的编译环境),如下图所示:

 

然后点击Open file右边的加号,选择open file选项,如下图所示:

 
找到我们要烧写的镜像,然后选择打开tf-a.tsv配置文件,如下图所示:

 

选择配置文件之后会将烧写的内容显示出来,然后选择右上角的USB设备,并点击绿色的链接按钮,如下图所示: 

 

连接成功之后(默认都是USB1),之前的Connect会变成Disconnect,然后点击Download按钮就会开始烧写了,如下图所示: 

需要注意的是下方的Binaries path可能不会默认选择,未选择时需要自行选择一下: 

 

烧写成功之后,重启开发板,在uboot倒计时的过程之中,按下任意键,然后进入uboot模式,如下图所示:

 

35.2.2 设置屏幕参数

各屏幕与对应的uboot命令如下:

屏幕

设置命令

4.3寸屏幕

setenv lcdtype 4.3

5寸屏幕

setenv lcdtype 5.0

9.7寸屏幕

setenv lcdtype 9.7

10.1寸屏幕

setenv lcdtype 10.1

塑胶壳7寸屏幕

setenv lcdtype 7.0

金属框7寸屏幕

setenv lcdtype 1024x600

HDMI屏幕

setenv lcdtype hdmi

以设置9.7寸屏为例,上电后在uboot倒计时按回车,进入命令行,输入“setenv lcdtype 9.7”,然后输入“saveenv”保存,然后输入“reset”重启使环境变量生效。

35.2.3 搭建nfs共享目录

为了方便进行 Linux 设备驱动的开发和调试,建立良好的开发环境很重要,还要使用必要的工具软件以 及掌握常用的调试技巧等。本章节将介绍搭建 nfs 共享目录,方便 Ubuntu 与开发板传文件来调试驱动程序。 NFS 是 Network FileSystem 的缩写,是由 SUN 公司研制的 UNIX 表示层协议 (pressentation layer protocol),NFS 是基于 UDP/IP 协议的应用。它的最大功能就是可以通过网络让不同的机器,不同的操作 系统彼此共享文件,可以通过 NFS 挂载远程主机的目录,访问该目录就和访问本地目录一样,所以也可以 简单的将它看成一个文件服务器。通过 NFS 服务,可以实现在线调试文件系统或应用程序,而不用像传统 的方式生成文件系统镜像,然后烧写到开发板的 eMMC 里,再启动开发板。通过 NFS 服务可以提高调试的效率。

35.2.3.1 搭建环境介绍

使用硬件环境是:一台PC,上面运行虚拟机ubuntu、一块 stm32mp157开发板。PC 机和开发板通过网线 连接到路由器上面,路由器分配的网段是192.168.0.x的ip地址,默认网关是路由器的ip地址,即 192.168.0.1。作者虚拟机 Ubuntu的ip地址是192.168.0.140,imx6开发板的ip是根据大家的具体情况而定,网段的子网掩码是 255.255.255.0。大家要根据自己使用的网络环境来设置ip地址,设置原则是确保虚拟机 Ubuntu的ip和开发板的ip在同一网段。

35.2.3.2 搭建NFS服务器

实现 NFS,需要一个主机作为 NFS 服务器,选择虚拟机 Ubuntu 作为主机。首先需要在在虚拟机Ubuntu 上安装 Ubuntu NFS 服务,这是一个软件包,可以使用 apt 命令下载(当然,首先要保证虚拟机可以上网)。 在 Ubuntu root 用户下输入“apt-get install nfs-kernel-server”命令安装 Ubuntu NFS 服务,在安装过程中会提 示”是否继续安装”的信息,输入”y”,如下图:

 

在这里我们的环境已经安装好了,所以这里显示零更新、零新安装,安装成功之后继续搭建 NFS 服务器。

我们使用命令“vim /etc/exports”,对exports文件进行内容的添加,在最后一行添加以下内容:

/home/nfs/ *(rw,sync,no_root_squash)

        添加完成如下图所示:

 

下面讲解一下上面输入的内容都代表什么意思:

/home/nfs/:要共享的目录;“/home/nfs/ ”目录需要自己建,默Ubuntu 中是没有的。

*:代表允许所有的网络段访问;

rw:是可读写权限;

sync:是资料同步写入内存和硬盘;

no_root_squash:是 Ubuntu nfs 客户端分享目录使用者的权限,如果客户端使用的是 root 用户,那么对于该共享目录而言,该客户端就具有 root 权限;

其他 Ubuntu nfs 常用的参数有:

ro:只读访问

async :nfs 在写入数据前可以相应请求

secure: nfs 通过以下的安全 TCP/IP 端口发送

insecure: nfs 通过 1024 以上的端口发送

wdelay:如果多个用户要写入 NFS 目录,则归组(默认)

no_wdelay:如果多个用户要写入 NFS 目录,则立即写入,当使用 async 时,无需此设置

hide:在 nfs 共享目录中不共享妻子目录

no_hide:共享 nfs 目录的子目录

subtree_check:如果共享/usr/bin 之类的子目录时,强制 nfs 检查父目录的权限(默认)

no_subtree_check:和上面相对,不检查父目录权限

all_squash:共享文件的 UID 和 GID 映射匿名用户 anonymous,适合公用目录

no_all_squash:保留共享文件的 UID 和 GID(默认)

root_squash root:用户的所有请求映射成如 anonymous 用户一样的权限(默认)

no_root_squash root:用户具有根目录的完全管理访问权限

anonuid=xxx:指定 nfs 服务器/etc/passwd 文件中匿名用户多的 UID

anongid=xxx:指定 nfs 服务器/etc/passwd 文件中匿名用户的 GID

接下来重启 rpcbind 服务,输入“/etc/init.d/rpcbind restart”命令,运行结果如下图:

 

然后重启 nfs 服务,输入“/etc/init.d/nfs-kernel-server restart”命令,运行结果如下图:  

使用命令:“showmount -e”查看是否成功挂载nfs目录(这里也可能要重启ubuntu才会又挂载目录),如下图: 

 

至此,Ubuntu nfs 服务器端的配置完成。

35.2.3.3 NFS共享目录使用

  通过路由器网线连接开发板和路由器。系统起来后首先使用“ifconfig”查看开发板 ip。如下图:

 

然后查看一下 NFS 服务器的 ip,如下图所示: 

 

可以查看到开发板和服务器在同一网段,如果不在同一网段然后修改开发板的网络设置,并重启开发板使之生效。

使用 ping 命令测试网络,如下图所示,开发板和 ubuntu 服务器之间的网络是连通的。

 

然后使用“mount -t nfs -o nolock 192.168.0.140:/home/nfs /mnt/”命令挂载到 nfs 服务器,如下图所示: 

 

进入虚拟机 Ubuntu 系统中的”/home/nfs”目录(这个目录是 NFS 服务器目录),使用“vim hello”命令新建 hello 文档,并添加“hello topeet nfs”内容,如下图: 

 

接下来查看开发板上的信息,如下图:

最后可以使用命令“umount /mnt/”命令卸载 NFS 目录。

由上图可知,开发板和虚拟机可以完成同步,方便调试。至此,nfs 共享目录的制作和使用介绍全部结束。

35.2.4 设置交叉编译器

如果是使用的我们搭建好的环境,则不需要设置,默认已经设置好了,而如果是自己搭建的环境则需要自己设置交叉编译器。

在虚拟机ubuntu中,进入“/usr/local”目录,使用如下命令创建 arm 目录,再进入此目录。

mkdir arm

接着通过 ssh 工具,将“iTOP-STM32MP157开发板光盘资料\04_TF-A、uboot和内核源码\交叉编译器” 路径下的gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz”编译器拷贝到“/usr/local/arm/”目录下。注意:此编译器用来编译uboot和kernel,编译应用程序的交叉编译器应与文件系统的编译器保持一致。

使用如下命令解压编译器,如下图所示,

tar -vxf gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz

 

解压完成,会得到“gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf”文件夹。

使用命令“cd ~”进入文件系统根目录下(一定要使用 root 账户),接着使用“vi .bashrc”命令,打开环境变量配置文件,如下图所示。

 

在环境变量配置文件最底行,添加以下内容。

export PATH=$PATH:/usr/local/arm/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin

如下图所示,然后保存退出。

 

接着还需要更新一下环境变量,如下图所示,使用命令“source .bashrc”。 

最后做一下环境变量测试,Ubuntu 控制台中输入“arm-”,然后按键盘上的“Tab” 键,会出现如下图所示内容。 

 至此我们的编译器就设置完成了。

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

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

相关文章

数据库表使用方法:

数据库表: 提供四种类型的约束保证完整性: 1.域完整性,2.实体完整性 3.自定义完整性 4.引用完整性 实体完整性: 约束方法:唯一约束,主键约束,标识列 域完整性: 约束方法&#x…

基于depth anything模型理解深度估计运行机理

文章目录 前言一、概念说明1、深度概念2、绝对深度概念3、相对深度概念4、深度估计表示方法二、相对深度估计与绝对(即度量)深度估计1、模型预测绝对深度劣势与应用优势2、模型预测相对深度必然性3、小结三、深度估计模型loss方法四、深度估计模型评估方法1、绝对相对误差2、…

Python:方法的链式调用

相关阅读 Pythonhttps://blog.csdn.net/weixin_45791458/category_12403403.html?spm1001.2014.3001.5482 在Python编程中,方法的链式调用是一种简洁且优雅的编程风格,它允许你在一行代码中连续调用多个方法,这种编程模式在简化代码、提升可…

22.安卓逆向-frida基础-objection工具1-安装和简单使用(Python的pip指令安装完提示不是内部命令解决办法)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于:图灵Python学院 本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要盲目相信。 工…

java4~~~

日期 第一代 import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.logging.SimpleFormatter;public class Main {public static void main(String[] args) throws ParseException {//两种构造器的使用//1、获取当…

OpenCV高级图形用户界面(1)创建滑动条函数createTrackbar()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 创建一个滑动条并将其附加到指定的窗口。 该函数 createTrackbar 创建一个具有指定名称和范围的滑动条(滑块或范围控制)…

Flexbox 弹性盒子布局

Flexbox,全称弹性盒子布局,提供更精细的控制,能轻松解决困扰我们许久的垂直居中和登高列问题。 1 display: flex 将容器设置为弹性容器,容器会占据100%的可用宽度,高度则由自身的内容来决定,即使改变主轴…

基于SSM的“企业人事管理系统”的设计与实现(源码+数据库+文档)

基于SSM的“企业人事管理系统”的设计与实现(源码数据库文档) 开发语言:Java 数据库:MySQL 技术:SSM 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 登陆页面 部门管理页面 加班页面 考勤页面 请假页面 工资页面 …

leetcode链表(三)-反转链表

题目 . - 力扣(LeetCode) 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 思路 首先定义一个cur指针,指向头结点,再定义一个pre指针,初始化为None。 然后就要开始反转了&…

使用tgz包下载安装clickhouse低版本

1.下载安装包 官方下载地址:https://packages.clickhouse.com/tgz/stable 阿里云下载地址:clickhouse-tgz-stable安装包下载_开源镜像站-阿里云 共需要下载四个文件 clickhouse-common-static-20.3.10.75.tgz clickhouse-common-static-dbg-20.3.10.7…

如何通过零工市场小程序提高匹配效率?

零工市场正往好的方向逐步发展,零工市场小程序就是数字化转型成功的标志,那么零工市场小程序作为求职者和雇主之间沟通的桥梁,通过利用现代技术,例如Java算法,提高了灵活就业市场的效率。 Java通过数据分析&#xff0…

AI预测体彩排3采取888=3策略+和值012路或胆码测试10月11日升级新模型预测第101弹

经过100多期的测试,当然有很多彩友也一直在观察我每天发的预测结果,得到了一个非常有价值的信息,那就是9码定位的命中率非常高,已到达90%的命中率,这给喜欢打私菜的朋友提供了极高价值的预测结果~当然了,大…

Docker Overlay2 空间优化

目录 分析优化数据路径规划日志大小限制overlay2 大小限制清理冗余数据 总结 分析 overlay2 目录占用磁盘空间较大的原因通常与 Docker 容器和镜像的存储机制以及它们的长期累积相关,其实我之前在 Docker 原理那里已经提到过了。 通常时以下几种原因导致&#xff…

Java:数据结构-LinkedList与链表(1)

一 链表 1.. ArrayList的缺陷(LinkedList的优点) 在ArrayList任意位置插入或者删除元素时,就需要将后序元素整体往前或者往后 搬移,时间复杂度为O(n),效率比较低,因此ArrayList不适合做任意位置插入和删除…

【AI知识点】残差网络(ResNet,Residual Networks)

AI知识点总结:【AI知识点】 AI论文精读、项目、思考:【AI修炼之路】 残差网络(ResNet,Residual Networks) 是由微软研究院的何凯明等人在 2015 年提出的一种深度神经网络架构,在深度学习领域取得了巨大的成…

Vue3封装消息提示框-基于element-plus

Vue3封装消息提示框-基于element-plus 图片示例 封装代码 创建modal.js文件 import {ElMessage,ElMessageBox,ElNotification,ElLoading, } from "element-plus";let loadingInstance;export default {// 消息提示msg(content) {ElMessage.info(content);},// 错误…

手机移动终端的土壤检测

手机OTG转USB串口,读取土壤检测设备信息,在APP展示。 总结一下 1. 用了MAUI框架,这东西感觉比xamarin好用,特别是contentpage和单例模式,数据绑定也很OK。 2. 串口驱动不好孤岛,废了不少功夫专门做这个。 3…

Lory: 推进大型语言模型训练的新篇章

人工智能咨询培训老师叶梓 转载标明出处 随着模型规模的增长,如何有效训练并利用这些模型成为了一个挑战。陈丹琦团队一项新的研究提出了一种创新的预训练方法——Lory,旨在解决大模型在混合专家(MoE)架构中的可微分性和计算效率…

开关打开输入框才能输入文字,否则为禁用状态

页面开关默认为关闭状态&#xff0c;输入框为禁用状态。 当点击开关&#xff0c;打开开关后&#xff0c;输入框禁用状态解除&#xff0c;才可以在输入框内输入。 html结构: <div class"page_top"><!-- 第一行 --><div class"top_first">…

使用three.js 实现一个 马赛克得 shader

使用three.js 实现一个 马赛克得 shader 源链接&#xff1a;https://threehub.cn/#/codeMirror?navigationThreeJS&classifyshader&idmosaicShader 国内站点预览&#xff1a;http://threehub.cn github地址: https://github.com/z2586300277/three-cesium-example…