mtk平台没有跑app/aboot/aboot.c 跑的是app/mt_boot/mt_boot.c
/ {
model = "MT8167";
compatible = "mediatek,mt8167";
interrupt-parent = <&sysirq>;
#address-cells = <2>;
#size-cells = <2>;
/* chosen */
chosen {
bootargs = "console=tty0 console=ttyS0,921600n1 \
earlycon=uart8250,mmio32,0x11005000 vmalloc=496M \
androidboot.hardware=mt8167 \
firmware_class.path=/vendor/firmware loop.max_part=7";
};
};
LK调用流程:
mt_boot_init
->boot_linux_from_storage
->tags_target_addr = get_tags_addr();
->bootargs_init((void *)tags_target_addr); //将dts chosen节点下的 bootargs子节点的字符串保存到g_cmdline
->boot_linux
->boot_linux_fdt //继续设置属性
/vendor/mediatek/proprietary/bootable/bootloader/lk/app/mt_boot/bootargs.h
#define CMDLINE_LEN 2048
/vendor/mediatek/proprietary/bootable/bootloader/lk/app/mt_boot/bootargs.c
static char g_cmdline[CMDLINE_LEN];
static char *cmdline_tail = g_cmdline;
static char *cmdline_end = g_cmdline + CMDLINE_LEN;
void bootargs_init(void *fdt)
... ...
/* Reset cmdline_tail */
cmdline_tail = g_cmdline;
offset = fdt_path_offset(fdt, "/chosen"); //dts chosen节点下的 bootargs子节点
fdt_bootargs = fdt_getprop(fdt, offset, "bootargs", &len); /vendor/mediatek/proprietary/bootable/bootloader/lk/lib/libfdt/fdt_ro.c
assert(fdt_bootargs);
n = snprintf(cmdline_tail, CMDLINE_LEN, "%s", (char *)fdt_bootargs);
if (n < 0)
dprintf(INFO, "snprintf error in %s:%d\n", __FILE__, __LINE__);
else
cmdline_tail += n;
... ...
}
static char g_cmdline[CMDLINE_LEN];
void cmdline_print(void){}
->cmd_len = strlen(g_cmdline);
->pal_log_err("g_cmdline size: %d\n", cmd_len);
->pal_log_err("cmdline: %s\n", temp_cmdline);
Line 1520: (190318_15:43:57.017)[1037]cmdline: console=tty0 console=ttyMT0,921600n1 root=/dev/ram earlycon=uart8250,mmio32,0x11005000 vmalloc=496Mandroidboot.hardware=mt8167 firmware_class.path=/vendor/firmware androidboot.verifiedbootstate=green bootopt=64S3,32N2,32N2 buildvariant=user androidboot.veritymode=enforcing printk.disable_uart=0 bootprof.pl_t=2244 bootprof.lk_t=1027 boot_reason=0 androidboot.serialno=0123456789ABCDEF androidboot.bootreason=power_key mrdump_ddrsv=no mrdump_rsvmem=0x56000000,0x400000,0x42100000,0x17b800,0x54000000,0x80000
/kernel-4.9-lc/init/main.c
asmlinkage __visible void __init start_kernel(void){}
->pr_notice("Kernel command line: %s\n", boot_command_line);
Line 1554: (190318_15:43:57.484)[ 0.000000] <0>-(0)[0:swapper]Kernel command line: console=tty0 console=ttyMT0,921600n1 root=/dev/ram earlycon=uart8250,mmio32,0x11005000vmalloc=496M androidboot.hardware=mt8167 firmware_class.path=/vendor/firmware androidboot.verifiedbootstate=green bootopt=64S3,32N2,32N2 buildvariant=user androidboot.veritymode=enforcing printk.disable_uart=0 bootprof.pl_t=2244 bootprof.lk_t=1027 boot_reason=0 androidboot.serialno=0123456789ABCDEF androidboot.bootreason=power_key mrdump_ddrsv=no mrdump_rsvmem=0x56000000,0x400000,0x42100000,0x17b800,0x54000000,0x80000
/kernel-4.19-lc/lib/cmdline.c
1 | int get_option(char **str, int *pint) |
内核自带例子:
/kernel-4.19-lc/arch/mips/kernel/mips-mt.c
1 | static int __init maxvpes(char *str) |
我们在MTK平台实现的例子:
NVRAM:
LVDS_SELECT_FLAG可以通过SN工具先行写到nvram里面,然后通过读取nvram “proinfo”分区的数据保存到addr
unsigned char *addr;
unsigned long length = 512;
char *part_name = "proinfo";
part_dev_t *dev;
part_t *part;
dev = mt_part_get_device();
part = mt_part_get_partition(part_name);
start_addr = (u64)(part->start_sect) * dev->blkdev->blksz;
addr = (unsigned char *)malloc(length*sizeof(unsigned char));
len = dev->read(dev, start_addr, (uchar*)addr,length, part->part_id);
len = partition_read(part_name, sizeof(part_hdr_t), (uchar *)addr, (size_t)part_hdr->info.dsize);
if(len < 0){
printf("Isaac [mboot_common_get_lvds_flag] len=%d\n",len);
len = -EIO;
goto exit;
}
LVDS_SELECT_FLAG= addr[64+40+40];
LK:
将LVDS_SELECT_FLAG添加到cmdline当中:
/vendor/mediatek/proprietary/bootable/bootloader/lk/app/mt_boot/mt_boot.c
extern int LVDS_SELECT_FLAG;//Isaac add
int boot_linux_fdt(void *kernel, unsigned *tags,
unsigned machtype,
void *ramdisk, unsigned ramdisk_sz)
{
...
/* Append androidboot.serialno=xxxxyyyyzzzz in cmdline */
snprintf(tmpbuf, TMPBUF_SIZE, "%s%s", "androidboot.serialno=", sn_buf);
cmdline_append(tmpbuf);
/*Isaac add lvds flag*/
printf("Isaac [boot_linux_fdt] get LVDS_SELECT_FLAG=%d\n",LVDS_SELECT_FLAG);
snprintf(tmpbuf, TMPBUF_SIZE, "%s%d", "lvds_select_flag=", LVDS_SELECT_FLAG);
cmdline_append(tmpbuf);
}
KERNEL:
kernel-4.4\drivers\misc\mediatek\lcm\B116XAN023_LVDS\B116XAN023_LVDS.c
int LVDS_SELECT_FLAG=0;
#define FRAME_WIDTH (1366)
#define FRAME_HEIGHT (768)
#define FRAME_WIDTH_MIPI (1368)
#define FRAME_HEIGHT_MIPI (768)
static int __init get_lvds_select_flag(char *str)
{
get_option(&str, &LVDS_SELECT_FLAG);
//LVDS_SELECT_FLAG = simple_strtol(str, NULL, 0);
return 1;
}
__setup("lvds_select_flag=", get_lvds_select_flag);
static void lcm_get_params(LCM_PARAMS *params)
{
printf("LK Isaac [lcm_get_params] LVDS_SELECT_FLAG=%d\n",LVDS_SELECT_FLAG);
if(LVDS_SELECT_FLAG == 0x31)
{
printf("[LK/LCM] [lcm_get_params]->B116XAN023_LVDS enter\n");
memset(params, 0, sizeof(LCM_PARAMS));
params->type = LCM_TYPE_DPI;
params->width = FRAME_WIDTH;
params->height = FRAME_HEIGHT;
... ...
}else{
printf("[LK/LCM] [lcm_get_params]->KD116N5_40NV_B12_MIPI enter\n");
memset(params, 0, sizeof(LCM_PARAMS));
params->type = LCM_TYPE_DSI;
params->width = FRAME_WIDTH_MIPI;
params->height = FRAME_HEIGHT_MIPI;
... ...
}
}
通过uart_log可以看到lvds_select_flag的值已经成功保存到cmdline:
(190418_21:09:30.218)[1392] g_cmdline size: 869
(190418_21:09:30.218)[1392] cmdline: console=tty0 console=ttyMT0,921600n1 earlycon=uart8250,mmio32,0x11005000 vmalloc=496M androidboot.hardware=mt8167 firmware_clas
(190418_21:09:30.218)[1394] : s.path=/vendor/firmware loop.max_part=7 androidboot.verifiedbootstate=green skip_initramfs rootwait ro init=/init root=/dev/dm-
(190418_21:09:30.218)[1396] : 0 dm="system none ro,0 1 android-verity PARTUUID=fbc2c131-6392-4217-b51e-548a6edb03d0 " androidboot.slot_suffix=_a androidboot.
(190418_21:09:30.218)[1398] : slot=a buildvariant=user androidboot.veritymode=enforcing bootopt=64S3,32N2,64N2 buildvariant=userdebug veritykeyid=id:7e4333f9
(190418_21:09:30.294)[1400] : bba00adfe0ede979e28ed1920492b40f androidboot.atm=disabled androidboot.meta_log_disable=0 androidboot.dtbo_idx=0 printk.disable_
(190418_21:09:30.294)[1401] : uart=0 bootprof.pl_t=2238 bootprof.lk_t=1359 boot_reason=0 androidboot.serialno=0123456789ABCDEFlvds_select_flag=49 androidboot
(190418_21:09:30.294)[1403] : .bootreason=reboot mrdump_ddrsv=no mrdump_rsvmem=0x56000000,0x400000,0x42100000,0x180f80,0x54000000,0x80000
(190418_21:09:30.372)[ 0.000000] <0>-(0)[0:swapper]KernelKernel command line: console=tty0 console=ttyMT0,921600n1 earlycon=uart8250,mmio32,0x11005000 vmalloc=496M androidboot.hardware=mt8167 firmware_class.path=/vendor/firmware loop.max_part=7 androidboot.verifiedbootstate=green skip_initramfs rootwait ro init=/init root=/dev/dm-0 dm="system none ro,0 1 android-verity PARTUUID=fbc2c131-6392-4217-b51e-548a6edb03d0 " androidboot.slot_suffix=_a androidboot.slot=a buildvariant=user androidboot.veritymode=enforcing bootopt=64S3,32N2,64N2 buildvariant=userdebug veritykeyid=id:7e4333f9bba00adfe0ede979e28ed1920492b40f androidboot.atm=disabled androidboot.meta_log_disable=0 androidboot.dtbo_idx=0 printk.disable_uart=0 bootprof.pl_t=2238 bootprof.lk_t=1359 boot_reason=0 androidboot.serialno=0123456789ABCDEFlvds_select_flag=49 androidboot.bootreason=reboot mrdump_ddrsv=no mrdump_rsvmem=0x56000000,0x400000,0x42100000,0x180f80,0x54000000,0x80000