亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? scankbd.c

?? Ep9315 arm ep9315 按鍵掃描程序
?? C
字號:
#ifndef __KERNEL__
#define __KERNEL__
#endif

#ifndef MODULE
#define MODULE
#endif

#include<linux/config.h>
#include<linux/module.h>
#include<linux/moduleparam.h>
#include<linux/init.h>
#include <linux/input.h>

#include<linux/kernel.h>
#include<linux/types.h>

#include<linux/interrupt.h>

#include<asm/io.h>
#include<asm/arch/regmap.h>
#include<asm/arch/regs_syscon.h>


#define KEYREG_KEY1_MASK                        0x0000003F
#define KEYREG_KEY1_SHIFT                       0
#define KEYREG_KEY2_MASK                        0x00000Fc0
#define KEYREG_KEY2_SHIFT                       6

#define KEYREG_KEY1ROW_MASK                     0x00000007
#define KEYREG_KEY1ROW_SHIFT                    0
#define KEYREG_KEY1COL_MASK                     0x00000038
#define KEYREG_KEY1COL_SHIFT                    3

#define KEYREG_KEY2ROW_MASK                     0x000001c0
#define KEYREG_KEY2ROW_SHIFT                    6
#define KEYREG_KEY2COL_MASK                     0x00000E00
#define KEYREG_KEY2COL_SHIFT                    9

#define KEYREG_1KEY                             0x00001000
#define KEYREG_2KEYS                            0x00002000
#define KEYREG_INT                              0x00004000
#define KEYREG_K                                0x00008000

#define SCANINIT_DIS3KY                         0x00008000

MODULE_LICENSE("Dual BSD/GPL");

#define DEBUG
#define STANDARD_EP93XX_SCANKBD		//this is for standard scan kbd
//#define HNAC_EP93XX_SCANKBD

#define DOWN 	1
#define UP		0


#define EP93XX_SCAN_TABLE_SIZE			64
static unsigned int const Ep93xxScanCodeToVKeyTable[EP93XX_SCAN_TABLE_SIZE+1] =
{
	KEY_RESERVED,
	KEY_A,
	KEY_B,
	KEY_C,
	KEY_D,
	KEY_E,
	KEY_F,
	KEY_G,
	KEY_H,
	KEY_I,
	KEY_J,
	KEY_K,
	KEY_L,
	KEY_M,
	KEY_N
};


static struct input_dev ep93xxscankbd;
static unsigned char *name = "Cirrus Ep93xx Scan Keyboard Driver";


void report_key(unsigned int code, unsigned int down)
{
#ifdef DEBUG
	unsigned char string[2][5] ={"UP", "DOWN"};

	printk("keyvalue = %d, %s\n", code, string[down]);
#endif

	input_report_key(&ep93xxscankbd, Ep93xxScanCodeToVKeyTable[code], down);
	input_sync(&ep93xxscankbd);
}

