HDMI和DVI的HDCP握手问题分析及其解决方案精粹.doc
《HDMI和DVI的HDCP握手问题分析及其解决方案精粹.doc》由会员分享,可在线阅读,更多相关《HDMI和DVI的HDCP握手问题分析及其解决方案精粹.doc(10页珍藏版)》请在冰点文库上搜索。
HDMI和DVI的HDCP握手问题分析及其解决方案精粹
随着越来越多的1080p显示器、8通道192KHz音响系统和高清晰A/V源的步入市场,消费者正一致转向采用HDMI和DVI非压缩数字A/V接口。
为什么?
因为在许多情况下,这些接口是获得受保护内容并沿着长长的信号链维持原始图像品质的唯一手段。
但是,这种转变尚面临一些限制。
HDMI和DVI与一种高清晰内容保护(HDCP)系统共生于一体,有时侯它会让经授权消费者什么都看不到,面对的屏幕是空白、闪烁的视频或雪花点,当出现这种缺陷的时候,消费者就变成了“HDCP握手问题”的受害者。
在本文中,我们将回顾围绕这个难题的关键问题,并向你介绍一些规则和工具,它们有助于解决HDMI和DVI设计过程中面临的问题。
基础知识
HDMI和DVI两者都是HDCP接口。
在通往演示设备的路径上,当数据在HDCP发送器和HDCP接收器之间传输时,HDCP接口保护高价值的内容。
HDCP涉及超越本文范围的法律问题,所以,在你的设计最终定型之前,你应该咨询你们公司的法律部。
对于这个问题的讨论,我们把纷繁复杂的所有法律要求归结为三个基本规则:
1.当被告知要这么做的时候,HDCP接口加密高价值的内容。
在蓝光和HDDVD播放机中,不论内容图像约束标记(ICT标记)是否为真,内容都是被加密的。
一旦完成加密,该内容就被称为“HDCP内容”。
2.HDCP内容在抵达演示设备之前,必须处于加密状态。
在HDCP授权协议的ExhibitC中概要说明了唯一的例外。
ExhibitC放松了该规则对音频、临时缓冲、转发器解密/二次解密及演示设备处理,如缩放等情况的要求。
目前的HDCP授权协议假设采用有线的点对点的路由,所以,对于现在需要基于LAN或无线接口的联网A/V产品,如数字放大的扬声器和视频墙等等来说,要等待DCPLLC推出新的协议,才容许采用了诸如AES-128和AES-256这样的加密方法的HDCP内容在“专用接口”上传输。
3.HDCP接口容许未经保护的非HDCP内容不经加密地通过。
寻找问题所在
最近,通过对现有产品的调查显示,大多数HDCP问题都有简单的成因,但是,解决这样的问题并不总是轻而易举的。
如果你不具备检测根本成因所需要的专用工具的话,HDCP握手问题将非常令人困惑。
假设你拥有合适的工具,下面罗列了一些要回避的问题以及要遵循的指南:
HDCP发送器问题?
?
将对一切内容进行加密,而不论其是高价值的HDCP内容,还是未经保护的内容。
这些源端设备在非HDCP接收器上不会显示任何信息,即使被播放的材料是一份未经保护的家庭制作的DVD。
1.忽视接收端电源周期(从开机到关机构成一个电源周期)、热插拔或重新连接的源端产品。
这些源端产品通常需要消费者去断开并重新连接一跟电缆或电源周期设备以触发二次授权。
有时侯,一切都不能工作。
当把源端连接到转发器的时候,热插拔变得更为重要,因为接收端的所有的下行数据流变化都必须被告知源端的上行数据流。
要确保你的产品能够检测所有重要的HDCP接收设备的状态及电缆连接的变化。
此外,即使持续时间只有最小的100ms,也要确保你的产品能够检测所有的热插拔,并让你的源端及时对热插拔作出响应。
当检测到热插拔的时候,要立即中断现有的显示数据通道(DDC)任务并启动一次新的HDCP握手。
2.数据传输太快可能导致闪烁的视频。
当你的HDMI发送器驱动一个HDMI接收器的时候,要在改变信号时序的前后分别对所传输的音视频数据进行“MUTE(禁止发送)”和“UN-MUTE(容许发送)”处理。
在你解除MUTE之前,要容许HDMI接收器有时间检测MUTE并处理时序的变化。
DVI源端必须停止传输并在信号时序稳定且接收器已经有时间恢复之后才进行二次授权。
在大多数接收端中的HDCP电路需要稳定的时序以完全地发挥作用。
3.确信你的HDMIHDCP发送器能够检测和驱动一个DVIHDCP接收器。
要注意在Bcaps寄存器中的HDMI性能并在必要时把HDMI发送器切换到DVI模式。
此外,当你读取接收端的EDID时,要寻找HDMI供应商的专用数据模块(VSPD)。
如果你无法找到,要把你的HDMI发送器切换到DVI模式。
4.要支持转发器。
越来越多的消费者在他们的源端和演示产品之间插入A/V接收器(AVR)。
不幸的是,并不是所有的源端产品都支持转发器;对于那些不支持转发器的产品,如果插入转发器的话,就可能造成系统停止工作。
在这种情况下,人们常常会怪罪于无辜的转发器制造商。
5.不要把HDCP内容传输到非HDCP或无效的HDCP接收器。
在第一种情况下,你的消费者可能看到的是一片雪花点;在第二种情况下,你将损坏HDCP更新系统的性能。
6.不要传输未经解密的HDCP内容。
这会导致内容被盗,并引发潜在的法律问题。
HDCP接收器问题
1.如果你的接收端配备一台HDMIHDCP接收器,要确保它能够与DVIHDCP发送器互操作。
2.不要认为所有的HDMI发送器都支持HDCP。
要确保你的接收端能够配合不支持HDCP的HDMI发送器的工作。
3.要确保你的HDCPRi寄存器支持长时间和短时间的读取操作。
大多数源端都做长时间的读取操作,但是,你的接收端可能会遇到一种性能经调整的源端,因此,需要用短的时间来读取你的HDCPRi寄存器。
HDCP转发器问题
转发器可能是最难以设计的产品,这是因为目前难以找到一种完全符合HDCP要求的转发器。
符合要求的转发器是存在的,但是,我们通常所找到的转发器的符合性参差不齐,范围跨越“危险”到“近乎完美”。
存在最严重问题的转发器就是忘记对HDCP内容进行二次加密。
其它的转发器则是忘记把热插拔信息告知上游设备,这种行为可能导致信号的损失,特别是当在各种输入之间切换的时候。
因为源端设备不需要支持转发器,所以,目前市场上的大多数转发器都故意地把他们的转发器位错误和伪装设置为非输出演示设备。
那些宣称它们就是这样设置的转发器,有时却忘记把所有下游的BKSV传递给上游的设备,所以,它们不能核对系统的可更新性消息(SRM)。
此外,当条件有保证时,它们有时还忘记显示MAX_DEVS_EXCEEDED或MAX_CASCADE_EXCEEDED,结果是再次危及了系统的HDCP可更新性。
要设计一个转发器设置位为“真”的符合要求的转发器,就要确保你的设计是符合要求并且是鲁棒的。
为此,你必须进行严格的测试。
下面是要注意的一些其它问题:
1.对于存在多种格式切换的源端和热插拔生成的接收端的情况,要确保你的转发器工作正常。
2.不要向“隐性”接收器传输HDCP内容;所有下游BKSV都应该是对上游设备透明的。
3.不要向单独工作的非HDCP(或无效HDCP)接收器或与一个HDCP接收器并联的分支器传输HDCP内容。
4.不要对来自非HDCP源的非HDCP内容进行加密。
5.对于每一个转发器设置,都要重复一次电源打开和关闭的周期,并确信你的系统得到恢复。
6.在你的转发器从一个源端切换到另外一个源端(所用的时间不同)并返回之后,要确信HDCP得到了恢复。
7.要确信你的转发器检测到所有的热插拔动作把它告知上游的设备,即使该热插拔信号仅仅持续了几百毫秒。
8.当接收未加密和二次发送的HDCP内容时,要确信二次发送的HDCP内容被二次加密。
如果HDCP内容在另外一个接口上二次传输,要确保根据上述“基础知识”一节中的规则2用同样鲁棒的加密方法对二次传输进行保护。
例如,如果你要解密、扩展、压缩并通过一条LAN把受保护的内容发送到一台显示设备,那么,该内容要在这个过程的每一个步骤都加密。
9.当利用从下游EDID提取的数据来构建一个时序列表时,要确信你的列表足够大。
近来在CEA-861标准中的变化使接收端设备能够支持861标准中列出的所有时序。
通用的测试指南
当测试HDCP时,要首先测试最高的像素率格式(即1080p60)。
要确信在格式变化和热插拔之后恢复HDCP。
永远要记住:
符合性(compliance)不等于互操作性(interoperability)。
正如我们在转发器的情况下所看到的那样,符合性对互操作性有负作用。
我们所面临的挑战
从历史的角度看,大多HDCP握手问题都可以被追溯到缺失的基础架构。
对于任何新技术来说,经同等检查的测试设备和认证程序都是至关重要的。
不幸的是,在HDCP的情形下,这些都来得太迟。
因此,目前现场中的大多数产品都是不符合HDCP要求并存在互操作性问题。
将来的发展方向
QuantumData与其它业界公司一道努力以解决这个问题,其目标是实现符合性以及具备互操作能力的符合HDCP要求的设备。
去年,DCP发布了一个补充文件及符合性测试标准。
HDCP符合性目前依赖于自我控制,所以,只会提供信息,而不会颁发证书。
DCP已经建立了一个测试实验室,在那里可以获得HDCP许可证并利用一套真实的产品来测试互操作性。
AD9889EDID和HDCP控制器用户指南
本应用实例描述了AD9889EDID和HDCP控制器,旨在帮助系统设计师定义必需的系统软件功能,恰当地在使用AD9889HDMI发射器时集成EDID和HDCP处理程序。
AD9889的EDID和HDCP支持特性
AD9889的EDID和HDCP控制器执行四种主要功能,支持系统的EDID和HDCP处理操作。
这里概括了这些特性。
图1给出了方框图。
1.一旦检测出HotPlug,即从显示器读取EDID段0。
256字节的EDID程序段被储存在内部RAM中,可通过I2C读取,有自己的I2C地址。
EDID存储器的I2C从地址可在EDIDID寄存器内编程。
寄存器默认值是0x7E。
2.按要求读取附加的EDID程序段。
这些段被存储在与第一个程序段相同的位置。
因此,该控制器应该在初始化另一个EDID程序段下载之前存储第一个程序段。
3.实现HDCP发射器状态机,包含下行流转发器处理。
4.包含robust错误报告,向系统固件报告多种多样的错误情况。
图1
AD9889执行的启动时序
AD9889EDID和HDCP控制器是一种在AD9889硬件内实现的状态机。
下面列出的指令清单阐明了状态机执行EDID和HDCP操作的时序。
注意,在下面的序列中,术语“系统”总是指控制系统的软件,通过I2C端口负责配置AD9889。
术语“用户”指使用AD9889的产品终端用户。
0.AD9889HDCP控制器在HPD电平变高前保持在复零状态。
1.当HPD为高时,AD9889读取EDID程序段0,向系统发送EDIDReady中断。
一旦成功读取EDID,即设置EDIDReady标志(0xC5[4])。
2.当读EDID时,AD9889等待HDCPDesired位(0xAF[7])变为高电平。
3.系统软件评估EDID,通过设置适当的视频和音频模式来配置AD9889,然后设置HDCPDesired位为高电平(该位的状态也在0xC6[3]内反映出来)。
帧编码位(0xAF[4])应被设置为‘1’1。
在设定HDCPRequested位之后不应该改变HDMI/DVI位(0xAF[1])。
4.一旦HDCPRequested为高电平,AD9889即初始化HDCP系统。
接收机的BKSV在存在BKSV寄存器(0xBF至0xC3)内,BKSV标志被设定为(0x97[6])(产生一个中断)并且BKSV计数(0xC7[6:
0])被设为0。
BKSV标志也在0xC7[7]内反映出来。
5.系统必须对照撤消清单检查BKSV,如果不在撤消清单内,即清除BKSV标志-BKSVFlag(向0x97[6]写入‘1’)中断。
如果不正常,系统将向视频流内的用户报告,并且不发送受保护的内容。
撤消清单作为源媒体(比如DVD)的一部分提供。
6.一旦BKSV标志被清除,AD9889就开始进行HDCP加密,并检查接收机是否是转发器。
AD9889检查接收机的DDC寄存器位,该位显示其是否是转发器。
如果不是转发器,即完成HDCP初始化,AD9889开始HDCP管理。
HDCP加密的状态被通过读0xB8[6]进行验证。
如果接收机是转发器,AD9889必须完成HDCP转发器认证:
7.AD9889从下行流转发器(AD9889仅能一次处理13个)读取13KSVs。
8.AD9889发出一个BKSVFlag中断,带BKSV计数(可高达13)。
9.系统顾件从EDID存储器内读取BKSV,并对照撤消单进行检查。
注意,EDID和HDCP操作共享AD9889的内部存储器。
在HDCP初始化完成时重新读取EDID。
系统固件清除BKSV标志中断。
10.AD9889计算KSV的SHA-1散列(Hash)。
如果还有更多KSVs(有超过13个下行流设备),即回到第8步。
从每一次迭代(13KSVs的每一组)得到的所有SHA-1散列值在第11步完成对比后被相加。
11.AD9889将下行流SHA-1散列与内部散列进行对比,以校验KSV清单。
12.一旦所有KSVs被校验完毕,AD9889即开始HDCP控制,受保护的内容就能被发送出去。
图2.AD9889EDID和HDCP控制器功能图。
EDID和HDCP操作时序可用图2中的流程图来概括。
注意:
1.任何一个出现的HPD=0都将AD9889EDID/HDCP控制器置零。
2.如果BKSV被唤醒,系统将清楚HDCP请求标志,来启动重新认证。
3.圆圈:
指示功能由AD9889控制。
4.方框:
指示功能由系统软件控制。
HDCP管理
一旦认证完成,AD9889将控制正在进行的HDCP链路认证。
每128帧,即接收机上的Ri’,被按照发射机上的Ri进行校验。
Ri是视频发射和接收同步化验证值。
它通知用户,发射机和接收机同步。
故障将产生一个HDCP/EDID控制器错误中断,重新启动HDCP认证。
如果接收机支持HDCP1.1,AD9889将对照接收机上的Pj按每16帧来检查Pj’。
Pj是链路同步化验证值,由每16帧与第一个像素进行异或计算。
这也通知用户,发射机和接收机同步。
故障将产生一个HDCP/EDID控制器错误中断,并重新启动HDCP认证。
系统固件将定期检查“加密On”状态位(0xB8[6])的状态,而发送受保护的音频或视频来确保HDCP被启动。
这应该由不小于每两秒的频率来检查。
检查该位能保护免受用AD9889寄存器设置来击败HDCP的第三方干预。
在BKSV被唤醒的情况下,系统软件仍然需要定期尝试重新认证。
为了做到这一点,清除HDCP请求位,启动EDID中断,清除BKSV标志。
一旦AD9889达到状态1(0xC8[3:
0]=2),设置HDCP请求标志重为1。
这将允许AD9889尝试重新认证(从第12步过渡到第4步)。
处理BKSV标志中断
表I列出了AD9889HDCP控制器引擎产生的中断条件。
同时也列出了适当的系统软件响应和其它注释。
附加的HDCP控制
帧加密位(0xAF[4])
帧编码位能被用于临时中止HDCP加密,而保持HDCP同步化。
当该位被置于零时,加密中止。
将其设置回1将重新启动加密。
当取消使能时,“EncryptionOn”位(0xB8[6])变成低电平,报告该状态,而帧加密=0。
如果接收机支持该特性,则同步化检查继续进行。
AVMute位(0x45[7:
6])
AVMute可能被用于在TMDS时钟频率变化时(如果,例如,用户想要从480p变化到720p或从480p变化到480p,但重复2倍像素)保持HDCP同步化。
要使用AVMute功能:
1.将“SetAVMute”位(0x45[6])设为1,“ClearAVMute”位(0x45[7])设为0。
2.使能通用控制包GeneralControlPacket(0x40[7]设为1)。
3.等待发送至少15个视频域。
4.改变为新视频模式。
5.等待发送至少1个视频域。
6.将SetAVMute位设为0(0x45[6]),ClearAVMute位设为1(0x45[7])。
7.等待4个Vsyncs被发送。
8.将ClearAVMute位设为0(0x45[7])。
表I.HDCP中断条件
中断条件系统软件响应注释
如果BKSVCount(reg.0xC7[6:
0])等于0读BKSV寄存器(0xBFto0xC3),然后对照撤消清单检查
如果BKSVCount大于0从EDID存储器读取地址0的BKSV每一个BKSV有5个字节,因此你必须读5倍的BKSVCount字节
如果BKSV在撤消清单上人可能导致I2C错误,因此重置AD9889并重新启动HDCP(将HDCP请求置为1)
在校验BKSV后,系统应该清除BKSV标志中断,因此,AD9889能继续HDCP认证
状态寄存器
ThecurrentstateoftheHDCPcontrollercanbereadfrom
theHDCPControllerStateI2Cregister(0xC8[3:
0]).The
codesforthisregisterareshowninTableII.
HDCP控制器的当前状态能从HDCP控制器状态I2C寄存器(0xC8[3:
0])读取。
寄存器的代码显示在表II中。
表II.HCDP控制器状态
Reg0xC8[3:
0]HCDP控制器状态
0000复零(没有检测到热插拔HotPlug)
0001读EDID
0010闲置(等待HDCP请求)
0011初始化HDCP
0100HDCP使能
0101初始化HDCP转发器
错误报告
如果出现错误,AD9889将置位错误标志(0xC5[7]),引起中断。
然后HDCP控制器错误寄存器(0xC8[7:
4])就报告一个错误代码。
表III列出了可能的错误条件和相应的4位错误代码。
表III.错误代码定义
错误代码错误条件
0000没有错误
0001接收不良BKSV
0010Ri误匹配
0011Pj误匹配
0100I2C错误(通常是一个no-ack)
0101等待下行流转发器完成时间溢出
0110超出转发器最大级联数
0111KSV清单SHA-1散列校验失败
1000太多设备连接至转发器树
错误处理
在任何错误下,AD9889的HDCP引擎将自动重新启动认证过程。
只要
HDCP请求位保持高电平,HDCP引擎将持续重新认证HDCP链路。
系统不应将HDCP请求位设为低电平,因为HDCP错误可能因接收机没有使能或者未被选中而引起。
需指出的是,在双端口显示中,没有使能的端口也许不会认可HDCP请求,直到用户选择该输入端口为激活状态。
其它注释
?
系统软件在激活后应总是清除HDCP错误中断,因此后续错误将产生新中断。
?
错误代码总是显示最后一个错误,即使该错误中断已被清除。
换句话说,该错误代码只能通过上电复位清除,或者由新错误代码替代。
额外的EDID控制
EDID定义
扩展EDID(E-EDID)支持高达256个程序段。
一个程序段是EDID的256字节段,包含一或两个EDID模块。
一个正常的HDMI系统将只有两个EDID模块,因此只采用0段。
第一个EDID模块总是一个基本的EDID1.3结构;第二个EDID模块通常是针对HDMI系统定义的CEA861B模块。
EDIDTries寄存器(0xC9[3:
0])
HDCP/EDID控制器试图读取EDID的时间数量受到EDIDTries寄存器的限制。
一个EDID每次读取失败时,该值就减1。
该寄存器默认的起动值为3。
一旦EDIDTries寄存器为0,控制器将不会尝试读EDID,直到该寄存器设为0之外的值。
EDID段寄存器(0xC4)
如果有必要读一个不是0的段,系统软件将把EDID段寄存器设为期望的程序段,并等待EDIDReady标志返回到高电平。
这将产生一个中断。
EDID/HDCP共享存储器
EDID和HDCP控制器使用共享存储器空间。
在HDCP转发器初始化期间,EDID存储器被写满,EDIDReady标志变为低。
在初始化之后,EDID被重读,EDIDReady标志被置为1。
EDIDReady标志设为1将引起中断,如果该中断被使能。
如果产生不想要的中断,系统软件处理EDID之后,EDID中断应该被取消。
EDID存储器的I2C从地址能在EDIDID寄存器内被编程。
寄存器默认值为0x7E。
10