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

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

?? mirage_ts.c

?? 底層驅動開發
?? C
字號:
/* * linux/arch/mips/au1000/db1x00/mirage_ts.c * * BRIEF MODULE DESCRIPTION *	Glue between Mirage board-specific touchscreen pieces *	and generic Wolfson Codec touchscreen support. * *	Based on pb1100_ts.c used in Hydrogen II. * * Copyright (c) 2003 Embedded Edge, LLC *		dan@embeddededge.com * *  This program is free software; you can redistribute	 it and/or modify it *  under  the terms of	 the GNU General  Public License as published by the *  Free Software Foundation;  either version 2 of the	License, or (at your *  option) any later version. * *  THIS  SOFTWARE  IS PROVIDED	  ``AS	IS'' AND   ANY	EXPRESS OR IMPLIED *  WARRANTIES,	  INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN *  NO	EVENT  SHALL   THE AUTHOR  BE	 LIABLE FOR ANY	  DIRECT, INDIRECT, *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT *  NOT LIMITED	  TO, PROCUREMENT OF  SUBSTITUTE GOODS	OR SERVICES; LOSS OF *  USE, DATA,	OR PROFITS; OR	BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON *  ANY THEORY OF LIABILITY, WHETHER IN	 CONTRACT, STRICT LIABILITY, OR TORT *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * *  You should have received a copy of the  GNU General Public License along *  with this program; if not, write  to the Free Software Foundation, Inc., *  675 Mass Ave, Cambridge, MA 02139, USA. */#include <linux/config.h>#include <linux/types.h>#include <linux/module.h>#include <linux/sched.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/fs.h>#include <linux/poll.h>#include <linux/proc_fs.h>#include <linux/smp.h>#include <linux/smp_lock.h>#include <linux/wait.h>#include <asm/segment.h>#include <asm/irq.h>#include <asm/uaccess.h>#include <asm/delay.h>#include <asm/au1000.h>/* *  Imported interface to Wolfson Codec driver. */extern void *wm97xx_ts_get_handle(int which);extern int wm97xx_ts_ready(void* ts_handle);extern void wm97xx_ts_set_cal(void* ts_handle, int xscale, int xtrans, int yscale, int ytrans);extern u16 wm97xx_ts_get_ac97(void* ts_handle, u8 reg);extern void wm97xx_ts_set_ac97(void* ts_handle, u8 reg, u16 val);extern int wm97xx_ts_read_data(void* ts_handle, long* x, long* y, long* pressure);extern void wm97xx_ts_send_data(void* ts_handle, long x, long y, long z);int wm97xx_comodule_present = 1;#define TS_NAME "mirage_ts"#define err(format, arg...) printk(KERN_ERR TS_NAME ": " format "\n" , ## arg)#define info(format, arg...) printk(KERN_INFO TS_NAME ": " format "\n" , ## arg)#define warn(format, arg...) printk(KERN_WARNING TS_NAME ": " format "\n" , ## arg)#define DPRINTK(format, arg...) printk("%s: " format "\n", __FUNCTION__ , ## arg)#define PEN_DOWN_IRQ	AU1000_GPIO_7static struct task_struct *ts_task = 0;static DECLARE_COMPLETION(ts_complete);static DECLARE_WAIT_QUEUE_HEAD(pendown_wait);#ifdef CONFIG_WM97XX_FIVEWIRETSstatic int release_pressure = 1;#elsestatic int release_pressure = 50;#endiftypedef struct {   long x;   long y;} DOWN_EVENT;#define SAMPLE_RATE	50	/* samples per second */#define PEN_DEBOUNCE	5	/* samples for settling - fn of SAMPLE_RATE */#define PEN_UP_TIMEOUT	10	/* in seconds */#define PEN_UP_SETTLE	5	/* samples per second */static struct {	int xscale;	int xtrans;	int yscale;	int ytrans;} mirage_ts_cal ={#if 0	xscale:   84,	xtrans: -157,	yscale:   66,	ytrans: -150,#else	xscale:   84,	xtrans: -150,	yscale:   66,	ytrans: -146,#endif};static void pendown_irq(int irqnr, void *devid, struct pt_regs *regs){//DPRINTK("got one 0x%x", au_readl(SYS_PINSTATERD));	wake_up(&pendown_wait);}static int ts_thread(void *id){	static int pen_was_down = 0;	static DOWN_EVENT pen_xy;	long x, y, z;	void *ts;	/* handle */	struct task_struct *tsk = current;	int timeout = HZ / SAMPLE_RATE;	ts_task = tsk;	daemonize();	tsk->tty = NULL;	tsk->policy = SCHED_FIFO;	tsk->rt_priority = 1;	strcpy(tsk->comm, "touchscreen");	/* only want to receive SIGKILL */	spin_lock_irq(&tsk->sigmask_lock);	siginitsetinv(&tsk->blocked, sigmask(SIGKILL));	recalc_sigpending(tsk);	spin_unlock_irq(&tsk->sigmask_lock);	/* get handle for codec */	ts = wm97xx_ts_get_handle(0);	/* proceed only after everybody is ready */	wait_event_timeout(pendown_wait, wm97xx_ts_ready(ts), HZ/4);	/* board-specific calibration */	wm97xx_ts_set_cal(ts,			mirage_ts_cal.xscale,			mirage_ts_cal.xtrans,			mirage_ts_cal.yscale,			mirage_ts_cal.ytrans);	/* route Wolfson pendown interrupts to our GPIO */	au_sync();	wm97xx_ts_set_ac97(ts, 0x4c, wm97xx_ts_get_ac97(ts, 0x4c) & ~0x0008);	au_sync();	wm97xx_ts_set_ac97(ts, 0x56, wm97xx_ts_get_ac97(ts, 0x56) & ~0x0008);	au_sync();	wm97xx_ts_set_ac97(ts, 0x52, wm97xx_ts_get_ac97(ts, 0x52) | 0x2008);	au_sync();	for (;;) {		interruptible_sleep_on_timeout(&pendown_wait, timeout);		disable_irq(PEN_DOWN_IRQ);		if (signal_pending(tsk)) {			break;		}		/* read codec */		if (!wm97xx_ts_read_data(ts, &x, &y, &z))			z = 0;	/* treat no-data and pen-up the same */		if (signal_pending(tsk)) {			break;		}		if (z >= release_pressure) {			y = ~y;	/* top to bottom */			if (pen_was_down > 1 /*&& pen_was_down < PEN_DEBOUNCE*/) {//THXXX				/* bounce ? */				x = pen_xy.x;				y = pen_xy.y;				--pen_was_down;			} else if (pen_was_down <= 1) {				pen_xy.x = x;				pen_xy.y = y;				if (pen_was_down)					wm97xx_ts_send_data(ts, x, y, z);				pen_was_down = PEN_DEBOUNCE;			}			//wm97xx_ts_send_data(ts, x, y, z);			timeout = HZ / SAMPLE_RATE;		} else {			if (pen_was_down) {				if (--pen_was_down)					z = release_pressure;				else //THXXX				wm97xx_ts_send_data(ts, pen_xy.x, pen_xy.y, z);			}			/* The pendown signal takes some time to settle after			 * reading the pen pressure so wait a little			 * before enabling the pen.			 */			if (! pen_was_down) {//				interruptible_sleep_on_timeout(&pendown_wait, HZ / PEN_UP_SETTLE);				timeout = HZ * PEN_UP_TIMEOUT;			}		}		enable_irq(PEN_DOWN_IRQ);	}	enable_irq(PEN_DOWN_IRQ);	ts_task = NULL;	complete(&ts_complete);	return 0;}static int __init ts_mirage_init(void){	int ret;	/* pen down signal is connected to GPIO 7 */	ret = request_irq(PEN_DOWN_IRQ, pendown_irq, 0, "ts-pendown", NULL);	if (ret) {		err("unable to get pendown irq%d: [%d]", PEN_DOWN_IRQ, ret);		return ret;	}	lock_kernel();	ret = kernel_thread(ts_thread, NULL, CLONE_FS | CLONE_FILES);	if (ret < 0) {		unlock_kernel();		return ret;	}	unlock_kernel();	info("Mirage touchscreen IRQ initialized.");	return 0;}static void __exit ts_mirage_exit(void){	if (ts_task) {		send_sig(SIGKILL, ts_task, 1);		wait_for_completion(&ts_complete);	}	free_irq(PEN_DOWN_IRQ, NULL);}module_init(ts_mirage_init);module_exit(ts_mirage_exit);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品 日产精品 欧美精品| 国产日韩欧美综合在线| 国产一区二区久久| 久久久久久麻豆| 欧美另类videos死尸| www.亚洲激情.com| 韩国v欧美v日本v亚洲v| 五月开心婷婷久久| 亚洲激情在线播放| 亚洲视频中文字幕| 国产精品三级视频| 欧美日韩黄视频| 欧美精品久久一区二区三区| 91久久精品一区二区| 成人av动漫网站| 国产成人精品一区二区三区四区| 免费高清视频精品| 日本特黄久久久高潮| 天天综合色天天综合| 一个色综合av| 亚洲一区二区精品视频| 一区二区三区高清在线| 亚洲精品乱码久久久久久日本蜜臀| 欧美国产成人在线| 中文久久乱码一区二区| 国产欧美1区2区3区| 久久久国产精品麻豆| 国产成人免费视| 一二三区精品视频| 伊人一区二区三区| 亚洲女人小视频在线观看| 亚洲天堂网中文字| 亚洲欧美日韩一区二区 | 综合欧美亚洲日本| 18成人在线观看| 亚洲一区二区三区在线| 亚洲主播在线播放| 天堂蜜桃91精品| 久久爱另类一区二区小说| 国产真实乱偷精品视频免| 国产又粗又猛又爽又黄91精品| 丁香激情综合国产| 91原创在线视频| 欧美日韩日日骚| 亚洲精品一区在线观看| 国产精品日韩成人| 日本aⅴ免费视频一区二区三区| 爽爽淫人综合网网站| 国产一区在线精品| 色综合视频在线观看| 欧美日韩一区二区三区高清 | 69成人精品免费视频| 精品理论电影在线观看| 亚洲欧美综合另类在线卡通| 午夜久久电影网| 岛国一区二区在线观看| 欧美日韩精品欧美日韩精品一综合| 日韩美女视频在线| 一区二区三区免费网站| 黄页网站大全一区二区| 色欧美88888久久久久久影院| 91精品一区二区三区久久久久久| 中文字幕免费观看一区| 一区二区成人在线视频| 激情另类小说区图片区视频区| 一本色道久久综合狠狠躁的推荐| 欧美一卡2卡3卡4卡| 中文字幕一区二区三区在线不卡 | 一本大道av一区二区在线播放 | 亚洲成人午夜电影| 国产成人鲁色资源国产91色综| 欧美日韩国产免费一区二区| 欧美大胆一级视频| 亚洲r级在线视频| 91小视频免费看| 久久亚洲综合色一区二区三区| 亚洲一区二区三区四区在线| 成人精品gif动图一区| 欧美一区二区福利在线| 一区二区三区中文在线观看| 福利一区福利二区| 精品国产免费一区二区三区香蕉| 亚洲国产精品久久不卡毛片| 国产成人av资源| 精品国产免费一区二区三区四区 | 国产精华液一区二区三区| 欧美一区二区二区| 亚洲欧美激情在线| 成人av集中营| 国产精品久久毛片av大全日韩| 精品一区二区久久久| 日韩精品资源二区在线| 亚洲成人777| 欧美色窝79yyyycom| 亚洲综合丁香婷婷六月香| 色久优优欧美色久优优| 国产精品夫妻自拍| 99久久婷婷国产精品综合| 中文字幕精品三区| 大胆欧美人体老妇| 国产精品美女一区二区三区| 免费成人你懂的| 欧美性猛片aaaaaaa做受| 亚洲影院久久精品| 欧美久久一区二区| 蜜臀av一区二区在线观看| 欧美一区午夜视频在线观看| 麻豆精品一二三| 久久久久久亚洲综合| 成人性生交大片免费看中文 | 久久精品无码一区二区三区| 91欧美一区二区| 久久精品国产一区二区| 中文字幕在线不卡| 欧美一区二区在线免费播放| 成人毛片视频在线观看| 调教+趴+乳夹+国产+精品| 国产亚洲综合在线| 欧美三级日韩三级国产三级| 国产成人免费在线视频| 午夜视频在线观看一区二区三区| 久久久欧美精品sm网站| 欧美三级电影网| a在线播放不卡| 久久成人麻豆午夜电影| 亚洲一区视频在线观看视频| 国产日韩精品一区二区浪潮av| 欧亚一区二区三区| 99久久精品一区二区| 久久er精品视频| 亚洲成av人片| 亚洲天堂免费在线观看视频| 亚洲国产成人私人影院tom| 欧美日韩mp4| 欧洲一区在线观看| 成人黄色大片在线观看| 久久成人av少妇免费| 婷婷开心久久网| 亚洲一区二区三区在线| 国产精品久久久久久福利一牛影视 | 国产一区二区在线电影| 婷婷激情综合网| 亚洲高清免费在线| 亚洲精品日韩一| 国产精品国产成人国产三级| 久久综合久久综合九色| 日韩一区二区在线观看视频 | 国产美女精品在线| 蜜桃视频一区二区| 日韩av一区二区三区| 亚洲国产sm捆绑调教视频| 亚洲精品视频免费观看| 日韩一区在线免费观看| 亚洲欧洲99久久| 亚洲免费视频中文字幕| 亚洲男帅同性gay1069| 中文字幕视频一区| 自拍视频在线观看一区二区| 自拍偷在线精品自拍偷无码专区 | 制服丝袜国产精品| 51久久夜色精品国产麻豆| 欧美日韩不卡视频| 日韩欧美一级二级| 久久午夜羞羞影院免费观看| 久久精品欧美一区二区三区麻豆| 久久久久久久久久看片| 久久久天堂av| 亚洲欧美国产77777| 亚洲综合一二三区| 天堂蜜桃91精品| 狠狠狠色丁香婷婷综合激情| 成人性生交大片免费看中文| av高清久久久| 欧美精选一区二区| 日韩欧美电影一区| 国产精品视频九色porn| 一区二区三区色| 久久疯狂做爰流白浆xx| 国产.欧美.日韩| 欧美影视一区在线| 欧美一区二区三区免费大片| 国产网红主播福利一区二区| 亚洲欧美日韩电影| 国产一区二区三区香蕉| 91在线一区二区三区| 欧美精品电影在线播放| 久久久国产午夜精品| 亚洲九九爱视频| 精品一区二区三区在线观看| 99久久精品情趣| 日韩欧美一级二级三级久久久| 欧美国产综合色视频| 午夜久久久久久电影| 懂色av中文字幕一区二区三区| 欧美视频一区二区三区在线观看| 欧美本精品男人aⅴ天堂| 亚洲嫩草精品久久| 国产在线不卡一区| 欧美日韩激情一区| 自拍偷拍亚洲激情|