irqreturn_t ep93xx_scan_kbd_irq( int irq, void *dev_id, struct pt_regs *regs)
{
	unsigned int uiCurrentKeyStat, uiKey1, uiKey2;
	static unsigned int uiLastKeyStat = 0, uiLastKey1 = 0, uiLastKey2 = 0;

	#ifdef DEBUG
		printk("Enter ep93xx_scan_kbd_irq_handler()\n");
	#endif
	
	uiCurrentKeyStat = inl(KEY_REG) &
			(KEYREG_KEY1COL_MASK | KEYREG_KEY1ROW_MASK |
			 KEYREG_KEY2COL_MASK | KEYREG_KEY2ROW_MASK |
			 KEYREG_1KEY | KEYREG_2KEYS);

#ifdef DEBUG
	if(uiCurrentKeyStat == uiLastKeyStat)
	{
		printk("ep93xx_scan_kbd: spurious interrupts, stat=0x%8X\n", uiCurrentKeyStat);
	}
	else
	{
		printk("ep93xx_scan_kbd: new interrupt, stat=0x%8X\n", uiCurrentKeyStat);
	}
#endif

	if(uiCurrentKeyStat & KEYREG_1KEY)
	{
		uiKey1 = ((uiCurrentKeyStat & (KEYREG_KEY1COL_MASK | KEYREG_KEY1ROW_MASK)) >> KEYREG_KEY1_SHIFT) + 1;
	}
	else
	{
		uiKey1 = 0;
	}
#ifdef DEBUG
		printk("key1 : %d\n", uiKey1);
#endif

	if(uiCurrentKeyStat & KEYREG_2KEYS)
	{
		uiKey2 = ((uiCurrentKeyStat & (KEYREG_KEY2COL_MASK | KEYREG_KEY2ROW_MASK)) >> KEYREG_KEY2_SHIFT) + 1;
	}
	else
	{
		uiKey2 = 0;
	}
#ifdef DEBUG
		printk("key2 : %d\n", uiKey2);
#endif

#ifdef HNAC_EP93XX_SCANKBD
	if(!(uiLastKeyStat & (KEYREG_1KEY | KEYREG_2KEYS)))
	{		//no key is pressed in last time
		if(uiCurrentKeyStat & KEYREG_1KEY)
		{		//
			report_key(uiKey1, DOWN);
		}

		uiLastKeyStat = uiCurrentKeyStat;
		uiLastKey1 = uiKey1;
	}
	else
	{		//have some keys are pressed in last time
		if(!(uiCurrentKeyStat & (KEYREG_1KEY | KEYREG_2KEYS)))
		{		//no key is pressed  this time
			if(uiLastKey1)
			{
				report_key(uiLastKey1, UP);
			}

			uiLastKeyStat = uiCurrentKeyStat;
		}
		else
		{		//have some keys are pressed this time
		}
	}
#endif		//#define HNAC_EP93XX_SCANKBD



#ifdef STANDARD_EP93XX_SCANKBD
	if(!(uiLastKeyStat & (KEYREG_1KEY | KEYREG_2KEYS)))
	{		//the last time, it is no key be pressed, this time, key1 and key2 are pressed
		if(uiKey1)
		{		//this time, the first key is pressed
			report_key(uiKey1, DOWN);
		}
		if(uiKey2)
		{		//this time, the first key is pressed
			report_key(uiKey2, DOWN);
		}
	}
	else if(uiLastKey1 == uiKey1)
	{		//this time' key1 is also equal to the last time's key1, it is still down
		if(uiKey2 != uiLastKey2)
		{		//this time's key2 is no the last time's, it's mean this time's key2 is changed
			if(uiLastKey2)
			{		//the last time, key2 is pressed, and now it is released
				report_key(uiLastKey2, UP);
			}
			if(uiKey2)
			{		//this time, a new key2 is pressed
				report_key(uiKey2, DOWN);
			}
		}
	}
	else if(uiKey1)
	{		//this time, key1 is no equal to the last time's, it's mean key1 is changed
		if(uiKey2 == uiLastKey1)
		{		//last time's key1 is this time's key2, it's said that this time's key1 is new key be pressed, and last time's key2 is maybe released
			if(uiLastKey2)
			{		//last time's key2 is released
				report_key(uiLastKey2, UP);
			}
				//this time's key1 is a new key be pressed
			report_key(uiKey1, DOWN);
		}
		else
		{		//the last time's key1 is released
				report_key(uiLastKey1, UP);

				if(uiKey1 == uiLastKey2)
				{		//this time's key1 is equal to the last time's key2, it's said this time's key2 is a new key be pressed
					if(uiKey2)
					{
						report_key(uiKey2, DOWN);
					}
				}
				else
				{		//this time's key1 is new key be pressed, and key2 meybe is new key????
					if(uiKey2 != uiLastKey2)
					{		//key1 and key2 are all new keys be pressed
						if(uiLastKey2)
						{
							report_key(uiLastKey2, UP);
						}

						if(uiKey2)
						{
							report_key(uiKey2, DOWN);
						}
					}

					report_key(uiKey1, DOWN);
				}
		}
	}
	else
	{		//this time's key1 and key2 are not vailable, so last time's key1 and key2 are released
		if(uiLastKey1)
		{
			report_key(uiLastKey1, UP);
		}

		if(uiLastKey2)
		{
			report_key(uiLastKey2, UP);
		}
	}

	uiLastKeyStat = uiCurrentKeyStat;
	uiLastKey1 = uiKey1;
	uiLastKey2 = uiKey2;
#endif			//#define STANDARD_EP93XX_SCANKBD

	#ifdef DEBUG
		printk("Leaving ep93xx_scan_kbd_irq_handler()\n\n\n\n");
	#endif

//	input_sync(&ep93xxscankbd);

	return IRQ_HANDLED;
}

