【经验分享】展锐平台如何兼容不同分辨率的屏

1 篇文章 0 订阅

展锐平台兼容不同分辨率的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分辨率兼容

驱动层已基本调试完毕,上层调试信息待补充,请读者关注后续文章。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jason Yan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值