关于stm32mp157
目录
设备树:
内核移植:
编写一个驱动的过程:
编写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结构体驱动层操作函数
相关文章:
关于stm32mp157
目录 设备树: 内核移植: 编写一个驱动的过程: 编写i2c传感器驱动的过程: 从arm11后,命名改为cortex, 1.cortex A:高端应用型领域 2.cortex R:实时性要求 3.cortex M:…...
关于单项梯度冻结小记
单项权重冻结(Partial Weight Freezing)详解 单项权重冻结(Partial Weight Freezing) 是深度学习模型训练中的一种技巧,指的是在训练过程中,只冻结(固定)部分网络权重,而…...
Ubuntu20.04安装Nvidia显卡驱动
Ubuntu20.04安装Nvidia显卡驱动 安装环境为Dell R540服务器 官网下载Nvidia显卡驱动 https://www.nvidia.cn/geforce/drivers/ 安装显卡驱动 chmod x NVIDIA-Linux-x86_64-470.63.01.run sudo ./NVIDIA-Linux-x86_64-470.63.01.run 遇到nouveau报错 lsmod查看nouveau驱动…...
YOLOv11 目标检测
本文章不再赘述anaconda的下载以及虚拟环境的配置,博主使用的python版本为3.8 1.获取YOLOv11的源工程文件 链接:GitHub - ultralytics/ultralytics: Ultralytics YOLO11 🚀 直接下载解压 2.需要自己准备的文件 文件结构如下:红…...
VSCode C/C++ 环境搭建指南
一、前言 Visual Studio Code(简称 VSCode)是一款轻量级且功能强大的跨平台代码编辑器,凭借丰富的插件生态和高度的可定制性,深受开发者喜爱。对于 C/C 开发者而言,在 VSCode 中搭建开发环境,能够获得灵活…...
Python-docx库详解:轻松实现Word文档自动化生成与图片尺寸控制
Python-docx库详解:轻松实现Word文档自动化生成与图片尺寸控制 在现代办公自动化的浪潮中,文档处理是一项不可或缺的任务。Python作为一种强大的编程语言,提供了丰富的库来简化这些任务。其中,python-docx库是处理Word文档的有力…...
Python大疆导出csv文件转化大地2000的dxf文件
大疆导出三维模型里面有个models\pc\0\terra_grid\csv\terra_grid.csv文件,里面记录所有点的坐标和高程,但坐标是经纬度坐标,需要转化为大地2000坐标。 我参照了:经纬度坐标转换为CGCS2000大地坐标系对应XY值(PYTHON实…...
Python 中下划线 “_” 的多面性:从变量到约定
# Python中下划线“_”的多面性:从变量到约定 在Python的语法体系里,下划线“_”看似毫不起眼,实则扮演着极为重要且多样化的角色。它不仅能作为普通变量参与编程,更在多个特殊场景下有着独特的用途与约定。深入理解下划线的各种…...
Vue3项目开发:状态管理实践指南
# Vue3项目开发:状态管理实践指南 一、引言 背景介绍 在Vue项目中,状态管理是一个非常重要的话题。合理的状态管理能够帮助我们更好地组织和管理数据,提升项目的可维护性和可扩展性。本文将深入探讨Vue3项目中状态管理的最佳实践,…...
JVM-JAVA编译到执行全过程
源码文件(.java)到代码执行的全过程: 该过程主要分为四个阶段,“编译-》加载-》解释-》执行”。 在编译阶段需要将源码文件(.java)通过语法分析、语义分析、注解处理后得到class文件; 在加载…...
数据结构-------栈
顺序栈: 一、数据结构定义 数据元素 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…...
python:music21 与 AI 结合应用探讨
Python 的 music21 库与人工智能(AI)技术结合应用具有广泛的可能性,尤其是在音乐生成、分析和风格模拟等领域。以下是具体的结合方向与示例: 1. 音乐生成与 AI AI 模型驱动音乐生成: 使用深度学习模型(如 …...
【LangChain入门 2 Model组件】开始!LLM Models简单对话
文章目录 一、使用langchain_ollama二、采用DeepSeek的API三、Model 介绍3.1 OllamaLLM 预训练模型3.2 ChatOllama 聊天预训练模型3.3 OllamaEmbeddings 实现一个helloworld,跑通一个简单的对话。 后面章节会正式介绍LangChain的各个功能。 后台llm的端口可以任意选…...
7种寻址方式
1. 立即寻址 立即寻址也叫立即数寻址,操作数本身就在指令中给出,只要取出指令也就取到了操作数,这个操作数被称为立即数。立即数要求以 “#” 为前缀。 #0x1100:表示十六进制数#0b1100:表示二进制数#0d1100ÿ…...
C语言中,#define和typedef 定义int* 一个容易混淆的点
前言 首先来看一个代码: #include <stdio.h> #include <string.h>#define int_ptr int *int main() {int c 100;int_ptr a , b; // 等效于int * a,b; 那么b就是int类型,不是int*类型a &c;b &c; //报错return 0; } 原意&#x…...
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 绝对引用),返回值的所在列数,精确查找或模糊查找)双击填充柄就会显示所有值 这个逗号要中文的不能英…...
6、说一下索引失效的场景?【中高频】
索引失效意味着 查询操作 不能利用索引进行数据检索,而是使用 全表扫描(也就是 数据库需要从磁盘上读取表的所有数据行),从而导致性能下降,下面一些场景会发生索引失效 对索引使用左或者左右模糊匹配(where…...
Noe.js 原生 http 模块 vs Express 框架对比
Noe.js 原生 http 模块 vs Express 框架对比 Noe.js 原生 http 模块 vs Express 框架对比 以下从多个维度对比两种方法,并提供详细示例,帮助初学者理解差异。 1. 基础架构对比 特性原生 http 模块Express 框架核心依赖Node.js 内置模块 (require(htt…...
滚动元素的新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语言)
代码如下: #include<stdio.h> #include<stdlib.h>int compare(void* a, void* b)//比较函数,用于qsort按处理时间从大到小排序 {return *(int*)a - *(int*)b; }int LPT(int jobs[], int n, int m)//多机调度问题的LPT算法 {qsort(jobs, n, …...
JS做贪吃蛇小游戏(源码)
一、HTML代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><link rel…...
烽火HG680-KB_海思HI3798MV310_安卓9.0_U盘强刷固件包及注意点说明
之前发布过这个固件包,关于烽火HG680-KA/HG680-KB_海思HI3798MV310_安卓9.0_U盘强刷固件包详细说明一下,汇总总结一些常遇到的情况,这次固件会分开发布,以免混淆。 上一个帖子地址:烽火HG680-KA࿰…...
Java数据结构相关知识
文章目录 1. 自动装箱和自动拆箱2. Object的equals方法3. Comparable和Comparator接口 1. 自动装箱和自动拆箱 自动装箱:将基本数据类型自动转换为对应的包装类。自动拆箱:将包装类自动转换为对应的基本数据类型。 显示装箱 int primitiveInt 10; //…...
996引擎 - 红点系统
996引擎 - 红点系统 总结NPC 红点(TXT红点)Lua 红点1. Red_Point.lua2. UI_Ex.lua参考资料以下内容是在三端 lua 环境下测试的 总结 红点系统分几个部分组成。 M2中设置变量推送。 配置红点表。 Envir\Data\cfg_redpoint.xls 2.1. UI元素中找到ID填写 ids 列。 主界面挂载…...
7种数据结构
7种数据结构 顺序表sqlite.hseqlite.c 单链表linklist.clinklist.h 双链表doulinklist.cdoulinklist.h 链式栈linkstack.clinkstack.h 队列SeqQueue.cSeqQueue.h 树tree.c 哈希表hash.c 顺序表 sqlite.h #ifndef __SEQLIST_H__ #define __SEQLIST_H__ typedef struct person…...
Redis的消息队列是怎么实现的
Redis 本身并不是一个专门的消息队列系统,但它的 List、Pub/Sub 和 Stream 数据结构可以用来实现消息队列的功能。以下是 Redis 实现消息队列的几种常见方式: 1. 基于 List 实现消息队列 Redis 的 List 是一个双向链表,支持在头部和尾部进行高效的插入和删除操作,非常适合…...
