⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 extint.c

📁 44B0+uclinux外接键盘驱动程序
💻 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 + -