Hi API 基础学习 <一> DISP
(2011-03-09 14:50:51)
标签:
hi3716hhigohi3716chi3720it |
分类: 嵌入式Linux |
作者: Sam (甄峰)
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_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_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事件有如下几种:
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
高带宽数码内容保护(HDCP,High-Bandwidth Digital Content Protection),是由英特爾公司所發展,用以確保數位化的影像與聲音資料在通過DVI或HDMI介面傳送時不至於遭到非法拷貝。HDCP的規格受到多項專利權保護,任何人欲實作HDCP必須申請授權。
HDCP的授權管理是由英特爾的子公司「數位內容保護公司」(Digital Content Protection, LLC)負責。除了交付授權金之外,生產HDCP相容設備的廠商必須限制其產品功能,例如高清畫面(解析度超過480p者)在通過產品上不支援HDCP的介面播放時必須支援碟片需求將解析度降至480p,而DVD聲訊在通過不支援HDCP的介面時必須被強制降到DAT等級的類比輸出。所有支援HDCP的影音播放設備都不得支援數位資料直接拷貝功能,並且必須「將其產品設計到足以打消大多數破解者的念頭」。
基本來說,欲播放有HDCP保護的影音內容如HD DVD、Blu-ray Disc、PlayStation 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的附加数据块数量。