static __init int ep93xx_scan_kb_init(void)
{
	unsigned long ulFlags;
	unsigned int uiTemp;
	int iFirstKey;
	int i;
	
	printk("%s\n", name);

	save_flags(ulFlags);
	cli();

	uiTemp = inl(SYSCON_DEVCFG);	
	uiTemp &= ~(SYSCON_DEVCFG_KEYS | SYSCON_DEVCFG_GONK);
	SysconSetLocked(SYSCON_DEVCFG, uiTemp);

	outl( (0x00FC00FA | SCANINIT_DIS3KY), SCANINIT );
	//TBD If too much capacitance on keyboard
	//outl( (0x00FC0020 | SCBACK | SCDIS3KEY), SCANINIT );
	uiTemp = inl(SYSCON_KTDIV) | SYSCON_KTDIV_KEN;
	SysconSetLocked(SYSCON_KTDIV, uiTemp);


	if (request_irq( IRQ_KEY, ep93xx_scan_kbd_irq, SA_INTERRUPT,
			 "ep93xx_scan_keyb", 0))
	{
		printk("EP93xx scan keyboard driver aborting"
				 " due to IRQ_KEY unavailable.\n");
		restore_flags(ulFlags);

		return -EBUSY;
	}
	else
	{
		printk("request_irq success\n");
	}

	iFirstKey = inl(KEY_REG);

	restore_flags(ulFlags);

	
	ep93xxscankbd.name = name;
	ep93xxscankbd.evbit[0] = BIT(EV_KEY);
	for(i=0; i<EP93XX_SCAN_TABLE_SIZE; i++){
		set_bit(Ep93xxScanCodeToVKeyTable[i], ep93xxscankbd.keybit);
		}

	input_register_device(&ep93xxscankbd);

#ifdef DEBUG
	printk("Leaving ep93xx_scan_kb_init()\n");
#endif

	return 0;
}


static __exit void ep93xx_scan_kb_cleanup(void)
{
#ifdef DEBUG
	printk("Enter ep93xx_scan_kb_cleanup()\n");
#endif

	free_irq(IRQ_KEY, 0);

#ifdef DEBUG
	printk("Leaving ep93xx_scan_kb_cleanup()\n");
#endif
}


