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

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

?? s3c2410_ts.c

?? linux下基于arm處理器s3c2410x開發板的觸摸屏的驅動程序及測試程序。
?? C
字號:
 /* * drivers/char/s3c2410-ts.c * * touchScreen driver for SAMSUNG S3C2410 *  */#include <linux/config.h>#include <linux/errno.h>#include <linux/kernel.h>#include <linux/module.h>#include <linux/slab.h>#include <linux/init.h>#include <linux/serio.h>#include <linux/delay.h>#include <asm/io.h>#include <asm/irq.h>#include <linux/miscdevice.h>#include <linux/sched.h>#include <linux/poll.h>#include <linux/spinlock.h>#include <linux/coda.h>#include <linux/cdev.h>#include <linux/interrupt.h>#include <linux/devfs_fs_kernel.h>#include <asm/io.h>#include <asm/hardware/clock.h>#include <asm/arch/regs-adc.h>#include <asm/arch/regs-gpio.h>#include <asm/irq.h>#include <linux/delay.h>#include <asm/hardware.h>/* debug macros */#undef DEBUG#ifdef DEBUG#define DPRINTK( x... )	printk("s3c2410-ts: " ##x)#else#define DPRINTK( x... )#endif#define PEN_UP	        0		#define PEN_DOWN	1#define PEN_FLEETING	2#define MAX_TS_BUF	8	/* how many do we want to buffer */#define DEVICE_NAME	"s3c2410-ts"static struct cdev ts = {        .kobj   =       {.name = "ts", },        .owner  =       THIS_MODULE,};typedef struct {  unsigned short pressure;  unsigned short x;  unsigned short y;  unsigned short pad;} TS_RET;typedef struct {	unsigned int penStatus;		/* PEN_UP, PEN_DOWN, PEN_SAMPLE */	TS_RET buf[MAX_TS_BUF];		/* protect against overrun */	unsigned int head, tail;	/* head and tail for queued events */	wait_queue_head_t wq;	spinlock_t lock;	struct fasync_struct *aq;} TS_DEV;static TS_DEV tsdev;#define BUF_HEAD	(tsdev.buf[tsdev.head])#define BUF_TAIL	(tsdev.buf[tsdev.tail])#define INCBUF(x,mod) 	((++(x)) & ((mod) - 1))unsigned long tmp;dev_t chrdev;static void (*tsEvent)(void);#define TS_TIMER_DELAY  (HZ/100) /* 10 ms */static struct timer_list ts_timer;#define wait_down_int()	{ S3C2410_DOWN_INT | S3C2410_ADCTSC_XP_PULL_UP_EN | \		          S3C2410_ADCTSC_XP_AIN | S3C2410_ADCTSC_XM_HIZ | \                          S3C2410_ADCTSC_YP_AIN | S3C2410_ADCTSC_YM_GND | \		          S3C2410_ADCTSC_XY_PST(S3C2410_WAIT_INT_MODE); }#define wait_up_int()	{ S3C2410_UP_INT | S3C2410_ADCTSC_XP_PULL_UP_EN | \                          S3C2410_ADCTSC_XP_AIN | S3C2410_ADCTSC_XM_HIZ | \		          S3C2410_ADCTSC_YP_AIN | S3C2410_ADCTSC_YM_GND | \                          S3C2410_ADCTSC_XY_PST(S3C2410_WAIT_INT_MODE); }#define mode_x_axis()	{ S3C2410_ADCTSC_XP_EXTVLT | S3C2410_ADCTSC_XM_GND | \                          S3C2410_ADCTSC_YP_AIN | S3C2410_ADCTSC_YM_HIZ | \			  S3C2410_ADCTSC_XP_PULL_UP_DIS | \                          S3C2410_ADCTSC_XY_PST(S3C2410_X_AXIS_MODE); }#define mode_y_axis()	{ S3C2410_ADCTSC_XP_AIN | S3C2410_ADCTSC_XM_HIZ | \                          S3C2410_ADCTSC_YP_EXTVLT | S3C2410_ADCTSC_YM_GND | \                     	  S3C2410_ADCTSC_XP_PULL_UP_DIS | \                          S3C2410_ADCTSC_XY_PST(S3C2410_Y_AXIS_MODE); }#define start_adc_x()	{ S3C2410_ADCCON_PRSCEN | S3C2410_ADCCON_PRSCVL(49) | \			  S3C2410_ADCCON_SELMUX(S3C2410_ADC_IN5) | \                          S3C2410_ADCCON_READ_START; }#define start_adc_y()	{ S3C2410_ADCCON_PRSCEN | S3C2410_ADCCON_PRSCVL(49) | \			  S3C2410_ADCCON_SELMUX(S3C2410_ADC_IN7) | \                          S3C2410_ADCCON_READ_START; } static int adc_state = 0;static int x, y;//touch screen coorinatesstatic void __iomem *base_addr;static void tsEvent_raw(void){	if (tsdev.penStatus == PEN_DOWN) {		BUF_HEAD.x = x;		BUF_HEAD.y = y;		BUF_HEAD.pressure = PEN_DOWN;		ts_timer.expires = jiffies + TS_TIMER_DELAY;		add_timer(&ts_timer);	} else {		del_timer(&ts_timer);				BUF_HEAD.x = 0;		BUF_HEAD.y = 0;		BUF_HEAD.pressure = PEN_UP;	}	tsdev.head = INCBUF(tsdev.head, MAX_TS_BUF);	wake_up_interruptible(&(tsdev.wq));	if (tsdev.aq)		kill_fasync(&(tsdev.aq), SIGIO, POLL_IN);}static int tsRead(TS_RET * ts_ret){  spin_lock_irq(&(tsdev.lock));	ts_ret->x = BUF_TAIL.x;	ts_ret->y = BUF_TAIL.y;	ts_ret->pressure = BUF_TAIL.pressure;	tsdev.tail = INCBUF(tsdev.tail, MAX_TS_BUF);	spin_unlock_irq(&(tsdev.lock));        	return sizeof(TS_RET);}static ssize_t s3c2410_ts_read(struct file *filp, char *buffer, size_t count, loff_t *ppos){	TS_RET ts_ret;retry: 	if (tsdev.head != tsdev.tail) {		int count;		count = tsRead(&ts_ret);		if (count) copy_to_user(buffer, (char *)&ts_ret, count);		return count;	} else {		if (filp->f_flags & O_NONBLOCK)			return -EAGAIN;		interruptible_sleep_on(&(tsdev.wq));		if (signal_pending(current))			return -ERESTARTSYS;		goto retry;	}	return sizeof(TS_RET);}static int s3c2410_ts_fasync(int fd, struct file *filp, int mode) {	return fasync_helper(fd, filp, mode, &(tsdev.aq));}static unsigned int s3c2410_ts_poll(struct file *filp, struct poll_table_struct *wait){	poll_wait(filp, &(tsdev.wq), wait);	return (tsdev.head == tsdev.tail) ? 0 : (POLLIN | POLLRDNORM); }static inline void start_ts_adc(void){	adc_state = 0;  writel(mode_x_axis(), base_addr+S3C2410_ADCTSC); //mode_x_axis();  writel(start_adc_x(), base_addr+S3C2410_ADCCON); //	start_adc_x();  tmp=readl(base_addr+S3C2410_ADCCON);  tmp &=~(S3C2410_ADCCON_STDBM);  writel(tmp, base_addr+S3C2410_ADCCON);  readl(base_addr+S3C2410_ADCDAT0);}static inline void s3c2410_get_XY(void){	if (adc_state == 0) { 		adc_state = 1;	  tmp = readl(base_addr+S3C2410_ADCCON);	  tmp &= ~(S3C2410_ADCCON_READ_START);	  writel(tmp, base_addr+S3C2410_ADCCON); // disable_ts_adc();	  y = (readl(base_addr+S3C2410_ADCDAT0) & 0x3ff); // y = (ADCDAT0 & 0x3ff); 	  writel(mode_y_axis(), base_addr+S3C2410_ADCTSC);// mode_y_axis();	  writel(start_adc_y(), base_addr+S3C2410_ADCCON);//	start_adc_y();	  tmp=readl(base_addr+S3C2410_ADCCON);	  tmp &=~(S3C2410_ADCCON_STDBM);	  writel(tmp, base_addr+S3C2410_ADCCON);	  readl(base_addr+S3C2410_ADCDAT1);	}         else if (adc_state == 1) { 		adc_state = 0;    tmp = readl(base_addr+S3C2410_ADCCON);    tmp &= ~(S3C2410_ADCCON_READ_START);    writel(tmp, base_addr+S3C2410_ADCCON); //	disable_ts_adc();     x = (readl(base_addr+S3C2410_ADCDAT1) & 0x3ff); //	x = (ADCDAT1 & 0x3ff);		tsdev.penStatus = PEN_DOWN;		DPRINTK("PEN DOWN: x: %08d, y: %08d\n", x, y);                writel(wait_up_int(), base_addr+S3C2410_ADCTSC);//	wait_up_int();		tsEvent();	}}static irqreturn_t s3c2410_isr_adc(int irq, void *dev_id, struct pt_regs *reg){	spin_lock_irq(&(tsdev.lock));	s3c2410_get_XY();	spin_unlock_irq(&(tsdev.lock));  return IRQ_HANDLED;}static irqreturn_t s3c2410_isr_tc(int irq, void *dev_id, struct pt_regs *reg){	spin_lock_irq(&(tsdev.lock));	if (tsdev.penStatus == PEN_UP) {	  start_ts_adc();	}         else {	  tsdev.penStatus = PEN_UP;	  DPRINTK("PEN UP: x: %08d, y: %08d\n", x, y);    writel(wait_down_int(), base_addr+S3C2410_ADCTSC);//wait_down_int();	  tsEvent();	}	spin_unlock_irq(&(tsdev.lock));        return IRQ_HANDLED;}static void ts_timer_handler(unsigned long data){	spin_lock_irq(&(tsdev.lock));	if (tsdev.penStatus == PEN_DOWN) {		start_ts_adc();	}	spin_unlock_irq(&(tsdev.lock));}static int s3c2410_ts_open(struct inode *inode, struct file *filp){	tsdev.head = tsdev.tail = 0;	tsdev.penStatus = PEN_UP;	init_timer(&ts_timer);	ts_timer.function = ts_timer_handler;	tsEvent = tsEvent_raw;	init_waitqueue_head(&(tsdev.wq));	return 0;}static int s3c2410_ts_release(struct inode *inode, struct file *filp){	del_timer(&ts_timer);	return 0;}static struct file_operations s3c2410_fops = {	owner:	  THIS_MODULE,	open:	  s3c2410_ts_open,	read:	  s3c2410_ts_read,		release:  s3c2410_ts_release,	fasync:	  s3c2410_ts_fasync,	poll:	  s3c2410_ts_poll,};void tsEvent_dummy(void) {}static struct clk       *adc_clock;static int __init s3c2410_ts_probe(struct device *dev){  int ret = 0;	tsEvent = tsEvent_dummy;  adc_clock = clk_get(NULL, "adc");  if (!adc_clock) {      printk(KERN_ERR "failed to get adc clock source\n");      return -ENOENT;  }  clk_use(adc_clock);  clk_enable(adc_clock);  base_addr=ioremap(S3C2410_PA_ADC,0x20);  if (base_addr == NULL) {      printk(KERN_ERR "Failed to remap register block\n");      return -ENOMEM;  }  if(alloc_chrdev_region(&chrdev,0,1,"ts")){      printk(KERN_ERR"Couldn't alloc chrdev region\n");      return 1;  }  cdev_init(&ts,&s3c2410_fops);  if(cdev_add(&ts, chrdev, 1)){    unregister_chrdev_region(chrdev,1);    printk(KERN_ERR"Couldn't register ts driver\n");    return 1;  }  s3c2410_gpio_cfgpin(S3C2410_GPG12, S3C2410_GPG12_XMON);  s3c2410_gpio_cfgpin(S3C2410_GPG13, S3C2410_GPG13_nXPON);  s3c2410_gpio_cfgpin(S3C2410_GPG14, S3C2410_GPG14_YMON);  s3c2410_gpio_cfgpin(S3C2410_GPG15, S3C2410_GPG15_nYPON);  if (request_irq(IRQ_ADC, s3c2410_isr_adc, SA_SAMPLE_RANDOM,          "s3c2410_action", &chrdev)) {          printk(KERN_ERR "Could not allocate ts IRQ_ADC !\n");          iounmap(base_addr);          return -EIO;  }  if (request_irq(IRQ_TC, s3c2410_isr_tc, SA_SAMPLE_RANDOM,                  "s3c2410_action", &chrdev)) {          printk(KERN_ERR "Could not allocate ts IRQ_TC !\n");          iounmap(base_addr);          free_irq(IRQ_ADC,&chrdev);          return -EIO;  }  writel(wait_down_int(), base_addr+S3C2410_ADCTSC);//wait_down_int();  ret = devfs_mk_cdev(chrdev,S_IFCHR | S_IRUGO | S_IWUSR, DEVICE_NAME);  if(ret)      goto out_chrdev;	writel(0xFFFF, base_addr+S3C2410_ADCDLY);  printk(KERN_INFO "Tochu screen successfully loaded\n");	goto out;out_chrdev:        unregister_chrdev(chrdev, DEVICE_NAME);out:        return ret;}static int s3c2410_ts_remove(struct device *dev){	unregister_chrdev(chrdev, DEVICE_NAME);  disable_irq(IRQ_ADC);  disable_irq(IRQ_TC);  free_irq(IRQ_TC,&chrdev);  free_irq(IRQ_ADC,&chrdev);  if (adc_clock) {      clk_disable(adc_clock);      clk_unuse(adc_clock);      clk_put(adc_clock);      adc_clock = NULL;  }  iounmap(base_addr);  return 0;}static struct device_driver s3c2410_ts_driver = { .name           = DEVICE_NAME, .bus            = &platform_bus_type, .probe          = s3c2410_ts_probe, .remove         = s3c2410_ts_remove,};int __init s3c2410_ts_init(void){   return driver_register(&s3c2410_ts_driver);}void __exit s3c2410_ts_exit(void){  driver_unregister(&s3c2410_ts_driver);}module_init(s3c2410_ts_init);module_exit(s3c2410_ts_exit);MODULE_LICENSE("GPL");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91传媒视频在线播放| www精品美女久久久tv| 这里只有精品视频在线观看| 久久综合网色—综合色88| 自拍视频在线观看一区二区| 奇米亚洲午夜久久精品| www.爱久久.com| 欧美va亚洲va在线观看蝴蝶网| 最新热久久免费视频| 久久电影网站中文字幕| 91麻豆免费看| 国产欧美一区二区在线观看| 日韩电影免费在线| 在线一区二区观看| 中文字幕不卡的av| 另类调教123区| 欧美日韩精品欧美日韩精品| 国产精品麻豆久久久| 久久成人免费日本黄色| 欧美丝袜丝交足nylons| 国产精品视频线看| 国产最新精品免费| 日韩一区二区三区在线观看| 一区二区三区中文字幕精品精品| 国产精品亚洲视频| 精品播放一区二区| 免费一区二区视频| 欧美日韩成人一区二区| 一区二区三区成人| 91视频免费播放| 国产精品毛片无遮挡高清| 国产一区二区三区综合| 日韩精品专区在线影院观看| 午夜免费欧美电影| 欧美日本一区二区| 亚欧色一区w666天堂| 欧美日韩欧美一区二区| 夜夜嗨av一区二区三区中文字幕| 91免费观看在线| 亚洲男人电影天堂| 日本大香伊一区二区三区| 亚洲人成精品久久久久久| av中文一区二区三区| 中文字幕中文在线不卡住| 豆国产96在线|亚洲| 中文字幕乱码久久午夜不卡 | 337p亚洲精品色噜噜噜| 国产精品亚洲а∨天堂免在线| 日韩一本二本av| 激情久久五月天| 国产亚洲欧美日韩在线一区| 懂色av噜噜一区二区三区av| 国产欧美日韩一区二区三区在线观看| 国产69精品一区二区亚洲孕妇| 久久久久国产免费免费| 成人精品视频一区二区三区| 国产精品久久久久久一区二区三区| gogo大胆日本视频一区| 亚洲精品成a人| 欧美丰满少妇xxxxx高潮对白| 三级在线观看一区二区| 精品美女一区二区三区| 成人精品视频一区二区三区 | 一区二区在线免费观看| 欧美吻胸吃奶大尺度电影| 天堂一区二区在线| 久久综合色一综合色88| 不卡高清视频专区| 午夜精品爽啪视频| 久久综合国产精品| 一本高清dvd不卡在线观看| 亚洲国产乱码最新视频| 精品国产乱码久久| 99久久国产综合精品女不卡| 首页综合国产亚洲丝袜| 国产婷婷一区二区| 欧美性感一类影片在线播放| 久久99九九99精品| 亚洲精品国产一区二区精华液| 5月丁香婷婷综合| 成人午夜av电影| 丝袜美腿一区二区三区| 国产精品美女久久久久av爽李琼| 欧美日韩亚州综合| 成人av资源在线| 三级影片在线观看欧美日韩一区二区| 久久久777精品电影网影网| 一本久久a久久免费精品不卡| 国产在线播放一区三区四| 亚洲激情在线激情| 久久精子c满五个校花| 欧美日韩视频不卡| 成人综合激情网| 经典一区二区三区| 亚洲高清三级视频| 亚洲人成亚洲人成在线观看图片| 精品美女在线播放| 欧美精选一区二区| 91福利在线播放| 成人h动漫精品| 国产老女人精品毛片久久| 亚洲成av人片在线| 亚洲三级理论片| 欧美国产一区在线| 精品久久久久久久久久久久包黑料 | 久热成人在线视频| 亚洲bt欧美bt精品777| 亚洲欧洲日产国产综合网| 久久久av毛片精品| 成人国产免费视频| 久久丁香综合五月国产三级网站| 一区二区三区在线播放| 亚洲欧美激情小说另类| 久久久久久久久久久电影| 777奇米四色成人影色区| 日韩高清在线观看| 国产精品中文字幕日韩精品| 成人免费毛片aaaaa**| 欧洲日韩一区二区三区| 69p69国产精品| 中日韩免费视频中文字幕| 一区二区三区在线免费| 麻豆精品一区二区三区| 成人一级片在线观看| 91国在线观看| 精品久久久网站| 亚洲黄色性网站| 美脚の诱脚舐め脚责91| 99久久久国产精品| 日韩午夜三级在线| 中文av一区二区| 久久国产精品一区二区| 99精品国产91久久久久久| 精品久久久久香蕉网| 一区二区欧美精品| 国产99久久久国产精品潘金网站| 欧美日韩国产小视频| 亚洲国产高清不卡| 免费三级欧美电影| 欧美亚洲动漫另类| 国产精品女主播在线观看| 麻豆国产一区二区| 日本高清视频一区二区| 欧美国产一区在线| 久久99热狠狠色一区二区| 欧美亚州韩日在线看免费版国语版 | 国产精品情趣视频| 国产真实乱对白精彩久久| 欧美日韩一卡二卡三卡| 亚洲美女视频一区| 国产不卡在线一区| 欧美电影免费观看高清完整版在线观看 | 欧美大白屁股肥臀xxxxxx| 中文字幕一区二区不卡| 麻豆精品久久久| 在线影院国内精品| 久久色在线视频| 亚洲国产aⅴ天堂久久| 国产69精品久久99不卡| 91麻豆精品国产91久久久久久 | 91久久一区二区| 综合久久给合久久狠狠狠97色 | 一区二区三区在线看| 国模娜娜一区二区三区| 欧美日韩日本视频| 亚洲成a人片综合在线| 成人毛片视频在线观看| 欧美成人猛片aaaaaaa| 一区在线中文字幕| 成人福利在线看| 欧美精品一区视频| 日本不卡高清视频| 在线亚洲高清视频| 亚洲一区在线观看免费观看电影高清| 国产成人av电影在线观看| 欧美一二三四区在线| 亚洲综合精品自拍| 欧美色精品在线视频| 亚洲美女一区二区三区| 9i看片成人免费高清| 国产片一区二区| 国产丶欧美丶日本不卡视频| 亚洲国产精品精华液ab| 国产精品一区二区在线看| 久久久国产精品不卡| 国产精品亚洲视频| 国产日产欧美一区| 床上的激情91.| 国产精品久久久久久久浪潮网站 | 国产成人在线网站| 亚洲精品一区二区三区福利| 日韩电影在线一区二区三区| 日韩色视频在线观看| 日韩专区在线视频| 91精品视频网| 国产精品的网站| 亚洲国产电影在线观看| 国产美女一区二区三区| 久久久久国产精品人| 91美女蜜桃在线|