加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Hi API 基础学习 <一>  DISP

(2011-03-09 14:50:51)
标签:

hi3716h

higo

hi3716c

hi3720

it

分类: 嵌入式Linux

作者: Sam (甄峰)  sam_code@hotmail.com

 

Sam最近需要在海思平台上作开发。海思提供一套相当完备的SDK供开发者使用。在大方的方面,这套SDK有自己一套相当清晰的世界观。当然在具体开发中,也发现一些做的不特别完备和合理的地方。后面会说到。

 

HI SDK将API分为几类模块:平台通用,媒体处理,图形处理等。

 

下面分别谈各个模块中Sam用到的部分。

 

0. HiGO介绍:

HiGo 是海思提供的一个基本图形组件,它充分利用芯片的加速功能,为用户提供进行
界面开发所需要的基本功能,是一套高效率的图形组件。目前HiGo 主要应用在海思的
媒体芯片上。

 

0. 系统初始化:

HI_SYS_Init()

在使用所有模块之前,需要调用此系统初始化函数。

 

 

图形处理模块---->HIGO模块

1. 在图层上绘制并显示图形界面:

1.1: HiGo组件初始化:

HI_S32 HI_GO_Init(void)

使用HiGo功能必须先调用该接口,完成HiGo的初始化,主要包括gdev, decoder, winc, blit, surface模块 .

 

媒体处理模块----->Dsiplay 模块

1.2: DISP设置:

 

DISPLAY从某种意义来讲,更像是输出信号或者是信号显示方式

既然是显示方式,那么就可以作如下设置:

背景色,输出类型(TV or LCD),输出格式(720P/1080P).

叠加层zorder, 叠加层包括视频层,图形层等。

亮度,对比度,饱和度等。

DISPLAY有多种通道,高清和标清通道。 可以对它们分别进行不同的设置。

 

1.2.1: 初始化DISP模块:

HI_UNF_DISP_Init()

调用DISP模块其它接口前要求首先调用本接口

 

1.2.2: 设置DISP背景:

HI_S32 HI_UNF_DISP_SetBgColor(HI_UNF_DISP_E enDisp, const HI_UNF_DISP_BG_COLOR_S *pstBgColor)

参数1:enDisp。 DISP通道号。可以选择标清或者高清DISP通道。

参数2:pstBgColor。指出背景中,红,绿,蓝各自比例。

 

1.2.3: 设置DISP的接口类型 :

HI_S32 HI_UNF_DISP_SetIntfType(HI_UNF_DISP_E enDisp, HI_UNF_DISP_INTF_TYPE_E enIntfType)

参数1:enDisp:DISP通道号,可以选择标清或者高清DISP通道。

参数2:enIntfType。 选择输出类型 为TV或者LCD.

 

1.2.4: 设置输出制式:

HI_S32 HI_UNF_DISP_SetFormat(HI_UNF_DISP_E enDisp, HI_UNF_ENC_FMT_E enEncodingFormat)

只有当设置DISP接口类型为TV后,调用本接口才有意义。
对高清的DISP,只能设置高清的制式;对标清的DISP,只能设置标清的制式。

参数1:enDisp:DISP通道号,可以选择标清或者高清DISP通道

参数2:enEncodingFormat:设置DISP输出TV制式。如720P50, 1080i24等。

 

1.2.5: 设置DAC模式 :

HI_S32 HI_UNF_DISP_SetDacMode(const HI_UNF_DISP_INTERFACE_S *pstDacMode)

DAC属于所有DISP共有资源,在完成DISP的参数配置并打开后,再调用本接口完成DAC的配置。
共有6个DAC,推荐0,1,2用作高清输出,3,4,5用作标清输出。

这里可以设置scart(欧洲人喜欢用的扫把头),BT1120,BT656是否有输出

再设置6个DAC得设置。

 

1.2.6: 将两个DISP通道绑定 :

HI_S32 HI_UNF_DISP_Attach(HI_UNF_DISP_E enDstDisp, HI_UNF_DISP_E enSrcDisp)

目前支持将高清DISP绑定到标清DISP通道上,绑定在打开DISP通道前必须完成绑定操作。

参数1:enDstDisp: 目标DISP通道号

参数2:enSrcDisp:源DISP通道号

这样的话,高清显示的图像就会显示在标清输出上。

但标清DISP也许要设置和打开。

 

 

1.2.7: 打开指定DISP通道

HI_S32 HI_UNF_DISP_Open(HI_UNF_DISP_E enDisp)

在打开DISP之前,先完成对其的参数设置,避免画面闪烁

参数为DISP通道号。

 

