高通平台 mipi转接屏调试 (以转lvds icn6202例)
mipi to lvds显示调试
调试前准备:
获取屏的规格书 获悉的关键信息
- VDD 需要 3.3v
- RST 3.3v 拉低进 rst
- LVDS 4 组数据 差分信号,clk 一组差分信号
- SELB 决定 数据格式 6bit or 8bit
- Dclk 典型值 51.2M
- H 水平方向典型值 1024
- V 垂直方向典型值 600
- H total典型值 1344
- 预分配 :h-front-porch 160, h-back-porch 150, h-pulse-width 10
- V total典型值 635
- 预分配 :v-back-porch 15, v-front-porch 15, v-pulse-width 5
获取转接芯片规格书及寄存器信息data sheet
- VDD18,VDD18_LVDS,VDD18_PLL,VDD18_RX。
四个电源管脚统一电压1.8V。
芯片工作电流在20-40mA左右,跟实际使用的分辨率相关,待机时拉低EN,电流10uA以下
- VCORE
建议外接四颗电容,两颗1uF,两颗10nF。最少不应少于两颗外接电容,一颗1uF,一颗10nF。电容尽量靠近芯片的VCORE管脚。
- DSI INPUT
支持1-4路MIPI DSI数据链路。不用的MIPI数据链路保持管脚悬空即可。支持RGB888,RGB666,RGB565输入。MIPI DSI接口支持Video Mode进行视频数据传输,MIPI Command Mode进行寄存器配置。当使用MIPI Command Mode配置寄存器时,可以省掉IIC接口。另外,将MIPI CLK配置为连续的High Speed模式,可以作为参考时钟使用,省掉外部晶振。
- REF_CLK2
参考时钟管脚,外接晶振。要求是交流耦合,需要在晶振和管脚间串接一颗1nF电容。外接晶振作为芯片的参考时钟,芯片内部有PLL锁相环,对晶振的精度要求不高。外接参考时钟仅作为备选方案,推荐客户使用MIPI CLK作为参考时钟。这种情况下,REF_CLK管脚接地即可。
- SDA,SCL
IIC通信管脚。配置芯片寄存器使用。芯片寄存器有两种配置方式,一种通过IIC一种通过MIPI Command Mode。当使用MIPI配置寄存器时,IIC接口可以省掉。
- ADDR_SEL
IIC地址选择管脚,拉高IIC地址为0x5A,拉低IIC地址为0x58。(八位地址)
- IRQ
芯片中断管脚。建议连接到主控的中断或者GPIO管脚。当芯片工作状态异常可以输出中断信号,复位芯片等。
- GPIO0,GPIO1
调试管脚。PCB空间充裕可以拉出测试点,供调试时使用。
- IC_EN
使能管脚。EN拉低芯片复位,EN拉高芯片工作。EN管脚拉低后,芯片进入低功耗模式,待机电流10uA以下。EN拉低再拉高后,芯片需要重新配置寄存器。
- ATEST,TEST_EN,BIST_EN
悬空或者接地。无功能。
- LVDS OUTPUT
LVDS输出管脚。支持VESA,JEIDA标准,支持18bit模式,24bit模式。LVDS链路管脚可交换,组内PN可交换。
- 寄存器0x00, 如果通信正常,读取改寄存器,应该会返回0xc1,可以帮助我们debug状态。
其他寄存器信息,可以在实际实际调试过程中来查看。
浏览原理图,获悉的关键信息:
- SELB 为low,即数据格式是8bit
- Soc 需输出4lane mipi信号到转接芯片,组间信号无调整,一一对应。
- 转接芯片输出的4组 lvds data,1组lvds clk,需要注意的是,客户这里是将 N,P 做了交叉,所以配置转接芯片寄存器时,需要额外注意。(通过观察主板实物来看,这样做的目的应该是为了更好的layout走线,避免走线交叉)
4转接芯片 icn6202
- IC en脚是芯片的使能脚,直连到soc gpio8, 如果有使用i2c方式配置,需要添加设备驱动,我们可以自行添加 ic_en的控制逻辑,如果使用mipi配置,我们可以在高通的mdss_dsi0的驱动中添加,这里也可以利用原有的rst脚来替代。
- Vdd 是1.8v,来自于 LDO6。
- ADDR_SEL 是i2c地址的选择脚,做兼容使用, 这里接gnd 写地址是0x58, 读地址是0x59,即7位i2c地址应该是0x2c。
- I2c 是接到sensor i2c,对应 sc20的 i2c1上。
- VCORE有提供测试点,可帮助我们通过量取电压值debug 芯片的状态。
- REFCLK2 是外接了 26M 晶振, 这里的晶振电路要参考 参考设计的。
- RST脚是1.8v,lcd 需要3.3v,客户添加了一个三极管,这里就必须要注意了,这个电路逻辑是反向的,soc输出1.8v 三极管导通,rst 为low,soc 输出0v,三极管不导通,rst为高。
- 背光通过 pwm来控制,pwm来自 pm8909_mpps 2
从此图可移看出来,相对于传统的调试mipi的数据框架中,使用转接芯片是在原有的流程中转接ic接收了来自soc的mipi信号转而输出lvds信号给到panel, 这个过程中,soc依旧是输出同样的mipi数据信号以及一些管脚配置。 那么我们可以认为,此状态下,soc就是将转接ic(icn6202)当做panel来配置,至于 转接ic输出何种信号,当根据后端所连接的panel的具体类型来做相应的配置,soc不关心实际panel的类型。那么整个配置流程便可以拆解为两个部分,第一部分是 转接ic的驱动配置,第二部分是soc mipi信号输出的配置,下面是对这两个部分的简单介绍。
Icn6202的配置
- 点亮屏首先需要点亮背光,虽然背光这部分不属于转接ic的配置,但是为了单独验证icn6202的配置,第一步依旧是关注背光。
根据前面获取的信息,背光是靠PWM方式来控制的,客户的主板上有了升压电路,是长供电所以我们只关心pwm的配置,pwm来自pm8909_mpps 2,是msm8909的默认配置
主要的配置如下:qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_pwm";
qcom,mdss-dsi-bl-pmic-pwm-frequency = <100>;
qcom,mdss-dsi-bl-pmic-bank-select = <0>;
qcom,mdss-dsi-pwm-gpio = <&pm8909_mpps 2 0>;
bl-pmic-control-type 会在panel驱动中做解析,选择bl_ctrl_pwm 即会选择相应的背光控制逻辑,pane驱动中 已经向led子系统注册了相关的节点,根据我们选择的bl_ctrl_pwm 会进入相应的brightness_set函数中,这个函数中会根据pwm-gpio 选择 pm8909mpp2,设置为pwm输出,根据
pwm-frequency设置频率, 根据传入的亮度值设置占空比; pm8909mpp2的设置是在msm8909-pm8909-mtp.dtsi 中设置的,主要如下:
mpp@a100 { /* MPP 2 */
/* Backlight PWM */
qcom,mode = <1>; /* Digital output */
qcom,invert = <0>; /* Disable invert */
qcom,src-sel = <4>; /* DTEST1 */
qcom,vin-sel = <0>; /* VPH_PWR */
qcom,master-en = <1>; /* Enable MPP */
};
具体pmic相关寄存器的设置选择,及panel驱动中背光控制的代码控制实现这里就不详细描述了。
- 根据芯片规格书的描述,icn支持两种配置方式,i2c 和 mipi comman的方式,在还未点亮之前,我们需要不断的debug其状态,且根据上面提到的流程分割,这部分暂时不关心soc的mipi 配置(通过上面我们获取的调试信息,icn6202的clk来自外部晶振,即可完成独立工作),减少可能会出现的问题点,推荐先使用i2c的方式。
Icn6202的配置流程比较的人性化,ic厂提供了一个生成寄存器配置的工具,用于转换,对lvds的配置如下图。
这里需要注意,根据前面获取的信息,填入屏幕参数后,lvds的P N SWAP5组信号都要使能 SWAP;且需要选择8bit。
点击绿色的生存按钮即可生成,要根据我们panel的要求来写入固定的数据到相应的寄存器,所以ic厂并没有提供参考驱动代码,这里我们可以自己实现。
主要需要我们来实现一个i2c的读写函数,根据寄存器手册,读写都是一个byte,实现如下:
驱动加载的主要逻辑如下:
Icn6202 init 即是写入需要配置的寄存器参数, 由于当前还未配置soc的mipi输出,根据寄存器手册的描述我们可以先通过配置icn6202进入测试模式,bittest color bar,通过设置转换工具也可以知道,需要写入的寄存器是0x10 = 0x47,0x2A = 0x41,完整的配置如下:
综上在驱动加载的过程中,首先判断读ID是否读取成功,给LDO6上电,拉低RST(反向到3.3),先拉低再拉高EN脚,让ic复位, 写入如上的寄存器(调试过程中,最好回读一下这些寄存器,看看。也可以根据芯片的描述监听irq信号去debug)。
理论上 硬件ok的话,测试lcd会显示彩条, 如果未能显示,需要检查REFCLK2,使用示波器测量是否得到26M的clk信号,检测其晶振电路,检查vcore ~=1.28v.确保芯片工作ok。 再测量屏上的信号,vcom3.3v,背光电压,rst(这个要格外注意客户反向了这路电),pwm;这个过程中遇到问题 务必回过头再详细阅读规格书,datasheet以及硬件电路设计,一般我们调试的主板都是客户设计的,基带不能面对面沟通,需要自己细心去发现需要注意的点。
都ok的应该就会输出如下彩条了。
Mipi输出设置
这部分流程就是点亮高通屏相同的流程了,这里就不再详细描述高通平台配置屏的具体详细流程,对应该平台可参考高通的文档80-nu323-3_b,
简单梳理下.调试在配置流程中要以注意的地方
- 填入panel需要的 的相应参数,这些参数应该和我们再转机ic中配置的保持一致,如下:
根据芯片的描述设置对应的特性, 如dsi-traffic-mode,timing等,如果客户硬件设计转接ic的clk不来自外部晶振,从mipi clk恢复的话,还需要设置 mipi clk强制为高速模式,通过量取mipi clk的波形来观察是否设置成功。
- 前面提到,除了使用i2c的配置方式,我们还可以使用mipi command的方式来做转接ic配置
这里需要提到一点,一般这些lcd的参数都已经固化,不需要我们来额外的去配置,那我们可以修改高通初始化panel的时候发送init command的流程来配置转接ic。
首先我们需要了解高通配置 init command的dsi数据包的格式,80-nu323-3中相关描述如下:
对应的将彩条测试通过的那组参数对应的填到 command数组中
同理在 lk中 也做相应的配置即可, 这里就不再详细描述。
- 建议使用device/qcom/common/display/tools/parser.pl 脚本生成填充 配置panel,bootloader,kernel中需要的配置文件。
- 使用mipi command配置,即不需要加载自行实现的i2c驱动了,注意将rst脚换成我们的转接ic 的en,同时注意ldo6的上下电,如果客户使用的不是ldo6这路电,需要在 原有的逻辑上加上对应的一路电。
通过以上配置,硬件上ok的话,即可输出正常的android画面。 调试过程中,多使用示波器测量相应的信号电平及波形,确认了本文提及的一些点后,基本上都可以成功点亮。