您的位置:首页 > 其它

EC程序的整体框架

2010-10-18 22:11 225 查看
一直以来,每当同学问我所从事的工作,我会说“我从事笔记本行业,主要负责EC这一块”,紧接着他们无一不例外的很迷糊的看着我“EC是什么东西?”。于是我只好不厌其烦的给它们介绍:EC是Embedded Controller的缩写,也就是嵌入式控制器的意思,它是笔记本里面挂在南桥下面的一个芯片,对应于台式机里面的super IO。主要负责给笔记本上下电、管理电池充放电、扫描键盘按键、处理Touchpad数据、实时获取CPU温度从而控制风扇转速、控制笔记本的部分LED灯等等。 于是他们会恍然大悟似的说“原来这些东西都是EC做的啊,我还以为是操作系统进行处理的呢”。恩,在没接触EC以前,我也以为这些东西微软都给搞掂了,并且以为BIOS不过就是用来显示开机LOGO以及设置一些参数的。BIOS、EC行业的确是很窄的行业,而且这两个英文缩写本身也不为人所知,虽然你的笔记本无时无刻不在跟它们打交道。那么就下来我就粗略的介绍一下EC这个东西,以便于您能更加了解自己的笔记本。当然如果您是一个EC同行的话,希望你能对我所述不正确的地方给予指正。由于我是技术人员,所以更多的是从技术的角度来分享自己的一点心得,希望对新入行的同行能有所帮助。

首先,从软件的角度来看EC。

工欲善其事,必先利其器。EC所使用的开发语言是C和汇编,由于汇编的可阅读性太差,不利于技术的推广,所以现在的EC厂商逐渐的抛弃了汇编,现在基本上是纯C语言。

开发工具为Keil C51或者AVC51。编译EC程序并不是使用Keil/AVC51的GUI界面,而是使用了他们自带的make.exe。因为使用makefile更加简洁高效,只要在命令行模式下输入一个make命令就可以编译链接几十个EC程序的源文件,还有一个原因是上游的EC厂商已经给搭建好了EC的框架,各个文件的依赖关系基本固定,EC程序员只是根据自己的需要修改部分文件,基本不会修改到makefile,所以这样就在一定程度上降低EC程序员的入门门槛。使用makefile编译链接后,最终将EC程序生成为一个二进制文件,然后将该bin文件烧录到EC的ROM里面,EC的内核8051就是从那个ROM里面抓取指令来执行。在执行EC代码之前,会先执行Keil C51的用户配置文件,用户配置文件是汇编代码,它的作用是根据硬件环境来清零RAM以及初始化堆栈,由于C语言的代码是放在栈中的,所以要要首先给C语言代码搭建好堆栈环境。

上面提到上游EC厂商已经搭建好了EC的整体框架,这个框架和EC的芯片设计是密切相关的。EC程序整体是在一个while循环之中,程序架构如下:

//EC框架---->

//main函数

void main()
{
/*
初始化硬件工作环境
*/
while(1) //从这条语句可以看出MCU的工作特点
{
if(外设需要服务)
{
外围设备的服务程序
}
}
}

//中断入口系列函数

void name interrupt n using 2 //8051中断只有两个优先级,这里全部采用优先级2
{
...
外设需要服务=1;
...
}


可以看出8051的中断都是单一功能的中断,因为这些中断都不需要寄存器AX来传递参数。

//<----

以上两组函数构成了EC的整体运行框架。

对于底层来说,中断是个很重要的概念,来看一下中断。

8051只能处理单一功能中断,而CPU则可以处理多功能的中断。对于多功能的中断,其函数原型是这样子的:

intn(REGISTER AX, REGISTER BX,...) //寄存器用来传递中断功能
{
switch(AH) //AH 代表功能号
{
case 0x0:
{
switch(AL)    //AL代表子功能号
{
case 0x0:
.
.
break;
case 0x1
.
.
break;
}
}
break;

case 0x1:
{
if(0==BX)
{
...
}
}
break;
case 0x3:
.
.
break;
}
}


有的中断不需要参数,其函数原型为:

intn(void)

{

...

}

这也就是单功能中断。

EC作为挂在南桥下面的一个设备,CPU会为它分配一个IO端口用于两者的交互。这个端口为0x62/0x66端口,。当然,由于EC内部集成了KBC(键盘控制器),CPU为KBC分配的端口为0x60/x64,所以二者也可以通过这个端口交互.端口Port也是底层编程中很重要的一个概念。简单介绍一下Port。

端口可以被认为是以输入输出线连接到总线的硬件连接口,端口可以是可以是可读写的(可以认为具有输入输出线)、只读的(可以认为只有输出线)、只写的(可以认为只有输入线)。在很多情形下,直接端口寻址会比中断方式访问要快很多。中断也可以被看作是在必要时以端口方式访问硬件设备的一种子程序,因而调用中断有些时候就是间接端口寻址。

端口是系统的资源之一。什么是资源?举个例子,对于我们人类来说,土地、水、矿产这些就称之为资源,它们是我们人类赖以生存的必要条件。同理,硬件资源就是硬件在系统中赖以存在的必要条件,像Memory空间、IO地址、中断等都是硬件资源,只有这些分配好了,硬件才能正常运行。

DOS下访问EC Space(EC用来存放数据的一个空间,有256bytes)的代码如下。

/*
Access EC Space in DOS
*/
#include <conio.h>
typedef unsigned char BYTE;
int main()
{
BYTE ECSpace;
BYTE value[256];
memset(value, 0, sizeof(value));
/*
ECSpace的范围是0~0xFF
*/
for(ECSpace=0; ECSpace<=0xFF; ECSpace++)
{
outp(0x66, ECSpace);  //把ECSpace输入到66口
value[ECSpace]=inp(0x62); //从62口获得1byte的数据
}
return 0;
}


以上所陈述的就是EC程序的整体框架。在后续的文章里面我会继续针对EC分享自己的一些心得。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: