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。
- 显示屏是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则黑屏
- 初始化流程
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.****.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.****.net/u013786805/article/details/21630325