最近在看关于键盘驱动的内核程序,关于键盘驱动内核写的十分复杂,分析起来的也是比较的困难.我在查阅的网上一些资料后才知道,其实键盘的控制就是四个寄存器的读写.也就是对键盘控制器的读写,而我们pc上使用的键盘控制器一般是i8042和8048.pc通过0x60和0x64这两个端口的读写来完成键盘的读写和控制.下面只是我的一个测试程序,将键盘上的三个指示灯以流水灯的形式依次点亮,不断的重复.当然关于键盘驱动还有很多的知识,不如键盘的译码过程等,我会继续分析并写出分析过程.
#include<linux/module.h>
#include<linux/init.h>
#include<linux/kd.h>
#include<asm/io.h>
#define BLINK_DELAY HZ/1
#define LED_A 0x07
struct timer_list my_timer;
unsigned char kled = 1;
static void my_timer_func(unsigned long ptr)
{
unsigned char readkey;
outb(0xED,0x60); //发出灯控制指令
readkey=inb(0x60); //读取其应答
if(readkey!=0xfa) goto outo; //判断应答是否正确
//键盘灯的控制是首先给i8042写入灯控制指令,标明要对灯进行设置,在读取其应答看其
//是否准备好,如准备好在向i8042写入控制数据.键盘上的三个灯由8为数据的低三位来
//控制,所以在后面的程序中我只取其低三位.
outb(kled,0x60); //设置灯
kled = (kled+1) & LED_A;
outo: printk("L:%02x F:%02x\n",kled,readkey);
my_timer.data = kled;
my_timer.expires = jiffies + BLINK_DELAY;
add_timer(&my_timer);
}
static int __init kbleds_init(void)
{
init_timer(&my_timer);
my_timer.function = my_timer_func;
my_timer.data = kled;
my_timer.expires = jiffies + BLINK_DELAY;
add_timer(&my_timer);
return 0;
}
static void __exit kbleds_cleanup(void)
{
del_timer(&my_timer);
}
module_init(kbleds_init);
module_exit(kbleds_cleanup);
MODULE_LICENSE("GPL");
来源:许振文博客 作者:许振文 2008-08-07 15:33:58.0 网友评论:0条 点击:196
最近在看关于键盘驱动的内核程序,关于键盘驱动内核写的十分复杂,分析起来的也是比较的困难.我在查阅的网上一些资料后才知道,其实键盘的控制就是四个寄存器的读写.
【发表评论 0条】