module_init(ep93xx_scan_kb_init);
module_exit(ep93xx_scan_kb_cleanup);

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩三级视频在线看| 欧美国产精品一区二区三区| 亚洲bt欧美bt精品| 国产亚洲精品7777| 91福利资源站| 成人网在线播放| 亚洲6080在线| 成人性生交大片| 精品一区二区在线视频| 中文字幕一区二区视频| 久久奇米777| 精品999在线播放| 欧美日韩一区二区三区在线 | 国产69精品久久久久毛片| 午夜影视日本亚洲欧洲精品| 久久久久成人黄色影片| 日韩三区在线观看| 91精品国产综合久久久蜜臀粉嫩 | 99久久国产综合精品女不卡| 亚洲成年人影院| 国产精品国产三级国产专播品爱网| 久久人人爽爽爽人久久久| 日韩无一区二区| 国产日产欧美精品一区二区三区| 国产视频视频一区| 久久影院午夜片一区| 久久久国产精品午夜一区ai换脸| 欧美日本视频在线| 久久国产精品免费| 亚洲啪啪综合av一区二区三区| 亚洲欧洲成人精品av97| 亚洲品质自拍视频网站| 婷婷激情综合网| 一区二区三区四区在线| 亚洲日韩欧美一区二区在线| 精品99999| 欧美成人video| 久久综合九色综合欧美亚洲| 亚洲免费高清视频在线| 亚洲网友自拍偷拍| 国产一区欧美一区| 不卡av电影在线播放| 欧美一区二区三区四区在线观看| 中文成人av在线| 亚洲超丰满肉感bbw| 麻豆一区二区三| 在线观看成人免费视频| 亚洲精品高清在线| 亚洲国产精品成人久久综合一区| 亚洲精品中文在线观看| 蜜桃视频一区二区| 91蜜桃在线免费视频| 国产午夜精品久久久久久久 | 国产麻豆9l精品三级站| 欧美日韩精品一区视频| 亚洲精品一区二区三区精华液| 91美女片黄在线| 亚洲人成精品久久久久久| 美洲天堂一区二卡三卡四卡视频| 国产精品亚洲第一区在线暖暖韩国 | 亚洲欧美自拍偷拍色图| 久久99精品久久久久| 国产成人自拍高清视频在线免费播放| 欧美精选一区二区| 尤物在线观看一区| 97久久精品人人澡人人爽| 精品国产三级a在线观看| 国产精品天天看| 国产精品综合一区二区三区| 日韩三级在线免费观看| 国内精品久久久久影院一蜜桃| 成人av影视在线观看| 久久亚洲精华国产精华液| 成人激情动漫在线观看| 国产精品美女久久久久久| 午夜婷婷国产麻豆精品| 欧美久久久久久蜜桃| 国产乱子轮精品视频| 91.麻豆视频| 亚洲国产精品久久不卡毛片| 99在线精品一区二区三区| 精品日韩av一区二区| 国产揄拍国内精品对白| 亚洲色图一区二区| 欧美四级电影网| 国产不卡在线一区| 视频一区视频二区中文字幕| 久久精品综合网| 一本久久精品一区二区| 亚洲欧美日本在线| 亚洲精品一区二区三区香蕉| 欧洲国内综合视频| 国产精品免费av| 日韩欧美色电影| 欧美精品v国产精品v日韩精品| 欧美区视频在线观看| 91精品国产综合久久精品图片| 56国语精品自产拍在线观看| 日韩一区国产二区欧美三区| 欧美一区二区三区精品| 久久精品视频在线免费观看| 亚洲色图都市小说| 亚洲一二三四区| 综合av第一页| 久久精品夜夜夜夜久久| 精品三级av在线| 亚洲精品成人精品456| 日日噜噜夜夜狠狠视频欧美人| 精品系列免费在线观看| av在线不卡免费看| 日韩西西人体444www| 精品国产不卡一区二区三区| 国产精品久久久久久久第一福利| 中文字幕欧美一| 日韩国产一区二| 成人app软件下载大全免费| 色欧美日韩亚洲| 26uuu国产电影一区二区| 中文字幕欧美日韩一区| 日本亚洲天堂网| 欧美日韩日日摸| 亚洲欧洲三级电影| 蜜桃视频一区二区三区| 欧美亚一区二区| 中文字幕av一区二区三区免费看 | 岛国精品在线播放| 精品剧情v国产在线观看在线| 一区二区三区中文免费| 久久av老司机精品网站导航| 欧美日韩国产一级片| 尤物av一区二区| 92精品国产成人观看免费| 欧美一区二区三区播放老司机| 综合久久久久久| 91免费观看视频在线| 亚洲激情在线播放| 一本到三区不卡视频| 国产精品久久夜| 成人一区二区三区中文字幕| ww亚洲ww在线观看国产| 国产在线播放一区二区三区| 国产亲近乱来精品视频| 91在线观看成人| 国产亚洲欧美日韩在线一区| 国产mv日韩mv欧美| 国产精品天干天干在线综合| 粉嫩欧美一区二区三区高清影视| 国产日韩精品视频一区| 丁香另类激情小说| 亚洲乱码国产乱码精品精可以看| 粉嫩av一区二区三区| 午夜精品久久久久久久久久| 免费欧美日韩国产三级电影| 51精品国自产在线| 久久精品72免费观看| 日韩欧美国产系列| 国产suv精品一区二区6| 日韩黄色一级片| 亚洲色图视频网| 精品日产卡一卡二卡麻豆| 国产91丝袜在线播放九色| 亚洲国产精品一区二区久久恐怖片| 91精品国产欧美一区二区18| 国产一区二区调教| 亚洲精品国产第一综合99久久| 日韩欧美色电影| 欧美精品亚洲二区| 国产精品亚洲一区二区三区在线| 首页国产欧美日韩丝袜| 一区二区三区中文字幕| 亚洲精品欧美专区| 91久久精品一区二区| 亚洲高清在线精品| 欧美极品另类videosde| 欧美一区二区三区性视频| 成人少妇影院yyyy| 午夜久久久久久久久| 99久久综合99久久综合网站| 亚洲国产精品久久一线不卡| 国产一区二区三区久久悠悠色av| 天天爽夜夜爽夜夜爽精品视频| 国产精品每日更新在线播放网址| 久久久99免费| 国产精品天美传媒| 国产精品看片你懂得| 亚洲永久免费视频| 亚洲小说欧美激情另类| 亚洲一区二三区| 免费成人av在线播放| 国产传媒日韩欧美成人| 久久成人免费电影| 日韩影院精彩在线| 亚洲最新视频在线观看| 一区二区三区四区国产精品| 视频一区欧美日韩| 国产传媒日韩欧美成人| 欧美性一二三区| 精品日本一线二线三线不卡| 久久精品视频免费观看| 亚洲午夜电影在线|