



在1.2节阐述信息处理方法和原则时,强调故障排查人员采用客观视角是整理现象的原则。另一方面,整理现象也是客观认知、故障梳理排查的保障。本节内容将用一系列的案例说明表象和本质的差距。
在包含计算机系统的电子产品中,有时故障表象与本质的差距非常大,主要原因是系统软硬件配合的复杂性。本节将讲解三个案例,案例2和案例4的故障的根本原因均与计算机系统中PCI外设初始化配置相关,而依据故障的直观表象,很难让人联想到故障的根本原因是系统启动时PCI外设初始化配置的问题。案例5的故障的根本原因是VGA标准接口的硬件故障,而故障表象是在操作系统启动后,支持双屏显示驱动(软件)后发生的异常。
读完本节内容之后,或许能理解笔者为何如此重视客观视角。
我们进一步解读案例2:在CPCI机箱和控制器应用场景中,系统上电启动2s左右,出现宕机重启;偶尔能够上电启动成功,故障现象不稳定。
现场技术支持工程师认为是电源功率不足。每位入局故障排查的工程师都有自己的先验知识,但是面对电子技术这个大平台,再丰富的经验都是沧海一粟,而且电子技术仍在不断演进。单纯使用理论知识和技术积淀不可能覆盖这个行业中不断涌现的新问题。知识是解决问题的基础条件之一,在不断更新自身知识的同时,还需要找到解决工程问题的思路和方法,而思路和方法是相对固定的。
在1.2节中,阐述了案例2的现象与“功率不足”这种假设的验证,说明了其假设的不合理性。此处进一步描述系统框架,并解释故障的根本原因。图1.3所示为该机箱和控制器系统的框架图。因为PCI总线是菊花链拓扑,透明桥的驱动能力有限,故系统的9~14槽需要第二级透明桥来扩展。
 
    图1.3 14槽CPCI背板总线架构
PCI透明桥是一种特殊的PCI设备,具有独立的配置空间,接收Type1型配置请求(相对应地,PCI Agent接收Type 0型配置请求)。在计算机系统启动过程中,BIOS负责系统初始化和引导加载操作系统功能,以某种体系结构计算机的启动流程为例,说明PCI总线外设初始化配置在启动过程中的位置:CPU核心(core)初始化→高速缓存(Cache)和内部高速总线的初始化→内存初始化→PCI总线外设初始化配置→加载启动操作系统。在上述启动流程中,CPU、内存、PCI总线的硬件初始化工作在系统整体启动过程中都是比较靠前的,例如在桌面个人计算机启动过程中,上述这些工作都是在显示器点亮之前完成的。
回到案例2的系统中,PCI总线树设备包括控制器部分芯片组和桥设备(系统未插入PCI外设卡)。如果桥设备的初始化出现异常,系统重新执行上电启动流程是常见的BIOS操作,即计算机系统中一张PCI或PCIe卡出现故障,或直接影响系统启动。也存在例外的情况,目前一些服务器或工控机的BIOS包含如下机制:在启动中可能检测到PCI/PCIe设备故障,尝试启动几次后可以剔除该故障节点,继续执行启动流程,这需要BIOS代码和部分硬件支持该功能。
通常,PCI外设与CPU之间的关系被称为是紧耦合的,因为PCI外设的初始化配置涉及向PCI外设分配(映射)内存空间等计算机底层操作,内存地址出现异常是非常严重的故障,势必引发计算机系统宕机。相应地,USB、以太网等通信设备与系统是松耦合的。简单来讲,插拔这些外设不会对系统启动造成影响。案例2的故障即是背板透明桥出现了初始化异常。
此处插入一部分关于CPCI机箱背板的知识,便于理解使用PCI透明桥扩展总线,以及案例中透明桥扣板与背板的机械结构。图1.4是一种标准的3U 8槽CPCI背板,背板的PCI总线是以“菊花链”拓扑连接。受限于PCI总线电气驱动性能的约束,一级PCI总线桥一般驱动5、6个PCI外设。
案例2所述的14槽的机箱背板则需要使用PCI透明桥进行扩展,受限于槽与槽之间的标准机械尺寸约束,则采用“透明桥”扣板与背板叠构的结构对PCI总线做扩展。
系统背板上的透明桥扣板与背板是分离的,采用高密度连接器与背板连接,扣板直接采用螺钉紧固。在多次的运输过程中,连接器出现松动,电气连接不可靠,信号传输受到影响,PCI总线的初始化过程中出现异常,因为计算机系统PCI外设的紧耦合性,导致系统重启。
 
    图1.4 标准的3U 8槽CPCI背板
