1. 概述

显示是非常重要的一个模块,人机交互的桥梁。那么SA8155 Hypervisor显示是如何处理的呢。对处理流程非常的好奇O(∩_∩)O哈哈~。

  • 数据流(buffer),如何刷屏
  • 同步机制(Vsync)
  • 帧率控制

TODO

2.OpenWFD

有点复杂,本文不介绍,标准基础的技术,需要专业的人去磨。如下贴两张图。

图1 

图2 

3. 显示框架 

3.1 显示框架如下图

本人理解绘制

  每个WFD Client连接一个显示输出:

        eQDIDisplayID : This is the QDI display ID associated with each port.
                        Should be of type QDI_Display_IDType
                          QDI_DISPLAY_NONE        = 0
                          QDI_DISPLAY_PRIMARY     = 1
                          QDI_DISPLAY_SECONDARY   = 2
                          QDI_DISPLAY_THIRD       = 3
                          QDI_DISPLAY_EXTERNAL    = 4
                          QDI_DISPLAY_EXTERNAL2   = 5
                          QDI_DISPLAY_EXTERNAL3   = 6
                          QDI_DISPLAY_FRAMEBUFFER = 7
  <WFDClient
     ID               = '0x7817'
     eWFDClientType   = '0x7'>
    <WFDPort ID='1'>
      <PortAttribs
        eQDIDisplayID = '3'
        uDisplayNode  = '0'
        ePortType     = '0x7660'
        eZOrderBase   = '0'
      ></PortAttribs>
      <WFDPipeline
        eQDILayerID   = '17'
        eZOrder       = '0'
      ></WFDPipeline>
    </WFDPort>
  </WFDClient>

3.2 Graphics Hypervisor 架构:

4. QNX MDSS(MultiMedia Display Sub System)及WFD相关

核心代码路基:qnx_ap/AMSS/multimedia/display

TODO

5. Bridge Driver/ 配置部分(重点)

常规座舱设计: 

开发板设计:

核心代码路径:qnx_ap/boards/display

5.1 目录架构:

├── adp_star_sda8155
│   ├── config
│   │   ├── graphics_ADP_STAR.conf
│   │   ├── graphics_ADP_STAR_FDN.conf
│   │   ├── graphics_ADP_STAR_GVM.conf
│   │   ├── Makefile
│   │   ├── qcdisplaycfg_ADP_STAR_FDN.xml
│   │   ├── qcdisplaycfg_ADP_STAR_LA_MULTI_DISP.xml  //WFDClient各个显示输出配置
│   │   └── qcdisplaycfg_ADP_STAR.xml
│   └── Makefile
├── common
│   ├── bridge_chip //涉及高可用框架
│   │   ├── client //客户端(API)
│   │   ├── drv //驱动/资源管理器
│   │   ├── Makefile
│   │   ├── plugins //串行解串芯片相关
│   │   └── server //服务端(高可用进程)
│   ├── Makefile
│   └── panels //屏接口配置,以及DSI->DP等转换芯片
│       ├── DANX7625_DP_QC_0
│       ├── DANX7625_DP_QC_1  
│       ├── DANX7625_DP_QC_2 
│       ├── DANX7625_DP_QC_3  
│       ├── DP1_COMMON_QC
│       ├── DP_BOND_COMMON_QC
│       ├── DP_COMMON_MST_QC
│       ├── DP_COMMON_QC
│       ├── DSI_COMMON_QC_0
│       ├── DSI_COMMON_QC_1
│       ├── EDP_COMMON_QC
│       ├── Makefile
│       ├── public
│       ├── SDANX7625x2_DPx2_QC_8155
└── Makefile

Demo板中硬件接口对应的屏驱动文件: 

Display interfacedriver for SA8155 Panel(Demo)
DSI-0DANX7625_DP_QC_0
DSI-1DANX7625_DP_QC_1
DP0DP_COMMON_QC
DP-MSTDP_COMMON_MST_QC
DP1N/A
eDPN/A

TODO

5.2 Bridge Driver(Server/Client)资源管理器

TODO

5.3 转换芯片(DSI->DP)

TODO

5.4 串行解串(Serializer/DeSerializer)

行业两大技术:  

  • Ti的 PDLINK3
  • 美信的 GMSL1/2

PDLINK 代表芯片:DS90UH947--DS90UH948 

                                DS90UH953--DS90UH954

                                DS90UH941--DS90UH981

