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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mykey.c

?? 最常用的嵌入式LINUX字符設備驅動:觸摸屏和小鍵盤驅動。觸摸屏使用SPI接口
?? C
字號:
/************************************************************文檔類型: 原代碼 項目編號: 文檔編號: 修訂版本: v1.0生成日期: 2001.8.15文檔作者: 何雄倫審    核: ************************************************************相關文檔: ucdimm上的鍵盤連接 文檔編號      說明 ************************************************************修訂說明修訂版本	v1.1	修訂說明 重寫了select函數************************************************************/#include <linux/kernel.h>#include <asm/MC68VZ328.h>#include <asm/segment.h>#include <linux/types.h>#include <linux/fs.h>#include <linux/mm.h>#include <linux/errno.h>#include <linux/sched.h>#include <linux/tqueue.h>#include <linux/interrupt.h>#include "kbd.h"/*The size of keyboard input buffer.*/unsigned int kbd_major = 99;/*The keyboard input buffer.*/unsigned char kbd_buf[MAX_KEY_COUNT];/* The keyboard wait queque */struct wait_queque *kbd_wait;int key_count = 0;int kbd_head = 0;int kbd_end = 0;/************************************************************函數原型: static int kbd_read(struct inode*,struct file*,short*,int)功    能: Read one byte from keyboard driver's buffer,輸入參數: short *buf:The point of save the readed one byte data.	 int   count:Not used.返 回 值: Sucess return 1,failed return 0.************************************************************/static int kbd_read(struct inode *node, struct file *fp,		    short *buf, int count){	if (verify_area(VERIFY_WRITE, buf, 1) == -EFAULT)		return -1;		if (key_count == 0)		return 0;		__put_user(kbd_buf[kbd_head],buf,1);	key_count --;	kbd_head ++;		if (kbd_head == MAX_KEY_COUNT) kbd_head = 0;	return 1;}/************************************************************函數原型: static int kbd_open(struct inode *,struct file*)功    能: Open the keyboard driver.輸入參數: struct inode *node:not used.	 struct file  *file:not used.返 回 值: Always success so always return 0.************************************************************/static int kbd_open(struct inode *node, struct file *fp){	kbd_head = 0;	kbd_end = 0;	key_count = 0;	return 0;}/************************************************************函數原型: static void kbd_close(struct inode *node,struct file *fp) 功    能: Close the keyboard driver.In here,it do nothing.輸入參數: struct inode *node:not used.	 struct file  *fp:not used.返 回 值: no return value.************************************************************/static void kbd_close(struct inode *node, struct file *fp){}/************************************************************函數原型: kbd_write(struct inode *,struct file*,const char *,int)功    能: Write the data to keyboard driver.But in our driver,	 can not write to the keyboard,so it do nothing.輸入參數: All not used返 回 值: always return 0.************************************************************/int kbd_write(struct inode *node, struct file *fp,		    const char *buf, int count){	int i;		if (verify_area(VERIFY_READ, buf, 1) == -EFAULT)		return -1;		if (key_count + count < MAX_KEY_COUNT)	{		for (i = 0;i < count;i ++)		{			kbd_buf[kbd_end] = buf[i];			kbd_end ++;			key_count ++;			if (kbd_end >= MAX_KEY_COUNT)				kbd_end = 0;		}		wake_up(&kbd_wait);		return count;	}	else		return 0;}/************************************************************函數原型: static int kbd_select(struct inode *,struct file*,int,select_table *)功    能: If the keyboard driver's buffer have data to read,return 1,otherwise,	 return 0.輸入參數: All arguments are not used.返 回 值: If the keyboard driver's buffer have data to read,return 1,otherwise,	 return 0.************************************************************/static int kbd_select(struct inode *inode,struct file *file,int mode,select_table *table){	if (mode == SEL_IN)	{		if (key_count)			return 1;		select_wait(&kbd_wait,table);	}	return 0;}static unsigned int charcase = 0;static int kbd_ioctl(struct inode *inode,struct file *filp,unsigned int cmd,unsigned long arg){	int result;	switch (cmd)	{	case 0:		/* Set the low case */		charcase = 0;		result = 2;		break;	case 1:		/* Set the up case */		charcase = 1;		result = 2;		break;	case 2:		/* Get the char case */		result = charcase;		break;	}	return result;}struct file_operations kbd_fops = {	NULL,	kbd_read,	kbd_write,	NULL,	kbd_select,	kbd_ioctl,	NULL,	kbd_open,	kbd_close,	NULL,	NULL,	NULL,	NULL};/************************************************************函數原型: static unsigned short invert(unsigned short)功    能: Invert the input data.輸入參數: unsigned short data:the data witch want to invert.返 回 值: return the inverted data.************************************************************/static unsigned short invert(unsigned short data){	unsigned short tmp = 0;	int i;	for (i=0; i<11; i++)	{		if (data&(1<<i))			tmp |= (1<<(10-i));	}	return tmp;}/************************************************************函數原型: static unsigned char check(unsigned short data)功    能: Check the input data(delete the start and stop bit,check	 the parity and delete the parity bit).輸入參數: unsigned short data:the data witch want to check.返 回 值: return the checked data.************************************************************/static unsigned char check(unsigned short data){	int i,par = 0;	/*Check the end bit*/	if (!(data & 0x400))		return 255;	/*Check the start bit*/	if (data & 0x1)		return 255;	/*Discard the start bit*/	data >>= 1;	for (i=0; i<8; i++)	{		if (data & (1<<i))			par++;	}		if (data & 0x100)		par++;	/*Check the parity*/	if (par%2 == 0)		return 255;	return data;}static unsigned char nortable[132] = {	/*		0    1    2    3    4    5    6    7    8    9    a    b    c    d    e    f	*/	/*00...0f*/	0x00,0x43,0x00,0x3f,0x3d,0x3b,0x3c,0x58,0x00,0x44,0x42,0x40,0x3e,0x0f,0x29,0x00,	/*10...1f*/	0x00,0x38,0x2a,0x00,0x1d,0x10,0x02,0x00,0x00,0x00,0x2c,0x1f,0x1e,0x11,0x03,0x00,	/*20...2f*/	0x00,0x2e,0x2d,0x20,0x12,0x05,0x04,0x00,0x00,0x39,0x2f,0x21,0x14,0x13,0x06,0x00,	/*30...3f*/	0x00,0x31,0x30,0x23,0x22,0x15,0x07,0x00,0x00,0x00,0x32,0x24,0x16,0x08,0x09,0x00,	/*40...4f*/	0x00,0x33,0x25,0x17,0x18,0x0b,0x0a,0x00,0x00,0x34,0x35,0x26,0x27,0x19,0x0c,0x00,	/*50...5f*/	0x00,0x00,0x28,0x00,0x1a,0x0d,0x00,0x00,0x3a,0x36,0x1c,0x1b,0x00,0x2b,0x00,0x00,	/*60...6f*/	0x00,0x56,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x4f,0x00,0x4b,0x47,0x00,0x00,0x00,	/*70...7f*/	0x52,0x53,0x50,0x4c,0x4d,0x48,0x01,0x45,0x57,0x4e,0x51,0x4a,0x37,0x49,0x46,0x00,	/*80...83*/	0x00,0x00,0x00,0x41};static unsigned char exttable[14][2] = {	{0x11,0x64},	{0x14,0x61},	{0x70,0x6e},	{0x71,0x6f},	{0x6b,0x69},	{0x6c,0x66},	{0x69,0x6b},	{0x75,0x67},	{0x72,0x6c},	{0x7d,0x68},	{0x7a,0x6d},	{0x74,0x6a},	{0x4a,0x62},	{0x5a,0x60},};/*The PrintScreen key's make scancode*/static unsigned char PrtScr[4] = {0xe0,0x12,0xe0,0x7c};/*The PrintScreen key's break scancode*/static unsigned char BreakPrt[5] = {0xf0,0x7c,0xe0,0xf0,0x12};/*The Pause/Break key's scancode*/static unsigned char Brk[8] = {0xe1,0x14,0x77,0xe1,0xf0,0x14,0xf0,0x77};static short flag_e0 = 0;static short flag_e1 = 0;static short flag_f0 = 0;/************************************************************函數原型: static unsigned char nortrans(unsigned char scancode)功    能: Translate the normal scancode from AT scancode to microwindows'	 scancode(include make and break scancode).輸入參數: unsigned char scancode:the data witch want to translate.返 回 值: return the corresponding microwindows' scancode.************************************************************/static unsigned char nortrans(unsigned char scancode){	unsigned char xtcode;	if (flag_f0 == 0)	{		if (scancode == 0xf0)		{			flag_f0 = 1;			return 0;		}		/*If the AT scancode is too lage then return*/		if (scancode > 131)			return 0;		xtcode = nortable[scancode];		/*If can't find the xt scancode then return*/		if (xtcode == 0)			return 0;	}	else	{		/* translate the break scancode */		flag_f0 = 0;		if (scancode > 131)			return 0;		xtcode = nortable[scancode];		if (xtcode == 0)			return 0;		xtcode |= 0x80;	}	/*Write the xt scancode to buffer*/	if (key_count < MAX_KEY_COUNT)	{		kbd_buf[kbd_end] = xtcode;		kbd_end ++;		key_count ++;		if (kbd_end >= MAX_KEY_COUNT)			kbd_end = 0;	}	return 1;}/************************************************************函數原型: unsigned char exttrans(unsigned char scancode)功    能: Translate the extend scancode.輸入參數: unsigned char scancode:the data witch want to translate.返 回 值: return the corresponding microwindows' scancode.************************************************************/unsigned char exttrans(unsigned char scancode){	unsigned char xtcode;	int i;	if (flag_f0 == 0)	{		/* process the make scancode */		if (scancode == PrtScr[flag_e0])		{			flag_e0 ++;			if (flag_e0 >= 4)			{				/*Write the xt scancode(PrtScr make) to buffer*/				if (key_count < MAX_KEY_COUNT)				{					kbd_buf[kbd_end] = 0x63;					kbd_end ++;					key_count ++;					if (kbd_end >= MAX_KEY_COUNT)						kbd_end = 0;				}				flag_e0 = 0;			}			return 0;		}			if (scancode == 0xf0)		{			flag_f0 = 1;			return 0;		}		flag_e0 = 0;		for (i = 0;i < 14;i ++)		{			if (exttable[i][0] == scancode)			{				xtcode = exttable[i][1];				break;			}		}		if (i >= 14)			return 0;	}	else	{		/* process the break scancode */		if (scancode == BreakPrt[flag_e0])		{			flag_e0 ++;			if (flag_e0 >= 5)			{				/*Write the xt scancode(PrtScr break) to buffer*/				if (key_count < MAX_KEY_COUNT)				{					kbd_buf[kbd_end] = 0xe3;					kbd_end ++;					key_count ++;					if (kbd_end >= MAX_KEY_COUNT)						kbd_end = 0;				}				flag_f0 = 0;				flag_e0 = 0;			}			return 0;		}			flag_f0 = 0;		flag_e0 = 0;		for (i = 0;i < 14;i ++)		{			if (exttable[i][0] == scancode)			{				xtcode = exttable[i][1];				xtcode |= 0x80;				break;			}		}		if (i >= 14)			return 0;	}	/*Write the xt scancode to buffer*/	if (key_count < MAX_KEY_COUNT)	{		kbd_buf[kbd_end] = xtcode;		kbd_end ++;		key_count ++;		if (kbd_end >= MAX_KEY_COUNT)			kbd_end = 0;	}	return 1;}/************************************************************函數原型: unsigned char translate(unsigned char scancode)功    能: The translate main function,include normal and extend	 key's scancode.輸入參數: unsigned char scancode:The data want to translate.返 回 值: return the translated scancode.************************************************************/unsigned char translate(unsigned char scancode){	if (flag_e0 == 0 && flag_e1 == 0)	{		/* process the normal AT scancode */		if (scancode == 0xe0)		{			flag_e0 = 1;			return 0;		}		else if (scancode == 0xe1)		{			flag_e1 = 1;			return 0;		}		return (nortrans(scancode));	}	else if (flag_e1)	{		/* process the Pause/Break key's scancode */		if (scancode == Brk[flag_e1])		{			flag_e1 ++;			if (flag_e1 >= 8)			{				/*Write the xt scancode(PrtScr break) to buffer*/				if (key_count < MAX_KEY_COUNT)				{					kbd_buf[kbd_end] = 0x77;					kbd_end ++;					key_count ++;					if (kbd_end >= MAX_KEY_COUNT)						kbd_end = 0;				}				flag_e1 = 0;			}		}		else			flag_e1 = 0;		return 0;	}	else	{		/* process the extend scancode */		return (exttrans(scancode));	}}/************************************************************函數原型: void irp_handler(int,void *,struct pt_regs)功    能: This is a interrupt handler function,it read the 11bits	 data from the SPI receive register.輸入參數: All arguments are not used.返 回 值: Have not return value.************************************************************/void irq_handler(int irq, void* dev_id, struct pt_regs* regs){	short tmp;	unsigned char scancode = 0;	unsigned char result;printk("keyboard irq hander\n");		cli();	tmp = SPI1RDATA;	tmp = invert(tmp);		scancode = check(tmp);	if (scancode == 255)	{//		printk("scancode error!\n");		return;	}		result = translate(scancode);	wake_up(&kbd_wait);		sti();}/************************************************************函數原型: void initSPI()功    能: Initialize the SPI.輸入參數: Have not input arguments.返 回 值: Have not return value.************************************************************/void initSPI(){	//set pin selection	PJSEL = (PJSEL&0xF2);	//SET_PKSEL(0);		//set SPI1 control/status register	SPI1CONT = 0x021A;//0000,0010,00??,1010			//set SPI1 interrupt control/status register	SPI1ICONT = 0x0800;}/************************************************************函數原型: void init_mykey()功    能: Do all the initialize work,include registe device,	 initialize the SPI,request interrupt.輸入參數: No input argument.返 回 值: No return value.************************************************************/void init_mykey(){	int result;	result = register_chrdev(kbd_major, "keyboard", &kbd_fops);	if (result<0)	{		printk("keyboard: can't get major number\n");		return;	}	/*Init SPI*///	initSPI();		//free_irq(12|0x10000000, NULL);//	if (request_irq(21|0x10000000, irq_handler, SA_SHIRQ,//		"test_keyboard_irq_handler", NULL))//		printk("Cannot request irq\n");	kbd_wait = NULL;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕一区二区三区不卡在线| 欧美电影免费观看高清完整版| 日韩毛片精品高清免费| 99精品一区二区三区| 亚洲另类春色国产| 欧美三级一区二区| 蜜桃久久精品一区二区| 久久久三级国产网站| 高清在线不卡av| 亚洲欧美一区二区三区久本道91| 欧美日韩视频在线一区二区| 青青青爽久久午夜综合久久午夜| 精品电影一区二区三区| eeuss鲁片一区二区三区| 亚洲综合在线电影| 日韩欧美精品在线视频| yourporn久久国产精品| 天天色 色综合| 欧美xxxxxxxx| 色综合天天做天天爱| 奇米888四色在线精品| 久久久国际精品| 欧美伊人久久大香线蕉综合69| 久久国产精品99久久久久久老狼| 中文字幕欧美激情一区| 欧美电影一区二区三区| 国产精品一二三区在线| 亚洲亚洲人成综合网络| 欧美精品一区二区三区视频| 日本国产一区二区| 国内精品嫩模私拍在线| 亚洲激情一二三区| 久久久夜色精品亚洲| 欧洲一区二区av| 国产麻豆精品视频| 午夜精品福利久久久| 国产精品国产成人国产三级| 91精品国产91久久久久久最新毛片| 成人av动漫在线| 久久精品国产澳门| 一级日本不卡的影视| 久久久蜜桃精品| 91精品国产手机| 91成人在线观看喷潮| 高清国产午夜精品久久久久久| 日韩福利电影在线观看| 一区二区三区在线观看视频 | 亚洲午夜羞羞片| 久久久国产精华| 日韩欧美中文字幕精品| 欧美日韩一区精品| 色综合天天综合网天天狠天天| 国产精品自产自拍| 老司机精品视频导航| 丝袜诱惑亚洲看片| 亚洲午夜在线视频| 亚洲综合在线视频| 一片黄亚洲嫩模| 亚洲精品va在线观看| 中文字幕在线观看不卡| 国产午夜亚洲精品不卡| 2021国产精品久久精品| 日韩免费一区二区| 日韩欧美中文一区| 日韩精品中文字幕一区二区三区| 欧美日韩在线免费视频| 欧美色中文字幕| 欧美日韩色综合| 欧美丰满一区二区免费视频| 欧美性高清videossexo| 欧美最猛性xxxxx直播| 一本大道久久a久久精二百| 99久久精品免费看国产免费软件| 波多野结衣在线aⅴ中文字幕不卡| 国产酒店精品激情| 国产精品资源网站| 丁香婷婷综合五月| 不卡欧美aaaaa| 91精品91久久久中77777| 91精品1区2区| 欧美伦理电影网| 日韩女优av电影| 久久综合成人精品亚洲另类欧美 | 欧美视频一区二区在线观看| 91福利社在线观看| 欧美日韩一区二区三区在线| 欧美美女一区二区在线观看| 欧美一级一区二区| 久久蜜臀中文字幕| 亚洲欧洲一区二区在线播放| 亚洲综合在线第一页| 日韩高清不卡一区二区三区| 国内偷窥港台综合视频在线播放| 成人网在线免费视频| 欧美综合一区二区三区| 欧美日韩成人激情| 久久久亚洲精华液精华液精华液| 中文无字幕一区二区三区 | 成人精品国产福利| 91免费版pro下载短视频| 欧美三级三级三级| 久久综合狠狠综合久久综合88| 国产精品另类一区| 亚洲一区二区美女| 国内久久婷婷综合| 色综合天天综合网天天狠天天| 555www色欧美视频| 国产欧美日韩亚州综合| 亚洲一区在线视频| 国产综合成人久久大片91| 色综合久久综合网欧美综合网 | 国产在线精品一区在线观看麻豆| 国产精品综合一区二区三区| 色婷婷国产精品| 日韩免费电影网站| 亚洲欧美激情一区二区| 久久99精品久久久久久国产越南| 99久久99精品久久久久久 | 亚洲国产精华液网站w| 亚洲一区二区三区小说| 国产传媒一区在线| 欧美日韩三级视频| 欧美国产综合色视频| 日韩成人午夜电影| 91丨porny丨户外露出| 欧美tickling网站挠脚心| 亚洲精品国产一区二区三区四区在线| 免播放器亚洲一区| 91精品办公室少妇高潮对白| 久久午夜免费电影| 日本不卡免费在线视频| 日本韩国一区二区三区| 国产日韩欧美a| 蜜桃久久久久久久| 精品视频在线免费看| 国产精品久久久久久久久免费桃花 | 国产不卡在线播放| 日韩一级二级三级精品视频| 亚洲女与黑人做爰| 成人激情综合网站| 精品国产伦一区二区三区观看体验| 亚洲日韩欧美一区二区在线| 国产一区二区三区不卡在线观看 | 欧美日韩精品欧美日韩精品一综合| 国产视频一区二区三区在线观看| 丝袜美腿亚洲综合| 欧美在线免费播放| 亚洲欧洲综合另类在线| 成人美女视频在线看| 久久亚洲综合色一区二区三区| 午夜成人免费电影| 欧美日韩一区精品| 亚洲一区免费在线观看| 在线视频你懂得一区| 亚洲人成网站影音先锋播放| www.亚洲国产| 国产精品系列在线| 粉嫩高潮美女一区二区三区| 久久亚区不卡日本| 国产福利精品导航| 久久久99精品免费观看| 国产精品1区2区3区在线观看| 欧美成人官网二区| 国产乱国产乱300精品| 国产欧美日本一区视频| 国产成人亚洲综合色影视| 国产亚洲综合性久久久影院| 国产成人午夜片在线观看高清观看| 久久亚洲精品国产精品紫薇| 久久99九九99精品| 久久久久久亚洲综合| 国产一区二区三区日韩| 国产欧美一区二区精品久导航| 成人综合婷婷国产精品久久蜜臀| 国产精品麻豆99久久久久久| av日韩在线网站| 亚洲精品日韩专区silk| 欧美浪妇xxxx高跟鞋交| 免费观看在线综合| 久久婷婷综合激情| aaa亚洲精品| 亚洲福利电影网| 日韩美女在线视频| 国产精品一色哟哟哟| 亚洲天天做日日做天天谢日日欢 | 色一情一伦一子一伦一区| 亚洲六月丁香色婷婷综合久久| 欧美日韩午夜在线视频| 免费观看一级特黄欧美大片| 国产日产欧美精品一区二区三区| 丁香亚洲综合激情啪啪综合| 一区二区欧美在线观看| 91精品国产综合久久婷婷香蕉| 毛片一区二区三区| 国产精品激情偷乱一区二区∴| 91电影在线观看| 久久99精品国产.久久久久| 综合久久一区二区三区| 91麻豆精品国产91久久久使用方法| 韩国v欧美v日本v亚洲v|