展锐平台兼容不同分辨率的LCD和TP
本例是基于展锐平台Android Q的HD+和FW+分辨率的兼容,主要包括LCD和TP的兼容。MTK平台同理,读者可以自行研究。
LCD兼容
LCD兼容主要需要关注时钟频率,由于平台已经做了数据处理,所以读者在兼容过程中只需要配置正确时钟频率和mipi频率即可。
注意,android Q平台和P平台区别在于,Q平台的kernel屏率获取是在相应lcd dtsi文件中,dpi时钟:clock-frequency = <76800000>;mipi时钟:sprd,phy-bit-clock = <692000>;
Pixel clk的计算及与mipi clk关系:实际为并行传输与串行数据传输的转换的关系,mipi clk(Mbps)*lane数=clock-frequency *24bit
Pixel clk:当clk上(下)升沿过来时24位数据(R8 G8 B8)全部发送出去。
这里顺便再给读者说下LCD的帧率计算公式。
像素时钟Pixel clock
Dpi_need_clk=(witdh+hfp+hbp+hsync)*(height+vfp+vbp+vsync)*fps
MIPI clock (Mhz)
Mipiclock = [ (width+hsync+hfp+hbp) x (height+vsync+vfp+vbp) ] x(bus_width) x fps/ (lane_num)/2
TP分辨率兼容
由于两者的显示分辨率存在差异,所以TP分辨率也需要作出相应调整。
dts节点增加TP分辨率兼容
sagereal/pcb/sp7731e_1h10_native/alps/bsp/kernel/kernel4.14/arch/arm/boot/dts/sp7731e-1h10-overlay.dts
在tp节点处增加HD+分辨率
tlsc6x_ts@2e {
compatible = "tlsc6x,tlsc6x_ts";
reg = <0x2e>;
gpios = <&ap_gpio 63 0
&ap_gpio 64 0>;
//controller = "focaltech,FT5436";
+TP_MAX_X1 = <720>;
+TP_MAX_Y1 = <1440>;//HD+分辨率增加
TP_MAX_X2 = <480>;
TP_MAX_Y2 = <960>;
vdd_name = "vdd18";
调用TP分辨率兼容
/pcb/sp7731e_1h10_native/alps/bsp/kernel/kernel4.14/drivers/input/touchscreen/chsc6448/tlsc6x_main.c
此处节点调用进行了取巧操作,就是直接使用了uboot cmdline传递过来的现成信息lcd_name来进行判断。注意由于需要调用kernel里的全局参数lcd_name,需要将tp的加载方式从ko加载改到kernel内核。(2023.11.7注释:此处也可以通过导出符号表实现,不需要修改到内核,可自行尝试)
+extern char *lcd_name;
static struct tlsc6x_platform_data *tlsc6x_parse_dt(struct device *dev)
{
…….
…….
+printk("yan lcd_name = %s.\n",lcd_name);
+if(!strcmp(lcd_name,"lcd_ili9881c_3lane_mipi_hd")) //yanjingqing add
{
printk("yanjingqing tp_max_x1");
ret = of_property_read_u32(np, "TP_MAX_X1", &pdata->x_res_max);
if (ret) {
dev_err(dev, "fail to get TP_MAX_X1\n");
goto fail;
}
ret = of_property_read_u32(np, "TP_MAX_Y1", &pdata->y_res_max);
if (ret) {
dev_err(dev, "fail to get TP_MAX_Y1\n");
goto fail;
}
}
+else
{
printk("yanjingqing tp_max_x2");
ret = of_property_read_u32(np, "TP_MAX_X2", &pdata->x_res_max);
if (ret) {
dev_err(dev, "fail to get TP_MAX_X2\n");
goto fail;
}
ret = of_property_read_u32(np, "TP_MAX_Y2", &pdata->y_res_max);
if (ret) {
dev_err(dev, "fail to get TP_MAX_Y2\n");
goto fail;
}
……
}
tp固件版本兼容
此例中有两个分辨率,一个是FW+,另一个是HD+,需要调用不同固件。如果是同一个供应商id,则使用项目id进行分辨。
alps/bsp/kernel/kernel4.14/drivers/input/touchscreen/chsc6448/tlsc6x_comp.c
tlsc_vendor_id = (g_tlsc6x_cfg_ver>>9)&0x7F;
+tlsc_project_id = g_tlsc6x_cfg_ver&0x01FF;
int tlsc6x_do_update_ifneed(void)
{
u8 *fupd;
int ret = -1;
printk("yan tlsc_vendor_id =%d\n",tlsc_vendor_id);
if(17 == tlsc_vendor_id) {
fupd = fw_file_17;
fw_size = ARRAY_SIZE(fw_file_17);
ret = tlsc6x_update_compat_ctl((u8 *) fupd, fw_size);
}
+else if((29 == tlsc_vendor_id)&&(27 == tlsc_project_id)) {
+fupd = fw_file_27;
+fw_size = ARRAY_SIZE(fw_file_27);
+ret = tlsc6x_update_compat_ctl((u8 *) fupd, fw_size);
}
+else if((29 == tlsc_vendor_id)&&(28 == tlsc_project_id)) {
+fupd = fw_file_28;
+fw_size = ARRAY_SIZE(fw_file_28);
+ret = tlsc6x_update_compat_ctl((u8 *) fupd, fw_size);
}
else if(25 == tlsc_vendor_id) {
fupd = fw_file_25;
fw_size = ARRAY_SIZE(fw_file_25);
ret = tlsc6x_update_compat_ctl((u8 *) fupd, fw_size);
}
return ret;
}
扩展:uboot上层logo分辨率兼容
驱动层已基本调试完毕,上层调试信息待补充,请读者关注后续文章。