rk3288对于parameter参数文件的解析处理

rk3288有一个parameter文件

类似于

  1. FIRMWARE_VER:4.4.2
  2. MACHINE_MODEL:rk30sdk
  3. MACHINE_ID:007
  4. MANUFACTURER:RK30SDK
  5. MAGIC:0x5041524B
  6. ATAG:0x60000800
  7. MACHINE:3066
  8. CHECK_MASK:0x80
  9. PWR_HLD:0,A,1
  10. #KERNEL_IMG:0x62008000
  11. #FDT_NAME:rk-kernel.dtb
  12. #RECOVER_KEY:1,1,20,0
  13. CMDLINE:console=ttyS2,115200earlyprintkroot=/dev/block/mtd/by-name/linuxrootrwrootfstype=ext4init=/sbin/initinitrd=0x62000000,0x00800000mtdparts=rk29xxnand:0x00008000@0x00002000(kernel),0x00008000@0x0000A000(boot),0x00002000@0x00012000(misc),0x00001000@0x00014000(backup),-@0x00015000(linuxroot)

这个文件是在uboot中被解析的。

在init_sequence_r中有board_late_init函数

board_late_init中首先就执行了

load_disk_partitions()这一部分。这一部分执行了解析parameter的过程。还有一次解析Parameter的过程是在执行完一次flash以后。刷了新的flash的时候会重新解析一次。

这一次是调用board_fbt_load_partition_table->load_disk_partitions执行的解析


在load_disk_partitions中

首先分配了一块内存用于保存解析的param结构

Parameters有多个Line组成,限制每个Line最大占1024 Bytes

#define ParaMETER_NUM 8// parameter文件的备份个数

#define MAX_LOADER_ParaM (128*512)// Parameters所占的最大Sector数(含tag、length、crc等)

PLoaderParam param = (PLoaderParam)memalign(ARCH_DMA_MINALIGN,MAX_LOADER_ParaM * ParaMETER_NUM);

申请了 128*512*8字节 512KB的大小。每个parameter文件只有128*512的大小。但是一共有8个parameter,可能7个是作为备份的。

只要按照顺序读取出一个parameter。并且是有效的parameter文件就表明成功了


随后调用GetParam获取parameter文件到这块内存中

然后调用ParseParam将这些信息解析到gBootInfo.cmd_mtd结构中。

释放申请param


GetParam就是从param_addr=0的地址读取emmc的内容。按照扇区读取,一共读取8次。其中有一次读取的数据是准确的就可以了。验证parameter的有效性是通过

CheckParam完成的

(为什么是从磁盘的地址0开始读取呢?,不是RKubootbin是从0地址保存的吗?)

随后调用ParseParam来解析数据,每次取得一行,然后调用ParseLine(pboot_info,line);解析数据,存放到pboot_info结构中

PBootInfo

  1. typedefstructtagBootInfo
  2. {
  3. uint32magic_code;
  4. uint16machine_type;
  5. uint16boot_index;//0-normalboot,1-recovery
  6. uint32atag_addr;
  7. uint32misc_offset;
  8. uint32kernel_load_addr;
  9. uint32boot_offset;//以Sector为单位
  10. uint32recovery_offset;//以Sector为单位
  11. uint32ramdisk_offset;//以Sector为单位
  12. uint32ramdisk_size;//以Byte为单位
  13. uint32ramdisk_load_addr;
  14. uint32is_kernel_in_boot;
  15. uint32check_mask;//00-不校验,01-checkkernel,10-checkramdisk,11-bothcheck
  16. charcmd_line[MAX_LINE_CHAR];
  17. cmdline_mtd_partitioncmd_mtd;
  18. intindex_misc;
  19. intindex_kernel;
  20. intindex_boot;
  21. intindex_recovery;
  22. intindex_system;
  23. intindex_backup;
  24. intindex_snapshot;
  25. charfw_version[MAX_LINE_CHAR];
  26. charfdt_name[MAX_LINE_CHAR];
  27. }BootInfo,*PBootInfo;

其中解析 cmdline的时候还调用了一次

parse_cmdline(pboot_info)

{

mtdpart_parse解析数据到CMDMTD里面

并且解析了每个分区的信息保存到disk_partition_t结构中。这个结构位于include/part.h

}

相关文章

目录前言一、创建Hadoop用户二、更新apt和安装Vim编辑器三、...
原文连接:https://www.cnblogs.com/yasmi/p/5192694.html ...
电脑重启后,打开VirtualBox,发现一直用的虚拟机莫名的消失...
参见:https://blog.csdn.net/weixin_38883338/article/deta...
Ubuntu 18.04 LTS 已切换到 Netplan 来配置网络接口。Netpla...
介绍每个 Web 服务都可以通过特定的 URL 在 Internet 上访问...