不了解计算机启动流程的用户,有可能认为点亮计算机显示器为“启动”,而实际上点亮显示器之前,计算机的启动流程已经执行了很多代码。这就是表象与本质的距离。
案例2涉及PCI桥设备配置异常的情况,再列举一个类似案例2的故障。
客户反馈:在客户的应用适配现场,一张CPCI计算机卡的VGA显示功能出现故障,显示器屏幕图像完全错乱。
将该板卡寄回研发部门进行测试,发现启动正常,未出现客户所描述的图像错乱故障。研发人员针对此故障报告,特别检查了VGA接口相关的电路和信号,未发现异常。
板卡返回客户方使用,再次复现故障,试验查明:该控制器在应用过程中,只要机箱中插入任何一张标准PCI外设卡(设备),即出现显示故障问题。将PCI设备卡拔出,故障现象消失。
直观的现象是VGA显示功能异常,研发人员检查VGA接口电路和信号质量,没有发现异常。此时,不得不思考“图像显示故障”与“系统插入PCI外设卡”这两个事件的联系。
CPCI总线系统架构框图如图1.5所示,系统PCI总线拓扑如图1.6所示。固件工程师参与调试后发现了故障与系统插入PCI外设卡相关的原因:在BIOS启动过程中,当系统插入PCI外设板卡后,PCI显卡的基地址配置参数出现错误,这是导致显示故障的直接原因。鉴于计算机系统硬件与软件是密切联系的,在找到故障的根本原因之前,有时很难清晰划分硬件故障或软件故障,在计算机系统故障排查的过程中,软、硬件联调是常态。
 
    图1.5 CPCI总线系统架构框图
 
    图1.6 系统PCI总线拓扑
为了更好地理解PCI显卡基地址参数配置错误,下面讲解两个概念,一是与系统PCI设备扫描顺序相关的“深度优先”算法,用于理解PCI设备树扫描PCI外插卡与PCI显卡的先后顺序;二是PCI空间与PCI外设的基地址寄存器,案例4中出现配置错误的寄存器就是PCI显卡的基地址寄存器。
第一个概念是关于PCI设备树扫描的“深度优先”算法。在此,基于图1.6的总线拓扑描述该算法的流程。首先Host主桥扫描PCI总线0,优先处理该总线上的“桥设备”(PCI桥1),并标记PCI桥1设备(PCI桥是一种特殊的PCI设备)配置空间的3个寄存器。
(1)上游总线号(primary bus)寄存器,以图1.6为例,primary bus=0。
(2)下游总线号(secondary bus)寄存器,下游总线号,即按顺序secondary bus=1。
(3)该透明桥直接访问的下游最大总线号(subordinate bus)寄存器。因为在标记该寄存器时,系统需要继续扫描PCI总线1,此时不知道PCI总线1是否包含“桥”设备,暂时不知道下游能够访问的最大总线号,因此暂时记为subordinate bus=0xFF。
基于“深度优先”算法,在配置PCI桥1后,系统暂时不会处理PCI总线0下的其他设备,而继续深入PCI桥1的下游,对图1.6中的PCI总线1进行扫描,同时仍然优先寻找“桥设备”,若发现“桥设备”,执行类似PCI桥1的配置操作,并继续深入“桥设备”的下一级总线,以此类推。本案例中,PCI总线1不再包含“桥设备”,则认为PCI总线1不再扩展其他PCI总线,则PCI桥1相应的下级最大总线号subordinate bus=1。
然后,系统继续扫描PCI总线0,检查总线0是否包含除PCI桥1以外其他的PCI桥设备。本例中,PCI总线0仅包含1个PCI桥设备,则完成扫描。
 
    图1.7 PCI空间及PCI外设存储空间
第二个概念与PCI设备的地址空间相关,所有的PCI设备映射到共同的一段地址空间——PCI空间,以便PCI设备的统一编址。每个PCI设备分配一段地址,如图1.7所示为PCI空间及PCI外设存储空间。每个PCI外设的基地址保存在自身的基地址寄存器(Base Address Register,BAR)中,类似上述第一个概念中的3个总线号寄存器,基地址寄存器也是PCI外设配置空间寄存器中的一部分。
在本案例中,当系统PCI桥1的下游包含PCI外设时(PCI桥1下游插入PCI外设卡),系统扫描到PCI桥1的下游设备,固件工程师发现PCI总线0挂载的PCI外设显卡配置空间的基地址与实际显存空间(PCI外设空间映射至内存)的基地址不一致,显存内数据即为错误数据。
一般的PCI总线架构中,PCI标准外设接入透明桥下游,为何代码会出错?
检查重点在透明桥(PCI桥1)的下游链路。因为PCI桥1下游没有PCI外设加入到系统时,显卡的显示功能是正常的。同时PCI总线1的挂载设备又是优先扫描和配置的,在PCI空间中分配的地址段也是靠前的。
按照CPCI规范,连接器端总线信号均串接10Ω端接电阻,图1.8展示了一种标准3U CPCI控制器(宽100mm,高160mm)及端接电阻布局的放大图,从PCB布局看,这些信号的串接电阻非常密集,串联端接电阻中还包含一些信号的上拉电阻,如PCI总线中TRDY#(目标设备准备完毕信号)的10kΩ上拉电阻。悉心检查硬件发现(PCB板上存在焊接痕迹),设备调试中错误地将TRDY#信号上拉的10kΩ电阻焊接至透明桥下游总线数据/地址线AD17的端接电阻上(该电阻应为10Ω端接),导致信号传输错误。PCI透明桥1下的设备基地址出现错误,因为其分配的PCI空间的地址顺序靠前,而PCI总线0下挂载的设备(例如显卡)分配的地址空间顺序靠后,受到先进行地址分配设备的影响,显卡数据的存储地址出现错误。
 
    图1.8 一种标准3U CPCI控制器及端接电阻布局的放大图
