Android MIPI转LVDS显示屏调试--- bootloader阶段显示(4)

《80_NU323_3_Multimedia_Driver_Development_and_Bringup_Guide___Display.pdf》提到Once Kernel bringup is done, perform the following steps for little kernel (LK) bringup.,也就是说推荐先调试kernel,但我们还是先介绍lk。

  1. 显示屏是command还是video mode

我们的显示屏是video mode

2. 创建panel(显示屏)头文件

到device\qcom\common\display\tools目录下,找到此目录下类似的xml文件,比如panel_nt35596_1080p_video.xml,基于此文件改为和我们显示屏的,比如改为panel_lm215w_lvds_1080p_video.xml,此xml文件里的内容细节这里不介绍了。

Xml可生成对应的.h和.dtsi文件,生成的方法如下:

perl parser.pl panel_lm215w_lvds_1080p_video.xml panel

但是在生成头文件的时候,没有生成panel_config结构体的mode_gpio_state和slave_panel_node_id对应的值,也没有生成lane_configuration结构体下force_clk_lane_hs成员的值。见下图红色部分,只能是我们手动增加,或是修改parser.pl文件来生成对应的

在parser.pl和xml中增加ModeGPIOState和SlavePanelNodeID(这两个名称是我自己命名的),这样用perl parser.pl panel_lm215w_lvds_1080p_video.xml panel生成的头文件就可以了。

Xml文件的配置,详细参考文档

《80_NU323_3_Multimedia_Driver_Development_and_Bringup_Guide___Display.pdf》,xml中一些参数的生成需要用到《80-NH713-1_G_DSI_Timing_Parameters.xlsm》,比如我们要根据panel的参数来填写

下面只介绍几项

2.1  PanelTimings

An array of length 12 that specifies the PHY timing settings for the panel.

填写好参数后,见excel表格的DSI PHY timing setting子表格

执行CTRL+J and CTRL+K后重新计算生成相关的,如下

PanelTimings对应DSI PHY registers的值,如下:

<PanelTimings>"0xD6, 0x32, 0x22, 0x00, 0x62, 0x66, 0x26, 0x36, 0x28, 0x03, 0x04, 0x00"

2.2  TclkPost和TClkPre

(1)TClkPost

DSI timing control clock post value

(2)TclkPre

DSI timing control clock pre value

这两个值对应T_CLK_POST和T_CLK_PRE,

</PanelTimings>

    <DSIMDPTrigger>0</DSIMDPTrigger>

    <DSIDMATrigger>4</DSIDMATrigger>

    <TClkPost>0x03</TClkPost>

    <TClkPre>0x28</TClkPre>

2.3  ResetSequence

Reset sequence using ResetGPIO with pulse width.这是显示屏使用的reset引脚的控制时序图,我们本次设计的SN65DSI84没有用到reset,我以之前项目用的显示屏panel规格书说明下

这是panel reset引脚的时序图,所以

<ResetSequence>

       <PinState1>1</PinState1>

       <PulseWidth1>20</PulseWidth1>

       <PinState2>0</PinState2>

       <PulseWidth2>2</PulseWidth2>

       <PinState3>1</PinState3>

       <PulseWidth3>20</PulseWidth3>

       <EnableBit>2</EnableBit>

    </ResetSequence>

这些值我还没有改,需要根据实际panel来填写,具体需要几个阶段,根据panel的规格书来定,比如这里是3个阶段

这里的EnableBit是用于表示reset GPIO作为输入还是输出的,输入对应0,输出对应2,这个时序在target_panel_reset()中会用到

2.4  头文件结构体lane_configuration的force_clk_lane_hs

这个表示是否强制DSK CLK工作在HS(高速)模式,一般情况下command panel此值为0,表示工作在LP(low power)模式;video panel此值为1,表示工作在HS模式。

因为我们硬件设计,SN65DSI84采用的是DSI CLK作为时钟源,SN65DSI84的DSI Lane合并时需要在HS模式,所以我们这里force_clk_lane_hs=1,如果为0则黑屏

  1. 初始化流程

aboot_init()--->sn65dsi84_Init()+target_display_init()--->gcdb_display_init()--->oem_panel_select()--->init_panel_data()

下面重点说明下我们修改涉及的部分:

3.1  sn65dsi84_Init()

这里主要是对SN65DSI84初始化,主要的内容如下:

3.1.1  涉及到的GPIO控制

3.1.2  通过I2C对SN65DSI84写寄存器,初始化

这涉及到I2C读写,有两种实现方式:

(1)GPIO模拟I2C

这里我省略到一部分寄存器,中间实际是有其他寄存器的。

(2)采用CPU的I2C总线协议

Lk下Msm8937对应的目录是msm8952,查看了源代码,lk阶段8952没有使用i2c,但msm8916下有配置i2c和使用i2c的地方,比如oem_panel.c下:

那我们基于8916的用法来在8952下添加的,需要根据采用的I2C对应的GPIO口来确定是哪个BLSP和QUP,比如我们采用SDA---GPIO6,SCL---GPIO7,最后确定是对应BLSP1和QUP_ID_1,详细见链接

https://blog.csdn.net/LoongEmbedded/article/details/83070030

3.2  oem_panel_select()

确保panel_id的值为我们增加的显示屏对应的,这里还调用init_sn65dsi84()来对SN65DSI84上电控制和通过I2C写初始化参数。

3.3  init_panel_data()

把xml文件生成的mipi dsi相关参数来初始化panelstruct结构体

参考链接:

toshiba TC358764 mipi 转LVDS屏调试

https://blog.csdn.net/u013786805/article/details/21630325

高通spi 屏幕 -lk代码分析

https://www.douban.com/note/669497080/

猜你喜欢

转载自blog.csdn.net/LoongEmbedded/article/details/83071537