最近在搞驱动,发现被dtsi坑死了,研究了一下打算总结在这里防止以后被坑,当然自己去找是很辛苦的,但是有时候也是有必要的。
之前我们用的dtsi是msm8916-mtp.dtsi,现在新加入了msm8916-pmi8916-mtp-evb.dtsi,而这两个在makefile里都被用了
dtb-$(CONFIG_ARCH_MSM8916) += msm8916-rumi.dtb \
msm8916-pmi8916-mtp.dtb \
msm8916-pmi8916-mtp-evb.dtb \
这下如何是好
据说在lk里会有选择,先看这两个dts文件
msm8916-pmi8916-mtp-evb.dts
msm8916-pmi8916-mtp.dts
结果发现有个不同
qcom,board-id= <10 0>;
qcom,board-id= <20 0>;一个是10一个是20,在lk的/bootable/bootloader/lk/platform/dev_tree.c里
(g__PRJ_STAGE ? (cur_dt_hw_platform == HW_PLATFORM__OTHER) : (cur_dt_hw_platform == HW_PLATFORM__EVB))
enum _platform{
HW_PLATFORM__EVB = 10,
HW_PLATFORM__OTHER = 20,
};
这里确定了差别
而cur_dt_hw_platform = (cur_dt_entry->variant_id & 0x000000ff);
以前的
enum asus_platform{
HW_PLATFORM_ASUS_EVB = 20,
};
现在的
enum asus_platform{
HW_PLATFORM_ASUS_EVB = 10,
HW_PLATFORM_ASUS_OTHER = 20,
};
所以以后要看一下dtsi所在的目录里,是否有修改过,然后看lk里是否有选择
在lk的/ target/msm8916/init.c里
int STAGE_ID2, MCP_ID3, PRO_ID8;
g__PRJ_STAGE = (gpio_status(STAGE_ID1)<<1) | (gpio_status(STAGE_ID0) );
if (STAGE_EVB == g__PRJ_STAGE) {
dprintf(CRITICAL, "NOTICE! EVB Board Detected! EVB configuration will be loaded\n");
STAGE_ID2 = STAGE_ID2_EVB;
MCP_ID3 = MCP_ID3_EVB;
PRO_ID8 = PRO_ID8_EVB;
} else {
STAGE_ID2 = STAGE_ID2_OTHER;
MCP_ID3 = MCP_ID3_OTHER;
PRO_ID8 = PRO_ID8_OTHER;
}
所以整个选择过程如上,有空研究一下devicetree到底如何选择