📄 extint.c
字号:
#include <linux/delay.h>
#include "extint.h"
#include "44blib.h"
#include "44b.h"
#define KEY_VALUE_MASK 0x0f
/* keyboard control address */
volatile char *keyboard_base = (char *)0x06000000;//keyboard address
/*
extern void kuangjia();
extern void Lcd_Init();
extern void jiemian1();
extern void loom_init();
extern void entry();
*/
int keyvalue;
//int isfirst;
static int extint_read(struct file *filp,char *buf,size_t count,loff_t *f_pos)
{
int ret; //该值将作为函数的返回值
int keyvaluetemp=keyvalue;
if(count > 4)
count = 4;
ret = copy_to_user(buf, &keyvalue, count) ? -EFAULT : count;
keyvalue=0;
return keyvaluetemp;
}
static int extint_write(struct file *filp,char *buf,size_t count,loff_t *f_pos)
{
return 0;
}
static int extint_ioctl(struct inode *inode,struct file *filp,unsigned int cmd,unsigned long arg)
{
return 0;
}
static int extint_open(struct inode *inode,struct file *filp)
{
//DEBUG("open\n");
filp->f_op=&extint_fops;
printk("open success\n");
MOD_INC_USE_COUNT;
printk("<0>someone open extint!\n");
return 0;
}
static int extint_release(struct inode *inode,struct file *filp)
{
MOD_DEC_USE_COUNT;
printk("<0>the boy close extint\n");
return 0;
}
void extint_handle(int irq,void *dev_id,struct pt_regs *regs)
{
int K_VALUE,i;
rINTMSK=(0x01<<24);
keyvalue=key_read();
while(keyvalue==-1)
keyvalue=key_read();
printk("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@in extint keyvalue=%d\n\r",keyvalue);
mdelay(150);
//for(i=1500000;i>0;i--);
CLEAR_PEND_INT(EXTINT_IRQ);//外部中断1清中断挂起
rINTMSK=(0x00<<24);
}
void extint_init(void)
{
//(*(volatile unsigned int *)(0x01d20050))=0x01<<14;
//EXTINT=0x01<<14;
int ret;
int extint_irq=EXTINT_IRQ;
keyvalue=0;
//Lcd_Init();
//jiemian1();
//EXTINT=(0x01<<12); //外部中断1低电平触发--------------------------------------------------------------------
/*
pthread_t id;
int i,ret;
ret=pthread_creat(&id,NULL,(void *)loom,NULL);
if(ret!=0){
printk("!!!!!!!!!!!!!!!!!!!!!!!!!!!Creat pthread error! \n");
exit(1);
}
*/
printk("before register devise!!!!!!!!!!!!!!!!!!!!!@@@@@@@@@@@@@@@@@@**********\n");
ret=register_chrdev(EXTINT_MAJOR,"extint",&extint_fops);
printk("after register devise!!!!!!!!!!!!!!!!!!!!!@@@@@@@@@@@@@@@@@@**********\n");
if(ret<0)
{
printk("failed to register "EXTINT_NAME"\n");
}
printk("before clear pend say hiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii\n");
CLEAR_PEND_INT(EXTINT_IRQ);
printk("after clear pend say yeahhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh\n");
if(extint_irq>=0)
{
printk("before irq yipyipyipyipyipyipyipyipyiyipyipyip\n");
ret=request_irq(EXTINT_IRQ,extint_handle,SA_INTERRUPT,"extint",NULL);
printk("after irq yapyapyapyapyapyapyapyapyayapyapyap\n");
if(ret)
{
printk("extint:can get assigned irq %i\n",extint_irq);
}
else
{
printk("extint: request external interrupt %i\n",extint_irq);
INT_ENABLE(EXTINT_IRQ);
//SET_EXTINT(EXTINT_IRQ); 0605lb
}
}
}
int key_read()
{
int value;
char temp;
/* read line 1 */
temp = *(keyboard_base+0xfd);
/* not 0xF mean key down */
if(( temp & KEY_VALUE_MASK) != KEY_VALUE_MASK)
{
if( (temp&0x1) == 0 )
value = 4;
else if( (temp&0x2) == 0 )
value = 3;
else if( (temp&0x4) == 0 )
value = 2;
else if( (temp&0x8) == 0 )
value = 1;
while(( temp & KEY_VALUE_MASK) != KEY_VALUE_MASK) // release
temp = *(keyboard_base+0xfd);
return value;
}
/* read line 2 */
temp = *(keyboard_base+0xfb);
/* not 0xF mean key down */
if(( temp & KEY_VALUE_MASK) != KEY_VALUE_MASK)
{
if( (temp&0x1) == 0 )
value = 8;
else if( (temp&0x2) == 0 )
value = 7;
else if( (temp&0x4) == 0 )
value = 6;
else if( (temp&0x8) == 0 )
value = 5;
while(( temp & KEY_VALUE_MASK) != KEY_VALUE_MASK) // release
temp = *(keyboard_base+0xfb);
return value;
}
/* read line 3 */
temp = *(keyboard_base+0xf7);
/* not 0xF mean key down */
if(( temp & KEY_VALUE_MASK) != KEY_VALUE_MASK)
{
if( (temp&0x1) == 0 )
value = 0xc;
else if( (temp&0x2) == 0 )
value = 0xb;
else if( (temp&0x4) == 0 )
value = 0xa;
else if( (temp&0x8) == 0 )
value = 9;
while(( temp & KEY_VALUE_MASK) != KEY_VALUE_MASK) // release
temp = *(keyboard_base+0xf7);
return value;
}
/* read line 4 */
temp = *(keyboard_base+0xef);
/* not 0xF mean key down */
if(( temp & KEY_VALUE_MASK) != KEY_VALUE_MASK)
{
if( (temp&0x1) == 0 )
value = 0x10;
else if( (temp&0x2) == 0 )
value = 0xf;
else if( (temp&0x4) == 0 )
value = 0xe;
else if( (temp&0x8) == 0 )
value = 0xd;
while(( temp & KEY_VALUE_MASK) != KEY_VALUE_MASK) // release
temp = *(keyboard_base+0xef);
return value;
}
return -1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -