高通设备数架构LCM调试

论坛 期权论坛 脚本     
匿名技术用户   2021-1-7 12:57   11   0

高通设备数架构LCM调试

主要参数

硬件:高通8926

软件:高通Android

开发主机:ubuntu

通信接口:MIPI(lane 4)

背光控制:GPIO实现PWM

LCM主要参数:分辨率768WX1024H),像素位深(BPP24MIPI通道数(lane4

前后肩VBPD 6,VFPD 8,VSPW 6,HBPD 60,HFPD 40,HSPW 8

简介

屏工作需要要背光和LCD显示两部分。对于手机来讲又要使屏在bootloaderkernel 两个模式下都可以工作,屏的工作原理是一样的,只是在bootloaderkernel中的实现格式不一样而已,下面将会详细说明。

一、背光

1. 查看电路原理图

1是背光控制电路,LCD_BL_CTL就是背光控制引脚,它连接在图2PM-8926芯片的GPIO_6上,把这个引脚配置成PWM输出即可点亮背光。

1

2

2Bootloader点亮背光

Bootloader的背光是通过target_backlight_ctrl()控制的,找到本项目的这个函数修改

成如下形式:

int target_backlight_ctrl(uint8_t enable)

{

struct pm8x41_gpio gpio;

static uint8_t bl_flag = 0;

static uint8_t init_gpio = 0;

if (enable == bl_flag)

return 0;

if(enable)

mdelay(20);

if(!init_gpio){

gpio.direction = PM_GPIO_DIR_OUT;

gpio.function = 6;

gpio.output_buffer = PM_GPIO_OUT_CMOS;

gpio.vin_sel = 3;

gpio.out_strength = 1;

pm8x41_gpio_config(6, &gpio);

init_gpio = 1;

}

pm8x41_backlight_enable(enable);

bl_flag = enable;

return 0;

}

pm8x41_backlight_enable()改成如下形式:

int pm8x41_backlight_enable(uint8_t enable)

{

if(enable){

pm8x41_lpg_write(4,LPG_N_PWM_SIZE_CLK,0x33);

pm8x41_lpg_write(4,LPG_N_PWM_FREQ_PREDIV_CLK,0x00);//0x43

pm8x41_lpg_write(4,LPG_N_PWM_TYPE_CONFIG,0x20);

pm8x41_lpg_write(4,LPG_N_ENABLE_CONTROL,0xe4);

pm8x41_lpg_write(4,LPG_N_PWM_VALUE_LSB,0xcc);

pm8x41_lpg_write(4,LPG_N_PWM_VALUE_MSB,0x0);

}

else {

pm8x41_lpg_write(4,LPG_N_ENABLE_CONTROL,0x04);

}

return 0;

}

宏定义如下:

#define LPG_N_PWM_SIZE_CLK 0x41

#define LPG_N_PWM_FREQ_PREDIV_CLK 0x42

#define LPG_N_PWM_TYPE_CONFIG 0x43

#define LPG_N_PWM_VALUE_LSB 0x44

#define LPG_N_PWM_VALUE_MSB 0x45

#define LPG_N_ENABLE_CONTROL 0x46

还有一些配置是在配置屏的位置一起配置的,后面会讲。

3.kernel点亮背光

找到对应项目的dtsi文件,我这里是d508.dtsi,添加如下代码配置GPIO

&spmi_bus {

/* Config the pmic gpio_6 as pwm out */

qcom,pm8226@0 {

gpios {

gpio@c500 {

qcom,mode = <1>; /* Digital output */ // QPNP_PIN_MODE_DIG_OUT

qcom,output-type = <0>; /* CMOS logic */

qcom,pull = <5>; /* QPNP_PIN_PULL_NO*/

qcom,vin-sel = <3>; /* QPNP_PIN_VIN3 */

qcom,src-sel = <3>; /* QPNP_PIN_SEL_FUNC_2 */ // QPNP_PIN_SEL_FUNC_2//not 6

qcom,master-en = <1>; /* Enable GPIO */

qcom,invert = <0>;

};

};

};

};

还有一些配置是在配置屏的位置一起配置的,后面会讲。

二、LCD显示

1.电路图

3是接口电路,就是板子上通过排线连接LCM的那个插槽,主要包括VDD,4MIPI数据线和背光LED.

3

供电引脚LCD_3V3是由图4电路的LCD_PWR_EN引脚进行控制的, LCD_PWR_EN是由图5MSM8926GPIO_34进行控制的,所以我们在程序中要它配置成输出,并使用它来控制供电。

MIPI只要在程序中配成4路就ok

背光LED前面已经配好,后面程序中直接使用。

4

5

2.bootloader显示

2.1移植

找一个类似的LCM作为模板进行移植,查看公司其他人集成LCM提交的分支看需要添加修改哪些文件。

主要包括添加LCM配置文件panel_xxx_video.h和在oem_panel中把屏添加进去两部分。

2.1.1创建panel_xxx_video.h

相关参数代表的意思可以查看结构体的原型,也可以结合后面将要创建的dsi-panel-xxx-video.dtsi查看/kernel/documentation/devicetree/bindings/fb/内文档。

a. Panel_config,panel_resolution,color_info,lane_configuration等结构体就是屏的基本参数配置,按照LCDdatasheet填写就可以了,文章开头已经列出了我的主要参数;

b. mipi_dsi_cmd包括onoff两个结构体,分别表示上电初始化和下电前要做的寄存器操作,按照FAE提供的初始化代码填充;

c. xxx_video_timings[]数组要使用高通提供的算法工具(一个Excel表格)算出;

d. 没提到的一些结构体和参数,如果你能确认就修改,否则就先使用默认值,如果没调通,后面调试的时候修改。

2.1.2在本项目的oem_panel中把屏添加进去

a. 添加头文件包含

#include "include/panel_xxx _video.h

b. 在屏menu中添加

XXX_VIDEO_PANEL,

c. 在屏选择函数oem_panel_select()的本项目中选择新增屏:

case HW_PLATFORM_D508:

panel_id = OTA7155A_XGA_VIDEO_PANEL;

d .init_panel_data()中参考其它屏添加初始化赋值代码:

case XXX_VIDEO_PANEL:

panelstruct->paneldata = &xxx _video_panel_data;

.

.

.

memcpy(phy_db->timing, xxx_video_timings, TIMING_SIZE);

break;

3.kernel显示

3.1移植

找一个类似的LCM作为模板进行移植,查看公司其他人集成LCM提交的分支看需要添加修改哪些文件。

主要包括添加LCM配置文件dsi-panel-xxx-video.dtsi和在oem_panel中把屏添加进去两部分。

3.1.1创建dsi-panel-xxx-video.dtsi

相关参数代表的意思可以结合前面bootloader中创建的panel_xxx_video.h和查看/kernel/documentation/devicetree/bindings/fb/内文档。

找个类似的文件复制一份,改成自己的名字“dsi-panel-xxx-video.dtsi”,参数按照前面创建的panel_xxx_video.h填写就ok,不知道的就使用默认值,后面调试再进行修改。

3.1.2在本项目的dtsi文件中使用此屏

我这里是d508.dtsi,修改mdss_dsi0

&mdss_dsi0 {

qcom,dsi-pref-prim-pan = <&dsi_xxx_vid>;

};

3.1.3msm8226-mdss.dtsi中修改供电相关

a. 添加LCD供电使能GPIO,就是前面提到的GPIO_34

mdss_dsi0: qcom,mdss_dsi@fd922800中添加:

qcom,platform-sgm2031-en-gpio = <&msmgpio 34 0>;

其中platform-sgm2031-en-gpio是我们自己定义的名字,后面在mdss_dsi.c中会根据它来配置GPIO

b. 修改上电时序

platform-supply-entry1, platform-supply-entry2, platform-supply-entry3为上电顺序,从电路图中看我们这里只用到VDD,所以我把entry2entry3都删除了。

3.1.4使用platform-sgm2031-en-gpio

a.mdss_dsi.hmdss_dsi_ctrl_pdata{}结构体中添加:

#ifdef CONFIG_ARCH_MSM8226_D508

int sgm2031_en_gpio;

#endif

因为是公用文件,所以最好用宏控一下。

b. mdss_dsi.cdsi_panel_device_register()函数中添加:

#ifdef CONFIG_ARCH_MSM8226_D508

ctrl_pdata->sgm2031_en_gpio = of_get_named_gpio(ctrl_pdev->dev.of_node,

"qcom,platform-sgm2031-en-gpio", 0);

printk(KERN_INFO "sgm2031_en_gpio: %d\n", ctrl_pdata->sgm2031_en_gpio);

if (!gpio_is_valid(ctrl_pdata->sgm2031_en_gpio)) {

pr_err("%s:%d, sgm2031_en_gpio gpio not specified\n",

__func__, __LINE__);

} else {

rc = gpio_request(ctrl_pdata->sgm2031_en_gpio, "sgm2031_en_gpio");

if (rc) {

pr_err("request sgm2031_en_gpio gpio failed, rc=%d\n",

rc);

return -ENODEV;

}

rc = gpio_direction_output(ctrl_pdata->sgm2031_en_gpio, 1);

if (rc) {

pr_err("sgm2031_en_gpio gpio set out, rc=%d\n",

rc);

return -ENODEV;

}

}

#endif

c.mdss_io_util.c中添加:

#define SGM2031_EN_GPIO 34

msm_dss_enable_vreg()函数中设置GPIO进行上电和下电

//上电:

#ifdef CONFIG_ARCH_MSM8226_D508

gpio_set_value(SGM2031_EN_GPIO, 1);

msleep(75);

#endif

} else {//下电

#ifdef CONFIG_ARCH_MSM8226_D508

gpio_set_value(SGM2031_EN_GPIO, 0);

msleep(20);

#endif

三、调试

程序写好了,接下来就可以编译下载看一下结果:

fastboot flash aboot emmc_appsboot.mbn

fastboot flash boot boot.img

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP