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

本文转载自:http://blog.csdn.net/groundhappy/article/details/56479694

rk3288有一个parameter文件。

类似于

 FIRMWARE_VER:4.4.2
 MACHINE_MODEL:rk30sdk
 MACHINE_ID:007
 MANUFACTURER:RK30SDK
 MAGIC: 0x5041524B
 ATAG: 0x60000800
 MACHINE: 3066
 CHECK_MASK: 0x80
 PWR_HLD: 0,0,A,0,1
 #KERNEL_IMG: 0x62008000
 #FDT_NAME: rk-kernel.dtb
 #RECOVER_KEY: 1,1,0,20,0
 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

typedef struct tagBootInfo
{
	uint32 magic_code;
	uint16 machine_type;
	uint16 boot_index;		// 0 - normal boot, 1 - recovery
	uint32 atag_addr;
	uint32 misc_offset;
	uint32 kernel_load_addr;
	uint32 boot_offset;		// 以Sector为单位
	uint32 recovery_offset;		// 以Sector为单位
	uint32 ramdisk_offset;	// 以Sector为单位
	uint32 ramdisk_size;	// 以Byte为单位
	uint32 ramdisk_load_addr;
	uint32 is_kernel_in_boot;
	
	uint32 check_mask;	// 00 - 不校验, 01 - check kernel, 10 - check ramdisk, 11 - both check
	char cmd_line[MAX_LINE_CHAR];
	cmdline_mtd_partition cmd_mtd;

	int index_misc;
	int index_kernel;
	int index_boot;
	int index_recovery;
	int index_system;
	int index_backup;
	int index_snapshot;
	char fw_version[MAX_LINE_CHAR];
	char fdt_name[MAX_LINE_CHAR];
} BootInfo, *PBootInfo;

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

parse_cmdline(pboot_info)

{

mtdpart_parse解析数据到CMDMTD里面

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

}

原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/7607388.html