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

  1. user space配置找到项目对应使用的*padmux.dts配置如下:

  2. Uboot下padmux配置

    TTL支持的RGB888/RGB666/RGB565在Uboot下已经根据屏参的Lane num自动切到对应Mode,用户可以不用关注,直接使用即可(如pin Mode不一致请找对应FAE咨询修改)


2.5.2. 配置屏参

  • 新增屏参

    1. SSD20X采用头文件的形式配置屏参,先找一个公版Demo带的屏参文件,这里拿公版TTL的屏参SAT070CP50_1024x600.h举例(该头文件易见于公版各显示Demo)

    2. 确认屏规格书,找到对应Timing规格,如:

    3. 参考以下屏参参数说明,将屏规格对应的参数填写到头文件中,然后点屏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

  1. user space配置找到项目对应使用的*padmux.dts配置对应MIPI MODE

  2. 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的稍有差异,主要关注两个结构体,注意参数设置:

  1. 配置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即会自动生成,示例如下:

      红框部分就是按照公式自动生成的惨呼,在范围内微调对应填到软件屏参即可

  2. 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. 点屏流程

  1. 根据原理图配置SPI PIN脚。查询CheckList表格并更改dts文件,配置对应管脚的PIN_MUX。

  2. Kernel中使能SPI驱动

    menuconfig下使能如下选项:

    > Device Drivers
      > Sstar Soc platform drivers
        > Sstar MSPI driver
    
  3. 根据数据手册下初始化命令。初始化命令一般由屏厂提供,或者查看屏规格书自行配置。

  4. 写入图像数据,显示画面。有些屏自带内部测试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驱动配置

  1. Kernel menuconfig中打开fbtft config,把图中标记编译成模块

    注意: Support for small TFT LCD display这个需要设置为 *

  2. Dts添加对应配置

    编译后insomod安装,命令如下:

    1. 移出原有的fbdev.ko,重启平台

    2. 重启后加载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做调试。

    3. 加载对应TFT驱动: insmod /config/modules/fb_st7796s.ko

  3. 针对panel的相关设定的更改

    1. 屏初始化

      Fbtft-core.c:

      fbtft_probe_common() -> fbtft_register_framebuffer() -> fbtftops.init_display()

      会使用如下数组的初始化参数对panel做初始化:

      其他设定分别在fbtftops.set_var()/fbtftops.update_display()fbtftops.set_gamma()

    2. 刷新

      上层通过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)