有段时间有写书的想法,可是一直比较懒,到现在也只写了一个提纲。
提纲也好,毕竟是原创,发出来吧。
第一章
SDL
System Description Language (SDL)
是AMI CORE8中引入的一种描述语言,SDL简单的说就是把BIOS代码中经常要改动的地方整理出来,单独放在SDL文件里面。这样要修改BIOS的时候,只需要改动SDL文件就可以了,不用去改动什么ASM,EQU,INC之类的文件。
所以,用SDL的目的是为了易于BIOS工程师更好的维护整个project
第一节
TOKEN
TOKEN在AMI CORE8中是非常重要的,拿到CRB BIOS Source code之后,其实一般改改TOKEN就能制作出一个能点亮主板的BIOS了(如果硬件没什么大问题的话)。
TOKEN可以OUTPUT到EQU或者MAK
因为有的情况是,根本没必要把某个文件或者Module编译进BIOS,用OUTPUT到MAK就可以实现这点。
这里谈点个人经验,AMI做BIOS已经做了很多年了,基本上OEM BIOS需要改什么AMI的工程师都是清楚的,所以很多时候我们OEM BIOS工程师不需要去跑到代码内部去改,改改token就可以了。
至于改哪个token,改为何值,这个其实可以去请教有经验的工程师。当然,自己也可以去摸索。
问别人,当然很快。不过,我们也知道有句话:“纸上得来终觉浅,绝知此事要躬行”。自己摸索其实很有趣,在摸索的过程中是可以学到很多知识的,所以建议初学者有空的话还是多多自己摸索。
很多东西,光是凭别人讲,你是体会不到的。
第二节
ELINK
用CORE8用久了,就会觉得ELINK是个非常好的设计。
CORE8的精髓就是模块化,面向对象思想的运用,虽然个人评价,这两点做得还不是很彻底,不过和Award比,强太多了。
Elink可以被override,也可以自己增加,删除。
假设有这样一种情况:CRB BIOS code中有某段代码我不需要执行,如果是Award代码,我必须到原始asm文件里面去改。但如果是CORE8,借用面向对象的术语,那段代码是可以被OEM Module重载的。
不过CRB BIOS Source里面也不是所有源文件都可以被重载,有些AMI认为不需要被OEM修改的,还有silicon Vendor的一些code,比如Intel的MRC,AMD的Agesa都不是按照CORE8的架构写的,无法被OEM Module重载。
注意:这里的重载应该不是严格意义上C++中的重载,实际意义应该类似于Override,只是一时半会我还找不到能用的中文词汇来表达这个意思。
Elink主函数代码找不到的情况有:
1.没有给源代码,即没有ASM文件,在OBJ文件
2.用了SkipElink宏,
SkipElink MACRO IdProc, Elink, Prolog:=
EXTERN Elink&End(DummyExternForOverrides):near
EXTERN Prolog&Elink&End(DummyExternForOverrides):near
Prolog&Elink PROC NEAR PUBLIC
%JIdProc IdProc
Jxx Elink&End
jmp Prolog&Elink&End
Prolog&Elink ENDP
ENDM
第三节
PCI DEVICE
这部分很简单,就是PCI routing的设定,对照硬件设定设好就OK
还有Option ROM,我就碰到过网卡灯闪烁有问题,后来通过升级Option ROM来解决的情况。
第四节
IO DEVICE
这里是legacy设备的一些设定,以前这些设备是在ISA总线上,现在则是LPC。
一般这些设备都是集成在Super I/O芯片里面。
第五节
其他
PATH
MAK的指定
第二章
SSP
ASD
BIOS SETUP脚本语言
ASD就是定义字符串用的
第三章
post asm
bb asm
smi asm
第四章
模块化
第五章
如何开发OEM BIOS
1.Disable CRB?
当然也可以Delete掉CRB
2.Config your own onboard device
a. GPIO Config
GPIO.EQU
放到Modulepart "OEM Board - BSP Files Modification"改
b. Super I/O Reg Mod
3.Microsoft OEM Activation1.0/2.0
4.OEM LOGO/OSB LOGO
5.Intel MRC modification
6.For your custom modify
ITE8718的PECI功能打开
TOKEN
Name = "SIO_Secondary_Floppy"
Value = "0"
Help = "On:/EC register Index 0Ah bit 6 must be 0 for secondary floppy/Off:/External Thermal Sensor Host Selection"
TokenType = Boolean
TargetEQU = Yes
TargetMAK = Yes
End
TOKEN
Name = "SIO_ITE8718_Pin55"
Value = "2"
Help = "External Thermal Sensor Host Selection:/0:AMDSI/1:SST Slave Device/2:PECI/3:SST Host"
TokenType = Integer
TargetEQU = Yes
TargetMAK = Yes
End
ITE8720与此类似。
Intel Desktop CPU从PECI给出的温度值是一个相对值,是相对于TCC的一个值,如果从PECI读出的值为零,说明CPU温度到达TCC,如果读出的值为1,则当前温度是TCC-1,以此类推……
在此,顺便提一下Intel Mobile CPU,Mobile CPU的TCC换了一个名字,叫Tjmax,而且Tjmax可以通过读CPU MSR读出来(Desktop CPU的TCC是不能通过读MSR读出的,ATOM,包括专供笔记本的ATOM N270,也是如此),Merom核心的CPU,Tjmax为85或者100,Penryn核心的则为90或者105。
AMI ITE8718模块的代码是做了直接在BIOS SETUP显示温度值的功能的,但如果是显示从PECI读取的CPU温度值(从PECI读取的温度值只能对应到TMPIN3),会显示负数,比如-50度之类,这时会产生一个问题,CPU的FAN SPEED CONTROLL(FSC)怎么办?
AMI也在BIOS SETUP里面做了设置FSC相关参数的功能,但那些选项无法输入负数。这个问题很好解决,我们可以直接在BIOS代码里面设定相关Register,再把BIOS SETUP相关选项隐藏起来。
按照Intel推荐做法,起转温度=Tcontrol-10,起转PWM为20%,即128*20%=25.6取整为26,至于斜率Slope,按照Intel的要球,要在Tcontrol时风扇转速达到最大,则很容易算出Slope=10PWM/C
Tcontrol的绝对值(offset)可以直接从CPU MSR读出来,于是,代码就很好写了,只要在AMI的那些设置FSC Register的代码之后,自己重设一下相关Register即可。
Sample code:
IF MKF_MRM_FAMILY
IF MKF_P4_PERFORM
mov ecx, 01A2h ;MSR_IA32_TEMP_TARGET_Offset
RDMSR ;TControl Offset (IA32_TEMPERATURE[15:8])
neg ah ;Tcontrol = -Tcontrol Offset
sub ah, 10t ;Start Temp = Tcontrol - 10
mov al, 061h ;for Fan_CTL1 is index 61.
call SIOHHMWriteIO ;Set Temp limit of Start register(Tcontrol-10)
ENDIF
ENDIF