DOS下刷写BIOS工具理解一点点
- 格式:doc
- 大小:26.00 KB
- 文档页数:4
刷写工具主要有三个大函数:
主函数main()
获得匹配参数的函数get_parameter()
屏幕绣字符函数show_page_box()
main()函数的功能:
1, 把要刷写的文件以每4K的大小先存入memoery中。
先在memoery里定义一块区域,一般是在4G空间的最后定义。
同时将二进制文件读到定义的和二进制文件一样大小的数组
了,将其和4G指针链接起来。
2,check chip_set
通过PCI读出南北桥的ID,判断进入相应芯片组的SPI的地址,
在此就可以找到SPI寄存器,读的是bus0,device0,function0,
偏移为0 的地方,在这里放的是8086xxxx。(之前C46 CPU温度读不
出来,刷写工具也刷不了,提示没有对应的芯片组,用ru工具查看,
发现北桥的ID变了,后来分析是ME被刷挂了,北桥的ID是ME读过
来的。CPU温度也是ME读过来的,应此风扇不转,EC抓不到CPU 的
温度。)
3,
3.1 pre-initializtion
disable SMI:为了防止刷写的时候被异常中断打断,如;刷写
的时候按键盘或按power butten关电,有可能会导致刷写错误,导
致开不了机或刷写紊乱,这里要把SMI disable了。
enable BIOS space writable:rom一般只让读,不让写,所以
要往rom里写东西,必须打开写使能。
3.2 register initialization
0x54(X80_ROM)和0x94(sst_ROM)这两个寄存器所放的命令在每一
个auto circle sequence作为第一条指令执行!
0x58(X80_ROM)和0x98(sst_ROM)放ROM的命令,后面的操作0x02
(X80_ROM)和0x91(sst_ROM)控制寄存器设定指针指向要执行的命
令和每次要传输的字节数!
3.3 read JEDEC ID to gain parameter
JEDEC ID放在地址0x00处,读出后与para.txt文件中做比较进行
匹配,读出对应rom的那一行参数。
3.4 check protected region
3.5 reg write test
3.6 clear ROM chip protected bits
因为要对ROM进行读写操作,必须把保护位清0。
4,开始bios数据的传输
擦4K空间----写-----校验,循环256次。在过程中,根据ROM
型号不同,CMD后写的字节数也不同,
如X80 一个CMD可以写256 BYTE ,但SPI的DATA缓冲区只有
64 BYTE,所以一个CMD 后写64 BYTE的数据。而SST25V080B 一个
CMD只能写2 BYTE的数据。 重点在SPI controller,把握每一位的
含义。
为了节省时间,刷写工具采用对比刷写,只刷不同的那块。先将
rom里的内容读出来,与4G内存里的文件做对比,相同的就过,不
用刷,不同的就刷。
5,校验
为了防止刷写有误,一般会将rom里的内容读出来和内存里了文
件对比,校验错误就说明刷写的时候没刷对,写进去的数据有误。
获得匹配参数的函数get_parameter()
Para文件有六个参数:
1. ROM的型号;先判断JEDEC ID,然后把匹配的六个参数存放在ram
里,在刷写时候会将板子上的rom型号绣出来。
2. JEDEC ID;这个参数是判断ROM的唯一参数,这个参数定了,别
的就可以从PARA文件里读到,JEDEC ID放在地址0x00处,刷写之
前首先要判断其JEDEC ID。
3. ROM SIZE;不同的rom size是不同的,在读参数文件会判断rom
size,没有匹配的就停止刷写。
4. BLOCK SIZE;rom文件是按照BLOCK SIZE的大小一块块刷的,现
在的刷写工具都是4K,每4K又64byte或者1byte一次次的刷写,
刷完一block,就进入下一个4k的刷写。
5. 擦除命令;不同rom 的厂商,擦除命令有时候不一样,因此根据
擦除命令要给预处理命令寄存器填相应的CMD。
6. 一次写的byte数;在PCH或ICH里,存放data的寄存器最多能
存64byte的data,可是每次刷写的byte数是由cmd决定的,
W25X80,program cmd 最大可以刷64byte,而SST的program cmd最
大只可以刷2byte data,应此在这里要做区分,从而在刷写的时候,
每次要刷的byte数在0x02寄存器填对。