1.2.8: 关闭指定DISP

HI_UNF_DISP_Close()

 

1.2.9: 将两个DISP通道解绑定

HI_S32 HI_UNF_DISP_Detach(HI_UNF_DISP_E enDstDisp, HI_UNF_DISP_E enSrcDisp)

只有在关闭两个DISP通道后才能进行解绑定操作。

 

1.2.10:去初始化DISP模块

HI_S32 HI_UNF_DISP_DeInit(HI_VOID)

在调用HI_UNF_DISP_Close接口关闭所有打开的DISP后调用本接口

 

媒体处理模块----->HDMI模块

1.3: HDMI设置:

1.3.1: HDMI初始化:

HI_S32 HI_UNF_HDMI_Init(const HI_UNF_HDMI_INIT_PARA_S *pstHdmiPara)

HDMI接口驱动软件初始化

 

必须在其他api之前先初始化一下

参数1:pstHdmiPara:

typedef struct hiHI_UNF_HDMI_INIT_PARA_S
{
    HI_UNF_HDMI_CallBack pfnHdmiEventCallback;    //事件回调函数
    HI_VOID             *pCallBackArgs;           // 回调函数参数私有数据
    HI_UNF_HDMI_FORCE_ACTION_E enForceMode;       //0:按标准协议模式1:强制HDMI模式,2:强制为DVI模式 
    HI_BOOL              bHDCPEnable;             //0:HDCP不激活,1:HDCP模式打开
} HI_UNF_HDMI_INIT_PARA_S;
HDCP讲解请看附录1。

 

1.3.2: 创建HDMI设备

HI_S32 HI_UNF_HDMI_Open(HI_UNF_HDMI_ID_E enHdmi)

参数1:enHdmi: 要打开的HDMI设备 . 即HDMI号。

 

1.3.3: 查询HDMI接口当前属性

HI_S32 HI_UNF_HDMI_GetAttr(HI_UNF_HDMI_ID_E enHdmi, HI_UNF_HDMI_ATTR_S *pstAttr)

参数1:enHdmi。 HDMI号。HDMI设备ID

参数2:pstAttr。HDMI接口属性

现在具体讲解属性:

typedef struct hiHI_UNF_HDMI_ATTR_S
{
 HI_BOOL                 bEnableHdmi;         ///是否强制HDMI,否则为DVI

    HI_BOOL                 bEnableVideo;        // 是否使能视频
    HI_UNF_ENC_FMT_E        enVideoFmt;          // 视频制式。 720P,1080i等
    
    HI_UNF_HDMI_VIDEO_MODE_E enVidOutMode;       //HDMI输出视频模式,VIDEO_MODE_YCBCR444,VIDEO_MODE_YCBCR422,VIDEO_MODE_RGB444
    HI_UNF_HDMI_DEEP_COLOR_E enDeepColorMode;    // DeepColor输出模式
    HI_BOOL                 bxvYCCMode;          // xvYCC输出模式

    HI_BOOL                 bEnableAudio;        // 是否Enable音频 
    HI_UNF_SND_INTERFACE_E  enSoundIntf;         //HDMI音频来源, 建议HI_UNF_SND_INTERFACE_SPDIF
    HI_BOOL                 bIsMultiChannel;     //多声道还是立体声,0:立体声,1:多声道固定为8声道 
    HI_UNF_SAMPLE_RATE_E    enSampleRate;        //PCM音频采样率
    HI_U8                   u8DownSampleParm;    // PCM音频向下downsample采样率的参数
    
    HI_UNF_BIT_DEPTH_E      enBitDepth;         
    HI_U8                   u8I2SCtlVbit;       

    HI_BOOL                 bEnableAviInfoFrame;
    HI_BOOL                 bEnableAudInfoFrame;
    HI_BOOL                 bEnableSpdInfoFrame;
    HI_BOOL                 bEnableMpegInfoFrame;

    HI_BOOL                 bDebugFlag;         
} HI_UNF_HDMI_ATTR_S;

 

1.3.4: 设置HDMI接口当前属性

HI_S32 HI_UNF_HDMI_SetAttr(HI_UNF_HDMI_ID_E enHdmi, HI_UNF_HDMI_ATTR_S *pstAttr)

设置以上数据结构。

 

 

1.3.5:停止HDMI接口,下电

HI_S32 HI_UNF_HDMI_Stop(HI_UNF_HDMI_ID_E enHdmi)

 

1.3.6:HDMI事件处理程序:

