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,0,A,0,1  
  10. #KERNEL_IMG: 0x62008000  
  11. #FDT_NAME: rk-kernel.dtb  
  12. #RECOVER_KEY: 1,1,0,20,0  
  13. CMDLINE:console=ttyS2,115200 earlyprintk root=/dev/block/mtd/by-name/linuxroot rw rootfstype=ext4 init=/sbin/init initrd=0x62000000,0x00800000 mtdparts=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. typedef struct tagBootInfo  
  2. {  
  3.     uint32 magic_code;  
  4.     uint16 machine_type;  
  5.     uint16 boot_index;      // 0 - normal boot, 1 - recovery  
  6.     uint32 atag_addr;  
  7.     uint32 misc_offset;  
  8.     uint32 kernel_load_addr;  
  9.     uint32 boot_offset;     // 以Sector为单位  
  10.     uint32 recovery_offset;     // 以Sector为单位  
  11.     uint32 ramdisk_offset;  // 以Sector为单位  
  12.     uint32 ramdisk_size;    // 以Byte为单位  
  13.     uint32 ramdisk_load_addr;  
  14.     uint32 is_kernel_in_boot;  
  15.       
  16.     uint32 check_mask;  // 00 - 不校验, 01 - check kernel, 10 - check ramdisk, 11 - both check  
  17.     char cmd_line[MAX_LINE_CHAR];  
  18.     cmdline_mtd_partition cmd_mtd;  
  19.   
  20.     int index_misc;  
  21.     int index_kernel;  
  22.     int index_boot;  
  23.     int index_recovery;  
  24.     int index_system;  
  25.     int index_backup;  
  26.     int index_snapshot;  
  27.     char fw_version[MAX_LINE_CHAR];  
  28.     char fdt_name[MAX_LINE_CHAR];  
  29. } BootInfo, *PBootInfo;  

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

parse_cmdline(pboot_info)

{

mtdpart_parse解析数据到CMDMTD里面

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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值