• System Architecture系统架构
  1. EC功能:EC是notebook笔记本电脑(NB)的组成部分,将传统mainboard(主板MB)的keyboard controller(键盘控制器KBC)延伸扩展,并集成touchpad、keyboard为一体通过KBC控制,使的空间大幅度减小,更加方便用户携带。
  2. 笔记本电脑拥有别与台式的DC电池供电,因此电池充放以及用电效益就是需要特别考虑的问题,EC配合芯片组在不同工作状态下提供不同的策略以达到省电目的。另外在EC控制充放电以及检测电池状态也可以保护电池,保护电脑运行数据,延长电脑的使用寿命。EC可以控制高度集成的笔记本电脑散热噪音和功效的问题,根据热传感器反馈的CPU和GPU温度智能调节风扇转速。
  3. 常见的H/W架构:

现在笔记本硬件线路系统中EC架构主要分为两种:

老版本中BIOS会挂载到EC的X-BUS总线上,与EC CODE,keyboard,touchpad设备放在一起,通过LPC BUS总线连接南桥,而新版本回见BIOS挂载在南桥下通过SPI或者LPC总线连接,而EC CODE(EC F/W)则挂载在EC下面。

老版本设计比较简便,并且节省成本,适合早期性能不足的时候使用,而新版本在性能高的情况下不容易抢占总线导致卡死,可以提高性能,提升运行速率。简单来说:老版本成本少,新版本性能高。类似BIOS引导的UEFI和legacy的区别。

  1. EC与HOST主机通信方式

EC与南桥SB通过LPC总线相连接,因此EC主要通过LPC总线与HOST进行通信,同时EC会将SMI系统管理中断和SCI系统控制中断的引脚拉到南桥上,即EC也可以发送系统终端通知芯片组,芯片组再获取相关的EVENT事件。

  • LID
  1. LID意为盖子,是指笔记本的翻盖合盖过程,即为panel版开关的过程。在大部分笔记本电路上LID是通过翻盖的magnet switch IC磁开关芯片检测LID状态是open还是close H/W的,通常也会作为笔记本屏幕背光板的信号。
  2. LID OPEN信号与EC的GPIO pin连接,即为LID状态变化会使EC接收中断并发送SCI通知主机自行相应程序,通常第一次开机显示屏是开的,没有供电无法获取LID状态,此时会根据LID状态设定,在系统装载中也会更新LID状态
  3. LID close与LID open信号基本一致,区别在于状态相反,系统选项也可以自行设置合盖时执行的代码段:do nothing不执行,Standby待机,hibernate休眠.
  • Keyboard Introduction键盘介绍
  1. PC主板中有一颗专用i8042接口芯片处理键盘,集成在sb中,其控制keyboard工作过程,包括加电自检,键盘扫描、与芯片组沟通,而在笔记本中这部分主要由EC负责,EC中集成KBC模块类似于8042,其内置的键盘和触碰面板也是由ec控制,按照ps2协议工作,通过ec发送给主机。
  2. 键盘按下或者松开时产生扫描码scan code,其分为make code通码 和break code断码。scan code一共有三种代码:set1、set2、set3,ps接口默认set2,ec会将set2转为set1推送给主机。set1中只有一个字节,通断码的区别在最高位为0时为make code,反之则为break code。

A KEY

set1

set2

set3

make code

0x1E

0x1C

0x1C

break code

0x9E

0xf0,0x1c

0xf0,0x1c

  1. 键盘一般通过行列地址扫描获取其matrix address矩阵地址(物理地址)而后转为matrix value(矩阵值),判断值为功能键还是标准按键,然后转为set2在转为set1发送给主机,主机再发送给相应的driver和API。

矩阵→物理地址→矩阵值→字符set1→字符set2→主机

  1. hot key热键是通过ec fw进行处理:fn功能键没有scan code 但存在物理地址,因此ec可以通过检测矩阵地址的方式-后置一个或多个flag,再通过flag判断按下值的差异然后发送信号(如FN发送Q_EVENT),这样子主机根据按键来制定各种各样功能
  2. host2ec io port command命令
  3. 0x60数据端口,0x64命令端口,EC支持命令如下:

命令

注释

EDh

设置LED。Keyboard收到此命令后,一个LED设置会话开始。Keyboard首先回复一个ACK(FAh),然后等待从60h端口写入的LED设置字节,如果等到一个,则再次回复一个ACK,然后根据此字节设置LED。然后接着等待。。。直到等到一个非LED设置字节(高位被设置),此时LED设置会话结束。

EEh

诊断Echo。此命令纯粹为了检测Keyboard是否正常,如果正常,当Keyboard收到此命令后,将会回复一个EEh字节。

F0h

选择Scan code set。Keyboard系统共可能有3个Scan code set。当Keyboard收到此命令后,将回复一个ACK,然后等待一个来自于60h端口的Scan code set代码。系统必须在此命令之后发送给Keyboard一个Scan code set代码。当Keyboard收到此代码后,将再次回复一个ACK,然后将Scan code set设置为收到的Scan code set代码所要求的。

