SSD_DISP点屏参考
1. 基本介绍¶
1.1. 概述¶
本文档主要讲解点屏相关的配置和使用。
1.2. 芯片相关规格¶
规格 芯片 |
TTL | MIPI | SPI | SRGB | HDMI |
---|---|---|---|---|---|
201/202 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
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 |
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¶
查看SSD202 HW CheckList找到管脚对应的padmux,如下:
2.5. 软件相关¶
2.5.1. 配置padmux¶
通过如上可知panel使用的是ttl28_mode_1
-
user space配置找到项目对应使用的*padmux.dts配置如下:
-
Uboot下padmux配置
TTL支持的RGB888/RGB666/RGB565在Uboot下已经根据屏参的Lane num自动切到对应Mode,用户可以不用关注,直接使用即可(如pin Mode不一致请找对应FAE咨询修改)
2.5.2. 配置屏参¶
-
新增屏参
-
SSD20X采用头文件的形式配置屏参,先找一个公版Demo带的屏参文件,这里拿公版TTL的屏参SAT070CP50_1024x600.h举例(该头文件易见于公版各显示Demo)
-
确认屏规格书,找到对应Timing规格,如:
-
参考以下屏参参数说明,将屏规格对应的参数填写到头文件中,然后点屏include对应头文件即可
参数 描述 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 //No use 6BIT :1 //RGB666 8BIT :2 //RGB888 565BIT :3 //RGB565 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进行配置(对应第3章MIPI点屏相关),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
-
-
代码示例
1. #include "SAT070CP50_1024x600.h" 2. 3. int sstar_disp_init(MI_DISP_PubAttr_t *pstDispPubAttr, int disp_port_num) 4. { 5. MI_PANEL_LinkType_e eLinkType; 6. 7. if (pstDispPubAttr->eIntfType == E_MI_DISP_INTF_LCD) 8. { 9. pstDispPubAttr->stSyncInfo.u16Vact = stPanelParam.u16Height; 10. pstDispPubAttr->stSyncInfo.u16Vbb = stPanelParam.u16VSyncBackPorch; 11. pstDispPubAttr->stSyncInfo.u16Vfb = stPanelParam.u16VTotal - (stPanelParam.u16VSyncWidth + 12. stPanelParam.u16Height + stPanelParam.u16VSyncBackPorch); 13. pstDispPubAttr->stSyncInfo.u16Hact = stPanelParam.u16Width; 14. pstDispPubAttr->stSyncInfo.u16Hbb = stPanelParam.u16HSyncBackPorch; 15. pstDispPubAttr->stSyncInfo.u16Hfb = stPanelParam.u16HTotal - (stPanelParam.u16HSyncWidth + 16. stPanelParam.u16Width + stPanelParam.u16HSyncBackPorch); 17. pstDispPubAttr->stSyncInfo.u16Bvact = 0; 18. pstDispPubAttr->stSyncInfo.u16Bvbb = 0; 19. pstDispPubAttr->stSyncInfo.u16Bvfb = 0; 20. pstDispPubAttr->stSyncInfo.u16Hpw = stPanelParam.u16HSyncWidth; 21. pstDispPubAttr->stSyncInfo.u16Vpw = stPanelParam.u16VSyncWidth; 22. pstDispPubAttr->stSyncInfo.u32FrameRate = stPanelParam.u16DCLK * 1000000 / (stPanelParam.u16HTotal * stPanelParam.u16VTotal); 23. pstDispPubAttr->eIntfSync = E_MI_DISP_OUTPUT_USER; 24. pstDispPubAttr->eIntfType = E_MI_DISP_INTF_LCD; 25. eLinkType = stPanelParam.eLinkType; 26. 27. MI_DISP_SetPubAttr(0, pstDispPubAttr); 28. MI_DISP_Enable(0); 29. 30. MI_PANEL_Init(eLinkType); 31. MI_PANEL_SetPanelParam(&stPanelParam); 32. } 33. return 0; 34. }
2.6. Debug方法¶
cat /proc/mi_modules/mi_panel/mi_panel0
3. MIPI点屏介绍¶
3.1. 规格¶
规格 芯片 |
MIPI |
---|---|
201/201 | 支持 |
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
屏参示例:
35. int sstar_disp_init(MI_DISP_PubAttr_t *pstDispPubAttr, int disp_port_num) 36. { 37. MI_PANEL_LinkType_e eLinkType; 38. 39. if (pstDispPubAttr->eIntfType == E_MI_DISP_INTF_LCD) 40. { 41. pstDispPubAttr->stSyncInfo.u16Vact = stPanelParam.u16Height; 42. pstDispPubAttr->stSyncInfo.u16Vbb = stPanelParam.u16VSyncBackPorch; 43. pstDispPubAttr->stSyncInfo.u16Vfb = stPanelParam.u16VTotal - (stPanelParam.u16VSyncWidth + 44. stPanelParam.u16Height + stPanelParam.u16VSyncBackPorch); 45. pstDispPubAttr->stSyncInfo.u16Hact = stPanelParam.u16Width; 46. pstDispPubAttr->stSyncInfo.u16Hbb = stPanelParam.u16HSyncBackPorch; 47. pstDispPubAttr->stSyncInfo.u16Hfb = stPanelParam.u16HTotal - (stPanelParam.u16HSyncWidth + 48. stPanelParam.u16Width + stPanelParam.u16HSyncBackPorch); 49. pstDispPubAttr->stSyncInfo.u16Bvact = 0; 50. pstDispPubAttr->stSyncInfo.u16Bvbb = 0; 51. pstDispPubAttr->stSyncInfo.u16Bvfb = 0; 52. pstDispPubAttr->stSyncInfo.u16Hpw = stPanelParam.u16HSyncWidth; 53. pstDispPubAttr->stSyncInfo.u16Vpw = stPanelParam.u16VSyncWidth; 54. pstDispPubAttr->stSyncInfo.u32FrameRate = stPanelParam.u16DCLK * 1000000 / (stPanelParam.u16HTotal * stPanelParam.u16VTotal); 55. pstDispPubAttr->eIntfSync = E_MI_DISP_OUTPUT_USER; 56. pstDispPubAttr->eIntfType = E_MI_DISP_INTF_LCD; 57. eLinkType = stPanelParam.eLinkType; 58. 59. MI_DISP_SetPubAttr(0, pstDispPubAttr); 60. MI_DISP_Enable(0); 61. 62. MI_PANEL_Init(eLinkType); 63. MI_PANEL_SetPanelParam(&stPanelParam); 64. if(eLinkType == E_MI_PNL_LINK_MIPI_DSI) 65. { 66. MI_PANEL_SetMipiDsiConfig(&stMipiDsiConfig); 67. } 68. 69. } 70. return 0; 71. }
3.5. Debug方法¶
cat /proc/mi_modules/mi_panel/mi_panel0
4. HDMI输出介绍¶
4.1. 规格¶
HDMI,英文全称是High DefinitionMultimedia Interface,中文名称是高清晰多媒体接口的缩写
HDMI 1.4b transmitter up to 4k2k@30
常规分辨率:
DACOUT_480P_60 DACOUT_576P_50 DACOUT_720P_50 DACOUT_720P_60 DACOUT_1024X768P_60 DACOUT_1080P_24 DACOUT_1080P_25 DACOUT_1080P_30 DACOUT_1080P_50 DACOUT_1080P_60 DACOUT_1920X1200P_60 DACOUT_1280X1024P_60 DACOUT_1280X800P_60 DACOUT_1366X768P_60 DACOUT_1440X900P_60 DACOUT_1600X1200P_60 DACOUT_1680X1050P_60 DACOUT_4K2KP_30
4.2. 基本概念¶
-
标准HDMI连接器
Pin Signal 1 TMDS Data2+ 2 TMDS Data2 Shield 3 TMDS Data2 4 TMDS Data1+ 5 TMDS Data1 Shield 6 TMDS Data1– 7 TMDS Data0+ 8 TMDS Data0 Shield 9 TMDS Data0– 10 TMDS Clock+ 11 TMDS Clock Shield 12 TMDS Clock– 13 CEC 14 Reserved (N.C. on device) 15 SCL 16 SDA 17 DDC/CEC Ground 18 + 5V 19 Hot Plug Detect -
DDC通道
DDC全称为Display Data Channel
传送端与接收端可利用DDC通道得知彼此的传送与接收能力,但HDMI仅需单向获知接收端(显示器)的能力
使用100kHz时钟频率的I²C信号
传送数据结构为VESA Enhanced EDID (V1.3)
-
TMDS通道
传送音频,视频,以及各种辅助数据
信号编码方式:遵循DVI 1.0规格。Single-link (Type A HDMI)
视频像素带宽:每个像素的容许数据量从24位至48位。支持每秒60张画面 1080p
像素编码方式:RGB 4:4:4, YCbCr 4:4:4; YCbCr 4:2:2
音频采样率:32 kHz, 48 kHz
音频声道数量:最大2声道
音频流规格:PCM Audio/16BIT
-
HPD
HPD(Hotplug热插拔)是由接收端设备(Sink)发出的,在与HDMI源端设备(Source)之间建立正式通信的前奏信号。HPD信号电平为高时表示接收端设备已经准备好了,允许源端设备访问接收端设备。
4.3. 点屏流程¶
HDMI接口为固定接口,请参考如下硬件和软件配置。
4.4. 硬件相关¶
IC pin接口:
4.5. 软件相关¶
4.5.1. Dts配置和pad mux配置¶
hdmitx: hdmitx { compatible = "sstar,hdmitx"; status = "ok"; i2c_id = <0>; hpd_gpio = <89>; i2c_sw = <1>; i2c_sda_gpio = <88>; i2c_scl_gpio = <87>; clocks = <&CLK_hdmi>, <&CLK_disp_432>, <&CLK_disp_216>; clock-names = "CLK_hdmi", "CLK_disp_432", "CLK_disp_216"; //Reg = <0x1F224000 0x200>; };
Gpio.h中pin脚对应gpio口。
#define PAD_HDMITX_SCL 87 #define PAD_HDMITX_SDA 88 #define PAD_HDMITX_HPD 89
其中需要说明:为iic通信可靠和兼容性。默认使用sw iic的方式。其中PAD_HDMITX_HPD默认为热插拔的检测口。
4.5.2. 初始化和参数设定¶
Hdmi相关代码:
/* Base Module Init */ stInitParam.pCallBackArgs = NULL; stInitParam.pfnHdmiEventCallback = Hdmi_callback_impl; ExecFunc(MI_HDMI_Init(&stInitParam), MI_SUCCESS); ExecFunc(MI_HDMI_Open(eHdmi), MI_SUCCESS); ExecFunc(MI_HDMI_SetAttr(eHdmi, &stAttr), MI_SUCCESS); ExecFunc(MI_HDMI_Start(eHdmi), MI_SUCCESS); //ExecFunc(MI_HDMI_SetAvMute(eHdmi, true), MI_SUCCESS);// first no audio ExecFunc(MI_HDMI_SetAvMute(eHdmi, false), MI_SUCCESS);
Display与hdmi接口:
memset(&stPubAttr, 0x00, sizeof(MI_DISP_PubAttr_t)); stPubAttr.u32BgColor = YUYV_BLACK; stPubAttr.eIntfType = E_MI_DISP_INTF_HDMI; stPubAttr.eIntfSync = eOutputTiming; /* Set Disp Pub */ ExecFunc(MI_DISP_SetPubAttr(DispDev, &stPubAttr), MI_SUCCESS); ExecFunc(MI_DISP_Enable(DispDev), MI_SUCCESS);
Hdmi参数:
MI_HDMI_Attr_t stAttr; stAttr.stEnInfoFrame.bEnableAudInfoFrame = true; stAttr.stEnInfoFrame.bEnableAviInfoFrame = true; stAttr.stEnInfoFrame.bEnableSpdInfoFrame = true; stAttr.stAudioAttr.bEnableAudio = true; stAttr.stAudioAttr.bIsMultiChannel = 0; stAttr.stAudioAttr.eBitDepth = E_MI_HDMI_BIT_DEPTH_16; stAttr.stAudioAttr.eCodeType = E_MI_HDMI_ACODE_PCM; stAttr.stAudioAttr.eSampleRate = E_MI_HDMI_AUDIO_SAMPLERATE_48K; stAttr.stVideoAttr.bEnableVideo = true; stAttr.stVideoAttr.eColorType = E_MI_HDMI_COLOR_TYPE_RGB444;//default color type stAttr.stVideoAttr.eDeepColorMode = E_MI_HDMI_DEEP_COLOR_MAX; stAttr.stVideoAttr.eOutputMode = E_MI_HDMI_OUTPUT_MODE_HDMI; stAttr.stVideoAttr.eTimingType = E_MI_HDMI_TIMING_1080_60P;//1080P60 -> 720P60 s32ret = MI_HDMI_SetAttr(eHdmi, &stAttr);
5. SPI点屏介绍¶
5.1. 规格¶
规格 芯片 |
SPI |
---|---|
201/202 | 支持 |
203 | 支持 |
5.2. 基本概念¶
SPI:Serial Peripheral Interface,串行外设接口。
利用spi接口一般点比较小分辨率的lcd。
5.3. 点屏流程¶
-
根据原理图配置SPI PIN脚。查询CheckList表格并更改dts文件,配置对应管脚的PIN_MUX。
-
Kernel中使能SPI驱动
menuconfig下使能如下选项:
> Device Drivers > Sstar Soc platform drivers > Sstar MSPI driver
-
根据数据手册下初始化命令。初始化命令一般由屏厂提供,或者查看屏规格书自行配置。
-
写入图像数据,显示画面。有些屏自带内部测试partten,可通过命令使能输出。
5.4. 硬件相关¶
5.4.1. 查看原理图¶
以SPI为例,硬件工程师在绘制原理图时会查询HW CheckList表格,选择一组空闲的,并且可以作为SPI接口的管脚。我们选择PAD_GPIO8-PAD_GPIO11,并且PADMUX选择SPI0_MODE_5。
5.4.2 对应padmux¶
5.5. 软件相关¶
5.5.1. 配置相关padmux¶
在已知管脚的PADMUX情况下,我们需要更改kernel/arch/arm/boot/dts目录下对应的padmux.dtsi文件,保证PADMUX切换正确。以SPI0_MODE_5为例:
5.5.2. 配置屏参¶
SPI没有我们TTL类似的屏参配置,主要是根据数据手册下初始化命令。初始化命令一般由屏厂提供,或者查看屏规格书自行配置。
5.5.3. 代码示例¶
SPI屏有两种开发方式:
a. 直接将YUV/RGB数据通过SPI发送到panel端,这个操作参考BSP中SPI使用参考发数据即可(下文不在赘述)
b. kernel原生框架有通过fbtft底层对接spi,用户操作只需要操作fbtft抽象出来的/dev/fb1即可,具体使用参考章节5.6。
5.6. Fbtft开发建议¶
对于spi panel建议使用kernel原生的架构去开发,使用TFT-LCD驱动。
5.6.1. Spi panel驱动配置¶
-
Kernel menuconfig中打开fbtft config,把图中标记编译成模块
注意: Support for small TFT LCD display这个需要设置为
*
-
Dts添加对应配置
编译后insomod安装,命令如下:
-
移出原有的fbdev.ko,重启平台
-
重启后加载fbtft模块
insmod /config/modules/4.9.84/fbtft_device.ko busnum=1 name=admatec_b-berry28 cs=0 gpios="reset:21,dc:20" custom=1 speed=40000000 width=240 height=320 buswidth=8 mode=0 debug=7 dma=0
注意:name=admatec_b-berry28 要和驱动fbtft_device_display displays[]的name一致。Speed参数如果过高可能会出现spi timeout,可以尝试降低speed做调试。
-
加载对应TFT驱动: insmod /config/modules/fb_st7796s.ko
-
-
针对panel的相关设定的更改
-
屏初始化
Fbtft-core.c:
fbtft_probe_common() -> fbtft_register_framebuffer() -> fbtftops.init_display()
会使用如下数组的初始化参数对panel做初始化:
其他设定分别在fbtftops.set_var()/fbtftops.update_display()fbtftops.set_gamma()
-
刷新
上层通过ioctl(g_fbFd, FBIOPAN_DISPLAY, &vinfo)来刷新fb
对应底层:
fbtft_update_display() -> fbtftops.write_vmem() -> fbtft_write_vmem16_bus8() -> fbtftops.write -> fbtft_write_spi()
注意:因为是spi直接送数据给panel,RGB565或 RGB888送的数据不一样,所以上层给驱动的data数据需要符合屏的数据格式。如果gui使用的flythings需要 关闭gfx模块:export ZK_GFX_ENABLE=0
-
5.7. Debug方法¶
SPI Panel点不亮的情况,可以从如下方法去check:
a. spi的padmux是否配置正确?可以通过产看寄存器和硬件测量波形的方法去确认。
b. spi初始化命令是否正确,可以联系屏厂确认,还有可以通过spi发送命令打test pattern测试硬件是否通了。
6. 常见问题¶
背光可以亮,但是没有画面,请排查如下问题:
a. 检查屏参是否满足panel spec要求
b. 数据流是否正常,是否有input buff输入
c. DISP device/layer/input port相关设定是否合理
d. panel init是否成功,需要SPI初始化的TTL panel可以量测SPI信号是否正常,initial cmd是否有正确传输
e. 检查Hsync/Vsync/DE/Dclk极性是否满足panel spec
f. MIPI panel检查clk lane/data lane线序和软件设定是否一致
g. 查看riu_r 0x101e 0xd是否有切对TTL mode(value:0x100)/MIPI mode(value:0x1000)