IPQ4019MTD分区生成的过程

article/2025/11/5 13:48:51

 

简介

本文介绍一个IPQ4019的MTD分区信息是如何从配置文件一步步传递到linux内核的。这个过程有几个部分组成,分区信息在编译过程中的传递;升级时写入flash区;设备上电时linux如何得到分区信息。

 

上电后linux打印的MTD分区如下图。

 

分区信息在编译过程中的传递

原始的配置文件

BOOT.BF.3.1.1/boot_images/build/ms/bin/40xx/misc/tools/config/nor-partition.xml等文件中。

打开以后是如下xml内容。

<partition_versionlength="4">0x4</partition_version><partitions><partition><name length="16"type="string">0:SBL1</name><size_kblength="4">256</size_kb> //256KB<pad_kblength="2">0</pad_kb><which_flashlength="2">0</which_flash><attr>0xFF</attr><attr>0xFF</attr><attr>0x00</attr><attr>0xFF</attr><img_nametype="string">sbl1_nor.mbn</img_name></partition><partition><namelength="16" type="string">0:MIBIB</name><size_kblength="4">128</size_kb><pad_kblength="2">0</pad_kb><which_flashlength="2">0</which_flash><attr>0xFF</attr><!-- Specify flashblock size in KB --><attr>64</attr><!-- Specify flash density in MB --><attr>32</attr><attr>0xFF</attr><img_nametype="string">nor-user-partition-ipq40xx.bin</img_name></partition><partition><namelength="16" type="string">0:QSEE</name><size_kblength="4">384</size_kb><pad_kblength="2">0</pad_kb><which_flashlength="2">0</which_flash><attr>0xFF</attr><attr>0xFF</attr><attr>0x00</attr><attr>0xFF</attr><img_nametype="string">tz.mbn</img_name></partition>


生成二进制mibib

使用如下命令

/BOOT.BF.3.1.1/boot_images/build/ms/bin/40xx/misc/tools目录下

pythonnand_mbn_generator.py config/nor-partition.xml x.bin

 

 

生成一个二进制文件。此二进制文件的内容如下:


hexdump -C x.bin                                           
00000000  9a 1b 7d aa bc 48 7d 1f  04 00 00 00 0b 00 00 00  |..}..H}.........|
00000010  30 3a 53 42 4c 31 00 00  00 00 00 00 00 00 00 00  |0:SBL1..........|
00000020  00 01 00 00 00 00 00 00  ff ff 00 ff 30 3a 4d 49  |............0:MI|
00000030  42 49 42 00 00 00 00 00  00 00 00 00 80 00 00 00  |BIB.............|
00000040  00 00 00 00 ff 40 20 ff  30 3a 51 53 45 45 00 00  |.....@ .0:QSEE..|
00000050  00 00 00 00 00 00 00 00  80 01 00 00 00 00 00 00  |................|
00000060  ff ff 00 ff 30 3a 43 44  54 00 00 00 00 00 00 00  |....0:CDT.......|
00000070  00 00 00 00 40 00 00 00  00 00 00 00 ff ff 00 ff  |....@...........|
00000080  30 3a 44 44 52 50 41 52  41 4d 53 00 00 00 00 00  |0:DDRPARAMS.....|
00000090  40 00 00 00 00 00 00 00  ff ff 00 ff 30 3a 41 50  |@...........0:AP|
000000a0  50 53 42 4c 45 4e 56 00  00 00 00 00 40 00 00 00  |PSBLENV.....@...|
000000b0  00 00 00 00 ff ff 00 ff  30 3a 41 50 50 53 42 4c  |........0:APPSBL|
000000c0  00 00 00 00 00 00 00 00  00 02 00 00 00 00 00 00  |................|
000000d0  ff ff 00 ff 30 3a 41 52  54 00 00 00 00 00 00 00  |....0:ART.......|
000000e0  00 00 00 00 40 00 00 00  00 00 00 00 ff ff 00 ff  |....@...........|
000000f0  30 3a 48 4c 4f 53 00 00  00 00 00 00 00 00 00 00  |0:HLOS..........|
00000100  00 10 00 00 00 00 00 00  ff ff 00 ff 72 6f 6f 74  |............root|
00000110  66 73 00 00 00 00 00 00  00 00 00 00 00 58 00 00  |fs...........X..|
00000120  00 00 00 00 ff ff 00 ff  61 64 64 5f 6e 65 77 5f  |........add_new_|
00000130  70 61 72 74 00 00 00 00  40 00 00 00 00 00 00 00  |part....@.......|
00000140  ff ff 00 ff 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000150  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|