F2h

读取Keyboard ID。由于EC芯片后不仅仅能够接Keyboard。此命令是为了读取后所接的设备ID。设备ID为2个字节,Keyboard ID为83ABh。当键盘收到此命令后,会首先回复一个ACK,然后,将2字节的Keyboard ID一个一个回复回去。

F3h

设置Typematic Rate/Delay。当Keyboard收到此命令后,将回复一个ACK。然后等待来自于60h的设置字节。一旦收到,将回复一个ACK,然后将Keyboard Rate/Delay设置为相应的值。

F4h

清理键盘的Output Buffer。一旦Keyboard收到此命令,将会将Output buffer清空,然后回复一个ACK。然后继续接受Keyboard的击键。

F5h

设置默认状态(w/Disable)。一旦Keyboard收到此命令,将会将Keyboard完全初始化成默认状态。之前所有对它的设置都将失效——Output buffer被清空,Typematic Rate/Delay被设置成默认值。然后回复一个ACK,接着等待下一个命令。需要注意的是,这个命令被执行后,键盘的击键接受是禁止的。如果想让键盘接受击键输入,必须Enable Keyboard。

F6h

设置默认状态。和F5命令唯一不同的是,当此命令被执行之后,键盘的击键接收是允许的。

FEh

Resend。如果Keyboard收到此命令,则必须将刚才发送到Output Register中的数据重新发送一遍。当系统检测到一个来自于Keyboard的错误之后,可以使用自命令让Keyboard重新发送刚才发送的字节。

FFh

Reset Keyboard。如果Keyboard收到此命令,则首先回复一个ACK,然后启动自身的Reset程序,并进行自身基本正确性检测(BAT-Basic Assurance Test)。等这一切结束之后,将返回给系统一个单字节的结束码(AAh=Success, FCh=Failed),并将键盘的Scan code set设置为2。

20h

准备读取芯片的Command Byte;其行为是将当前Command Byte的内容放置于Output Register中,下一个从60H端口的读操作将会将其读取出来。

60h

准备写入EC芯片的Command Byte;下一个通过60h写入的字节将会被放入Command Byte。

A4h

测试一下键盘密码是否被设置;测试结果放置在Output Register,然后可以通过60h读取出来。测试结果可以有两种值:FAh=密码被设置;F1h=没有密码。

A5h

设置键盘密码。其结果被按照顺序通过60h端口一个一个被放置在Input Register中。密码的最后是一个空字节(内容为0)。

A6h

让密码生效。在发布这个命令之前,必须首先使用A5h命令设置密码。

AAh

自检。诊断结果放置在Output Register中,可以通过60h读取。55h=OK。

ADh

禁止键盘接口。Command Byte的bit-4被设置。当此命令被发布后,Keyboard将被禁止发送数据到Output Register。

AEh

打开键盘接口。Command Byte的bit-4被清除。当此命令被发布后,Keyboard将被允许发送数据到Output Register。

C0h

准备读取Input Port。Input Port的内容被放置于Output Register中,随后可以通过60h端口读取。

D0h

准备读取Outport端口。结果被放在Output Register中,随后通过60h端口读取出来。

D1h

准备写Output端口。随后通过60h端口写入的字节,会被放置在Output Port中。

D2h

准备写数据到Output Register中。随后通过60h写入到Input Register的字节会被放入到Output Register中,此功能被用来模拟来自于Keyboard发送的数据。如果中断被允许,则会触发一个中断。

  1. 命令代码如下:

void host2ec_send_cmd(char cmd)

{

#ifdef asm

__asm

{

in al,64h

test al,2

jz send_cmd

ret

send_cmd: mov bl,0ADh

out 64h,bl

}

#else

static int rxec = (*(base+0x64));

if(rxec & 0x2)

{

host2ec_send_cmd(cmd);

}

else

*(base+0x64)=cmd;

#endif

return P_OK;

}

char ec2host_read_key(char *rx)

{

#ifdef asm

__asm

{

in al,64h

test al,1

jnz read_key

ret

read_cmd: in al,60h

}

#else

static int rxec = (*(base+0x64));

if(rxec & 0x1)

{

*rx= (*(base+0x60));

}

else

ec2host_read_key(rx);

#endif

return *rx;

}

Status Register(状态寄存器)的状态位如下所述:

