SSD_DISP点屏参考
1. 基本介绍¶
1.1. 概述¶
本文档主要讲解点屏相关的配置和使用。
1.2. 芯片相关规格¶
规格 芯片 |
TTL | MIPI | SPI | SRGB | HDMI |
---|---|---|---|---|---|
201/202 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
21X/22X | 支持 | 不支持 | 支持 | 支持 | 不支持 |
203 | 不支持 | 不支持 | 支持 | 不支持 | 支持 |
1.3. 关键字说明¶
-
TTL/MIPI/SRGB(SSD20X不支持SRGB)
这些都是液晶屏接口。
TTL接口信号类型是TTL电平,信号的内容是RGB565或RGB666或RGB888,行场同步(HSYNC/VSYNC),时钟(CLK)和数据有效信号(DE)。
MIPI接口信号类型是LVDS信号,信号的内容是视频流数据和控制指令。
SRGB接口将一个像素点的RGB数据被分为三次传输到panel。
-
HDMI
高清多媒体接口(High Definition Multimedia Interface)是一种全数字化视频和声音发送接口,可以发送未压缩的音频及视频信号。
2. TTL点屏介绍¶
2.1. 规格¶
规格 芯片 |
最大分辨率 | 信号格式 |
---|---|---|
201/202 | 1280x720 60fps | RGB565/RGB666/RGB888 |
21X/22X | 1280x720 60fps | RGB565/RGB666/RGB888 |
203 | 不支持 | 不支持 |
2.2. 基本概念¶
Parallel RGB Interface有两种,DE mode和HV mode,当使能DE的时候,会使用VSYNC、HSYNC、DOTCLK、DE、D[0-23]这些pin,当使能HV mode的时候,会使用VSYNC、HSYNC、DOTCLK、D[0-23]。现在程序默认使用DE mode,相关参数请按照DE mode配置。
一些panel driver IC需要对其初始化,其实就是对其内部register的设定,一般会通过SPI或者IIC接口来通信,初始化需要的cmd和data一般由屏厂提供,发送时的数据格式需要参考panel datasheet。
使用Parallel RGB Interface的panel需要HSYNC、VSYNC、DOTCLK来作为同步信号,RGB data只在timing的特定区间有效。
行场信号中的blanking区间是不可见区域,只有active区间的RGB data才会最终显示出来,不同的panel Driver IC对于blanking区间的要求不同。
行信号中:
Htotal = HSYNC + HBP + HFP + H Active
场信号中:
Vtotal = VSYNC + VBP + VFP + V Active
最后计算像素时钟频率:
Pixel CLK = Htotal * Vtotal * fps
屏参中时序相关的配置主要是调整行信号中HSYNC、HBP、HFP和场信号中VSYNC、VBP、VFP。panel spec中会提供blanking区间各部分的长度要求。
blanking区间是一个可调范围,最终计算出的pixel clk也是在一个范围内。
主控芯片一般会有时钟频率的限制,所以在点一个新的panel时,应先计算panel的pixel clk,如果将要点的panel满足像素时钟频率的要求,则一般可以点起来。
Parallel RGB Interface Timing
2.3. 点屏流程¶
2.4. 硬件相关¶
2.4.1. 查看原理图¶
以SSD202 demo board原理图举例说明。
查看如下原理图可知RGB888数据格式,以及CLK/HSYNC/VSYNC/DE对应的Pin:
查看如下原理图可知控制时序需要的PWM(LCD_BL_PWM)和panel power enable(PNL_PWRCTL):
芯片端对应pin脚如下:
控制时序如下:
2.4.2. 对应Padmux¶
查看SSD222X HW CheckList V03.xlsx的Tmux页找到管脚对应的padmux,如下:
信号管脚如下:
控制管脚如下:
2.5. 软件相关¶
2.5.1. 配置padmux¶
通过如上知道panel使用的是ttl24_mode_4,对应kernel的pioneer3-ssc020a-s01a-demo-camera-padmux.dtsi(使用的config不一样话对应的padmux.dtsi不一样)配置如下:
2.5.2. 配置控制管脚(pwm/power)¶
这部分写在了屏参配置的project/board/ini/misc/config.ini里面,如果不用屏参里的相关控制话,需要在padmux里面把pwm管脚配置为pwm mode,enble power pin配置为对应GPIO。屏参里的对应栏位和意思如下:
m_ePanelPwBlCtrl = 1; | 表示要不要config里控制pwm和power的时序。 0:关闭如下配置。 1:使能如下配置。 |
---|---|
m_wPanelPwGpioNum = 62; | Power gpio对应的sw index。 |
m_wPanelPwmNum = 1;#pwm num not gpio index!!! | Pwm number,含义是pwm0/pwm1/pwm2。pwm num 不是 gpio index。 |
m_wPanelDutyVal = 200000; | Pwm duty。 |
m_wPanelDlyTm2Data = 0; | Power和data之间的Delay时间。 |
m_wPanelDlyTmData2Bl = 100; | 背光和data之间的Delay时间。 |
m_wPanelPeriodVal = 200000; | Pwm Period。 |
2.5.3. 屏参配置¶
-
屏参配置文件介绍
屏参配置文件在alkaid中的路径为project/board/ini/misc/config.ini,系统启动过程中会去解析屏参配置文件,然后将不同屏参保存到系统中,给显示模块使用。显示模块会根据用户调用API的参数设定向系统获取所需屏参。
屏参配置文件由section、variable name组成:
-
section:
文件中"[]"中的字段。
-
variable name:
文件中"="左边的字段,右边是给variable name赋的值
section是唯一的,不允许有同名,但是variable name允许。如上图,section DACOUT_576I只能有一个,但是m_pPanelName可以在不同的section中。系统根据不同的section区分variable name,然后添加不同的屏参。
variable name的字段为系统预先定义,在添加新的屏参时,只能填写系统中现有的,新增或者修改时请告知owner,否则系统无法识别。如m_pPanelName,在新增屏参时只能使用m_pPanelName定义新的panel name。
variable name赋值示例如下:
-
-
新增屏参
-
新屏参定义section name不能和现有section name相同;
-
将新屏参的section name追加到ROOT section的m_pnlList变量中(不同接口的LCD section只能存在一个,比如m_pnlList中已经存在一个TTL的panel section name,那么如果想要添加新的TTL,只能删除掉之前存在的section);
-
将新的屏参添加到新的section中,如下:
-
-
屏参参数说明
参数 描述 m_pPanelName panel name m_bPanelDither 1:enable Dither 0:disable Dither m_ePanelLinkType 接口类型 TTL :0 MIPI_DSI :10 m_bPanelInvDCLK Pixel clk极性反转 m_bPanelInvDE DE极性反转 m_bPanelInvHSync Hsync极性反转 m_bPanelInvVSync Vsync极性反转 m_wPanelHSyncWidth 行同步信号脉宽 m_wPanelHSyncBackPorch 行同步信号后肩 m_wPanelVSyncWidth 场同步信号脉宽 m_wPanelVBackPorch 场同步信号后肩 m_wPanelHStart m_wPanelHSyncWidth+m_wPanelHSyncBackPorch m_wPanelVStart m_wPanelVSyncWidth+ m_wPanelVBackPorch m_wPanelWidth 行有效像素点数 m_wPanelHeight 场有效行数 m_wPanelHTotal m_wPanelWidth+m_wPanelHSyncWidth+m_wPanelHSyncBackPorch+HsyncFrontPorch m_wPanelVTotal m_wPanelHeight+m_wPanelVSyncWidth+ m_wPanelVBackPorch+VsyncFrontPorch m_wPanelDCLK m_wPanelHTotal*m_wPanelVTotal*fps(IP内部使用clk) m_wSpreadSpectrumFreq 时钟延展幅度调制(详见展频计算v2.xlsx) m_wSpreadSpectrumRatio 时钟延展频率调制(详见展频计算v2.xlsx) m_eOutputFormatBitMode 10BIT :0 6BIT :1 8BIT :2 565BIT :3 m_ucPanelSwapChnR Swap Channel R 0:default 1:select R 2:select G 3:select B m_ucPanelSwapChnG Swap Channel G 0:default 1:select R 2:select G 3:select B m_ucPanelSwapChnB Swap Channel B 0:default 1:select R 2:select G 3:select B m_ucPanelSwapRgbML Swap Rgb MSB/LSB 0:disable M/L swap 1:enable M/L swap 如果是mipi panel还需要对mipi dsi进行配置:
MIPI DSI参数说明:
参数 描述 m_wHsTrail Default: 5 m_wHsPrpr Default: 3 m_wHsZero Default: 5 m_wClkHsPrpr Default: 10 m_wClkHsExit Default: 14 m_wClkTrail Default: 3 m_wClkZero Default: 12 m_wClkHsPost Default: 10 m_wDaHsExit Default: 5 m_wContDet Default:0 m_wLpx Default:16 m_wTaGet Default:26 m_wTaSure Default:24 m_wTaGo Default:50 m_wHactive Follow 屏参设定 m_wHpw Follow 屏参设定 m_wHbp Follow 屏参设定 m_wHfp Follow 屏参设定 m_wVactive Follow 屏参设定 m_wVpw Follow 屏参设定 m_wVbp Follow 屏参设定 m_wVfp Follow 屏参设定 m_wBllp 0 m_wFps Default:60 m_eLaneNum one lane :1 two lane :2 three lane :3 four lane :4 m_eFormat RGB565 :0 RGB666 :1 LOOSELY_RGB666 :2 RGB888 :3 m_eCtrlMode CMD_MODE :0 SYNC_PULSE :1 SYNC_EVENT :2 BURST_MODE :3 m_ucClkLane Clk lane selection(default:2) 0:select chn0 1:select chn1 2:select chn2 3:select chn3 4:select chn4 m_ucDataLane0 data lane0 selection(default:4) 0:select chn0 1:select chn1 2:select chn2 3:select chn3 4:select chn4 m_ucDataLane1 data lane1 selection(default:3) 0:select chn0 1:select chn1 2:select chn2 3:select chn3 4:select chn4 m_ucDataLane2 data lane2 selection(default:1) 0:select chn0 1:select chn1 2:select chn2 3:select chn3 4:select chn4 m_ucDataLane3 data lane3 selection(default:0) 0:select chn0 1:select chn1 2:select chn2 3:select chn3 4:select chn4 m_pCmdBuff Mipi panel cmd m_pCmdBuff= m_ucPolCh0 Chn0极性 0:default 1:positive 2:negative m_ucPolCh1 Chn1极性 0:default 1:positive 2:negative m_ucPolCh2 Chn2极性 0:default 1:positive 2:negative m_ucPolCh3 Chn3极性 0:default 1:positive 2:negative m_ucPolCh4 Chn4极性 0:default 1:positive 2:negative -
根据规格书填屏参
根据屏的规格书找到如下表格:
HTotal = u16Width + u16HSyncWidth + u16HSyncBackPorch + HSyncFrontPorch VTotal = u16Heigth + u16VSyncWidth + u16VSyncBackPorch + HVyncFrontPorch DCLK = HTotal * VTotal * FPS
需要根据屏规格书填写如下内容:
m_wPanelHSyncWidth m_wPanelHSyncBackPorch m_wPanelVSyncWidth m_wPanelVBackPorch m_wPanelHStart m_wPanelVStart m_wPanelWidth m_wPanelHeight m_wPanelHTotal m_wPanelVTotal m_wPanelDCLK
如下是公版填写的相关数据:
config.ini的解析是在开机insmode的时候通过config_tool自动加载到mi_sys里面的,mi_disp和mi_panel只需要直接使用就可以了,不再需要手动加载。
config.ini默认load路径为:
第一优先路径:/misc/config.ini
第二优先路径:/config/config.ini
第三优先路径:/config/model/config.ini
2.5.4. 代码示例¶
SSD2X2与SSD20X在加载屏参的方式上有所差异。SSD20X是将屏参保存在一个头文件中,初始化时通过MI_PANEL_SetPanelParam函数从头文件中读取相关参数。SSD2X2是将屏参保存在project/board/ini/misc/config.ini文件中,通过调用MI_PANEL_Init函数,设置对应的interface类型,解析config.ini文件并加载对应屏参。
MI_PANEL_IntfType_e eIntfType; eIntfType = E_MI_PNL_INTF_TTL; //TTL接口 MI_PANEL_Init(eIntfType);
2.6. Debug方法¶
2.6.1. 系统对应module 节点供查看¶
cat /proc/mi_modules/mi_panel/mi_panel0
2.6.2. 常用debug寄存器¶
调用MI_DISP相关API初始化显示设备之后可通过riu_w 1128 7 a写寄存器,将测试pattern打到PANEL,验证PANEL屏参是否配置成功。
3. MIPI点屏介绍¶
3.1. 规格¶
规格 芯片 |
MIPI |
---|---|
201/201 | 支持 |
21X/22X | 不支持 |
203 | 不支持 |
MIPI DSI 规格:
-
1-4 data lanes, 1 clock lane
-
Level
LP: 0~12V
HS: 100~300mV
-
HS: 80Mbps ~ 1.5Gbps/lane
-
Pixel format
16 bpp (5,6,5 RGB) each pixel using two bytes
18 bpp (6,6,6 RGB) packed
18 bpp (6, 6, 6 RGB) loosely packed into three bytes
24 bpp (8, 8, 8 RGB), each pixel using three bytes
-
video mode: BURST_MODE/SYNC_EVENT/SYNC_PULSE
-
data/clk chn swap
-
data/clk chn P/N swap
-
data clk skew adjustment
3.2. 基本概念¶
MIPI DPHY timing chart:
图3-1 Data lanes-Low Power Mode to/from High Speed Mode Timing
图3-2 Clock lanes- High Speed Mode to/from Low Power Mode Timing
-
Configure HS Timing Parameter
HS_TRAIL/HS_EXIT /HS_PRPR/HS_ZERO/CLK_PRPR/CLK_ZERO/CLK_POST/CLK_TRAIL
Timing specification THS-PREPARE + THS-zero 145ns+10*UI THS-PREPARE 40ns+4 * UI ~ 85ns +6 * UI THS-ZERO >60ns+4 * UI ~105ns+6 * UI UI表示时间间隔,等于时钟通道上任何HS状态的持续时间。
UI的计算方法:
H_Total = HACT+HPW+HBP+HFP V_Total = VACT+VPW+VBP+VFP BitsPerPixel=24(RGB888)/18(RGB666)/16(RGB565) Bitrate = (H_Total)*(V_Total)*FPS* BitsPerPixel/lane number UI = 1/Bitrate
图3-3 DSI clock channel timing
如果Bitrate = 750Mps,UI = 1/Bitrate = 1.333ns,那么HS timing parameter计算结果为:
Timing specification Absolute time DA_HS_PREP value(Absolute time/(8*UI)) THS-PREPARE + THS-zero 145ns+10*UI > 158.33 ns > 15 THS-PREPARE 40ns+4 * UI ~ 85ns +6 * UI 45.32 ~ 92.98 ns 5 ~ 8 THS-zero >60ns+4 * UI ~105ns+6 * UI > 112.98~ 65.32 ns 10 ~ 7 -
Configure LP Timing Parameter
CONT_DET/LPX/TA_GET/TA_SURE/TA_GO
low power parameters建议使用提供的默认值
DCS(Display Command Set)协议:DCS是一个标准化的命令集,用于命令模式的显示模组。
DSI(Display Serial Interface)分四层,对应D-PHY、DSI、DCS规范、分层结构图如上:
-
PHY 定义了传输媒介,输入/输出电路和和时钟和信号机制。
-
Lane Management层:发送和收集数据流到每条lane。
-
Low Level Protocol层:定义了如何组帧和解析以及错误检测等。
-
Application层:描述高层编码和解析数据流。
-
3.3. 硬件相关¶
3.3.1. 查看原理图¶
Demo Board 原理图:
如上图,芯片内部默认情况下对应的pin是:
Lane0对应的是PAD_TTL6/7 → E_MI_PNL_CH_SWAP_0 (对应枚举值是0)
Lane1对应的是PAD_TTL8/9 → E_MI_PNL_CH_SWAP_1 (对应枚举值是1)
Lane2对应的是PAD_TTL12/13 → E_MI_PNL_CH_SWAP_3 (对应枚举值是3)
Lane3对应的是PAD_TTL14/15 → E_MI_PNL_CH_SWAP_4 (对应枚举值是4)
Clk对应的是PAD_TTL10/11 → E_MI_PNL_CH_SWAP_2 (对应枚举值是2)
这里的枚举值是软件定义,参考接下来介绍的MIPI Swap栏位配置
3.3.2. 对应padmux¶
确认硬件设计pin脚连接
如下图是推荐使用的mipi pin,PAD TTL6 – PAD TTL15 (MIPI Mode 1)
3.4. 软件相关¶
3.4.1. 配置padmux¶
-
user space配置找到项目对应使用的*padmux.dts配置对应MIPI MODE
-
Uboot下padmux配置
MIPI常用的是2Lane跟4Lane,在Uboot下已经根据屏参的Lane num自动切到对应Mode,用户可以不用关注,直接使用即可
3.4.2. 配置屏参¶
确认panel规格:
HTotal = u16Width + u16HSyncWidth + u16HSyncBackPorch + HSyncFrontPorch VTotal = u16Heigth + u16VSyncWidth + u16VSyncBackPorch + HVyncFrontPorch DCLK = HTotal * VTotal * FPS
3.4.3. 代码示例¶
MIPI屏参在配置上会比TTL的稍有差异,主要关注两个结构体,注意参数设置:
-
配置MI_PANEL_MipiDsiConfig_t (TTL不需要关注)
-
Part2主要是设置Panel规格书列明的H/V相关参数,参照TTL的方法逐个填入接可
-
Part3主要是Panel的初始化cmd,这部份cmd是各panel厂商参照DSC的标准自定义的,所以cmd一般是找Panel的芯片原厂提供
1. static MI_U8 cmd_buf[] = 2. { 3. cmd1, data_num, data[0],data[1],...,data[num-1], 4. ..., 5. cmdN, data_num, data[0],data[1],...,data[num-1], 6. FLAG_END_OF_TABLE, FLAG_END_OF_TABLE, //结束符 7. }
-
Part4是设置各Lane的P/N极性翻转,参考硬件跟Panel的连接确认是否需要翻转即可
-
Part1这部分主要是对传输过程中时序要求,这部分我们准备了一个通用的Excel表格(附件:mipi相关参数计算表格v2.xlsx),只要输入对应Panel的HTotal/VTotal即会自动生成,示例如下:
红框部分就是按照公式自动生成的惨呼,在范围内微调对应填到软件屏参即可
-
-
MI_PANEL_ParamConfig_t:主要看MIPI Swap配置栏位(TTL不需要关注)
1. typedef enum 2. { 3. E_MI_PNL_CH_SWAP_0, 4. E_MI_PNL_CH_SWAP_1, 5. E_MI_PNL_CH_SWAP_2, 6. E_MI_PNL_CH_SWAP_3, 7. E_MI_PNL_CH_SWAP_4, 8. }MI_PANEL_ChannelSwapType_e; 9. 10. typedef struct 11. { 12. ... 13. ... 14. MI_PANEL_ChannelSwapType_e eCh0; //--> CLK 栏位 15. MI_PANEL_ChannelSwapType_e eCh1; //--> Lane3栏位 16. MI_PANEL_ChannelSwapType_e eCh2; //--> Lane2栏位 17. MI_PANEL_ChannelSwapType_e eCh3; //--> Lane1栏位 18. MI_PANEL_ChannelSwapType_e eCh4; //--> Lane0栏位 19. }MI_PANEL_ParamConfig_t;
需要参考实际的硬件连接配置,考虑外接设备Lane To Lane不做Swap的话,参数应配置如下:
1. typedef struct 2. { 3. ... 4. ... 5. MI_PANEL_ChannelSwapType_e eCh0; //--> CLK 栏位 -- E_MI_PNL_CH_SWAP_2 6. MI_PANEL_ChannelSwapType_e eCh1; //--> Lane3栏位 -- E_MI_PNL_CH_SWAP_4 7. MI_PANEL_ChannelSwapType_e eCh2; //--> Lane2栏位 -- E_MI_PNL_CH_SWAP_3 8. MI_PANEL_ChannelSwapType_e eCh3; //--> Lane1栏位 -- E_MI_PNL_CH_SWAP_1 9. MI_PANEL_ChannelSwapType_e eCh4; //--> Lane0栏位 -- E_MI_PNL_CH_SWAP_0 10. }MI_PANEL_ParamConfig_t;
即2, 4, 3, 1, 0
屏参示例:
1. int sstar_disp_init(MI_DISP_PubAttr_t *pstDispPubAttr, int disp_port_num) 2. { 3. MI_PANEL_LinkType_e eLinkType; 4. 5. if (pstDispPubAttr->eIntfType == E_MI_DISP_INTF_LCD) 6. { 7. pstDispPubAttr->stSyncInfo.u16Vact = stPanelParam.u16Height; 8. pstDispPubAttr->stSyncInfo.u16Vbb = stPanelParam.u16VSyncBackPorch; 9. pstDispPubAttr->stSyncInfo.u16Vfb = stPanelParam.u16VTotal - (stPanelParam.u16VSyncWidth + 10. stPanelParam.u16Height + stPanelParam.u16VSyncBackPorch); 11. pstDispPubAttr->stSyncInfo.u16Hact = stPanelParam.u16Width; 12. pstDispPubAttr->stSyncInfo.u16Hbb = stPanelParam.u16HSyncBackPorch; 13. pstDispPubAttr->stSyncInfo.u16Hfb = stPanelParam.u16HTotal - (stPanelParam.u16HSyncWidth + 14. stPanelParam.u16Width + stPanelParam.u16HSyncBackPorch); 15. pstDispPubAttr->stSyncInfo.u16Bvact = 0; 16. pstDispPubAttr->stSyncInfo.u16Bvbb = 0; 17. pstDispPubAttr->stSyncInfo.u16Bvfb = 0; 18. pstDispPubAttr->stSyncInfo.u16Hpw = stPanelParam.u16HSyncWidth; 19. pstDispPubAttr->stSyncInfo.u16Vpw = stPanelParam.u16VSyncWidth; 20. pstDispPubAttr->stSyncInfo.u32FrameRate = stPanelParam.u16DCLK * 1000000 / (stPanelParam.u16HTotal * stPanelParam.u16VTotal); 21. pstDispPubAttr->eIntfSync = E_MI_DISP_OUTPUT_USER; 22. pstDispPubAttr->eIntfType = E_MI_DISP_INTF_LCD; 23. eLinkType = stPanelParam.eLinkType; 24. 25. MI_DISP_SetPubAttr(0, pstDispPubAttr); 26. MI_DISP_Enable(0); 27. 28. MI_PANEL_Init(eLinkType); 29. MI_PANEL_SetPanelParam(&stPanelParam); 30. if(eLinkType == E_MI_PNL_LINK_MIPI_DSI) 31. { 32. MI_PANEL_SetMipiDsiConfig(&stMipiDsiConfig); 33. } 34. 35. } 36. return 0;
3.5. Debug方法¶
cat /proc/mi_modules/mi_panel/mi_panel0
4. 其他类型点屏介绍¶
4.1. SPI点屏介绍¶
4.1.1 规格¶
规格 芯片 |
SPI |
---|---|
201/202 | 支持 |
21X/22X | 支持 |
203 | 支持 |
4.1.2 基本概念¶
SPI:Serial Peripheral Interface,串行外设接口。
利用spi接口一般点比较小分辨率的lcd。
4.1.3 点屏流程¶
Step 1:
根据原理图配置SPI PIN脚。查询CheckList表格并更改dts文件,配置对应管脚的PIN_MUX。
Step 2:
Kernel中使能SPI驱动
menuconfig下使能如下选项:
> Device Drivers >Sstar Soc platform drivers >Sstar MSPI driver
Step 3:
根据数据手册下初始化命令。初始化命令一般由屏厂提供,或者查看屏规格书自行配置。
Step 4:
写入图像数据,显示画面。有些屏自带内部测试partten,可通过命令使能输出。
4.1.4 硬件相关¶
4.1.4.1 查看原理图
以SPI为例,硬件工程师在绘制原理图时会查询HW CheckList表格,选择一组空闲的,并且可以作为SPI接口的管脚。我们选择PAD_KEY0~3复用为SPI1,并且PADMUX选择SPI1_MODE_5。
4.1.4.2 对应padmux
4.1.5 软件相关¶
4.1.5.1 配置相关padmux
在已知管脚的PADMUX情况下,我们需要更改kernel/arch/arm/boot/dts目录下的padmux.dtsi文件,保证PADMUX切换正确。以SPI1_MODE_5为例:
在kernel/drivers/sstar/gpio/pioneer3/mhal_pinmux.c文件中可以找到每个管脚可以配置的PADMUX,以及相关的寄存器。我们可以在板端通过riu工具读寄存器的值确认PADMUX是否切换正确,以SSD2X2平台为例:
1. #define PADTOP_BANK 0x103C00 //基地址 2. #define REG_SPI1_MODE 0x68 //偏移地址 3. #define REG_SPI1_MODE_MASK BIT8|BIT9|BIT10|BIT11 //有效位
riu_r 103C 68,如果读的值为0x500表明PADMUX切换正确。
4.1.5.2 配置屏参¶
SPI没有我们TTL类似的屏参配置,主要是根据数据手册下初始化命令。初始化命令一般由屏厂提供,或者查看屏规格书自行配置。
4.1.5.3 代码示例¶
smartdisp_demo\P3_ReleaseDemo\panel\SpiPanel
留意这个demo里spi实现有硬件spi和gpio模拟两种方法,建议用我们芯片内部的硬件spi方法。
4.1.6 开发建议¶
对与spi panel建议使用kernel原生的架构去开发,可以参考:
4.1.7 Debug方法¶
SPI Panel点不亮的情况,可以从如下方法去check:
-
spi的padmux是否配置正确?可以通过产看寄存器和硬件测量波形的方法去确认。
-
spi初始化命令是否正确,可以联系屏厂确认,还有可以通过spi发送命令打test pattern测试硬件是否通了。
4.2. PSPI点屏介绍¶
4.2.1 规格¶
规格 芯片 |
PSPI |
---|---|
201/202 | 不支持 |
21X/22X | 支持 |
203 | 不支持 |
4.2.2 基本概念¶
PSPI模块是SSD2X2平台新增的私有SPI协议,支持Master/Slave模式,最大时钟216MHz。点屏时配置为Master模式,要求PANEL支持TE Mode。
PSPI模块支持双线模式,即一个时钟传输两个bit,配置为双线模式时PSPI的DCLK最大配置为108MHz。TE信号是用于同步的控制信号,亦即屏幕的刷新率,收到TE信号的上升沿跳变PSPI模块会将一场数据发送到PANEL。DCLK需满足DCLK>hTotal * vTotal * Pixel * FPS / 2,保证PSPI在TE信号的间隔时间内将一场数据发送完。
TE Mode工作模式见下图:
4.2.3 硬件相关¶
4.2.3.1 配置管脚PADMUX
查询HW Checklist表格,找到管脚对应的复用模式。如下例,配置PAD_TTL0~PAD_TTL3为PSPI1_PL_MODE_4,配置PAD_TTL4为PSPI1_TE_MODE_5。
修改kernel/arch/arm/boot/dts下padmux.dtsi设备树文件,配置对应管脚的PADMUX。
以SSD2X2平台为例,相关寄存器定义在kernel/drivers/sstar/gpio/pioneer3/mhal_pinmux.c文件中。可通过读取寄存器的值,确认PADMUX是否切换OK。
riu_r 103C 6A,如果读到的值为0x504,则PADMUX切换正确。
4.2.4 软件相关¶
4.2.4.1 屏初始化
管脚的PADMUX配置完成后,需要向Panel发送初始化命令,初始化命令一般屏厂会提供或者参看屏规格书用户自行配置。当PSPI模块配置为单线模式时相当于SPI外设,可以调用相关的API发送命令。
调用MI_PSPI_Transfer接口将初始化命令发送给panel。
1. MI_PSPI_Msg_t pspi_msg; 2. MI_PSPI_Param_t pspi_para; 3. MI_PSPI_DEV pspi_dev = 1;//使用PSPI点屏dev需选1 4. 5. pspi_para.u8BitsPerWord = 9;//数据长度,常见的有8bit/9bit,最大16bit 6. pspi_para.u8DataLane = DATA_SINGLE;//单线模式 7. pspi_para.u16DelayCycle = 2; 8. pspi_para.u16WaitCycle = 2; 9. pspi_para.u8RgbSwap = 0; 10. pspi_para.u32MaxSpeedHz = 1000000;//PSPI时钟频率,单线模式最高216MHz 11. pspi_para.u16PspiMode = 0; 12. pspi_para.u8ChipSelect = MI_PSPI_SELECT_0; 13. pspi_para.u8TeMode = 0;//作为普通SPI发送命令时先关掉TE MODE 14. MI_PSPI_CreateDevice(pspi_dev, &pspi_para);// 15. 16. memset(&pspi_msg, 0 ,sizeof(MI_PSPI_Msg_t)); 17. pspi_msg.u8TxBitCount = 9; 18. pspi_msg.u8TxSize = 8;//一次传输最大8个数据 19. pspi_msg.au16TxBuf[0] = 0xDA; //command 20. pspi_msg.au16TxBuf[1] = 0x1FF;//data 21. pspi_msg.au16TxBuf[2] = 0x1AB; 22. pspi_msg.au16TxBuf[3] = 0x104; 23. pspi_msg.au16TxBuf[4] = 0x1D2; 24. pspi_msg.au16TxBuf[5] = 0x108; 25. pspi_msg.au16TxBuf[6] = 0x1C2; 26. pspi_msg.au16TxBuf[7] = 0x133; 27. MI_PSPI_Transfer(pspi_dev, & pspi_msg);
4.2.4.2 显示测试
用户层需要调用MI SYS与PSPI相关的API,向PSPI模块填入RGB数据,PSPI模块收到PANEL反馈的TE信号后,会将图像数据发送给PANEL显示。具体的代码实现可参考如下。
1. MI_PSPI_Msg_t pspi_msg; 2. MI_PSPI_Param_t pspi_para; 3. MI_PSPI_DEV pspi_dev = 1;//使用PSPI点屏dev需选1 4. 5. pspi_para.u8TeMode = 1;//打开TE MODE 6. pspi_para.u32MaxSpeedHz = 24 * 1000 * 1000;//配置时钟 7. pspi_para.u8DataLane = DATA_DUAL;//双线模式 8. MI_PSPI_SetDevAttr(pspi_dev, &pspi_para); 9. 10. MI_SYS_ChnPort_t stChnPort; 11. MI_SYS_BufConf_t stBufConf; 12. MI_SYS_BUF_HANDLE stHandle; 13. MI_SYS_BufInfo_t stBufInfo; 14. memset(&stChnPort, 0, sizeof(MI_SYS_ChnPort_t)); 15. memset(&stBufConf, 0, sizeof(MI_SYS_BufConf_t)); 16. memset(&stBufInfo, 0, sizeof(MI_SYS_BufInfo_t)); 17. memset(&stHandle, 0, sizeof(MI_SYS_BUF_HANDLE)); 18. 19. stChnPort.eModId = E_MI_MODULE_ID_PSPI;//选中PSPI模块 20. stChnPort.u32DevId = 1; 21. stChnPort.u32ChnId = 0; 22. stChnPort.u32PortId = 0; 23. 24. stBufConf.eBufType = E_MI_SYS_BUFDATA_FRAME; 25. stBufConf.stFrameCfg.u16Height = IMAGE_HEIGHT;//图像的高 26. stBufConf.stFrameCfg.u16Width = IMAGE_WIDTH;//图像的宽 27. stBufConf.stFrameCfg.eFrameScanMode = E_MI_SYS_FRAME_SCAN_MODE_PROGRESSIVE; 28. stBufConf.stFrameCfg.eFormat = E_MI_SYS_PIXEL_FRAME_RGB565;//图像的数据格式 29. 30. //申请一张buf,用于保存图像数据, 31. if(MI_SYS_ChnInputPortGetBuf(&stChnPort, &stBufConf, &stBufInfo, &stHandle, -1) == MI_SUCCESS) 32. { 33. //将图像数据拷贝到申请的buf中 34. memcpy(stBufInfo.stFrameData.pVirAddr[0], TxBuf, stBufInfo.stFrameData.u32BufSize); 35. 36. //将buf交给PSPI模块使用.当PSPI模块收到TE信号就会将这张图像发送给panel显示 37. if(MI_SYS_ChnInputPortPutBuf(stHandle, &stBufInfo, FALSE) != MI_SUCCESS) 38. { 39. printf("MI_SYS_ChnInputPortPutBuf Failed!\n"); 40. } 41. }
4.2.5 注意事项¶
-
使用PSPI模块点屏PSPI设备只能选择PSPI1,即MI_PSPI_DEV=1
-
MI_PSPI_Transfer每次传输的最大数据个数默认是8。
-
单线模式最大时钟216MHz,双线模式最大时钟108Mhz。
4.3. SRGB点屏介绍¶
4.3.1 规格¶
规格 芯片 |
SRGB |
---|---|
201/202 | 不支持 |
21X/22X | 支持 |
203 | 不支持 |
4.3.2 基本概念¶
SRGB即串行的RGB接口,使用该接口传输数据一个像素点的RGB数据会被分为三次传输到panel。如下图,以RGB888为例,对于TTL屏来说,一个DCLK时钟就能并行的将24bit数据即一个像素传输给panel;而对于SRGB接口屏来说,一个DCLK时钟只传输一个byte,依此串行的传输R、G、B数据,需要3个CLK才能传输完一个像素。因此点相同分辨率的屏,SRGB接口要求的时钟频率比TTL接口时钟频率约高3倍。
4.3.3 硬件相关¶
4.3.3.1 查看原理图
4.3.2 对应padmux
查看HW Checklist表格,确定PAD_TTL8、PAD_TTL11~ PAD_TTL21管脚选择RGB8_MODE_2。
4.3.4 软件相关¶
4.3.4.1 配置PADMUX
修改kernel/arch/arm/boot/dts下padmux.dtsi设备树文件,配置对应管脚的PADMUX。
以SSD2X2平台为例,相关寄存器定义在kernel/drivers/sstar/gpio/pioneer3/mhal_pinmux.c文件中。可通过读取寄存器的值,确认PADMUX是否切换OK。
riu_r 103C 6B,如果读到的值为0x2,则PADMUX切换正确。
4.3.4.2 填写屏参
SRGB接口屏与TTL屏类似,同样需要根据屏规格书在config.ini中增加对应的屏参,然后调用MI_PANEL_Init加载屏参。在屏规格书中找到类似如下几组参数:
上述参数之间的关系参看时序图可知:
V_Total = VS + VBP + VDISP + VFP H_Total = HPW + HBP + HDISP + HFP DCLK = H_Total * 3 * V_Total * FPS
然后将各参数填写到config.ini中,如下示例:
其中HTotal、VTotal、DCLK参数的数值可用上述公式计算,该屏的有效显示大小为240x320,刷新率设置为60Hz,则有:
m_wPanelHTotal= m_wPanelHSyncWidth+m_wPanelHSyncBackPorch+m_wPanelWidth+HFP=10+10+240+46=306 m_wPanelVTotal=m_wPanelVSyncWidth+m_wPanelVBackPorch+m_wPanelHeight+VFP=4+4+320+8=336 m_wPanelDCLK= m_wPanelHTotal*3*m_wPanelVTotal*FPS=306*3*336*60=18MHz
因为是使用SRGB接口,PADMUX配置的是RGB8 MODE,所以m_eOutputFormatBitMode选择2
4.3.4.3 加载屏参
屏参文件一般保存在板端的/misc目录下,用户也可在insmod mi_sys.ko时带相关参数指定屏参文件的路径:insmod mi_sys.ko config_ini_path=“/misc/config.ini”
用户层调用MI PANEL相关的API就会解析ini文件并加载对应的屏参。
1. MI_PANEL_IntfType_e eIntfType; 2. eIntfType = E_MI_PNL_INTF_SRGB; //选择SRGB接口 3. MI_PANEL_Init(eIntfType);
填写屏参时需注意,m_pnlList栏位下有且只能有一种SRGB类型的屏参,否则MI底层不能正确的解析到目标屏参。
4.3.4.4 显示测试
使用MI Test Parttern测试SRGB屏是否初始化成功。
riu_w 1128 7 A,如果屏上有彩条显示则表明屏初始化成功。
另外,可以通过调整ini中的swap参数,来修正RGB显示错位的问题。
1. m_ucPanelSwapChnR = 3; 2. m_ucPanelSwapChnG = 2; 3. m_ucPanelSwapChnB = 1; 4. m_ucPanelSwapRgbML = 0;
如上RGB通道的顺序为3、2、1,如果原本显示红色的地方却显示为绿色,我们可以swap红色与绿色的通道进行调整,即将RGB通道的顺序改为2、3、1。
通过如下寄存器确认颜色通道:
riu_w 1129 1C 8000 //enable riu_w 1129 1C 80FF //R riu_w 1129 1B FF00 //G riu_w 1129 1B 00FF //B
4.4. 常见问题¶
背光可以亮,但是没有画面,请排查如下问题:
1.检查屏参是否满足panel spec要求
2.数据流是否正常,是否有input buff输入
3.DISP device/layer/input port相关设定是否合理
4.panel init是否成功,需要SPI初始化的TTL panel可以量测SPI信号是否正常,initial cmd是否有正确传输
5.检查Hsync/Vsync/DE/Dclk极性是否满足panel spec
6.201/201:MIPI panel检查clk lane/data lane线序和软件设定是否一致
7.201/201:查看register BK101e addr 0d 是否有切对TTL mode/MIPI mode