这个add_new_part是我自己手动增加的。

 

 

这个文件不会被编译过程动态生成,如需要修改,则要人工生成。这个文件最后会放入mibib区,我们就叫它mibib文件。

 

已经制件好的mibib文件在BOOT.BF.3.1.1/boot_images/build/ms/bin/40xx/[ nor  nor-plus-emmc nor-plus-nand emmc]

这些目录下。

如BOOT.BF.3.1.1/boot_images/build/ms/bin/40xx/nor/nor-system-partition-ipq40xx.bin

 

编译打包

 

在编译过程中,大家可以看到如下日志。Image1位置打包的文件就是norplussemmc-systerm-partition-ipq40xx.bin。它的来源就是上面的目录的文件。

 

 

升级时写入flash区

使用uboot升级或是sysupgrade升级,会把mibib文件写入mibib的MTD区。

 

这个区内容非常重要,如果不正确,则系统连uboot也进不去。

 

设备上电时linux如何得到分区信息

 

高通MSM系列芯片上电过程。

APPSBL是我们的uboot区。

 

从串口日志可知在uboot输出日志前的日志如下:这部分日志是SBL程序输出的。

 

Format: Log Type - Time(microsec) - Message- Optional Info

Log Type: B - Since Boot(Power OnReset),  D - Delta,  S - Statistic

S - QC_IMAGE_VERSION_STRING=BOOT.BF.3.1.1-00096

S - IMAGE_VARIANT_STRING=DAABANAZA

 

 

它的程序放到了0:SBL1区。它会读取mibib区,如果读不正确,则SBL程序会挂死。本人亲测。

 


 

SBL把分区信息传给UBOOT

 

Uboot修改FDT信息

Uboot读取mtd[0]区上的信息

从nandinfo[nand_env_device]读取数据,其中nand_env_device = 0.

 

取parts信息

Smem_getpart

Smem_getpart从smem的全局变量中找出 parts的名称,size等信息。其中一些size信息保存在了nand_info中。

 

 

 

Setenv mtdparts并安装到设备树

 

 

FDT = flat device tree.


Fdt_node_set_part_info就是用来修改partition信息的函数,它把partition信息加入了FDT中。

Ft_board_setup -> Ipq_fdt_fixup_mtdparts->fdt_node_set_part_info.

 

 

Linux读取过程

 

Mtdparts的两种解析方式,一是ofpart,二是cmdpart,ARM使用第一种,lsdk使用第二种。

 

 

在spi总线被注册以后,会扫描下面的设备,它会了解到下面有一个m25p80的flash.

在m25p80驱动加载时,会按dev->of_node的信息(这是设备树解析成功后的结构)调用mtdparts的解析方式一步步加载分区。

在加载spi总线注册之前,设备树就已经都建立成功。设备树的源文件在:

qsdk/qca/src/linux/arch/arm/boot/dts

相关dts文件不包含MTD分区信息。

 

 

最后在设备树下的结果如下:

cd/proc/device-tree/soc/spi@78b5000/m25p80@0/

[root@Abloomy:m25p80@0]# ls-lat

-r--r--r--    1 root    root             4 Apr 21 05:23#address-cells

-r--r--r--    1 root    root             4 Apr 21 05:23#size-cells

-r--r--r--    1 root    root            11 Apr 21 05:23compatible

-r--r--r--    1 root    root             4 Apr 21 05:23density

-r--r--r--    1 root    root            18 Apr 21 05:23linux,modalias

-r--r--r--    1 root    root             7 Apr 21 05:23name

dr-xr-xr-x    2 root    root             0 Apr 21 05:23partition@0

dr-xr-xr-x    2 root    root             0 Apr 21 05:23partition@170000

dr-xr-xr-x    2 root    root             0 Apr 21 05:23 partition@180000

dr-xr-xr-x    2 root    root             0 Apr 21 05:23partition@40000

dr-xr-xr-x    2 root    root             0 Apr 21 05:23partition@580000

dr-xr-xr-x    2 root    root             0 Apr 21 05:23partition@60000

dr-xr-xr-x    2 root    root             0 Apr 21 05:23partition@c0000

dr-xr-xr-x    2 root    root             0 Apr 21 05:23partition@d0000

dr-xr-xr-x    2 root    root             0 Apr 21 05:23partition@e0000

dr-xr-xr-x    2 root    root             0 Apr 21 05:23 partition@f0000

-r--r--r--    1 root    root             4 Apr 21 05:23reg

