关于stm32mp157

news2025/3/20 5:39:53

目录

设备树:

内核移植:

编写一个驱动的过程:

编写i2c传感器驱动的过程:


从arm11后,命名改为cortex,

        1.cortex A:高端应用型领域

        2.cortex R:实时性要求

        3.cortex M:单片机领域 

stm32mp157(双核异构)有两个cortexA7(主频650MHZ,最高可达800HZ),有一个cortexM4(主频209MHZ),16位ADC

设备树:

Linux3.x出现的一种用来管理板级资源的机制,使用节点形式描述板子上的资源;Linux5.4.31->arch/arm/boot/dts中存放设备树文件     

内核移植:

Linux5.4.31内核版本(支持设备树):

       1.使用usb,通过STM32CubeProgermmer烧写uboot(拨码开关 000),为系统运行提供一个合适的环境,包括:

                (1.对硬件初始化(初始化cpu工作模式SVC,初始化内存,初始化时钟,关闭中断和看门狗,关闭 Dcache) 

                (2.对串口网口初始化

                (3.将内核映像从flash搬到内存

                (4.向内核传参(R0 = 0,R1 = Machine ID,R2 = 基地址) 

        2.编译内核Kernel(uImage;Image->zlmage->uImage(自解压的过程))以及设备树

                (1.因为st官方源码不支持YT8511,需要自己移植:

                               a.将motorcomm.c和motorcomm_phy.c分别拷贝到drivers/net/phy和/include/linux

                               b.修改drivers/net/phy/Makefile: 97行 -> obj -$(CONFIG_MOTORCOMM_PHY) += motorcomm.o

                                c.修改Kconfig:

                                d.修改 make menuconfig

                (2.执行build.sh脚本(./build.sh)生成uImage和dtb文件

                (3.通过tftp将ulmage和.dtb下载到板子里 -> 设置环境变量bootcmd tftp c2000000 uImage  tftp c4000000 .dtb

                (4.编译Kernel的一些过程

                        (a.对内核映像完成解压

                        (b.跳转到解压后的内核入口点

                        (c.执行start_kernel函数(C语言函数),完成内核大部分初始化工作 

                (5.mkimage -l uImage                    

        3.根文件系统:nfs挂载根文件系统

                (1.使用busybox制作根文件系统

        4.向根文件系统添加lib库

                (1. 向rootfs/lib添加.so动态库:

                        (a.cd /usr/local/arm/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/arm none-linux-gnueabihf/libc/lib

                        (b.cp *so* /home/linux/nfs/rootfs/lib/ -d

                        (c. 在rootfs/lib中 rm ld-linux-armhf.so.3

                        (d.cd /usr/local/arm/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/arm none-linux-gnueabihf/libc/lib

                        (e.cp ld-linux-armhf.so.3 /home/linux/nfs/rootfs/lib/

                (2. 向rootfs/lib添加静态库文件

                        (a.cd /usr/local/arm/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/arm none-linux-gnueabihf/lib

                        (b.cp *so* *.a /home/linux/nfs/rootfs/lib/ -d

                (3.向 rootfs/usr/lib"添加库文件

                        (a.mkdir /home/linux/nfs/rootfs/usr/lib

                        (b.cd /usr/local/arm/gcc-arm-9.2-2019.12-x86_64-arm-none-linux gnueabihf/arm-none-linux-gnueabihf/libc/usr/lib

                        (c.cp *so* *.a /home/linux/nfs/rootfs/usr/lib/ -d

        5.init进程:执行init进程,开启用户空间;在bootargs中,init = /linuxrc,是内核启动执行的第一个进程

编写一个驱动的过程:

        1.在stm32mp157-atk.dts设备文件中增加设备节点

        2.在顶层目录通过make dtbs命令编译设备树文件,生成dtb文件:stm32mp157-atk.dtb

        3.dtb和ulmage拷贝到tftb指定路径下(tftpboot),并使用编译好的dtb和ulmage启动内核

        4.使用of函数从节点将设备信息解析出来

        5.进行GPIO相关操作,初始化,映射等

        6.编译成.ko -> insmod.ko -> init ->

        7.运行应用层程序

编写i2c传感器驱动的过程:

        1.在dts设备文件中,在i2c控制器节点下添加新的传感器设备节点

        2.make dtbs

        3.将dtb文件拷贝到tftp指定目录(tftpboot)

        4.编写i2c设备树驱动程序(spi类似)

                (a.insmod后,首先执行init函数,i2c_add_driver();   -> 将驱动注册到总线中

                (b.static const struct of_device_id match[] = {

                                {.compatible = "atk,lm75"},

                        };   -> 匹配设备树节点

                (c.匹配成功后执行driver函数中的probe函数,完成字符型设备驱动的初始化(注册字符型设备,初始化以及添加cdev,自动生成设备节点等)

                (d.当rmmod时,执行exit函数,i2c_del_driver();  -> 将i2c从总线上注销

                (e.执行remove函数(因为i2c_del_driver();)

                (f.再这个过程中,执行file_opreation结构体驱动层操作函数

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

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

相关文章

YOLOv11 目标检测

本文章不再赘述anaconda的下载以及虚拟环境的配置,博主使用的python版本为3.8 1.获取YOLOv11的源工程文件 链接:GitHub - ultralytics/ultralytics: Ultralytics YOLO11 🚀 直接下载解压 2.需要自己准备的文件 文件结构如下:红…

VSCode C/C++ 环境搭建指南

一、前言 Visual Studio Code(简称 VSCode)是一款轻量级且功能强大的跨平台代码编辑器,凭借丰富的插件生态和高度的可定制性,深受开发者喜爱。对于 C/C 开发者而言,在 VSCode 中搭建开发环境,能够获得灵活…

Python 中下划线 “_” 的多面性:从变量到约定

# Python中下划线“_”的多面性:从变量到约定 在Python的语法体系里,下划线“_”看似毫不起眼,实则扮演着极为重要且多样化的角色。它不仅能作为普通变量参与编程,更在多个特殊场景下有着独特的用途与约定。深入理解下划线的各种…

Vue3项目开发:状态管理实践指南

# Vue3项目开发:状态管理实践指南 一、引言 背景介绍 在Vue项目中,状态管理是一个非常重要的话题。合理的状态管理能够帮助我们更好地组织和管理数据,提升项目的可维护性和可扩展性。本文将深入探讨Vue3项目中状态管理的最佳实践,…

数据结构-------栈

顺序栈: 一、数据结构定义 数据元素 DATATYPE typedef struct person {char name[32];char sex;int age;int score; } DATATYPE;顺序栈结构 SeqStack typedef struct list {DATATYPE *head; // 栈空间首地址int tlen; // 栈总容量(total leng…

机器学习概要

文章目录 一、什么是机器学习 二、机器学习的种类 1. 有监督学习 2. 无监督学习 3.强化学习 三、机器学习的应用 四、机器学习的步骤 1. 数据的重要性 2. 数据和学习的种类 3. 可视化 一、什么是机器学习 机器学习指的是计算机根据给定的问题、课题或环境进行学习&a…

【LangChain入门 2 Model组件】开始!LLM Models简单对话

文章目录 一、使用langchain_ollama二、采用DeepSeek的API三、Model 介绍3.1 OllamaLLM 预训练模型3.2 ChatOllama 聊天预训练模型3.3 OllamaEmbeddings 实现一个helloworld,跑通一个简单的对话。 后面章节会正式介绍LangChain的各个功能。 后台llm的端口可以任意选…

C++20 中线程管理与取消机制的深度剖析

文章目录 std::jthread:更智能的线程管理背景与优势构造函数与 std::stop_token 的集成 std::stop_token、std::stop_source 和 std::stop_callback:灵活的取消机制std::stop_token:取消请求的指示器std::stop_source:取消请求的发…

Vue3 核心特性解析:Suspense 与 Teleport 原理深度剖析

Vue3 核心特性解析:Suspense 与 Teleport 原理深度剖析 一、Teleport:突破组件层级的时空传送 1.1 实现原理图解 #mermaid-svg-75dTmiektg1XNS13 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-s…

FPGA——实现LED流水灯

文章目录 一、Quartusll_18.1和VS Code软件的关联二、DE2-115的时钟电路三、流水灯的分层次设计四、总结 一、Quartusll_18.1和VS Code软件的关联 1.先打开Quartus II 软件,然后选择菜单栏“Tools”下的“Options…”。 2.点击“Options…”,在弹出的对…

Excel 小黑第12套

对应大猫13 涉及金额修改 -数字组 -修改会计专用 VLOOKUP函数使用(查找目标,查找范围(F4 绝对引用),返回值的所在列数,精确查找或模糊查找)双击填充柄就会显示所有值 这个逗号要中文的不能英…

滚动元素的新api

点击的时候需要双重视图滚动 itemClick(id) {// 滚动到对应位置this.$nextTick(() > {// 找到对应 id 在 initList2 中的索引const index this.initList2.findIndex((item) > item.id Number(id));if (index ! -1) {// 获取所有菜单项const menuItems document.queryS…

多机调度问题(C语言)

代码如下&#xff1a; #include<stdio.h> #include<stdlib.h>int compare(void* a, void* b)//比较函数&#xff0c;用于qsort按处理时间从大到小排序 {return *(int*)a - *(int*)b; }int LPT(int jobs[], int n, int m)//多机调度问题的LPT算法 {qsort(jobs, n, …

烽火HG680-KB_海思HI3798MV310_安卓9.0_U盘强刷固件包及注意点说明

之前发布过这个固件包&#xff0c;关于烽火HG680-KA&#xff0f;HG680-KB_海思HI3798MV310_安卓9.0_U盘强刷固件包详细说明一下&#xff0c;汇总总结一些常遇到的情况&#xff0c;这次固件会分开发布&#xff0c;以免混淆。 上一个帖子地址&#xff1a;烽火HG680-KA&#xff0…

996引擎 - 红点系统

996引擎 - 红点系统 总结NPC 红点(TXT红点)Lua 红点1. Red_Point.lua2. UI_Ex.lua参考资料以下内容是在三端 lua 环境下测试的 总结 红点系统分几个部分组成。 M2中设置变量推送。 配置红点表。 Envir\Data\cfg_redpoint.xls 2.1. UI元素中找到ID填写 ids 列。 主界面挂载…

3.17BUUCTF练习day1

BUUCTF练习day1 [极客大挑战 2019]EasySQL1&#xff08;字符型&#xff0c;账号密码型&#xff0c;get型&#xff09; 判断闭合方式 在用户名输入1‘&#xff0c;此时密码先输入任何数字时&#xff0c;出现语法错误 说明闭合方式为单引号闭合&#xff0c;在判断完闭合方式后…

【贪心算法】柠檬水找零

1.题目解析 860. 柠檬水找零 - 力扣&#xff08;LeetCode&#xff09; 2.讲解算法原理 分情况讨论 5---》直接收下 10---》找五元&#xff0c;收下 20----》105△ ----》555 由于5元更有用&#xff0c;则尽可能保留5元 3.代码 class Solution {public boolean lemonadeCh…

黑马跟学.苍穹外卖.Day08

黑马跟学.苍穹外卖.Day08 苍穹外卖-day8课程内容1. 工作台1.1 需求分析和设计1.1.1 产品原型1.1.2 接口设计 1.2 代码导入1.2.1 Controller层1.2.2 Service层接口1.2.3 Service层实现类1.2.4 Mapper层 1.3 功能测试1.3.1 接口文档测试1.3.2 前后端联调测试 1.4 代码提交 2. Ap…

ABAP语言的动态编程(4) - 综合案例:管理费用明细表

本篇来实现一个综合案例&#xff1a;管理费用明细表。报表在实际项目中&#xff0c;也有一定的参考意义&#xff0c;一方面展示类似的报表&#xff0c;比如管理费用、研发费用等费用的明细&#xff0c;使用业务比较习惯的展示格式&#xff1b;另一方面正好综合运用前面学习的动…

通过Geopandas进行地理空间数据可视化

目录 引言 安装与导入 数据加载与探索 数据预处理 基本地图可视化 添加其他数据到地图上 空间分析与查询 地图叠加与分组 空间缓冲区 交互式地图可视化 实际应用案例 城市规划 环境监测 结论 引言 在数据科学领域,地理空间数据可视化扮演着至关重要的角色。它不…