发新话题
打印

键盘驱动之(一) 键盘灯控制

键盘驱动之(一) 键盘灯控制

最近在看关于键盘驱动的内核程序,关于键盘驱动内核写的十分复杂,分析起来的也是比较的困难.我在查阅的网上一些资料后才知道,其实键盘的控制就是四个寄存器的读写.也就是对键盘控制器的读写,而我们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");
Zhenwen Xu - Open and Free
Home Page:    http://dim4.cn
可以看看我整理的下一篇文章<键盘驱动之--- 硬件相关部分认识>
发新话题