-r--r--r--    1 root    root             4 Apr 21 05:23sector-size

-r--r--r--    1 root    root             4 Apr 21 05:23spi-max-frequency

-r--r--r--    1 root    root             0 Apr 21 05:23use-default-sizes

dr-xr-xr-x   12 root    root             0 Apr 21 05:23 .

dr-xr-xr-x    3 root    root             0 Apr 21 05:23 ..

[root@Abloomy:m25p80@0]#

 

 

参考

http://blog.csdn.net/modianwutong/article/details/46353301

http://blog.chinaunix.net/uid-9185047-id-5001947.html

 

UBOOT的fdt命令

这说明uboot可以修改fdt.

 

其中一个重要的命令是fdtmknode 它对于应的函数:fdt_add_subnode


http://chatgpt.dhexx.cn/article/HwJM33l8.shtml

相关文章

修改IPQ4019/4018的MTD分区

简介 高通的IPQ4018的SoC使用了ARM的CPU&#xff0c;并使用了高通的QSDK. 在开发中发现很难在它的架构中去修改MTD分区信息。 今天就提供一种可以修改MTD分区的方式。 MTD分区信息是如何从Uboot传到linux的&#xff0c;有几种方式&#xff1f; 换一种问法 uboot如何把参数传入l…

IPQ4019/QCA9531/MT7628/MT7621系嵌入式无线双频AP核心模块选型探讨

嵌入式双频无线AP核心模块,首先是核心模块,不是成品主板,也可以认为是成品的核心部分&#xff0c;或者理解成只带方便延伸的接口功能&#xff0c;不带外围实际接口的成品&#xff0c;实际使用时&#xff0c;可以根据所需要的接口灵活选择(未必要使用全部接口)&#xff1b;功能上…

ARM 汇编语言

1. 什么是汇编语言&#xff1f; 计算机处理器&#xff0c;执行的是 二进制的 10101010001&#xff0c;这些机器码对应的助记符就是汇编指令。 处理器 fetch 到的指令是 1001010101, 可能就是 对应汇编语言中 ADD 的加法指令&#xff0c; 处理器执行 加法操作&#xff0c;并把…

利用keil完成ARM汇编语言编程入门实践

文章目录 一、安装keil软件1.下载安装包2.安装keil3.安装stm32 pack 二、简单的stm汇编语言的编程1.新建工程项目2、新建main.c文件3.编译4.stm32仿真调试5.hex文件分析解读 一、安装keil软件 1.下载安装包 下载安装mdk5软件和stm32包&#xff08;链接&#xff1a;https://pa…

如何在ARM下进行高效的C编程?

通过一定的风格来编写C程序&#xff0c;可以帮助C编译器生成执行速度更快的ARM代码。下面就是一些与性能相关的关键点&#xff1a; 1.对局部变量、函数参数和返回值要使用signed和unsigned int类型。这样可以避免类型转换&#xff0c;而且可高效地使用ARM的32位数据操作指令。 …

## ARM基础编程实验

ARM基础编程实验 作者&#xff1a; Saint 掘金&#xff1a;https://juejin.im/user/5aa1f89b6fb9a028bb18966a 微博&#xff1a;https://weibo.com/5458277467/profile?topnav1&wvr6&is_all1 GitHub&#xff1a;github.com/saint-000 CSDN: https://me.csdn.net/qq_4…

ARM汇编编程基础

(一) -- ARM CPU寄存器 本系列文章节选自本人所著《深入浅出嵌入式底层软件开发》。 本系列文章&#xff0c;所需代码请从以下地址下载: http://download.csdn.net/download/scyangzhu/4602585 ARM的汇编编程&#xff0c;本质上就是针对&#xff23;&#xff30;&#…

搭建Keil编程环境,ARM汇编语言编程入门实践

多看多学 一、安装及配置环境01 型号分类及缩写02 资料共享03 安装器件支持包04 Keil简单设置 二、简单程序编译01 新建工程02 配置环境03 添加源文件04 设置仿真器模式05 编译调试06 分析Hex文件 三、中值滤波及程序设计01 中值滤波02 流程框图03 程序设计 四、总结参考资料 一…

ARM编程环境搭建教程

随着移动互联网的繁荣发展&#xff0c;物联网人工智能的兴起&#xff0c;嵌入式开发成为了越来越多IT人必须学习的内容&#xff0c;而在嵌入式芯片领域&#xff0c;ARM具有无可撼动的市场占有率&#xff0c;所以说&#xff0c;学习嵌入式不学ARM&#xff0c;不如回家卖红薯。 接…

