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

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

?? mypad.c

?? 一個(gè)MP3的鍵盤驅(qū)動(dòng)程序,可以是按鍵式的也可以是轉(zhuǎn)輪式的
?? C
字號(hào):
#include <linux/config.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/miscdevice.h>#include <linux/sched.h>#include <linux/delay.h>#include <linux/poll.h>#include <linux/spinlock.h>#include <asm/irq.h>#include <linux/delay.h>#include <asm/hardware.h>#define DEVICE_NAME     "pad"  //device name #define BUTTON_MAJOR 233  //major number#define DE     GPIO_G11  //irq#define STB    GPIO_E13 //clock#define SDATA  GPIO_E12 //data,lsb#define IN  0#define OUT 1static struct key_info {    int irq_no;    unsigned int gpio_port;    unsigned int mod;} key_info_tab[3] = {    { IRQ_EINT19, DE  ,  IN  },//irq    { IRQ_EINT19, STB ,  OUT },//clock    { IRQ_EINT19, SDATA ,IN  }//data,lsb};/******************* about ALT *********************/#define SIF1_MODE				0		// Definition of Serial Communication Mode#define SIF2_MODE				1// the value of OUTPUT_ENABLE and OUTPUT_THRESHOLD depends on your design.// if you need high speed or fast reaction, use small number. (the smallest is 1, means not using DCA)// On the contrary, if you need stability, use fairly big number (the biggest depends on how fast your MCU can acces ATA2501)#define OUTPUT_ENABLE		    2//	5		// to receive this amount of sensor inputs to process DCA#define OUTPUT_THRESHOLD	    1//	4		// Each sensor input must be greater than or equal to this value as HIGH (touched)#define SCROLL_TYPE				0		// Pad Design selection (0: scroll, 1: button)#define BUTTON_TYPE				1#define LINEAR_SCROLL			0		// Scroll type selection#define CIRCULAR_SCROLL			1 #define BOOL  unsigned short#define BYTE  unsigned char#define FALSE 0#define TRUE  1#define QUITE  3 //if need not DEBUG message,you can set the QUIT = 5#define NOISE 4#define PAD_DEBUG_VERBOSE NOISE#define DEBUG2(n, args...)	\	if (n <= PAD_DEBUG_VERBOSE) {	\		printk(args);	\	}//--------------------------------------------------------------------------------------------------------------------// Prototypes//--------------------------------------------------------------------------------------------------------------------static void Init_G_Var( void );	// Initialize global variablesstatic void SIF_Read( unsigned int *sensDataIn );		// ATA2501 SIF communication function (SIF1, SIF2)static BOOL DCA(unsigned char numSensor, unsigned int sDataIn, unsigned int *sDataOut);	// Selects the strongest inputsstatic char Button_Process( int numBtn, unsigned int dcaData );	// Choose one button among the strongest inputsstatic char Linear_Scroll_Process( int numScr, unsigned int dcaData, unsigned char *padPos );	// Calculates the movement of linear scrollstatic char Circular_Scroll_Process( int numScr, unsigned int scrData, unsigned char *padPos ); // Calculates the movement of circular scroll//--------------------------------------------------------------------------------------------------------------------//	global variable definitions //--------------------------------------------------------------------------------------------------------------------unsigned char xPadPos;			// save current pad position before fetching new sensor dataint outEnCount;					// accumulates times of sensor data fetchunsigned char thCountReg[12];	// stores strength of each sensor padBOOL sifMode;					// indicates current sif modeunsigned char padType;			// indicates pad type (0: scroll type, 1: button type)BOOL scrType;					// indicates scroll type (0: Linear type, 1: Circular Type)//--------------------------------------------------------------------------------------------------------------------// Code starts here//--------------------------------------------------------------------------------------------------------------------static void Init_G_Var( void ){	int i;  	xPadPos = 0xff;	outEnCount = 0;	for(i=0; i<12; i++)	{		thCountReg[i] = 0;	}		sifMode = SIF1_MODE;	padType = BUTTON_TYPE;	scrType = LINEAR_SCROLL;}static void send_a_clock(void){	struct key_info *k;        k = key_info_tab + 1;  //STB	write_gpio_bit(k->gpio_port,1);  //make STB bit to high	udelay(10); 	write_gpio_bit(k->gpio_port,0); //mkae STB bit to low	udelay(10);	}static void SIF_Read( unsigned int *sensDataIn ){	unsigned char i;	unsigned int dataTemp;	unsigned int sensorIn = 0;	unsigned int dataEnable;        struct key_info *k;        k = key_info_tab + 2;// sdata	if( sifMode == SIF1_MODE )	{			send_a_clock();			for( i=0; i<12; i++ )			{				send_a_clock();				dataTemp = read_gpio_bit(k->gpio_port);	// catch serial data from SDADA pin of DCC				sensorIn |= dataTemp << i;			}						*sensDataIn = sensorIn;		//	DEBUG2(QUITE,"in SIF_Read :the sensorIn is %d\n",sensorIn);	}	else if( sifMode == SIF2_MODE )	{		for( i=0; i<12; i++ )		{			send_a_clock();			dataTemp = read_gpio_bit(k->gpio_port); // catch serial data from SDADA pin of DCC			sensorIn |= dataTemp << i;		}				*sensDataIn = sensorIn;	}}static BOOL DCA(BYTE numSensor, unsigned int sDataIn, unsigned int *sDataOut){///////////////////////////////////////////////////////////////////////////////////////////	int i;	int maxCount = 0;	//-------------------------------------------------------	// update each pad counter for output threshold check	//-------------------------------------------------------	for( i=0; i<numSensor; i++ ) {				if(( sDataIn >> i ) & 1 ) thCountReg[i]++;	}	//----------------------------------	// increment outEnCount	//----------------------------------	outEnCount += 1;	if( outEnCount != OUTPUT_ENABLE ) return( FALSE );	// select the biggest count among Pads	*sDataOut = 0;		for( i=0; i<numSensor; i++ )	{		if( maxCount < thCountReg[i] )	 	{			maxCount = thCountReg[i];		}	}	if( maxCount >= OUTPUT_THRESHOLD ) {		for( i=0; i<numSensor; i++ )		{			if( thCountReg[i] == maxCount )			{					*sDataOut = *sDataOut | (1 << i);			}		}	}	// clear all thCount	for( i=0; i<numSensor; i++ )	{		thCountReg[i] = 0;		}		// clear outEnCount	outEnCount = 0;	return( TRUE );}static char Button_Process( int numBtn, unsigned int dcaData ){	int i;	int count = 0;	char checkPos;	unsigned char position;	for( i=0; i<numBtn; i++ )	{		if( dcaData & (1<<i) ) count++;	}	if( count )	{		if( xPadPos != 0xff )		{			checkPos = dcaData & ( 1<<xPadPos );			if( checkPos )			{				return( xPadPos );			}		}				for( i=0; i<numBtn; i++ )		{ 			if( dcaData & ( 1<<i )) 			{				position = i;				break;			}		}	} // end of if( count );	else 	{		position = 0xff;	}	return( position );}static char Linear_Scroll_Process( int numScr, unsigned int scrData, unsigned char *padPos ){	int i;	int count = 0;	char dMove;		*padPos = 0xff;	for( i=0; i<numScr; i++ )	{		if( scrData&(1<<i) ) *padPos = i;	}	if( *padPos == 0xff ) return( 0 );	if( xPadPos == 0xff ) return( 0 );	dMove = (char)(*padPos - xPadPos);	switch( dMove )	{		case -11:		case -10:		case -9:		case -8:		case -7:		case -6:		case -5: dMove = 0; break;		case -4:		case -3:		case -2: dMove = -1; break;		case -1:		case 0:		case 1: break;			case 2: 		case 3:		case 4: dMove = 1; break;		case 5:		case 6:		case 7:		case 8:		case 9:		case 10:		case 11: dMove = 0; break;		default: dMove = 0; break;	}	return( dMove );}static char Circular_Scroll_Process( int numScr, unsigned int scrData, unsigned char *padPos ){	int i;	int count = 0;	char dMove;		*padPos = 0xff;	for( i=0; i<numScr; i++ )	{		if( scrData&(1<<i) ) *padPos = i;	}	if( *padPos == 0xff ) return( 0 );	if( xPadPos == 0xff ) return( 0 );	dMove = (char)(*padPos - xPadPos);/*		delta = 0,1,2,3 OK	delta = 4,5,6,7,8 Discard	delta = 9,10,11 --> -3,-2,-1	delta = -1,-2,-3 OK	delta = -4,-5,-6,-7,-8 Discard	delta = -9,-10,-11 --> 3,2,1*/	switch( dMove )	{		case -11:		case -10:		case -9: dMove = 1; break;				case -8:		case -7:		case -6:		case -5: 		case -4: dMove = 0; break;		case -3:		case -2: dMove = -1; break;		case -1:		case 0:		case 1: break;			case 2: 		case 3: dMove = 1; break;		case 4:		case 5:		case 6:		case 7:		case 8: dMove = 0; break;		case 9:		case 10:		case 11: dMove = -1; break;		default: dMove = 0; break;	}	return( dMove );}/************************* about ALT end *****************************/static int ready = 0;static int key_value = 0;static DECLARE_WAIT_QUEUE_HEAD(buttons_wait);//lxy:set gpio mode,in or out,according to the info in the key_info_tabstatic void gpio_init(void){	struct key_info *k;	unsigned i;	for (i = 1; i < sizeof key_info_tab / sizeof key_info_tab[1]; i++) //xiabiaocong 1 kaishi??	{        	k = key_info_tab + i;        	if (k->mod == IN) 		{			//set_gpio_mode_user(k->gpio_port, GPIO_MODE_IN);   what's this?			set_gpio_ctrl(GPIO_MODE_IN | k->gpio_port);		}		else		{    			//set_gpio_mode_user(k->gpio_port, GPIO_MODE_OUT);			set_gpio_ctrl(GPIO_MODE_OUT | k->gpio_port);		}	}}static void buttons_irq(int irq, void *dev_id, struct pt_regs *reg){	unsigned int sensData, dcaData;	unsigned char padPos;	char delta;	int i;	int flags;	save_flags(flags);	cli();	//DEBUG2(QUITE," in buttons_irq!\n");	SIF_Read( &sensData );		// read 12 sensor data periodically	if( DCA( 12, sensData, &dcaData ))	// get the strongest inputs 	{		if( padType == BUTTON_TYPE )		{			padPos = Button_Process( 12, dcaData );	// choose one button among the strongest inputs			// send padPos to main processor 			xPadPos = padPos;		// update pad position		}		else if( padType == SCROLL_TYPE )		{			if( scrType == LINEAR_SCROLL )			{				delta = Linear_Scroll_Process( 12, dcaData, &padPos );	// calculate the movement			}			else if( scrType == CIRCULAR_SCROLL )			{				delta = Circular_Scroll_Process( 12, dcaData, &padPos );	// calculate the movement			}			// send delta to main processor 			xPadPos = padPos;		// update pad position		}			key_value = xPadPos;			ready = 1; //get a  powerfull data			wake_up_interruptible(&buttons_wait); //wake up the wait quenu	}			for(i=0;i<100;i++) 		udelay(1);	// delay about 1msec	restore_flags(flags);	sti();//lxy:unnecessary?}        static int request_irqs(void){	struct key_info *k;  	k = key_info_tab ;        set_external_irq(k->irq_no, EXT_RISING_EDGE, GPIO_PULLUP_DIS); //set the irq mode        if (request_irq(k->irq_no, &buttons_irq, SA_INTERRUPT, DEVICE_NAME, &buttons_irq))  //request the irq	{              return -1;        }	return 0;}static void free_irqs(void){	struct key_info *k;        k = key_info_tab ;        free_irq(k->irq_no, buttons_irq);}static int pad_buttons_read(struct file * file, char * buffer, size_t count, loff_t *ppos){    static int key;    int flags;    int repeat;    if (!ready)             return -EAGAIN;    if (count != sizeof key_value)          return -EINVAL;    save_flags(flags); //disable local irq??    if (key != key_value) {        key = key_value;        repeat = 0;    } else {        repeat = 1;    }    restore_flags(flags); //enable local irq    if (repeat) {  //dispatch the repeat data ,if you want to get the data continuous ,you should add "//" before the line.        return -EAGAIN;    }        copy_to_user(buffer, &key, sizeof key);    ready = 0;    return sizeof key_value;}static unsigned int pad_buttons_select( struct file *file, struct poll_table_struct *wait){	if (ready)		return 1;	poll_wait(file, &buttons_wait, wait); // add the current process to the wait quenu		return 0;}static int pad_buttons_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg){	switch(cmd) 	{		default:			return -EINVAL;	}}static struct file_operations pad_buttons_fops = {	owner: THIS_MODULE,	ioctl: pad_buttons_ioctl,	poll: pad_buttons_select,	read: pad_buttons_read,};static devfs_handle_t devfs_handle;static int __init pad_buttons_init(void){	int ret;	unsigned int sensData1;	ready = 0;	ret = register_chrdev(BUTTON_MAJOR, DEVICE_NAME, &pad_buttons_fops);	if (ret < 0) 	{		printk(DEVICE_NAME " can't register major number\n");		return ret;	}	gpio_init();  //init the gpio drictions	Init_G_Var(); //init the global varibales	ret = request_irqs(); //request the irq	if (ret) 	{        	unregister_chrdev(BUTTON_MAJOR, DEVICE_NAME);        	printk(DEVICE_NAME " can't request irqs\n");        	return ret;    	}	devfs_handle = devfs_register(NULL, DEVICE_NAME, DEVFS_FL_DEFAULT,BUTTON_MAJOR, 0, S_IFCHR | S_IRUSR | S_IWUSR, &pad_buttons_fops, NULL);  //added the device node??		return 0;}static void __exit pad_buttons_exit(void){	devfs_unregister(devfs_handle);	free_irqs();	unregister_chrdev(BUTTON_MAJOR, DEVICE_NAME);}module_init(pad_buttons_init);module_exit(pad_buttons_exit);MODULE_LICENSE("GPL");

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人免费毛片嘿嘿连载视频| 国产视频在线观看一区二区三区| 色综合视频在线观看| 高清日韩电视剧大全免费| 久国产精品韩国三级视频| 免费成人在线播放| 蜜桃视频一区二区三区| 蜜臀91精品一区二区三区| 老司机精品视频一区二区三区| 日本免费新一区视频| 麻豆一区二区在线| 激情欧美一区二区| 国产不卡视频在线播放| www.亚洲免费av| 91福利在线免费观看| 欧美在线你懂的| 91精品国产综合久久久久久 | www国产成人免费观看视频 深夜成人网| 欧美一区二区在线视频| 日韩视频免费观看高清完整版在线观看| 日韩三级视频在线观看| 久久久久久黄色| 国产精品电影院| 亚洲国产一区二区视频| 日本美女一区二区三区| 国模套图日韩精品一区二区 | 久久美女艺术照精彩视频福利播放| 精品免费一区二区三区| 国产丝袜在线精品| 亚洲精品视频一区| 奇米影视在线99精品| 国产精品一区在线| 91影院在线观看| 欧美一三区三区四区免费在线看| 久久久精品天堂| 亚洲少妇中出一区| 日韩电影在线观看电影| 国产在线麻豆精品观看| www.亚洲色图.com| 在线播放欧美女士性生活| 国产亚洲美州欧州综合国| 亚洲精品成人a在线观看| 日韩成人一级大片| 福利电影一区二区| 欧美日韩五月天| 久久精品一区二区三区av| 亚洲在线中文字幕| 国产米奇在线777精品观看| 在线中文字幕一区| www久久久久| 亚洲在线免费播放| 国产成人午夜精品5599| 欧美视频一区二| 久久精品亚洲国产奇米99| 亚洲人成人一区二区在线观看| 免费一级欧美片在线观看| av一区二区三区四区| 欧美丰满美乳xxx高潮www| 中文字幕不卡的av| 免费日本视频一区| 色婷婷综合久色| 亚洲1区2区3区4区| 成人黄色片在线观看| 日韩欧美一区在线观看| 亚洲麻豆国产自偷在线| 国产麻豆视频一区二区| 欧美精品视频www在线观看 | 久久精品久久久精品美女| 99精品欧美一区二区三区综合在线| 欧美一区二区精品在线| 18成人在线观看| 国产乱码精品一区二区三区忘忧草| 欧美色图免费看| 亚洲视频一区二区在线| 国产一区二区三区av电影| 欧美日韩一区二区三区不卡| 成人免费在线视频观看| 国产剧情一区二区| 欧美一区二区成人6969| 亚洲国产精品久久久久秋霞影院| eeuss影院一区二区三区| 久久婷婷色综合| 麻豆精品一区二区综合av| 欧美日韩一级片网站| 一区二区三区视频在线看| heyzo一本久久综合| 国产日韩欧美精品综合| 国产真实乱对白精彩久久| 日韩美女一区二区三区四区| 日韩电影在线一区二区| 欧美日韩精品免费观看视频| 夜色激情一区二区| 日本高清不卡aⅴ免费网站| 亚洲欧美在线视频观看| 不卡高清视频专区| 国产精品久久久一区麻豆最新章节| 国产成人午夜电影网| 久久午夜老司机| 国产精品影音先锋| 久久久久九九视频| 国产精品小仙女| 欧美激情一区二区三区在线| 国产91在线看| 国产欧美一区二区三区鸳鸯浴 | 欧洲另类一二三四区| 国产丝袜欧美中文另类| 国产一区二区精品久久| 久久欧美中文字幕| 国产美女精品在线| 国产清纯白嫩初高生在线观看91 | 一本一道综合狠狠老| 国产精品久久久久久久久快鸭| 成人的网站免费观看| 亚洲欧美在线aaa| 色哟哟国产精品免费观看| 亚洲在线中文字幕| 欧美精品tushy高清| 免费成人美女在线观看| 日韩欧美在线1卡| 国产一区二区福利视频| 国产精品五月天| 精品国产一区二区三区忘忧草| 日本不卡一二三| 日韩欧美中文一区| 国产精品99久| 18涩涩午夜精品.www| 色狠狠桃花综合| 日韩中文字幕av电影| 日韩欧美你懂的| 国产jizzjizz一区二区| 亚洲蜜臀av乱码久久精品蜜桃| 日本精品视频一区二区| 日韩福利电影在线| 久久在线观看免费| av男人天堂一区| 午夜精彩视频在线观看不卡| 欧美成人性战久久| 成人动漫av在线| 一级做a爱片久久| 日韩欧美中文一区| av在线一区二区三区| 天堂va蜜桃一区二区三区漫画版| 2022国产精品视频| 色网站国产精品| 久久国产成人午夜av影院| 国产精品久久久久久久岛一牛影视| 欧美天堂一区二区三区| 韩国av一区二区三区| 一区二区三区中文免费| 本田岬高潮一区二区三区| 亚洲午夜免费电影| 久久久久九九视频| 欧美少妇一区二区| 久久一夜天堂av一区二区三区| 国产在线精品免费| 一区二区三区四区精品在线视频 | 精品国产人成亚洲区| 不卡的电影网站| 日韩福利视频导航| 成人免费小视频| 亚洲精品在线电影| 欧美性极品少妇| 成人性生交大片免费看中文| 午夜精品视频在线观看| 欧美激情综合网| 51精品久久久久久久蜜臀| 成人高清视频免费观看| 麻豆精品一区二区| 亚洲国产色一区| 欧美韩日一区二区三区四区| 91麻豆精品国产自产在线观看一区| av在线综合网| 精品亚洲欧美一区| 亚洲va国产va欧美va观看| 国产精品乱码人人做人人爱| 日韩精品一区二区三区四区视频| 日本精品裸体写真集在线观看| 国产成人av一区二区三区在线 | 国产亚洲欧美日韩俺去了| 在线成人免费观看| 94-欧美-setu| 国产一区二区不卡在线| 美女国产一区二区| 亚洲国产精品人人做人人爽| 亚洲美女视频在线| 欧美精彩视频一区二区三区| 精品国产乱码久久久久久老虎| 欧美欧美欧美欧美首页| 色综合网站在线| 99久久免费国产| 国产成人免费视频精品含羞草妖精| 美女精品自拍一二三四| 视频一区二区不卡| 亚洲va天堂va国产va久| 一区二区国产视频| 亚洲精品写真福利| 亚洲美女视频在线观看| 亚洲欧美色图小说| 亚洲欧美偷拍三级| 最新中文字幕一区二区三区|