Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1312329
  • 博文数量: 478
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 4833
  • 用 户 组: 普通用户
  • 注册时间: 2014-06-28 11:12
文章分类

全部博文(478)

文章存档

2019年(1)

2018年(27)

2017年(21)

2016年(171)

2015年(258)

我的朋友

分类: Android平台

2015-09-15 13:42:58

[FAQ10897][Misc]利用cmdline,将参数从preloader传递到kernel
2014-09-02
软件分支JB2JB3JB5
FAQs 46 of 84
[Misc] 如何客制化自己的开机图片 [NVRAM]如何客制化NVRAM item并且备份(附带修改BT、WIFI 地址sample code)

内容

[DESCRIPTION]
客户有些需求是,在preloader阶段获取得到一些参数,如EMMC ver, DDR type等,需要将这些参数传递到kernel driver层使用,可以做些driver的兼容情况。
如果这些参数比较少,如一个int变量,几个字符串等,则可以通过cmdline的方式来传递。
注意:系统默认cmdline的长度是200 byte,default已经有参数传递,所以客制化参数长度不大,可以适用此方法。
 
[SOLUTION]
以定义参数 cus_param 为例,int型变量。
 
1. Preloader部分

Platform.h(mediatek\platform\[$platform]\preloader\src\drivers\inc\platform.h)

在如下结构体中加cus_param变量,如果是char型,请注意4byte对其:

typedef struct {

    u32 magic;

    boot_mode_t mode;

    u32 e_flag;

    u32 log_port;

    u32 log_baudrate;

    u8  log_enable;

    u8  part_num;

    u8  reserved[2];

    u32 dram_rank_num;

    u32 dram_rank_size[4];

    u32 boot_reason;

    u32 meta_com_type;

    u32 meta_com_id;

    u32 boot_time;

    da_info_t da_info;

    SEC_LIMIT sec_limit;     

    part_hdr_t *part_info;

    u8  md_type[4];

    u32  ddr_reserve_enable;   

    u32  ddr_reserve_success;

    u32 cus_param; //mediatek add

} boot_arg_t;

 
Platform.c(mediatek\platform\[$platform]\preloader\src\drivers\platform.c)

在此函数中添加对cus_param的赋值,通过函数,或者直接写入所需的值:

void platform_set_boot_args()

{

#if CFG_BOOT_ARGUMENT

    bootarg.magic = BOOT_ARGUMENT_MAGIC;

    bootarg.mode  = g_boot_mode;

    bootarg.e_flag = sp_check_platform();

    bootarg.log_port = CFG_UART_LOG;

    bootarg.log_baudrate = CFG_LOG_BAUDRATE;

    bootarg.log_enable = (u8)log_status();

    bootarg.dram_rank_num = get_dram_rank_nr();

    get_dram_rank_size(bootarg.dram_rank_size);

    bootarg.boot_reason = g_boot_reason;

    bootarg.meta_com_type = (u32)g_meta_com_type;

    bootarg.meta_com_id = g_meta_com_id;

    bootarg.boot_time = get_timer(g_boot_time);

 

    bootarg.part_num =  g_dram_buf->part_num;

    bootarg.part_info = g_dram_buf->part_info;

 

    bootarg.ddr_reserve_enable = g_ddr_reserve_enable;

    bootarg.ddr_reserve_success= g_ddr_reserve_success;

 

    //mediatek add,mt_get_cus_param这个函数是客制化得到cus_param的函数,请自行实现

    bootarg.cus_param = mt_get_cus_param();

 
2.LK 部分

Boot_mode.h(mediatek\platform\[$platform]\lk\include\platform\boot_mode.h)

在如下结构体中同样添加cus_param变量,如果是char型,请注意4byte对其:

typedef struct {

  u32      maggic_number;

  BOOTMODE boot_mode;

  u32      e_flag;

  u32      log_port;

  u32      log_baudrate;

  u8       log_enable;

  u8       part_num;

  u8       reserved[2];

  u32      dram_rank_num;

  u32      dram_rank_size[4];

  u32      boot_reason;

  META_COM_TYPE meta_com_type;

  u32      meta_com_id;

  u32      boot_time;

  da_info_t da_info;

  SEC_LIMIT sec_limit;

  part_hdr_t *part_info;

  u8 md_type[4];

  u32  ddr_reserve_enable;   

  u32  ddr_reserve_success;

  u32 cus_param; //mediatek add,和preloader部分相同,两个结构体要一样

} BOOT_ARGUMENT;

 

Mt_boot.c(bootable\bootloader\lk\app\mt_boot\mt_boot.c)

在此函数中,将cus_param的信息添加到cmdline上:

int boot_linux_from_storage(void)

{

    .....

    strlen += sprintf(commanline, "%s fps=%1d", commanline, mt_disp_get_lcd_time());

    strlen += sprintf(commanline, "%s cus_param=%1d", commanline, g_boot_arg->cus_param); //mediatek add

 

3.Kernel部分

saved_command_line 这是一个全局变量,在您所需要此参数的driver文件中,extern saved_command_line变量,

通过查找 cus_param 的字符串即可:

    char * ptr;

    int cus_param;

    ptr = strstr(saved_command_line, "cus_param=");

    ptr += strlen("cus_param=");

    cus_param = simple_strtol(ptr, NULL, 10);

此时 cus_param就是最初的int值。

 

 

 

 

阅读(528) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~