Linux和qtopia下的矩阵键盘驱动程序(三)

2014-11-24 09:12:45 · 作者: · 浏览: 4
清除SRCPND寄存器中eint1 eint2 eint8相应位
SRCPND = 0x0000002A;
//使能中断
enable_irq(IRQ_EINT1);
enable_irq(IRQ_EINT3);
enable_irq(IRQ_EINT8);

}

/*----------------------------------------------------
* func: 键盘定时扫描程序,如果得到稳定键码,将键码存
* 入循环队列;如果没有,则延时20ms后继续扫描
* param:
* data: 无参数

* return:
*
------------------------------------------------------*/
static inline void kb_timer_handler(unsigned long data)
{
int x,y;
spin_lock_irq(&(kbdev.lock));
x = y = 0;


if(scan_keyboard(&x,&y) == KEY_DOWN)
{
// printk("snap_keyboard_code=%d, %d, %d, %d\n", snap_keyboard_code[0][1],snap_keyboard_code[1][1],snap_keyboard_code[2][1],snap_keyboard_code[3][1]);
kbdev.keyStatus =KEY_DOWN;
if(key_changed())
{
pre_keyboard_code = curr_keyboard_code;
save_key_to_queue(pre_keyboard_code);
//printk("KEY_DOWN:%d x=%d y =%d\n",timeCount,x,y);
//设置自动重复开始延时定时器
/*repeat_timer.expires = jiffies + REPEAT_START_DELAY;
add_timer(&repeat_timer);*/

}

timeCount=1;
memset(snap_keyboard_code,0,12*sizeof(u_short));
//curr_keyboard_code =0;

kb_timer.expires = jiffies + KB_TIMER_DELAY;
add_timer(&kb_timer);



}
else
{
//printk("snap_keyboard_code=%d, %d, %d, %d\n", snap_keyboard_code[3][0],snap_keyboard_code[3][1],snap_keyboard_code[3][2],snap_keyboard_code[3][3]);
kb_timer.expires = jiffies + KB_TIMER_DELAY;
add_timer(&kb_timer);

//printk("timeCount:%d\n",timeCount);

if (timeCount==TIME_OUT) //扫描5次后仍然没有得到稳定键值
{
//复位计数器
timeCount=1;
kbdev.keyStatus =KEY_UP;
//使能中断
enableIrq();
//关闭定时器
del_timer(&kb_timer);

del_timer(&repeat_timer);
//printk("enable irq \n\n\n");
curr_keyboard_code = 0;
pre_keyboard_code= 0 ;
memset(snap_keyboard_code,0,12*sizeof(u_short));
}
else
timeCount++;
}

spin_unlock_irq(&(kbdev.lock));

}

/*----------------------------------------------------
* func: 从循环队列中读取按键的键码

* param:


* return: 按键的键码
*
------------------------------------------------------*/
static inline int kbRead()
{
u_short keyvalue;

spin_lock_irq(&(kbdev.lock));

keyvalue = BUF_TAIL;

INCBUF(kbdev.tail );

spin_unlock_irq(&(tsdev.lock));

return keyvalue;
}

/*----------------------------------------------------
* func: 对应文件读的函数,如果循环队列中有键码,
则将键码拷贝到用户空间的buffer中
* param:
*

* return:
* 返回从循环队列中读取的键码的字节数
*
*
------------------------------------------------------*/

static ssize_t
S3C2440_kb_read(struct file *filp, char *buffer, size_t count, loff_t * ppos)
{
u_short keyvalue;
if(kbdev.head == kbdev.tail)
{

return 0;
}
else
{

keyvalue = kbRead();
count = sizeof(keyvalue);
/*将数据拷贝到用户空间*/
copy_to_user(buffer,&(keyvalue),count);
return count;
}


}

/*----------------------------------------------------
* func: 与打开文件对应的open函数,初始化全局变量和定
* 时器以及请求中断
* param:
*
*
* return:
*
------------------------------------------------------*/

static int S3C2440_kb_open(struct inode *inode, struct file *filp)
{

kbdev.keyStatus = KEY_UP;
kbdev.head=kbdev.tail = 0;
kbdev.lock = SPIN_LOCK_UNLOCKED;
repeat_lock = SPIN_LOCK_UNLOCKED;

output_giop(0);

//初始化定时器
init_timer(&kb_timer);
k