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,A,1
- #KERNEL_IMG:0x62008000
- #FDT_NAME:rk-kernel.dtb
- #RECOVER_KEY:1,1,20,0
- 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
- typedefstructtagBootInfo
- {
- uint32magic_code;
- uint16machine_type;
- uint16boot_index;//0-normalboot,1-recovery
- uint32atag_addr;
- uint32misc_offset;
- uint32kernel_load_addr;
- uint32boot_offset;//以Sector为单位
- uint32recovery_offset;//以Sector为单位
- uint32ramdisk_offset;//以Sector为单位
- uint32ramdisk_size;//以Byte为单位
- uint32ramdisk_load_addr;
- uint32is_kernel_in_boot;
- uint32check_mask;//00-不校验,01-checkkernel,10-checkramdisk,11-bothcheck
- charcmd_line[MAX_LINE_CHAR];
- cmdline_mtd_partitioncmd_mtd;
- intindex_misc;
- intindex_kernel;
- intindex_boot;
- intindex_recovery;
- intindex_system;
- intindex_backup;
- intindex_snapshot;
- charfw_version[MAX_LINE_CHAR];
- charfdt_name[MAX_LINE_CHAR];
- }BootInfo,*PBootInfo;
其中解析 cmdline的时候还调用了一次
parse_cmdline(pboot_info)
{
mtdpart_parse解析数据到CMDMTD里面
并且解析了每个分区的信息保存到disk_partition_t结构中。这个结构位于include/part.h
}