高通平臺LK傳遞參數給kernel參考serialno的方式實現

該需求主要是爲了能夠獲取自定義的版本號,或者需要bootloader裏,定製代碼的執行結果需要傳遞到bootloader從而控制啓動等。

首先可以從shell裏查看LK傳入的值。

cat proc/cmdline

得知androidboot.serialno=xxxxx 那麼可以再源碼樹裏查找serialno關鍵字並依葫蘆畫瓢即可

bootable/bootloader/lk/app/aboot/aboot.c

1、同樣和serialno增加一個屬性名。

 static const char *usb_sn_cmdline = " androidboot.serialno=";
+static const char *bootloader_version = " bootloader.version=";

2、和serialno增加一個存儲的buf

 char sn_buf[13];
+char lkversion_buf[32];

3、和serialno類似,進行buf賦值,並且更新cmdline的長度

unsigned char *update_cmdline(const char * cmdline) {

………………………………

        cmdline_len += strlen(usb_sn_cmdline);
        cmdline_len += strlen(sn_buf);
+       cmdline_len += strlen(bootloader_version);
+       snprintf((char *)lkversion_buf, 32, "%s", "20171026");
+       cmdline_len += strlen(lkversion_buf);

………………………………

}

4、將寫入的值賦值到傳入kernel參數的緩衝區裏。

unsigned char *update_cmdline(const char * cmdline) {

………………………………

+               
+               //bootloader version
+               src = bootloader_version;
+               if (have_cmdline) --dst;
+               have_cmdline = 1;
+               while ((*dst++ = *src++));
+               src = lkversion_buf;
+               if (have_cmdline) --dst;
+               have_cmdline = 1;
+               while ((*dst++ = *src++));
+

………………………………

以上爲LK部分的修改,對於kernel層,我們可以將獲取到的cmdline參數解析後設置到Android系統的systemprop裏

system/core/init/init.c

static void import_kernel_nv(char *name, int for_emulator){

 ………………………………
+
+       if (!strncmp(name, "bootloader.version", 18) && name_len > 18) {
+               property_set("ro.bootloader.version",value);
+       }

………………………………
 }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章