GMSL2 代表芯片:Max96737--Max96752

                               Max96718--Max96717

                               Max96751--Max96718F

                               Max96745--Max96768

                               Max96789--Max96752F/Max9278

├── common
│   │   ├── plugins  //串行解串相关
│   │   │   ├── DS90UH981Q_QC_0 //TI PDLINK3 UH981
│   │   │   ├── DS90UH983Q_QC_0 //TI PDLINK3 UH983
│   │   │   └── Makefile

 

TODO

5.5 qcdisplaycfg配置

5.5.1 WFDClinet配置:

描述

<!-- WFD Configurations : Used to configure WFD driver -->
<WFDConfig>
  <!-- Client enumeration :
       ID               : Defines a unique value that resembles a client. It must have a prefix of 0x78##;
                          where ## is any unique value for each of the clients.
                          Exception: Client ID 0x78FF must be used for SCREEN.
       eWFDClientType   : Defines the Client Type associated with different clients
                            WFD_CLIENT_TYPE_CLUSTER  = 0x1
                            WFD_CLIENT_TYPE_MONITOR  = 0x2
                            WFD_CLIENT_TYPE_TELLTALE = 0x3
                            WFD_CLIENT_TYPE_RVC      = 0x4
                            WFD_CLIENT_TYPE_LA_GVM   = 0x5
                            WFD_CLIENT_TYPE_LV_GVM   = 0x6
                            WFD_CLIENT_TYPE_SPLASH   = 0x7

    Port enumeration :
      ID                     : Defines the order in which ports are enumerated
                               to client. Starts from '0'

      Port configuration     : Define attributes for each enumerated port.
                           Following attributes to be set
        eQDIDisplayID : This is the QDI display ID associated with each port.
                        Should be of type QDI_Display_IDType
                          QDI_DISPLAY_NONE        = 0
                          QDI_DISPLAY_PRIMARY     = 1
                          QDI_DISPLAY_SECONDARY   = 2
                          QDI_DISPLAY_THIRD       = 3
                          QDI_DISPLAY_EXTERNAL    = 4
                          QDI_DISPLAY_EXTERNAL2   = 5
                          QDI_DISPLAY_EXTERNAL3   = 6
                          QDI_DISPLAY_FRAMEBUFFER = 7
        ePortType     : This defines the type of the port.
                        Should be of type WFDPortType
                          WFD_PORT_TYPE_INTERNAL        = 0x7660
                          WFD_PORT_TYPE_COMPOSITE       = 0x7661
                          WFD_PORT_TYPE_SVIDEO          = 0x7662
                          WFD_PORT_TYPE_COMPONENT_YPbPr = 0x7663
                          WFD_PORT_TYPE_COMPONENT_RGB   = 0x7664
                          WFD_PORT_TYPE_COMPONENT_RGBHV = 0x7665
                          WFD_PORT_TYPE_DVI             = 0x7666
                          WFD_PORT_TYPE_HDMI            = 0x7667
                          WFD_PORT_TYPE_DISPLAYPORT     = 0x7668
                          WFD_PORT_TYPE_DSI             = 0x766A
        eZOrderBase   : Starting Z-order for layers assigned to this port for
                        this client

      Pipeline configuration : Define attributes for each enumerated pipeline
                               within a port. Following attributes to be set
        eQDILayerID : This is the QDI layer ID associated with each pipeline.
                      Should be of type QDI_Layer_IDType
                        QDI_LAYER_ID_OVERLAY1  = 5  - ViG0 (supports YUV content)
                        QDI_LAYER_ID_OVERLAY2  = 6  - ViG1 (supports YUV content)
                        QDI_LAYER_ID_OVERLAY3  = 7  - ViG2 (supports YUV content)
                        QDI_LAYER_ID_OVERLAY4  = 8  - ViG3 (supports YUV content)
                        QDI_LAYER_ID_OVERLAY5  = 9  - ViG4 (ViG0 REC1)
                        QDI_LAYER_ID_OVERLAY6  = 10 - ViG5 (ViG1 REC1)
                        QDI_LAYER_ID_OVERLAY7  = 11 - ViG6 (ViG2 REC1)
                        QDI_LAYER_ID_OVERLAY8  = 12 - ViG7 (ViG3 REC1)
                        QDI_LAYER_ID_DMA1      = 14 - DMA0
                        QDI_LAYER_ID_DMA2      = 15 - DMA1
                        QDI_LAYER_ID_DMA3      = 16 - DMA2
                        QDI_LAYER_ID_DMA4      = 17 - DMA3
                        QDI_LAYER_ID_DMA5      = 18 - DMA4 (DMA0 REC1)
                        QDI_LAYER_ID_DMA6      = 19 - DMA5 (DMA1 REC1)
                        QDI_LAYER_ID_DMA7      = 20 - DMA6 (DMA2 REC1)
                        QDI_LAYER_ID_DMA8      = 21 - DMA7 (DMA3 REC1)
        eZOrder     : Defines the Z-order of each pipeline within the port
                      Should be of type QDI_ZorderType
                        QDI_ZORDER_0  = 0  - bottom layer
                        QDI_ZORDER_1  = 1  - stage 1 layer
                        QDI_ZORDER_2  = 2  - stage 2 layer
                        QDI_ZORDER_3  = 3  - stage 3 layer
                        QDI_ZORDER_4  = 4  - stage 4 layer
                        QDI_ZORDER_5  = 5  - stage 5 layer
                        QDI_ZORDER_6  = 6  - stage 6 layer
                        QDI_ZORDER_7  = 7  - stage 7 layer
                        QDI_ZORDER_8  = 8  - stage 8 layer
                        QDI_ZORDER_9  = 9  - stage 9 layer
                        QDI_ZORDER_10 = 10 - top layer

  Restrictions:
   - Each QDI layer ID can be used inside one WFDPipeline tag only
   - WFDPipeline tags within one eQDIDisplayID tag must have unique eZOrder.
     i.e. Two WFDPipelines cannot have the same eZOrder within the same
     eQDIDisplayID
   - Pipelines that represent different rectangles of the same physical pipe
     must use the same QDI display ID.
     i.e. If DMA0 is used on eQDIDisplayID='1' then DMA4 must also be used on
     eQDIDisplayID='1', even if the pipelines are assigned to different clients
   - RECT1 pipelines cannot be assigned to displays wider than 2048 pixels
  -->

