EC 中的Keyboard Controller

简介

Keyboard Controller简称KBC,它是EC芯片中一个用于处理Keyboard、Mouse的模块,也可以说,它只是一个通道,因为最后处理数据的还是交给EC 8032处理器去处理。KBC只处理挂在EC PS/2接口上的设备,假如接了个usb键盘或鼠标,那可不关它的事。PS/2设备只有两种,即Keyboard和Mouse,即使像接的是触摸板,它实际上也是一个Mouse设备。

下面从几个方面来进一步认识KBC。

KBC通信过程

画了个简图,大致如下:

一个KBC设备开机后要正常工作,就需要对其进行初始化。初始化也就是Host对KBC下命令的过程:开机时,Host通过6064端口向KBC发送命令,EC(8032)收到后则通过PS/2接口向device做相应的处理。此过程在Code中写得很详细,如BIOS初始化keyboard,在\MdeModulePkg\Bus\Isa\Ps2KeyboardDxe\Ps2KbdCtrller.c文件中InitKeyboard这个函数,里边有很多初始化的命令,这里看下其中一个Command举个例子:

这里是发了一个自检(Self Test)的Command(0xAA)给KBC,KBC若返回0x55则自检成功;EC收到该命令后便会去扫描所有的PS/2 Channel,检测哪些Channel是可用的,然后返回0x55,code(ITE:\CORE\CORE_COMMON\CORE_PORT6064.C)如下:

0x60/0x64端口

KBC提供了一个可以让Host跟KBC进行通信的接口,即0x60/0x64 port。这两个port实际上是由一组Host端的寄存器和一组EC端的组成,定义见下图:

Host读写KBC的数据时,使用的Host Interface Registers ;EC读写KBC数据时,使用的是EC Interface Registers。如Host在KBDIR寄存器写了一个数据,EC端是从KBHIDIR寄存器读到的,而并不是读取KBDIR,它们都是相互独立使用的。

上面只有两个port,怎么对应到四个寄存器呢?关系如下:

0x60端口:Host对此端口写操作时,作为KBC Data Input Register;Host读取此端口时,作为KBC Data Output Register。

0x64端口:Host对此端口写操作时,作为KBC Command Register;Host读取此端口时,作为KBC Status Register。

Host和EC怎么知道它们之间互相写数据了呢?有两种情况。

 - Host向KBC接口写数据

当Host往60h或64h写数据时,KBSTR中的IBF bit 置1,如是写60h,A2 bit清0,写64h,A2 bit置1。EC 8032可根据IBF bit(KBHISR)是否置1或检测是否有INT24中断(前提是中断功能有启用)来判断是否有数据输入。当EC 8032从KBHIDIR读走数据时,IBF bit会被清0。

 - EC 8032向KBC接口写数据

EC 8032有两个寄存器可用来向Host写数据,分别是KBHIKDOR(Keyboard数据),KBHIMDOR(Mouse数据)。当EC 8032写数据时,KBSTR中的OBF bit置1,若有启用IRQ1中断,则会给Host产生一个IRQ1的中断;同理若是写Mouse数据,OBF也会置1,若有启用IRQ12中断,则会给Host产生一个IRQ12的中断。Host可根据KBSTR中IBF判断是否有数据,有的话便从KBDOR(Keyboard或Mouse数据)读走,IBF则被清0。

KBSTR定义如下:

KBC中的Command

KBC 设备支持很多种Command,一个command一般为一个byte,有的command还有接参数。Host发完一个command,EC一般都会有一个响应值,响应一个ACK或直接返回原来的command,表示发送的命令出错。下面列出所定义的Command,但并不是所有的KBC设备都会全部支持。

响应值也是有定义的:

版权声明:
作者:bin
链接:https://ay123.net/mystudy/752/
来源:爱影博客
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>