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. 屏参配置

  1. 屏参配置文件介绍

    屏参配置文件在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赋值示例如下:

  2. 新增屏参

    • 新屏参定义section name不能和现有section name相同;

    • 将新屏参的section name追加到ROOT section的m_pnlList变量中(不同接口的LCD section只能存在一个,比如m_pnlList中已经存在一个TTL的panel section name,那么如果想要添加新的TTL,只能删除掉之前存在的section);

    • 将新的屏参添加到新的section中,如下:

  3. 屏参参数说明

    参数 描述
    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
  4. 根据规格书填屏参

    根据屏的规格书找到如下表格:

    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

  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

屏参示例:

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原生的架构去开发,可以参考:

TFT-LCD驱动使用参考


4.1.7 Debug方法

SPI Panel点不亮的情况,可以从如下方法去check:

  1. spi的padmux是否配置正确?可以通过产看寄存器和硬件测量波形的方法去确认。

  2. 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 注意事项

  1. 使用PSPI模块点屏PSPI设备只能选择PSPI1,即MI_PSPI_DEV=1

  2. MI_PSPI_Transfer每次传输的最大数据个数默认是8。

  3. 单线模式最大时钟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