有些时候随着产品的开发迭代硬件配置发生了不同,但是需要使用一套软件来兼容不同的硬件批次,这时候使用dtsi来配置就无法达到我们兼容的目的了,这时候可以在BootLoader阶段检测不同的HWID来区分不同的硬件批次,然后修改不同的cmdline传递给kernel,在kernel驱动注册阶段去检测cmdline中相关关键字来加载不同的配置即可。
内核启动过程中start_kernel中setup_arch中解析tags获取cmdline,复制到boot_command_line中。我们接着往下看start_kernel,调用setup_command_line,将cmdline拷贝2份,放在saved_command_line static_command_line。
在我们的driver中可以解析saved_command_line 中的相关字段获取配置,下面的一段demo代码:
static int get_board_version(void)
{
char boot[3] = {'\0'};
int ret = 0;
char *match = (char *) strnstr(saved_command_line,
"androidboot.hwid=",
strlen(saved_command_line));
if (match) {
memcpy(boot, (match + strlen("androidboot.hwid=")),
sizeof(boot) - 1);
printk("%s: hwid is %s\n", __func__, boot);
if (!strncmp(boot, "P1", strlen("P1")))
ret = 1;
else if (!strncmp(boot, "P2", strlen("P2")))
ret = 2;
else if (!strncmp(boot, "P3", strlen("P3")))
ret = 3;
else
ret = 0;
}
return ret;
}