[U-BOOT][STM32]设置使用SD卡中的linux程序启动
@[toc] https://github.com/wdfk-prog/u-boot/tree/art-pi-debug 前提 使用SD卡启动linux,可以方便linux的升级 当然SD卡linux去写入flash替换正在运行的linux程序也是可以的 操作步骤Kconfig配置 打开fat文件系统支持,这一块根据自己SD卡的格式化文件系统去配置. 这里就使用fat32去举例了. SD卡格式化程序可以使用格式化程序,这个是SD卡协会推荐的格式化程序,暂时没遇见格式化后无法识别的情况. 12CONFIG_CMD_FAT=yCONFIG_FS_FAT=y env或cli命令实现 可以编译时存入env变量中,直接从bootmenu中选择启动SD卡的linux还是flash中烧录的 12//stm32h750-art-pi.envbootmenu_0=load from SD=mmc dev 0;fatload mmc 0 0xC1000000 APT_Pi_Krl.itb.bin; bootm 0xC1000000; 这段代码也可以在CLI命令行环境中手动输入执行哦...
[U-BOOT][STM32]SD卡导入导出环境变量
@[toc] https://github.com/wdfk-prog/u-boot/tree/art-pi-debug 前提 u-boot的环境变量十分重要,可以说有了环境变量.u-boot的配置和灵活性得到了提高. 只有u-boot编译了相关程序,使用环境变量执行命令,可扩展性将会大大增加. 操作步骤 结合之前的内容 Kconfig需要启用如下配置 用于导入导出env变量,编辑env变量 CONFIG_ENV_IS_IN_FAT这个是用于从fat中加载env变量环境到内存中.没有设置将从默认的编译程序中加载,这种就不可改变了.但是存在fat文件系统中的env环境变量,是可以一直保存与修改的,掉电后还可生效. 1234567891011// configs/stm32h750-art-pi_defconfig## Command line interface -> Environment commands#CONFIG_CMD_EXPORTENV=yCONFIG_CMD_IMPORTENV=yCONFIG_CMD_EDITENV=yCONFIG_CMD_SAV...
[U-BOOT][STM32F40xx]移植与编写
@[toc] https://github.com/wdfk-prog/u-boot/tree/f4debug 参考 参考uboot现有支持板子与芯片型号 1234567891011├── common├── stih410-b2260├── stm32f429-discovery├── stm32f429-evaluation├── stm32f469-discovery├── stm32f746-disco├── stm32h743-disco├── stm32h743-eval├── stm32h750-art-pi├── stm32mp1└── stm32mp2 使用stm32f429-discovery作为模板配置使用 编译与修改 编译 12export CROSS_COMPILE=arm-none-eabi- ARCH=arm;make configs/stm32f429-discovery_defconfigmake -j12 将编译后的.bin文件烧录到指定地址CONFIG_TEXT_BASE=0x08000000 这个时候是看不到任何现象的...
[uboot][stm32]配置LTDC屏幕
@[toc] https://github.com/wdfk-prog/u-boot 前提 手上刚好有块屏幕,尝试在uboot中点亮一下 使用前请使用其他手段点亮该屏幕确保屏幕的完好再进行操作.确保配置的参数及引脚是可用的. dts设备树修改 ltdc状态修改为重定向前绑定,另外进行GPIO的绑定.根据需要自行配置.注意我使用的是H7系列芯片.不同系列芯片AF的内容不一致,需要自行查看修改. 12345678910111213141516171819202122232425262728293031323334<dc { pinctrl-0 = <<dc_pins>; pinctrl-names = "default"; status = "okay"; bootph-all;};&pinctrl { ltdc_pins: ltdc@0 { pins { pinmux = <STM32_PI...
[Linux][ARM][asm bug]BUG宏的理解
@[toc] https://github.com/wdfk-prog/linux-studyhttps://github.com/wdfk-prog/other 编写原因 阅读linux源码时,看到了#define BUG()的定义,便尝试理解.发现自行理解较难,便去网上搜索.搜索了好久,才终于搞懂这一块干了什么.所以写这个文章,给后面的人减少点搜索工作量. 网上搜索的要么不够深入,要么根本不是arm架构的实现. BUG_INSTR 的指令理解 #define BUG()这块自行理解既可,这里着重说明BUG_INSTR为什么要这么写 1234567891011121314151617/* * Use a suitable undefined instruction to use for ARM/Thumb2 bug handling. * We need to be careful not to conflict with those used by other modules and * the register_undef_hook() system. */ ...
[Linux][ARM][decompress]decompress使用的malloc函数分析
@[toc] https://github.com/wdfk-prog/linux-study 前言 之所以写这个文章,是因为阅读linux源码时被坑了.直接F12跳转到了其他地方.分析了半天都看不明白.晕头转向的.跳回来在分析了一遍才发现有个坑的地方.特除记录说明. lib/decompress_inflate.c 这里的__gunzip函数需要进行malloc.如果直接用F12进行跳转到函数声明与定义的地方,大概率是跳转到include/linux/decompress/mm.h 123456/* Use defines rather than static inline in order to avoid spurious * warnings when not needed (indeed large_malloc / large_free are not * needed by inflate */#define malloc(a) kmalloc(a, GFP_KERNEL)#define free(a) kfree(a) 实际上这里还未进...
[linux][stm32]早期调试启用(DEBUG_LL)教程
@[toc] https://github.com/wdfk-prog/linux/tree/ART-PI_DEBUG DEBUG_LL的功能 开启早期的调试功能 12345678910111213# These options are only for real kernel hackers who want to get their hands dirty.config DEBUG_LL bool "Kernel low-level debugging functions (read help!)" depends on DEBUG_KERNEL help Say Y here to include definitions of printascii, printch, printhex in the kernel. This is helpful if you are debugging code that executes before the console is initialized. Note that select...
[Linux][STM32H7]深入解析:系统时钟源为何被无故修改
@[toc] 问题背景分析在Linux环境下开发STM32H7系列芯片时,发现系统时钟sys_ck的时钟源并非手册标明的默认HSI(High Speed Internal oscillator),而是被配置为PLL1。这种现象需要从系统启动流程的底层进行分析。 关键发现通过追踪系统启动流程,发现u-boot引导阶段已经对时钟进行了重新配置。在u-boot的时钟驱动代码中明确设置了PLL1作为系统时钟源: 1234/* 选择PLL1作为系统时钟源(sys_ck) */clrsetbits_le32(®s->cfgr, RCC_CFGR_SW_MASK, RCC_CFGR_SW_PLL1);while ((readl(®s->cfgr) & RCC_CFGR_SW_MASK) != RCC_CFGR_SW_PLL1) ; 这段代码位于drivers/clk/stm32/clk-stm32h7.c文件的configure_clocks函数中,执行以下操作: 清除RCC_CFGR寄存器中的时钟源选择位 设置PLL1作为新的系统...
[Linux][PR]使用B4向linux内核提交补丁
@[toc] https://people.kernel.org/monsieuricon/sending-a-kernel-patch-with-b4-part-1 1. 使用pip安装1234$ pip install --user b4[...]$ b4 --version0.11.1 2. 使用b4切换分支1b4 prep -n [name-of-branch] -f [nearest-tag] 例如:b4 prep -n __reserved_mem_init_node v6.15-rc2,最好使用-f固定tag版本 3. b4 prep --edit-cover 将自己的补丁信息描述清楚并提交 可以参考修改的文件的其他pr的描述格式进行提交 例如 123456789101112131415of: reserved-mem: Warn for missing initfn in __reservedmem_of_tableFor the data in __reservedmem_of_table, its function pointer initfn ...
内核“创世纪”:新任务的第一次呼吸是如何伪造的?
@[toc] 内核“创世纪”:新任务的第一次呼吸是如何伪造的? 在多任务操作系统中,我们想当然地认为任务切换就是“保存旧任务的状态,恢复新任务的状态”。但一个悖论随之而来:如果一个任务是全新创建的,它从未运行过,自然也就没有一个“旧状态”可供恢复。那么,当调度器第一次选中这个新任务时,CPU的PC指针该跳向何方?SP栈指针又该指向哪里? 答案是:伪造。 内核在创建新任务时,会扮演一名技艺高超的“现场伪造专家”,在任务的内核栈上,手动地、精确地构建一个假的上下文现场。这个假现场看起来就像是这个任务在某个神秘的、预设好的点被正常“切换”出去一样。 本文将带您深入Linux内核的fork过程,揭开新任务“第一次呼吸”背后那令人惊叹的伪造艺术。 创生之地:copy_thread函数当我们在用户空间调用fork()或在内核中创建新线程时,内核最终都会调用一个名为copy_process()的函数。在这个函数中,所有与进程相关的资源被复制。而最核心的、与CPU状态相关的初始化,则发生在copy_thread()这个特定于体系结构的函数中。 copy_thread的使命,就是在新任务(p...
![[U-BOOT][STM32]设置使用SD卡中的linux程序启动](/images/covers/05.jpg)
![[U-BOOT][STM32]SD卡导入导出环境变量](/images/covers/10.jpg)
![[U-BOOT][STM32F40xx]移植与编写](/images/covers/04.jpg)
![[uboot][stm32]配置LTDC屏幕](/images/covers/01.jpg)
![[Linux][ARM][asm bug]BUG宏的理解](/images/covers/08.jpg)
![[linux][stm32]早期调试启用(DEBUG_LL)教程](/images/covers/07.jpg)