嵌入式ARM设计编程(四) ARM启动过程控制

文章和代码已归档至【Github仓库&#xff1a;hardware-tutorial】&#xff0c;需要的朋友们自取。或者公众号【AIShareLab】回复 嵌入式 也可获取。 一、实验目的 &#xff08;1&#xff09; 掌握建立基本完整的ARM 工程&#xff0c;包含启动代码&#xff0c;C语言程序等&…

《嵌入式基础》实验三 ARM编程模型和ARM指令

零、前言 本人不擅长写汇编相关的东西&#xff0c;所以以下内容也是不断摸索&#xff08;百度 &#xff09; 整出来的&#xff0c;和linux的实验报告的质量相比较低。 一、 实验目的 掌握ARM微处理器的汇编指令的使用方法。掌握使用 LDM/STM&#xff0c;B&#xff0c;BL 等指…

嵌入式ARM设计编程(一) 简单数据搬移

文章和代码已归档至【Github仓库&#xff1a;hardware-tutorial】&#xff0c;需要的朋友们自取。或者公众号【AIShareLab】回复 嵌入式 也可获取。 一、实验目的 熟悉实验开发环境&#xff0c;掌握简单ARM汇编指令的使用方法。 二、实验环境 硬件&#xff1a;PC机 软件&am…

ARM汇编语言编程入门实践

文章目录 一、keil的安装二、安装stm32 pack三、keil 的简单设置四、基于STM32汇编程序的编写4.1 新建工程4.2 新建test.s文件4.3 编译程序4.4 分析HEX文件 五、总结六、参考资料 一、keil的安装 双击打开mdk_510.exe应用程序文件&#xff0c;点击Next>>。勾选I agree……

ARM体系结构与编程模型总结

ARM体系结构与编程模型 ARM体系结构 一、ARM处理器简介及RISC特点 ARM处理器简介 ARM&#xff08;Advanced RISC Machines&#xff09;是一个32位RISC&#xff08;精简指令集&#xff09;处理器架构&#xff0c;ARM处理器则是ARM架构下的微处理器。ARM处理器广泛的使用在许多…

数学建模-层次分析法(评价模型)

层次分析法概述 层次分析法的步骤和方法 1. 建立层次结构模型 2. 构造判断(成对比较)矩阵 3. 层次单排序及其一致性检验 4. 层次总排序及其一致性检验 总结 应用层次分析法的注意事项 举例 层次分析法代码实现 disp(输入判断矩阵C) Cinput(C); %输入矩阵 [n,n] size(C);%…

数学建模-层次分析模型

层次分析法的基本原理与步骤 人们在进行社会的、经济的以及科学管理领域问题的系统分析中&#xff0c;面临的常常是一个由相互关联、相互制约的众多因素构成的复杂而往往缺少定量数据的系统。层次分析法为这类问题的决策和排序提供了一种新的、简洁而实用的建模方法。 运用层次…

数学建模-层次分析法

个人主页&#xff1a; 个人主页 系列专栏&#xff1a; 数学建模 目录 前言 一、引入 二、层析分析法 1.思想介绍 2.判断矩阵 3.一致矩阵 4.一致性检验 5.一致性检验步骤&#xff08;两张图片告诉你&#xff09; 6.计算权重 一致矩阵计算权重&#xff1a; 判断矩阵计…

数学建模--层次分析法

层次分析法的求解步骤 1.建立层次结构模型 模型分为三层。分别为最高层&#xff08;决策问题最终要解决什么&#xff0c;即决策的目的&#xff09;、中间层&#xff08;考虑的因素&#xff0c;决策的准则。比如买衣服要考虑价格、尺寸、款式等因素&#xff09;和最低层&#…

层次分析法模型(数学建模学习)

本系列参考清风老师的数学建模课程 层次分析法模型 一、模型介绍 &#xff08;一&#xff09;模型引入 对于方案选择类问题&#xff0c;评价类问题采用层次分析法&#xff08;The ayalytic hierarchy process / AHP&#xff09;模型进行评分&#xff0c;之后评分高的就是最佳…

数据库常用数据模型1(层次模型)

1 数据模型分为两类&#xff1a;一类是概念模型&#xff08;信息模型&#xff09;&#xff0c;第二类是逻辑模型&#xff08;数据建模&#xff09;和物理模型&#xff08;对数据最底层的抽象&#xff09;。 2 常用的逻辑模型&#xff1a;层次模型、网状模型、关系模型、面向对…