在上一篇文章的介绍之下,在加上从网上搜寻一点相关资料,我想基本可做这个话题了.在下面的测试程序中,我使用共享中断的方式来读取键盘的扫描码,并且做了一个简单的map来做扫描码和真实ASII键值之间的转换.
以下是测试程序:
#include<linux/module.h>
#include<linux/init.h>
#include<linux/interrupt.h>
#include<linux/kd.h>
#include<asm/io.h>
#define BLINK_DELAY HZ/1
#define LED_A 0x07
static unsigned char kdata=0;
static int mykirq=1;
static char *interface="xuxkey";
static unsigned char kled = 1;
static struct timer_list my_timer;
// ,ESC,1,2 ,3, 4, 5, 6 ,7 ,8 ,9 ,0 ,-, =
static unsigned char keymapto[] ={0,27,49,50,51,52,53,54,55,56,57,48,189,187,\
//BKSP,TAB,Q,W,E,R,T,Y,U,I,O, P,[, ],ENTER,CTRL,A,S,D ,F, G, H, J, K, L, ;, '
8,9,81,87,69,82,84,89,85,73,79,80,219,221,13,17,65,83,68,70,71,72,74,75,76,186,222,\
//`,SHIFT,\,Z, X,C,V ,B, N, M, , , ., /,SHITF,F1,F2, F3, F4, F5, F6 ,F7, F8, F9
192,16,220,90,88,67,86,66,78,77,188,192,191,16,112,113,114,115,116,117,118,119,120};
//上面是译码表,参考 Scan Code Set 1和键盘ASII值表定做.
static void keylet(unsigned long data);
static irqreturn_t keyrupt(int irq, void *dev_id, struct pt_regs *regs);
static irqreturn_t keyrupt(int irq, void *dev_id, struct pt_regs *regs)
{
unsigned char ōrkey=NULL;
keytaskl.data=irq;
//键值的获取是,首先要看其状态位,是否有数据来,即看状态寄存器的bit0,若为0则表示有数据.
//这里是从64端口读取.
//再从60端口读取数据.
ōrkey=inb(0x64);
if(orkey&0x01)
return -1;
ōrkey=inb(0x60);
if(orkey&0x80)
return 0;
if(orkey<64)
kdata=keymapto[orkey]; //进行译码
printk("oldkey:%02x keydata:%c\n",orkey,kdata);
return IRQ_NONE;
}
static int __init kbleds_init(void)
{
if (request_irq(mykirq,keyrupt,IRQF_SHARED,interface,&mykirq)) {
printk(KERN_ERR "myirqtest: cannot register IRQ %d\n", mykirq);
return -EIO;
}
printk("%s Request on IRQ %d success\n",interface,mykirq);
return 0;
}
static void __exit kbleds_cleanup(void)
{
free_irq(mykirq,&mykirq);
}
module_init(kbleds_init);
module_exit(kbleds_cleanup);
MODULE_LICENSE("GPL");
~
来源:许振文博客 作者:许振文 2008-08-07 15:08:22.0 网友评论:0条 点击:187
在上一篇文章的介绍之下,在加上从网上搜寻一点相关资料,我想基本可做这个话题了.在下面的测试程序中,我使用共享中断的方式来读取键盘的扫描码,并且做了一个简单的map来做扫描码和真实ASII键值之间的转换.
【发表评论 0条】

