如何將uboot裡面的參數傳給recovery或kernel

來源:互聯網
上載者:User

原文地址:http://blog.csdn.net/dwyane_zhang/article/details/8441854

最近我們在做一個LCM兩屏或三屏相容的問題,所以首先要在uboot裡面讀出各屏的id,然後再將讀得到的id傳給recovery和kernel,實現機器的正常顯示.

一.首先實現uboot讀lcm的id.

          1.bootable/bootloader/lk/target/msm7627a_sku3_Q6_D/rules.mk是uboot裡面宏開關,開啟所顯示的屏宏

DEFINES += DISPLAY_MIPI_CMD_PANEL_ILI9487=1DEFINES += DISPLAY_MIPI_CMD_PANEL_HX8357=1

 

          2.去初始化mipi的地方先讀id. bootable/bootloader/lk/platform/msm_shared/mipi_dsi.c

              在函數int mipi_dsi_panel_initialize(struct mipi_dsi_panel_config *pinfo){       ......#if defined(DISPLAY_MIPI_CMD_PANEL_ILI9487)||defined(DISPLAY_MIPI_CMD_PANEL_HX8357)    mipi_dsi_cmd_bta_sw_trigger();    dat = mipi_viroyal_manufacture_id();    if(dat == 0x90)    {        lcm_flag = 8357;        //hx8357-c    }    else    {        lcm_flag = 9487;        //ili9487    }        pinfo_tmp =get_panel_info();    memcpy(pinfo, pinfo_tmp, sizeof(struct mipi_dsi_panel_config));#endif       ......}

 

           3.讀到id後再初始化屏

                struct mipi_dsi_panel_config *get_panel_info(void){              .........#elif (DISPLAY_MIPI_CMD_PANEL_ILI9487)||(DISPLAY_MIPI_CMD_PANEL_HX8357)    if (lcm_flag == 8357)        return &hx8357_cmd_panel_info;    else        return &ili9487_cmd_panel_info;#endif               ..........}

 

這樣在uboot裡面就成功可以顯示圖片了,下面是如何將lcm_flag的值傳給kernel了.

二.傳lcm_flag給kernel

     1.uboot裡面要做的bootable/bootloader/lk/app/aboot/aboot.c

         其實原生態的android系統就有一個將uboot傳給kernel的例子,那就是跟蹤代碼static const char *boot_splash = " splash=1";

          我做的也是效仿系統做的,先定義一個字串

static const char *lcm_flg_ili9486 = " lcmflag=9486";static const char *lcm_flg_nt35310 = " lcmflag=5310";

 

然後在下面的函數copy到kernel

void boot_linux(void *kernel, unsigned *tags,        const char *cmdline, unsigned machtype,        void *ramdisk, unsigned ramdisk_size){   .....        if(!boot_into_recovery)    {        cmdline_len += strlen(boot_splash);        #if DISPLAY_TYPE_MIPI        if (lcm_flag == 8357)        cmdline_len += strlen(lcm_flg_hx8357c);        else         cmdline_len += strlen(lcm_flg_ili9487);        #endif   .....       if (!boot_into_recovery)        {        #if DISPLAY_TYPE_MIPI            if (lcm_flag == 8357)               src = lcm_flg_hx8357c;            else               src = lcm_flg_ili9487;        #endif        if (have_cmdline) --dst;        while ((*dst++ = *src++));       .....}

 

這樣uboot裡面的動作就做完了,即是將uboot裡面的資料copy到一個數組裡面,這個數組能從uboot傳給kernel.

三.kernel接受uboot傳來的字串

msm7627a/kernel/arch/arm/mach-msm/board-msm7x27a.c

 

在這個函數裡面接受(依據自己用的平台阿,要靈活),同樣是模仿boot_splash,在代碼裡添加接受字串,並轉化為數字

/* LK lcm_flag, 0 - off, 1 - on */int lcm_flag = 0;static int __init lk_lcmflag_setup(char *str){    lcm_flag = simple_strtol(str, NULL, 0);    printk("lcmflag = %d\n", lcm_flag);    return 1;}__setup("lcmflag=", lk_lcmflag_setup);

 

這樣就算是取到lcm_flag的值了,然後在具體的驅動中extern int lcm_flag即可,簡單吧.其實技術就那樣,很怕人認真,呵呵.開玩笑的.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.