zoukankan      html  css  js  c++  java
  • 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

    }

  • 相关阅读:
    Class constructor FileManager cannot be invoked without 'new' in undefined (line undefined, column undefined)
    vscode插件
    面试题
    使用NPOI读取word表格里面的图片
    Postgresql安装过程记录
    .net Core 新增Area的步骤
    kendo grid上的模版示例
    unicode与string之间的转换
    使用yarn安装puppeteer失败的解决方案
    abp第一篇《框架的下载与mysql数据库的切换》
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/7607388.html
Copyright © 2011-2022 走看看