相对应地,如果PCI桥1下游未挂载PCI外设,即不存在需要分配PCI空间的设备,PCI总线0下挂载的PCI外设,基地址配置与实际分配空间的基地址正常匹配。
复盘该故障排查的流程,系统VGA显示出现故障是非常直观的,吸引了故障排查人员的注意力,显示接口的电路即成为故障排查的重心,而忽视了调试过程中的其他现象。深层次地讲,管理或质量控制存在疏漏。同时,技术人员仅怀疑VGA模拟信号受到干扰,而并未找到干扰源。
“事后诸葛亮”式的说辞意义不大,一方面现象是计算机显示异常,一方面原因是主板上一个似乎与显示功能完全无关的电阻错误焊接,这两者的关联是不能通过先验知识所预测的。
案例4涉及计算机显示异常故障,在案例5中,再谈一个与计算机显示相关的案例。该板卡是基于COM-Express(下文简称COMe)计算机模块的集成控制器系统,即制作该模块的载板,并搭载标准COMe计算机模块的集成控制器产品。其中该控制器的显示接口包括VGA显示接口、DVI数字显示接口、数字液晶屏显示接口。在该控制器应用中发现,控制器单独连接数字液晶屏显示接口时,较多设备出现显示屏异常闪烁(5s左右闪烁一次)。
因为该设备应用在特殊场景下(不同于批量的消费类电子产品),一次设备生产仅有几十片,且故障现象呈现随机性,三种显示接口和故障相关性不清晰(缺乏现象整理)。
另外,接口电路的可靠性受到质疑,其中VGA和DVI接口采用的柔性电路板,通过柔性印制电路板(Flexible Printed Circuit,FPC)连接器与主板连接。因接口可靠性和信号质量问题,该柔性电路板经过多次调整、改版。
小样本试验且随机地复现故障的情况非常棘手。另外,项目技术交接、接口修改、生产周期等因素,使这个故障潜伏数月之久。直到某一天笔者翻看COMe载板的VGA接口电路,发现“ R 2 =75Ω”(COMe载板上一般设计该电阻为150Ω)。图1.9为该控制器的VGA接口中RGB(红、绿、蓝)信号的电路与阻抗控制示意图。
原理需要从计算机系统和显示器是如何感知交互讲起。将显示器的VGA接口和计算机连接,即显示出图像,计算机系统是如何感知自身已经通过VGA接口连接显示器了呢?可能有人说通过I 2 C通信接口进行信息交互。事实上,有的VGA接口包含I 2 C通信接口,有的不包含通信接口,仍然可以显示。实际上是通过计算机主机端感知RGB电流驱动电阻网络形成的电压信号实现的。
 
    图1.9 集成控制器VGA接口中RGB信号的电路及阻抗控制
另外,VGA接口的RGB颜色显示是电流信号驱动电阻网络输出电压实现的,RGB信号电压范围为0~0.714V,其中0.714V为满色。
图1.9中,计算机COMe模块中的R、G、B接口均设置一个150Ω的对地电阻,相应地,在COMe载板上的对应接口也设置一个150Ω的对地电阻,两者并联,即控制器整体的对地电阻为75Ω。显示器端包含一个75Ω的对地电阻。整体链路对地电阻并联后为37.5Ω。这也是有的布局布线(Layout)规范中要求阻抗约束 L 1 =37.5ohm、 L 2 =50ohm、 L 3 =75ohm的原因。
在故障单板中,为何 R 2 设置为75Ω。因为在最初的设计中,这个控制器使用了第三方的COMe模块进行系统集成,其模块内部的电路是不公开的,技术支持人员要求 R 2 设置为75Ω(或许技术支持人员疏忽了该问题)。
这个结果导致 R 1 与 R 2 的并联电阻偏小。在未连接VGA显示器(无 R 3 并联),而接入其他数字接口显示设备时,计算机的驱动程序支持双屏显示,偏小的并联电阻使计算机误以为接入了VGA显示器(事实上未连接设备),这时计算机就会不时地切换双屏显示,但又未发现VGA显示器,再切换回数字显示器……将 R 2 修改为150Ω后,不再出现屏幕闪烁故障。
在该故障排查周期中,因为不同模块略有差异,故障现象具有随机性;没有悉心安排试验和整理现象;技术人员没有检测到柔性电路板上VGA模拟信号受到干扰的证据,仅仅主观地转移了故障排查的重心。
本节的三个案例,都出现了故障排查相关人员被“先入为主”的意识干扰。读者会发现,按部就班地将故障现象列出,大多主观偏见经受不住逻辑推敲的考验。