Bit7: PARITY-EVEN(P_E):从键盘获得的数据奇偶校验错误
Bit6: RCV-TMOUT(R_T): 接收超时,置1) M: c  i0 d* p- z& O' i* R2 v6 v
Bit5: TRANS_TMOUT(T_T): 发送超时,置14 Y' s! ]& O. L6 Q  K9 P
Bit4: KYBD_INH(K_I): 为1键盘没有被禁止。为0键盘被禁止。! C5 `1 f( M+ @% s1 ~2 O) U5 v
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

我所学到的EC-2(个人学习总结,不能保证正确,欢迎大佬指正)相关推荐

  1. 大年初七,发paper、学Python...分享一下你的学习计划吧~

    今天是大年初七,今天是人日,上天造物顺序一鸡二狗三羊...七人!快快恢复元气,努力工作! 欢迎参与今天的话题讨论:发paper.学Python...分享一下你的学习计划吧~ 欢迎留言,参与今天的话题讨 ...

  2. 学python需要多久-零基础学习python,要多久才可以学好并且找到工作?

    原标题:零基础学习python,要多久才可以学好并且找到工作? 零基础的你想学习python肯定很关注学习python的最短时间是多久,怎样才能快速学习python等问题,今天就为大家详细地回答一下这 ...

  3. 零基础学python看什么书-零基础学python推荐几本python学习的书籍

    原标题:零基础学python推荐几本python学习的书籍 无论是否已经学习了一些其他的编程语言,在开始学习Python时,都应该先从Python的基本概念学起,这样在之后的编程实战中就能尽量减少因为 ...

  4. 学python数学要好吗_学习Python数学英语基础重要吗?

    提到Python编程语言,大家就会想编程语言肯定会涉及到的就是代码,很多人看到那满屏的英文字母就头疼,觉得自己不会英语,肯定学不好Python,但是不会英语到底能不能够学习Python呢,下面小编给大 ...

  5. c语言自学技巧,轻松学C语言,教给你学习技巧

    C语言轻松学,在这里教给你几个C语言学习技巧,让你更加快速的学习C语言,快速掌握这些让你不再迷茫. 1.你要记住,不管是什么语言,他都是为应用服务的,这里的应用最重要的就是测试方面,这点你是必须要明确 ...

  6. python人工智能要学什么_为什么学人工智能首推Python 需要学习哪些知识

    原标题:为什么学人工智能首推Python 需要学习哪些知识 为何学人工智能首推Python?需要学习哪些知识?简单地讲,人工智能就是图像处理,数据处理,语言处理等多技术融合,在我们生活中经常可见.比如 ...

  7. 前端开始学java_[Java教程]开启前端学习之路

    [Java教程]开启前端学习之路 0 2014-06-10 17:00:06 前言 第一次在博客园写博客,写写自己开启前端学习之路.应该是受邢师兄的影响吧,不得不说邢师兄人很好,学习也很认真,师兄的前 ...

  8. 测试学开发——第一课:java学习路程

    测试学开发--第一课:java学习路程

  9. 家人不支持自己学计算机,家人不支持我学习,感觉父母对我好像是很无所谓的?...

    之前,一直觉得学习好了或许父母对自己的关注就会多一点,后来发现学习再好,结果还是一样的. 好像怎么都不能让父母再多关注自己一些,就很难过. 后来才发现,每个人爱人的方式不同.有的人觉得爱就是满足你的需 ...

  10. 新手学java 学哪方面_初学者学Java应从哪些方面学习?

    原标题:初学者学Java应从哪些方面学习? Java作为应用于网络的最好语言,前景无限看好.然而,就算用Java建造一个不是很烦琐的web应用,也不是件轻松的事情.那么,初学者学Java应从哪些方面学 ...

最新文章

  1. codeforces round 421 div2 补题 CF 820 A-E
  2. 动态规划与卫星任务规划
  3. Hdoj 1846.Brave Game 题解
  4. 快速入门 TensorFlow2 模型部署
  5. Hibernate(三) - hibernate 表操作-多对多配置
  6. c语言程序输出时有没有分号,问什么C程序里总是提示缺少分号;,而明明有分号?...
  7. 自己动手架设linux下Web服务器(图)6
  8. 网络监控工具--ntop
  9. python中json模块_Python json模块与jsonpath模块区别详解
  10. sp导出法线_SP导出贴图导Redshift渲染效果不同的问题
  11. [Windows Phone] 如何在 Windows Phone 应用程式制作市集搜寻
  12. HDU1869 六度分离【Dijkstra算法】
  13. messagedigest 图片加密_MessageDigest来实现数据加密
  14. Matlab 绘制 1931 CIE色品图 并标点
  15. iOS app 打包发布
  16. 普通索引 唯一索引 主键索引 组合索引 全文索引
  17. 使用activeMQ发送短信验证码
  18. AnyConnect Windows系统的使用教程
  19. 线性代数笔记3.3向量组的秩
  20. ESD静电保护二极管的优点有哪些?

热门文章

  1. [C语言]统计单词:输入一行字符(其中仅包含英文字母和空格),用函数编程统计其中有多少单词。假设单词之间以空格分开。
  2. 达人评测 机械革命Z3 Air怎么样
  3. [Office] 设置段落标题边框
  4. js  计算是今天多少周
  5. java使用freemarker实现word下载
  6. Unreal Engin_画廊制作笔记 _005灯光处理,平行光的设置
  7. 武汉大学1987级计算机专业,武汉大学信息管理学院
  8. word里画的流程图怎么全选_Word中绘制流程图的正确姿势,这招大多数人不知道!...
  9. 东辉创投放心用姓名存钱的利害,存款一切权归吗?
  10. OpenJ_Bailian - 2977 生理周期 【枚举】