HDMI事件有如下几种:

    HI_UNF_HDMI_EVENT_HOTPLUG = 0x10,       //HDMI热插入事件 (包括打开TV,插入HDMI线)
    HI_UNF_HDMI_EVENT_NO_PLUG,              //HDMI Cable没有连接 事件 (包括关闭TV,拔掉HDMI线等)
    HI_UNF_HDMI_EVENT_EDID_FAIL,            //HDMI EDID读取失败事件 
    HI_UNF_HDMI_EVENT_HDCP_FAIL,            //HDCP验证失败事件
    HI_UNF_HDMI_EVENT_HDCP_SUCCESS,         //HDCP验证成功
    HI_UNF_HDMI_EVENT_HDCP_USERSETTING,     //HDMI Reset

 

HDCP见附录1.

EDID见附录2.

在热插拔事件处理中,查询远端设备是否支持DISP设置的Fromat(720P,1080i等)

 

 

 

1.3.7: 查询获取HDMI Sink设备的能力集:

HI_S32 HI_UNF_HDMI_GetSinkCapability(HI_UNF_HDMI_ID_E enHdmi, HI_UNF_HDMI_SINK_CAPABILITY_S *pstSinkAttr)

得到终端设备的能力集。

 

这个函数非常有用,能够得到巨量信息。

如远端设备EDID是否为真实获取。

视频能力集合:如1080P_60,1080P_50,1080P_30,1080P_25,1080P_24, 1080i_60,1080i_50, 720P_60....

(Sam也是拿这个函数第一次知道了手头的电视机具体支持什么制式,呵呵)

音频能力集合,

厂商ID,

设备ID,

生产日期等。

 

 

 

 

 

 

 

 

 

 

 

 

 

附录1:HDCP

高带宽数码内容保护HDCPHigh-Bandwidth Digital Content Protection),是由英特爾公司所發展,用以確保數位化的影像聲音資料在通過DVIHDMI介面傳送時不至於遭到非法拷貝。HDCP的規格受到多項專利權保護,任何人欲實作HDCP必須申請授權

HDCP的授權管理是由英特爾子公司數位內容保護公司」(Digital Content Protection, LLC)負責。除了交付授權金之外,生產HDCP相容設備的廠商必須限制其產品功能,例如高清畫面(解析度超過480p者)在通過產品上不支援HDCP的介面播放時必須支援碟片需求將解析度降至480p,而DVD聲訊在通過不支援HDCP的介面時必須被強制降到DAT等級的類比輸出。所有支援HDCP的影音播放設備都不得支援數位資料直接拷貝功能,並且必須「將其產品設計到足以打消大多數破解者的念頭」。

基本來說,欲播放有HDCP保護的影音內容如HD DVDBlu-ray DiscPlayStation 3遊戲(透過HDMI輸出時),訊號來源(播放機電腦顯示卡)和显示器雙方都必须內建HDCP密钥晶片才能正常播放。若系统任何一者不配備此密匙晶片,影像質素有可能降低,甚至不能播放影像。現時某些顯示卡已內建HDCP晶片,有限度支持HDMI輸出。

 

 

附录2:

延伸顯示能力識別(Extended display identification data,簡稱EDID)是指螢幕解析度的資料,包括廠商名稱與序號,一般EDID存在於顯示器的PROM (programmable read-only memory) 或是 EEPROM內。一般如要讀取EDID都是透過I2C,slave address是0x50[1]。目前 HDMI 1.0 - 1.3c 使用 EDID 結構 1.3版。

 

EDID(Extended Display Identification DATA,即扩展显示识别数据), 最初是为PC显示器设置的优化显示格式而设计的规范,存储在显示器中专用的1Kb的EEROM存储器中(即EDID数据结构是128Bytes),数字电视HDMI接口,遵从并且扩展了此规范。

  同PC主机和显示器通过DDC数据线访问存储器中数据,以确定显示器的显示属性(如分辨率、纵横比等)信息一样,在数字电视上,也沿用HDMI接口的DDC数据线访问EDID存储器,以确定数字电视的相关显示属性,关键是128Byte是PC显示器的标准,已不能满足数字电视视频标准的要求,因此需要对数据结构进行扩展,由于EDID标准并没有相应的规范,按照EIA/CEA-861-B标准规范对EDID数据进行编程。(VESA已经有相关的规范出台, 新的标准也是配合了EIA/CEA-861-B标准规范而已, 且需付费才能获取)

HDMI接口在数字电视中的EDID数据结构,与PC显示器的最大区别是编程数据可以是128Byte的倍数,它不仅规定数字电视显示的格式,也规定数字视频信号和数字音频信号,基本的128Byte以外的数据都是附加数据,在基本数据的第127个字节定义EDID的附加数据块数量。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有