参考案例:

  <WFDClient
     ID               = '0x7812' //Client ID,每个显示ID不同(0x7800~0x78FF)
     eWFDClientType   = '0x3'>//Client Type,倒车RVC还是仪表,还是HMI
    <WFDPort ID='1'>//
      <PortAttribs
        eQDIDisplayID = '1'//显示ID,首屏,副屏等
        uDisplayNode  = '0'
        ePortType     = '0x7660'//显示接口类型,DSI/DP/eDP等
        eZOrderBase   = '10'
      ></PortAttribs>
      <WFDPipeline
        eQDILayerID   = '8'
        eZOrder       = '10'
      ></WFDPipeline>
    </WFDPort>
  </WFDClient> 

5.5.2 显示参数配置

  • 分辨率
  • 前后肩
  • 时钟
  • 其他

<Display ID='1'> //显示ID QDI_DISPLAY_PRIMARY 对应 eQDIDisplayID
  <!-- Panel Library:
    cPanelDriverRoot : Directory where the panel driver library is stored
    cPanelName       : Name of the panel driver library
  -->

  <PanelLibrary //屏驱动
    cPanelDriverRoot = '/lib64/'
    cPanelName       = 'DANX7625_DP_QC_0' //DSI->转DP芯片
  ></PanelLibrary>

  <PanelVideoTiming//时序配置
    ePixelFormatType = '3' //格式
    uVisWidth        = '1920'
    uHsyncFrontPorch = '88'
    uHsyncWidth      = '44'
    uHsyncBackPorch  = '148'
    uVisHeight       = '1080'
    uVsyncFrontPorch = '4'
    uVsyncWidth      = '5'
    uVsyncBackPorch  = '36'
    uPixelFreqInHz   = '148500000'
    bDEPolarity      = '0'
  ></PanelVideoTiming> 

  <DSIConfiguration //DSI配置
    cBridgeChipID = 'NATIVE' //是否有BridgeChip(串解器),没有就是NATIVE
    eMapSelect    = '0'
    uNumOfLanes   = '4'// DSI LANE数量
  ></DSIConfiguration>
</Display>

TODO

6.  高可用机制(重要)

高可用机制是汽车电子软件设计的可靠性、稳定性的可靠保障。汽车电子产品尤其是前装,本着可靠性,稳定性第一原则。

TODO

6.1 异常监控 

TODO

6.2 异常定位

TODO

6.3 异常恢复

TODO

6.4 热拔插支持

TODO

7. 总结

综上,对于BSP开发人员来讲,梳理后,感觉不难吧,O(∩_∩)O哈哈~。技术还是那些技术,只不过换了个平台,换了一种实现方式。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