我所知道的EC.doc
《我所知道的EC.doc》由会员分享,可在线阅读,更多相关《我所知道的EC.doc(65页珍藏版)》请在冰点文库上搜索。
![我所知道的EC.doc](https://file1.bingdoc.com/fileroot1/2023-4/29/11d5f37e-bf76-488e-a6b9-e35bd149f8be/11d5f37e-bf76-488e-a6b9-e35bd149f8be1.gif)
我所知道的EC====>owerSequence
1.What’sPowerSequence?
+w8f*m,\4K9Y0{4H3x
PowerSequence是指HWDevice上电的顺序,它的大致顺序如下:
/v+s#G&{:
Z'J4~,S3o
1)ALWAYS!
}P6m*[2h!
U,v%u2)SUS_ON3)DIMM_ON6h"W*^']0a4)RUN_ON-R#g9U:
p!
t(k5)VR_ON)Z3W(k2S'v8k/I,{'C
这基本上是NB工作需要的所有POWER。
插入AC或者DC后,机器内部的开启的电为ALWAYS电,主要用以保证EC的正常运行;系统正常工作进入os以后,所有的Power都开启。
完整的过程其实是这样的:
AC或者DC插入以后,ECReset开始跑code,用户按下PowerSwitch时,EC拉SUS_ON送给一颗POWERIC,+3VSUS,+5VSUS起来后,POWERIC回ECSUS_OK。
接下来EC发给南桥一个称为‘RSMRST#’的信号。
这时候南桥的部分功能开始初始化并等待开机信号。
这时候的南桥并没有打开全部电源,只有很少一部分的功能可用,比如供检测开机信号的PWRBTN#信号。
在用户按下Power键的时候,EC检测到一个中断,然后duplicate一个开机信号(PWRBTN#)给南桥,南桥收到PWRBTN#信号后依次拉高SLP_S5#,SLP_S4#,SLP_S3#信号,开启了所有的POWER,在V_CORE电起来后,IC会发送ALLSYSPWOK信号给EC这信号表明外围电源正常开启。
南桥会发出PCIRST#信号到PCI总线,于是总线上的设备都被初始化(包括北桥),然后CPURST#信号送出,HOST正式接手并开始工作。
/至此,上电时序完成。
4t-O&f%Q"bC7J
:
l/f,I9r@
2.WhyPowerSequence?
I.Whyneedsequence?
(个人猜测,欢迎指教J)
为什么需要PowerSequence呢?
没有PowerSequence直接把所有的电压都供上可以开机吗?
答案是YES。
直接上电开机是没有问题的,可是没有办法达成省电的功能;另外S3/S4,LongRun也会有问题。
系统進入待机的时候(S3),机器内部的电只有SUS&DIMM电,主要是提供DDR的电压,以保证RAM内部的资料不丢失(S3是将数据StoretoRam,在Resume之后OS从RAM中获得数据,所以DDR的电一定要留着),而S4和关机(S5)的电是一样的,都是Always电(当AC在的时候其实SUS电要留着,目的是加速Resume或者PowerOn的速度)。
0_-e)Q6\7OJ9m
II.S4和S5共用一个信号?
#M3H3M6v,F(A3_#S"]%G6y
做过EC的同志可能会发现,线路图上S4,S5的信号只会有一个。
根据我们的使用经验S4和S5有很大的差异。
原因其实是因为S4,S5都只有ALWAYS电,从EC的角度,根本没有必要区分S4,S5所以SB只有一个信号拉到EC。
.m;W0B:
q+{)我所知道的EC====>SystemArchitecture
1.EC功能概述
EC是NB独有的组成部分。
它将MB上面的keyboard、mouse集中于一体在,EC内部提供了KBC控制器统一控制它们,这样大大节省了空间实现了便携。
NB的另一个特点是它需要电池供电,这样省电是一个重要的问题。
EC配合chipset在S3、S4、S5分别供不同的电源策略以达到节省的目的,另外EC也会控制电池的冲放电的过程,检测电池电量用于决定是否待机or紧急关机
orWakeup等。
另外由于NB集成度高、空间受限,散热非常重要但同时还要兼顾噪音的问题,EC会通过thermalsensor获得当前的CPU和VGA温度,根据不同的温度自动调节风扇的转速。
这些都是EC提供的功能。
7T0F-D:
M1Y
2.常见HW架构b6l9`5l3D%Y;o
现在NBHW线路系统中EC的常见架构有两种,比较旧一点的案子会将BIOS和EC的code放在一起挂在EC的X-BUS下面。
而新一些的做法会将BIOS和EC分开;BIOS挂在SBLPC或者SPI下面而EC挂在EC的SPI下面。
如下图所示:
0A5R%c/g6c0l%R2^
那么为什么会有两种架构呢?
他们有什么区别呢?
听我慢慢道来Jzzz。
这其实是个多方原因导致的结果。
1.出于成本的考虑。
大家都知道现在NB的价格战是愈演愈烈,大家都在拼成本。
所以低端机种都在拼命的costdown.很明显第一种架构也就是图1左边的架构会省掉一颗IC的成本。
那么大家可能又会问既然这么economic为什么还要导入第二种架构呢?
2.出于性能的考虑“有所得就有所失”没有完美的方案,第一种架构存在一个致命得缺陷,就是BIOS和EC跑code时会抢总线,也就是说有可能某一段时间BIOS狂飙得时候,EC就卡住了,反之亦然。
于是就发现POST时间过长,S3、S4Resume时间过长的问题了。
于是乎第二种架构应运而生;所以在新机种以及那些高性能的game系列中就会采用这种架构。
(PS:
现在应该以第二种架构为主了)#Y+{(}1q:
r
3.EC如何与HOST通信\#d-[)s5y*C
由图1可以看出EC与SB通过LPC相连,所以EC与HOST端的通信主要是通过LPCBUS进行的,除此之外EC还会有SMI,SCI的pin拉到SB上也就是说EC也可以通过发SCI,SMI的中断通知Chipset,Chipset再从LPCBUS获得相关的EVENT(PS:
后续的会详细讨论这部分)。
LPCBUS通信的部分如下图所示:
"S"E6@$w'c(d9\&h"o*h
1U&hB1d9W9T(t&~0i!
y
总之EC是NB系统中最为底层的部件,只要有电EC就会工作,检测各种输入信息,同时它还负责提供powersequence和host通信等重要的工作。
(
我所知道的EC====>LID
1.What’slid?
Lid是盖子的意思,在NB上其实就是指Panel打开和关闭的过程。
不知道有没有人试过用磁石去碰NB的底边缘,试过就会发现一碰NB就会进S3、S4当然也可能什么动作都没有(取决于OS的配置)。
其实这部分是因为大多NB都是通过一颗magnetswitchIC控制lid。
Lid有两种状态Open和CloseHW的线路通常还会将它们用作背光的始能信号8q8{:
`;|(B8M
2.LidOpen
LidOpen就是通常上讲的开盖,HW会将这支信号拉到EC一根GPIOpin上,也就是说一旦Lid状态有变化EC这端就会收到中断,EC收到中断后会发SCI通知host,host再去做其他的动作。
可是通常第一次开机的时候Panel是打开的,NB并没有供电所以EC没法更新lid的状态,这时EC就会在进入S0的时候根据lid这根GPIO的状态(H&L)去更新lid的状态。
在OS装载的过程中会主动去callBIOS中的aslcode去更新Lid的状态。
3.LidClose4z2z9{"C3[(Q
LidClose指的是合盖,EC处理的过程和LidOpen基本一致,区别之处在于EC记录Lid的状态有变化。
另外在OS下有一个选项可以设置LidClose时OS可以进行的动作。
如下图所示
如上图1所示closelid可以选择的action有三种"y2F0u%Y+_,D$i9
1.Donothing
)n3V$S&W'cA;f1{.t'^
2.Standby]0d3P)I9m#P#?
*w(A+I"E
3.HibernatX;i)l!
i!
s!
K2y
这些功能是怎么实现的呢?
完整的流程如下图所示:
*d4}%T8{+{(
图2就是完整的工作过程,步骤5是猜的。
要知道真正的做法恐怕只有问了微软才知道J。
窗体顶端
我所知道的EC====>Keyboard-B-u(W$E0]%B#f8j
1.KeyboardIntroduction
Keyboard是PC架构中的一个重要组成部分。
在常见的PC系统中主板上都有一颗专用的8042接口芯片去处理(现在被集成进了SB中),8042控制keyboard的整个工作过程,包括加电自检键盘扫描码的缓冲以及与chipset沟通。
在NB上这部分工作都有EC负责,它有一个keyboardcontroller,它扮演8042相似的角色。
NB都有一个内置Keyboard,这个keyboard是由EC控制的。
Keyboard和touchpad都是EC内置的一个部分,它们按照ps2协议工作,最终的数据通过EC送给host。
常见的102key的键盘如下图1所示:
2.3\0Y8A4f.c6p1NScancodeandMake&Break1[)H.{:
`*S(D0R&v
-m1h-}5f8r#e
当键盘上有键被按下,键盘将产生扫描码(scancode),scancode有两种Makecode和Breakcode,也就是通常所说的通码和断码。
每一个按键都有一个唯一的Makecode和Breakcode。
当一个键被按下就会产生Makecode,松开时就会产生一个Breakcode。
Scancode一共有三套称之为set1、set2、set3,PS2接口键盘默认使用set2。
EC收到set2scancode以后会将它转化为set1送给host。
Set1的scancode中标准按键的ScancodeMakecode和Breakcode都只有一个字节,Makecode和BreakCode的差别就在最高位。
Makecode最高位为0,Breakcode最高位为1。
A的scancode如下图1所示:
Akey
Makecode
Breakcode
Set1
1Eh
$F"a+ax6}"@2T
9Eh
Set2
1Ch
F0h,1Ch
Set3
1Ch
F0h,1Ch
$g6D;U5K,T6]9R图2
3.HowDoesKeyboardWork?
Keyboard功能虽然比较简单,只是让用户可以输入一些字符而已,可是它的工作原理却不简单。
从一个键被按下到操作系统识别它并送给其他的driver或者AP,中间经历了很多道工序。
键盘是一种矩阵结构,每一个键都有一个行地址和列地址,用户按下键以后,EC获得该按键的matrixaddress,EC将该address转化为matrixvalue然后判断该键的类型是特殊功能键还是标准按键,然后采用不同的方法将matrixvalue转成Set2,最后在转成Set1value送给host,host收到就可以送给其它需要的程序了。
其完整的工作流程如下图3所示:
4.Customized-Q2|-?
6N.h!
x,s)S
HotKey
NB上有一些被称为HotKey(热键)的东东,比如用户可以按Fn+F4/F5调整亮度等。
这些是如何实现的呢?
既然keyboard部分是由ECFW处理,那定制这些特殊功能键就不是什么难事了。
Fn没有scancode但是它有matrixaddress所以EC收到该键按下后置一个flag,后续检测到F1-F12被按下后,EC发一个Q_EVENT(什么是Q_EVENT?
后续会详细描述J)给Host,Host就可以和EC通信了。
如此便可以定制出各种各样的功能了。
+k-e&z&N9G8}+n
%u9c/H)I5Y
5.6N,t*BK.S!
j4^IOPortCommand
Host通过60h,64h这两个ports和Keyboard进行通信,其中60h被称为数据端口,64h为命令端口。
Host对EC发命令是通过64hport实现的命令分别为:
Command
Description
EDh
设置LED。
Keyboard收到此命令后,一个LED设置会话开始。
Keyboard首先回复一个ACK(FAh),然后等待从60h端口写入的LED设置字节,如果等到一个,则再次回复一个ACK,然后根据此字节设置LED。
然后接着等待。
。
。
直到等到一个非LED设置字节(高位被设置),此时LED设置会话结束。
EEh
诊断Echo。
此命令纯粹为了检测Keyboard是否正常,如果正常,当Keyboard收到此命令后,将会回复一个EEh字节。
F0h
选择Scancodeset。
Keyboard系统共可能有3个Scancodeset。
当Keyboard收到此命令后,将回复一个ACK,然后等待一个来自于60h端口的Scancodeset代码。
系统必须在此命令之后发送给Keyboard一个Scancodeset代码。
当Keyboard收到此代码后,将再次回复一个ACK,然后将Scancodeset设置为收到的Scancodeset代码所要求的。
F2h
读取KeyboardID。
由于EC芯片后不仅仅能够接Keyboard。
此命令是为了读取后所接的设备ID。
设备ID为2个字节,KeyboardID为83ABh。
当键盘收到此命令后,会首先回复一个ACK,然后,将2字节的KeyboardID一个一个回复回去。
F3h
设置TypematicRate/Delay。
当Keyboard收到此命令后,将回复一个ACK。
然后等待来自于60h的设置字节。
一旦收到,将回复一个ACK,然后将KeyboardRate/Delay设置为相应的值。
/V%h7p3R'O!
C"}
F4h
清理键盘的OutputBuffer。
一旦Keyboard收到此命令,将会将Outputbuffer清空,然后回复一个ACK。
然后继续接受Keyboard的击键。
F5h
设置默认状态(w/Disable)。
一旦Keyboard收到此命令,将会将Keyboard完全初始化成默认状态。
之前所有对它的设置都将失效——Outputbuffer被清空,TypematicRate/Delay被设置成默认值。
然后回复一个ACK,接着等待下一个命令。
需要注意的是,这个命令被执行后,键盘的击键接受是禁止的。
如果想让键盘接受击键输入,必须EnableKeyboard。
F6h
设置默认状态。
和F5命令唯一不同的是,当此命令被执行之后,键盘的击键接收是允许的。
FEh
Resend。
如果Keyboard收到此命令,则必须将刚才发送到OutputRegister中的数据重新发送一遍。
当系统检测到一个来自于Keyboard的错误之后,可以使用自命令让Keyboard重新发送刚才发送的字节。
FFh
ResetKeyboard。
如果Keyboard收到此命令,则首先回复一个ACK,然后启动自身的Reset程序,并进行自身基本正确性检测(BAT-BasicAssuranceTest)。
等这一切结束之后,将返回给系统一个单字节的结束码(AAh=Success,FCh=Failed),并将键盘的Scancodeset设置为2。
20h
准备读取芯片的CommandByte;其行为是将当前CommandByte的内容放置于OutputRegister中,下一个从60H端口的读操作将会将其读取出来。
60h
准备写入EC芯片的CommandByte;下一个通过60h写入的字节将会被放入CommandByte。
A4h
测试一下键盘密码是否被设置;测试结果放置在OutputRegister,然后可以通过60h读取出来。
测试结果可以有两种值:
FAh=密码被设置;F1h=没有密码。
A5h
设置键盘密码。
其结果被按照顺序通过60h端口一个一个被放置在InputRegister中。
密码的最后是一个空字节(内容为0)。
A6h
让密码生效。
在发布这个命令之前,必须首先使用A5h命令设置密码。
AAh
自检。
诊断结果放置在OutputRegister中,可以通过60h读取。
55h=OK。
ADh
禁止键盘接口。
CommandByte的bit-4被设置。
当此命令被发布后,Keyboard将被禁止发送数据到OutputRegister。
AEh
打开键盘接口。
CommandByte的bit-4被清除。
当此命令被发布后,Keyboard将被允许发送数据到OutputRegister。
C0h
准备读取InputPort。
InputPort的内容被放置于OutputRegister中,随后可以通过60h端口读取。
D0h
准备读取Outport端口。
结果被放在OutputRegister中,随后通过60h端口读取出来。
D1h
准备写Output端口。
随后通过60h端口写入的字节,会被放置在OutputPort中。
D2h
准备写数据到OutputRegister中。
随后通过60h写入到InputRegister的字节会被放入到OutputRegister中,此功能被用来模拟来自于Keyboard发送的数据。
如果中断被允许,则会触发一个中断。
%Y8f1Q0X'O3c
.
上面的表格就是EC支持的全部的command。
那么如何向EC发一个命令呢?
在向端口60h,64h写任何信息之前,EC输入缓冲区必须为空。
读取64h获得状态,然后检查bit1,如果是0表示buffer为空可写,否则为满不能写入。
Example:
+H#P(U*Q-^9q/h2Yin2\8y5J5Q-P
al,64h
"P1l'H1F;o!
Y9l;]#e,K
test
al,2
*N$s5c5M'_/UR
jz(n1W2X1?
)TH$i9G.m;N
send_cmd
1X,L,{#p3h5Q2U(f'W/e
ret
send_cmd:
mov
bl,adh
3a$v3b7^/Ha0w0d8Q
out64h,bl
如何从EC端读取数据呢?
读取任何信息之前,必须检查控制器输出缓冲区状态,以确定可以读取一个字节。
读取64hbit0如果是1表示buffer为满可读,否则为空不能读取。
Example:
1k;]6h+s"A0c
in/U&o0Q.t"z#g3L
al,64h
4m/p1O;j(O
test"}/D)f2e,x8O"d
al,1
s6],\5M"y"g/A3L2Q.f
jnz
read_key_ready
9r4h#N5]7[$[;M)d!
P
ret
4e"z*X#U8V;Q\,t
read_key_ready:
!
C8F9]!
\:
a-L'~
in%P*Z$b9X1g#`+J
al,60h
(i7\4X&h:
v5_
StatusRegister(状态寄存器)的状态位如下所述:
Bit7:
PARITY-EVEN(P_E):
从键盘获得的数据奇偶校验错误
Bit6:
RCV-TMOUT(R_T):
接收超时,置1)M:
ci0d*p-z&O'i*R2v6v
Bit5:
TRANS_TMOUT(T_T):
发送超时,置14Y's!
]&O.L6QK9P
Bit4:
KYBD_INH(K_I):
为1键盘没有被禁止。
为0键盘被禁止。
!
C5`1f(M+@%s1~2O)U5v
Bit3:
CMD_DATA(C_D):
为1输入缓冲器中的内容为命令,0输入缓冲器中的内容为数据。
Bit2:
SYS_FLAG(S_F):
系统标志,加电启动置0,自检通过后置1
Bit1:
INPUT_BUF_FULL(I_B_F):
输入缓冲器满置1,i8042取走后置0'q'g/X4~G'F
BitO:
OUT_BUF_FULL(O_B_F):
输出缓冲器满置1,CPU读取后置0
6.Co-WorkWithUSBKeyboard
$I,E&\1D&j#a$f
大家可能会觉得Usbkeyboard好像和EC没什么关系,其实不然。
Usbkeyboard在Legacymode需要将数据送给EC,由EC在送给Host。
(借腹生子哈哈)。
完整的流程如图4所示:
当usbkeyboard有数据输入,BIOS将数据转化并通过D2command将数据送给EC,
EC通过IRQ1通知Host,Host再下来读取
我所知道的EC====>Battery
1.BatteryInformationw#c#g)[8X
探测Battery的信息是EC一个重要的工作,OS也要通过读取ECRAM中的内容获取电池电量、温度、电压、充、放电电流、Battery是否存在的信息。
那么EC如何获得这些信息呢?
Battery通常是一个smbusdevice所以它会接在EC的一组smbus上,而Battery的spec上会给出Battery的smbus的地址以及读取Battery信息相关的命令。
EC通过向smbus上送Battery的address,cmd然后就会取得相应的信息了。
2.BatteryCharge&DischargeAlgorithm
1)Charge
充电的过程是这样的,ACin的状态下Battery插入,这时EC会进入prechargemode进行小电流充电。
如果precharge时间过长(通常是指超过一个小时)EC就会停止充电并且认为Batterydead,送给host一个BatteryFail的Event。
在prechargemode如果充电电流增大到特定的数值后EC就会进入fastchargemode快速充电。
Battery充满后停止充电。
在这个过程中如果电池温度异常EC也会进行一些处理。
这就充电的简单过程。
2)Discharge
ACout&Batteryin这时Battery开始放电,在放电过程中如果电量小CriticalLow,系统处于S0,EC会发CriticalEvent给host,然后OS紧急关机。
系统处S3,EC将会唤醒OS。
如果电量小于BattLowLowled将会被点亮(BatteryLowPolicy会详述)。
另外放电温度也会被检测,如果温度过高将会做降频动作等。
~H.Y6f"G,O
3.LowLedPolicy
经常使用NB的话,大家可能会发现有一个led很有趣。
插入AC充电时会看到一个黄色的led被点亮,电池没电了会看到一