参见改进方案:https://intgyl.com/post/84b102bf.html#more
1 | 该方案是硬件设计时预留几个gpio,不同厂家的屏对不同的gpio进行上拉或者下拉,将上下拉电阻直接贴到fpc上, |
1 | 该方案是在系统启动时读取 LCD IC的寄存器,不同的IC其内容不同,以此达到区分的目的。 |
使用gpio
1 | 该方案对软件来说与方案1相同,不同点在于该方案是将上下拉电阻贴到PCB板上。 |
增加特定分区
1 | 该方案是在原有的emmc或ufs分区的基础上增加一个oem分区,在生产时针对不同的屏烧录对应的oem.img文件即可。 |
Parameter.txt(rk平台特有)
1 | 该方案效果与方案4相同,都是修改commandline,区别在于方案4是读取oem分区的内容后再修改,该方案时直接修改原始commandline。 |
根据项目实际情况采用方案5, 以下介绍兼容过程中涉及的修改。
Android5.1
Device tree修改
公共部分
由于该平台在LCD兼容方面做的不完善,无法直接将不同dtsi文件包含到平台中,所有LCD devicetree文件中包含的内容是完整的(LCD的上下电、reset、command、timging等),因此需要将不同的devicetree之间相同的部分抽离出来。中对应的是下图部分(lcd-power-common-gpio.dtsi),该部分是对LCD的上下电和reset操作。
不同部分
不同的LCD其command和timing会有所区别,需要将这部分独立出来, 如下图:
由于代码在解析dtb文件时是通过名称来匹配,因此在抽离不同部分后需要修改对应的节点名称:
uboot 代码修改
在进行LCD初始化前,读取
parameter.txt
中commandline的LCD信息,保存在global date结构中。使用方案5时commandline中已经包含了LCD信息,因此uboot中无需修改。
由于在devicetree中修改了dts节点名称,此处需要根据不同的屏加载对应的内容。
整体的修改思路是:在进行LCD初始化前完成识别操作,原有代码初始化LCD时读取的节点是写死的,修改后根据判断动态获取。
kernel 修改
LCD驱动
Kernel中对LCD驱动的修改思路与修改内容与uboot一样,此处不在详细描述,以下是kernel修改的相关patch
1 | diff --git a/kernel/drivers/video/of_display_timing.c b/kernel/drivers/video/of_display_timing.c |
Touch panel驱动
更换LCD后触摸屏也可能会改变,此时需要在不同的TP驱动中增加判断。
parameter.txt 修改
使用方案 5时,需要针对每一款屏增加一个parameter.txt文件,如下图:
与原始文件的区别仅在于commandline中增加了对应的lcd信息:
编译脚本修改
编译脚本中只需将所有的parameter 文件拷贝到release目录下即可,烧录时选择对应文件即可。
新加一款屏
uboot修改
在现有代码基础上增加一款屏,在uboot增加对应的定义,增加parameter文件即可。
fdt_compat_id 中增加相应的枚举类型。
compat_names中增加类型对应的dts节点名称。
parameter
device/rockchip/rk3288 目录下增加一个对应的文件parameter_xxx.txt, 其中的CMDLINE最后修改为对应的名称即可,名称要以1rk_mipi_dsi开头, 该名称根据代码解析自定义。
其他修改
将新LCD对应的dtsi加到 g3288.dts中,对应的TP驱动做相关判断即可
Android 7.1
Android7.1中LCD 兼容修改要简单一些,rockchip在lcd驱动方面有所修改,兼容思路与Android5.1中的修改相同,其中parameter中的修改相同,此处不再赘述。
uboot 修改
1 | diff --git a/u-boot/board/rockchip/common/rkloader/parameter.c b/u-boot/board/rockchip/common/rkloader/parameter.c |
1 | diff --git a/u-boot/drivers/video/rockchip_display.c b/u-boot/drivers/video/rockchip_display.c |
1 | diff --git a/u-boot/drivers/video/rockchip_dsi_panel.c b/u-boot/drivers/video/rockchip_dsi_panel.c |
1 | diff --git a/u-boot/include/asm-generic/global_data.h b/u-boot/include/asm-generic/global_data.h |
device tree 修改
Android7.1的代码中将lcd command timing等配置放到了 kernel/include/dt-bindings/display/screen-timing/ 目录下。
将dts中panel timing 相关的配置从rk3288-xxx.dts中删除,添加到kernel/include/dt-bindings/display/screen-timing/ 下每个lcd的配置中。
1 | -/* |
1 | --- a/kernel/include/dt-bindings/display/screen-timing/lcd-ili9881c-mipi-wacom.dtsi |
panel-init-sequence_xxx 中添加对于添加对应LCD的初始化命令。
kernel 驱动修改
1 | diff --git a/kernel/include/linux/lcd_compatible.h b/kernel/include/linux/lcd_compatible.h |
1 | diff --git a/kernel/drivers/gpu/drm/panel/panel-simple.c b/kernel/drivers/gpu/drm/panel/panel-simple.c |
mkimgge.sh脚本
1 | diff --git a/mkimage.sh b/mkimage.sh |