6.6 Quantum驱动器固件
Quantum驱动器盘体印刷标贴上有两行字,如图6-58所示。第一行包含驱动器属系码,第二行是固件版本号,配置页CP#4中也有同样的行,但两者并不完全相同。例如,配置页CP#4中记录的读取结果为“AIY.1312”,而盘体标贴的第二行是“1310”。注意,盘体标贴第二行的最后一个字符总是“0”,而不管配置页CP#4中保存的是什么。
图6-58 盘体标签
虽然通过PCB没有办法确定ROM的版本,但是版本不兼容的情况笔者只在AS属系和D740X-6L属系的驱动器中遇到过。
6.6.1 固件的结构
Quantum驱动器控制固件由两部分组成。主要初始化固件部分存储在与处理器和磁盘控制器集成在单一芯片中的ROM中,有些出厂测试的样品驱动器也可能装备外部串行ROM。固件的另一部分以一组模块的方式存储在磁盘固件区,这些模块除了代码,还包含一些数据,如缺陷表、S.M.A.R.T表等。
检查固件结构命令成功执行后将输出固件内容和设置报告,报告的开始部分是配置参数值,然后是一些配置页的通用信息,后跟部分配置页的详细信息,最后是组成固件区的模块信息。即使是功能正常的驱动器,也会出现一些模块校验和错误或读取错误。报告实例如下。
Configuration params. table : DisCache parameters : Prefetch enable : Yes Cache enable : Yes Recovery errors parameters : Automatic Write Reallocation Enabled : Yes Automatic Read Reallocation : Yes Read Continuous : No Enable Early Correction : No Disable Correction : No Number of Retries : 8 ECC Correction Span : 32 HDD parameters : Write Cache Enable : No Reallocate Uncorrectable Error Enables : Yes Configuration pages (Config Pages) # CP# Length, bytes Condition ------------------------------------- 0 0 1 OK 1 1 2 OK 2 2 16 OK 3 3 16 OK 4 4 8 OK 5 5 12 OK 6 6 32 OK 7 7 16 OK 8 8 1 OK 9 9 16 OK 10 10 140 OK 11 11 4 OK 12 12 1 OK 13 13 2 OK 14 14 6 OK 15 15 167 OK 16 16 2 OK 17 17 3090 OK 18 18 1742 OK 19 19 28 OK 20 20 1 OK 21 21 400 OK 22 22 1 OK 23 23 144 OK 24 24 258 OK 25 25 284 OK CP 02 Page about manufacturer QUANTUM CP 03 Model name page DSJ FB EX6.4A CP 04 Firmware version page A0A.0414 CP 05 Serial number page 276825233298 CP 07 Logical parameters page Cyl: 13328 Heads: 15 Sectors: 63 Detailed COM log : No CP 08 Physical heads number page Number of physical heads : 4 CP 10 Zone reallocation table page # Beg. c. SPT0 SPC ------------------------ 0 0 189 756 1 0 349 1396 2 770 345 1380 3 1540 339 1356 4 2310 333 1332 5 3080 327 1308 6 3850 324 1296 7 4620 310 1240 8 5390 298 1192 9 6160 291 1164 10 6930 280 1120 11 7700 270 1080 12 8470 254 1016 13 9240 240 960 14 10010 225 900 15 10780 208 832 Physical cylinders: 11550 Max LBA : 12594959 CP 11 Max LBA stopper page Max LBA: 12594960 (00C02F10h) CP 14 Heads control page Amount of heads : 4 Utilized heads : 0 1 2 3 Road Map page # ID Cyl Head Sec Length FamCod Rev Condition ---------------------------------------------------------- 1 0E -2 0 0 1 2B A0A OK -2 1 0 1 2B A0A OK -3 0 0 1 2B A0A OK -3 1 0 1 2B A0A OK 2 65 -2 0 1 1 2B A0A OK -2 1 1 1 2B A0A OK -3 0 1 1 2B A0A OK -3 1 1 1 2B A0A OK 3 06 -2 0 2 2 2B A0A OK -2 1 2 2 2B A0A OK -3 0 2 2 2B A0A OK -3 1 2 2 2B A0A OK 4 05 -2 0 4 1 2B A0A OK -2 1 4 1 2B A0A OK -3 0 4 1 2B A0A OK -3 1 4 1 2B A0A OK 5 61 -2 0 5 28 2B A0A OK -7 1 5 28 2B A0A OK -4 1 5 28 2B A0A OK -9 0 5 28 2B A0A OK 6 66 -2 0 33 5 2B A0A OK -7 1 33 5 2B A0A OK -4 1 33 5 2B A0A OK -9 0 33 5 2B A0A OK 7 60 -2 0 38 60 2B A0A OK -7 1 38 60 2B A0A OK -4 1 38 60 2B A0A OK -9 0 38 60 2B A0A OK 8 62 -2 0 98 6 2B A0A OK -7 1 98 6 2B A0A OK -4 1 98 6 2B A0A OK -9 0 98 6 2B A0A OK 9 07 -2 0 104 13 2B A0A OK -7 1 104 13 2B A0A OK -4 1 104 13 2B A0A OK -9 0 104 13 2B A0A OK 10 08 -2 0 117 13 2B A0A OK -7 1 117 13 2B A0A OK -4 1 117 13 2B A0A OK -9 0 117 13 2B A0A OK 11 09 -2 0 130 2 2B A0A OK -7 1 130 2 2B A0A OK -4 1 130 2 2B A0A OK -9 0 130 2 2B A0A OK 12 D7 -2 0 132 13 00 " Chk S.ERR -7 1 132 13 00 " Chk S.ERR -4 1 132 13 00 " Chk S.ERR -9 0 132 13 00 " Chk S.ERR 13 D9 -2 0 145 2 00 " Chk S.ERR -7 1 145 2 00 " Chk S.ERR -4 1 145 2 00 " Chk S.ERR -9 0 145 2 00 " Chk S.ERR 14 D3 -2 0 147 11 2B A0A OK -7 1 147 11 2B A0A OK -4 1 147 11 2B A0A OK -9 0 147 11 2B A0A OK 15 31 -2 0 158 16 2B A0A OK -7 1 158 16 2B A0A OK -4 1 158 16 2B A0A OK -9 0 158 16 2B A0A OK 16 33 -3 1 5 16 2B A0A OK -8 0 5 16 2B A0A OK -5 0 5 16 2B A0A OK -10 1 5 16 2B A0A OK 17 3E -3 1 21 5 2B A0A OK -8 0 21 5 2B A0A OK -5 0 21 5 2B A0A OK -10 1 21 5 2B A0A OK 18 34 -3 1 26 98 2B A0A OK -8 0 26 98 2B A0A OK -5 0 26 98 2B A0A OK -10 1 26 98 2B A0A OK 19 40 -3 1 124 8 2B A0A OK -8 0 124 8 2B A0A OK -5 0 124 8 2B A0A OK -10 1 124 8 2B A0A OK 20 36 -3 1 132 8 2B A0A OK -8 0 132 8 2B A0A OK -5 0 132 8 2B A0A OK -10 1 132 8 2B A0A OK 21 3F -3 1 140 8 2B A0A OK -8 0 140 8 2B A0A OK -5 0 140 8 2B A0A OK -10 1 140 8 2B A0A OK 22 3D -3 1 148 8 2B A0A OK -8 0 148 8 2B A0A OK -5 0 148 8 2B A0A OK -10 1 148 8 2B A0A OK 23 41 -3 1 156 5 2B A0A OK -8 0 156 5 2B A0A OK -5 0 156 5 2B A0A OK -10 1 156 5 2B A0A OK 24 42 -3 1 161 8 00 " Chk S.ERR -8 0 161 8 00 " Chk S.ERR -5 0 161 8 00 " Chk S.ERR -10 1 161 8 00 " Chk S.ERR 25 35 -3 1 169 4 2B A0A OK -8 0 169 4 2B A0A OK -5 0 169 4 2B A0A OK -10 1 169 4 2B A0A OK 26 37 -3 1 173 2 2B A0A OK -8 0 173 2 2B A0A OK -5 0 173 2 2B A0A OK -10 1 173 2 2B A0A OK 27 43 -3 1 175 1 2B A0A OK -8 0 175 1 2B A0A OK -5 0 175 1 2B A0A OK -10 1 175 1 2B A0A OK 28 21 -3 1 176 1 2B A0A OK -8 0 176 1 2B A0A OK -5 0 176 1 2B A0A OK -10 1 176 1 2B A0A OK 29 32 -4 0 5 6 2B A0A OK -9 1 5 6 2B A0A OK -6 1 5 6 2B A0A OK -11 0 5 6 2B A0A OK 30 5F -4 0 11 20 00 " Chk S.ERR -9 1 11 20 00 " Chk S.ERR -6 1 11 20 00 " Chk S.ERR -11 0 11 20 00 " Chk S.ERR 31 24 -4 0 31 32 2B A0A OK -9 1 31 32 2B A0A OK -6 1 31 32 2B A0A OK -11 0 31 32 2B A0A OK 32 25 -4 0 63 32 2B A0A OK -9 1 63 32 2B A0A OK -6 1 63 32 2B A0A OK -11 0 63 32 2B A0A OK 33 26 -4 0 95 32 2B A0A OK -9 1 95 32 2B A0A OK -6 1 95 32 2B A0A OK -11 0 95 32 2B A0A OK 34 27 -4 0 127 32 2B A0A OK -9 1 127 32 2B A0A OK -6 1 127 32 2B A0A OK -11 0 127 32 2B A0A OK 35 20 -4 0 159 19 2B A0A OK -9 1 159 19 2B A0A OK -6 1 159 19 2B A0A OK -11 0 159 19 2B A0A OK 36 22 -4 0 178 2 2B A0A OK -9 1 178 2 2B A0A OK -6 1 178 2 2B A0A OK -11 0 178 2 2B A0A OK 37 28 -5 1 5 32 2B A0A OK -10 0 5 32 2B A0A OK -7 0 5 32 2B A0A OK -2 1 5 32 2B A0A OK 38 30 -5 1 37 8 2B A0A OK -10 0 37 8 2B A0A OK -7 0 37 8 2B A0A OK -2 1 37 8 2B A0A OK 39 73 -5 1 45 1 2B A0A OK -10 0 45 1 2B A0A OK -7 0 45 1 2B A0A OK -2 1 45 1 2B A0A OK 40 71 -5 1 46 1 2B A0A OK -10 0 46 1 2B A0A OK -7 0 46 1 2B A0A OK -2 1 46 1 2B A0A OK 41 01 -5 1 47 85 2B A0A OK -10 0 47 85 2B A0A OK -7 0 47 85 2B A0A OK -2 1 47 85 2B A0A OK 42 00 -5 1 132 4 2B A0A OK -10 0 132 4 2B A0A OK -7 0 132 4 2B A0A OK -2 1 132 4 2B A0A OK 43 11 -5 1 136 8 2B A0A OK -10 0 136 8 2B A0A OK -7 0 136 8 2B A0A OK -2 1 136 8 2B A0A OK 44 12 -5 1 144 8 2B A0A OK -10 0 144 8 2B A0A OK -7 0 144 8 2B A0A OK -2 1 144 8 2B A0A OK 45 13 -5 1 152 8 2B A0A OK -10 0 152 8 2B A0A OK -7 0 152 8 2B A0A OK -2 1 152 8 2B A0A OK 46 14 -5 1 160 8 2B A0A OK -10 0 160 8 2B A0A OK -7 0 160 8 2B A0A OK -2 1 160 8 2B A0A OK 47 15 -5 1 168 8 2B A0A OK -10 0 168 8 2B A0A OK -7 0 168 8 2B A0A OK -2 1 168 8 2B A0A OK
模块报告格式见表6-6。
表6-6 模块报告格式
FamCod(Family code,属系码)可能的值如表6-7所示。
表6-7 属系码
Quantum驱动器运行必须的模块大致如下。
ID=0Eh:读出服务区的设置模块(服务区适配器)。
ID=65h:服务区缺陷表。
ID=06h:承载overlay。
ID=05h:包含数据模块。
ID=00h:包含数据模块。
ID=01h/11h/12h/13h/14h/15h/16h/17h:承载overlay。
ID=61h:译码表模块,包含隐含缺陷表。
ID=66h/62h:服务区缺陷扇区重定位模块。
ID=08h:全部配置页模块。
ID=09h:数据模块。
ID=7xh:S.M.A.R.T服务表模块。
ID=2xh/3xh/4xh:Self-Test程序,属于SELFSCAN模块,这些模块的功能一般不使用。
ID=0Eh/05h/08h/6xh:对数据安全至关重要,不能从其他驱动器复制。
6.6.2 固件的保存
固件保存命令包括添加固件到数据库、读配置页和读模块。
添加固件到资源数据库命令能够将服务区全部模块和配置页保存到资源文件中。对EL、CR和CX属系,资源文件与程序自带的早期版本兼容,但它们带有早期没有添加到数据库中的配置页。当把资源添加到数据库中时,最好指出驱动器的型号和固件版本,如“lct10 5GB A03.093A”。
读配置页命令用于读取驱动器CP配置页,读出的配置页保存在“QU xx_MOD”子目录下,“xx”是属系名称。读取CP配置页之前,屏幕上会显示可以读取的CP列表。按【Space】键选择需要读取的项,或者选择“SELECT ALL”选项以选择全部CP配置页。按下【Enter】键,选中的配置页就分别被读到各自的子目录下。如果目录中已经存在同名CP文件,程序不会进行提示,而是直接覆盖。
读模块命令用于读取驱动器的固件程序模块,读取过程与存放目录和读配置页的过程相同,如果模块不能读出,那么它所对应的文件的长度为0。
由于驱动器使用的是一次性编程ROM,所以不需要建立数据库保存ROM程序。
6.6.3 固件的转用
通过将先前保存的固件写入驱动器可以实现固件的转用。修复工具有两种转用固件的方法,分别是整体转用和独立模块转用。只有在驱动器大部分模块损坏时才有理由使用整体转用方法,但经常是如果适配数据模块损坏就不可能写入固件。当损坏模块较少时(例如ID=61h和ID=71h),只要从固件复本中写入相应模块就足够了。
执行从数据库提取固件命令并选择要写入的驱动器,所有模块和配置页将被写入驱动器固件区,写入过程按照写入之前从驱动器读取的驱动器模块的物理映射位置执行,如果由于某种原因造成没有输出映射或输出的映射不正确,那么前者将不能写入,而后者写入的位置会不正确,驱动器重启动时找不到它们。在写入时,无论是模块还是配置页,都没有机会选择写入的模块或配置页。
写配置页命令用于选择把配置页写入驱动器固件区或RAM中。执行此项操作前,屏幕上会显示“QU xx_MOD”子目录中全部可供写入的CP列表。用【Space】键选择需要的配置页,或者用“SELECT ALL”(选取全部)命令选择所有配置页,然后按下【Enter】键,就可以依据选择从“QU xx_MOD”子目录把所选配置页写入驱动器固件区或RAM中了。
写模块命令用于把模块写入固件区。在执行此项操作前,屏幕上会显示“QU xx_MOD”子目录中全部可供写入的程序模块列表,用【Space】键选择相应的模块,或者用“SELECT ALL”命令选择所有模块,然后按下【Enter】键,选择的模块就从“QU xx_MOD”子目录写入驱动器固件区了。
6.6.4 安全模式
Quantum驱动器主要控制将固件及其数据存储在驱动器盘片上,并在驱动器初始化时将它们加载到驱动器RAM中。当发生故障时(固件数据错误或模块不可读取),驱动器固件将不能启动,因而就不能访问磁盘表面(读或写)。这时,对任何ATA标准命令都将返回ABRT错误或错误的数据。
如果读取固件时出错,Quantum驱动器就自动进入保护模式(这与TM、ST、SE及更早属系需要设置跳线进入初始化安全模式不同)。这样的驱动器进入就绪状态后,可以通过加载LDR文件或使用热交换法来完成固件的初始化,从而进入可操作状态。
6.6.5 恢复固件数据
PC3000能够发现错误的固件功能。如果固件功能不正确,启动PC-3000AT后,驱动器将返回ABRT错误,即DSC、DRDY、ERR和ABRT灯亮,其余均灯不亮。
修复固件数据就是重写不正确(不能读出)的驱动器固件模块或其中不正确的数据。根据修复方法不同,驱动器模块可以再分成如下两类。
可以通过从其他驱动器写入修复的:包括可加载的代码overlay和与驱动器设置不相关的表,如包含S.M.A.R.T参数表的模块。
可以通过其内容生成修复的:包括缺陷表、译码表(有时组合在一个模块中)以及表面访问的适配数据表。
第一类模块的恢复方法非常简单,具体如下。
第1步 磁头离开启停区后,驱动器立即切换到安全模式,只要检测COM端口的输出信息,就能够确定是哪一个模块出错引起的问题。
第2步 通过“Load LDR file to drive RAM”命令将LDR文件加载到RAM,驱动器将发出类似重校准的声音,如果加载过程带错完成,那么很有可能是驱动器电路板故障或者1个或几个磁头的伺服域故障。
第3步 加载配置页CP#10,驱动器型号相同则效果较好。这一步是调整固件区每磁道扇区数所必需的。
第4步 检查固件数据结构,找出损坏的模块(checksum不正确或读取错误的模块)。只有1个复本不可读而其他复本可读且检验和正确的模块视为功能正常的模块。
第5步 从型号相同的驱动器写入正确的模块,以覆盖出错的模块。
注意:只有损坏的模块需要覆盖写入驱动器,其余正确的模块应保留不动。
有些模块不能使用上述方法进行处理,包括ID=0Eh模块、ID=65h模块、ID=08h模块和ID=61h模块。此外,如果将其他驱动器的ID=0Eh模块或ID=08h模块写入待修驱动器中,适配设置将被擦除,ID=0Eh模块或ID=08h模块也将被擦除,从而导致通过上述恢复机制将不能向固件区写入任何数据。
ID=65h模块是固件区缺陷表,而大多数常用模块中不会有隐藏的缺陷,因此从其他驱动器复制的成功概率非常高。
ID=08h模块包含所有的配置页,不可能通过写模块的方法进行写入操作,需要向固件区写入所有的CP配置页来进行恢复。
对译码表模块ID=61h,可以使用完整的ID=60h模块再生。再生时,缺陷列表能够输出并保存到一个*.qdt文件中,然后可以再使用输入缺陷表命令重写ID=61h模块。
注意:如果想保留工厂缺陷表,应该记住,对缺陷表的操作将自动清除工厂缺陷表。因此,在对缺陷表进行操作之前,应该输出ID=60h模块,或者直接把该模块保存到一个文件中,需要时再将其写回驱动器。
另外要注意:热交换操作可能导致转接器/前置放大器芯片失效。