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

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

?? s3c2410-rtc.c

?? 三星的arm9的處理器
?? C
字號:
/* * Real Time Clock interface for Samsung S3C2410 MPU * * Based on linux/drivers/char/s3c2400-rtc.c * * Copyright (C) 2003 MIZI Research, Inc. * * Author: Chan Gyun Jeong <cgjeong@mizi.com> * $Id: s3c2410-rtc.c,v 1.1.2.1 2003/01/13 14:52:07 tolkien Exp $ * */#include <linux/config.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/miscdevice.h>#include <linux/proc_fs.h>#include <linux/poll.h>#include <linux/rtc.h>#include <asm/hardware.h>#include <asm/uaccess.h>#include <asm/irq.h>#define DRIVER_VERSION		"0.1"#ifndef BCD_TO_BIN#define BCD_TO_BIN(val)		((val)=((val)&15) + ((val)>>4)*10)#endif#ifndef BIN_TO_BCD#define BIN_TO_BCD(val)		((val)=(((val)/10)<<4) + (val)%10)#endif#define RTC_LEAP_YEAR		2000/* Those are the bits from a classic RTC we want to mimic */#ifndef RTC_IRQF#define RTC_IRQF		0x80	/* any of the following 3 is active */#endif#ifndef RTC_PF#define RTC_PF			0x40#endif#ifndef RTC_AF#define RTC_AF			0x20#endif#ifndef RTC_UF#define RTC_UF			0x10#endifstatic unsigned long rtc_status;static unsigned long rtc_irq_data;static struct fasync_struct *rtc_async_queue;static DECLARE_WAIT_QUEUE_HEAD(rtc_wait);extern spinlock_t rtc_lock;static void get_rtc_time(int alm, struct rtc_time *rtc_tm){	spin_lock_irq(&rtc_lock);	if (alm == 1) {		rtc_tm->tm_year = (unsigned char)ALMYEAR & Msk_RTCYEAR;		rtc_tm->tm_mon = (unsigned char)ALMMON & Msk_RTCMON;		rtc_tm->tm_mday = (unsigned char)ALMDAY & Msk_RTCDAY;		rtc_tm->tm_hour = (unsigned char)ALMHOUR & Msk_RTCHOUR;		rtc_tm->tm_min = (unsigned char)ALMMIN & Msk_RTCMIN;		rtc_tm->tm_sec = (unsigned char)ALMSEC & Msk_RTCSEC;	}	else { read_rtc_bcd_time:		rtc_tm->tm_year = (unsigned char)BCDYEAR & Msk_RTCYEAR;		rtc_tm->tm_mon = (unsigned char)BCDMON & Msk_RTCMON;		rtc_tm->tm_mday = (unsigned char)BCDDAY & Msk_RTCDAY;		rtc_tm->tm_hour = (unsigned char)BCDHOUR & Msk_RTCHOUR;		rtc_tm->tm_min = (unsigned char)BCDMIN & Msk_RTCMIN;		rtc_tm->tm_sec = (unsigned char)BCDSEC & Msk_RTCSEC;		if (rtc_tm->tm_sec == 0) {			/* Re-read all BCD registers in case of BCDSEC is 0.			   See RTC section at the manual for more info. */			goto read_rtc_bcd_time;		}	}	spin_unlock_irq(&rtc_lock);	BCD_TO_BIN(rtc_tm->tm_year);	BCD_TO_BIN(rtc_tm->tm_mon);	BCD_TO_BIN(rtc_tm->tm_mday);	BCD_TO_BIN(rtc_tm->tm_hour);	BCD_TO_BIN(rtc_tm->tm_min);	BCD_TO_BIN(rtc_tm->tm_sec);	/* The epoch of tm_year is 1900 */	rtc_tm->tm_year += RTC_LEAP_YEAR - 1900;	/* tm_mon starts at 0, but rtc month starts at 1 */	rtc_tm->tm_mon--;}static int set_rtc_time(int alm, struct rtc_time *rtc_tm){	unsigned char year, mon, day, hour, min, sec;	if (rtc_tm->tm_year < (RTC_LEAP_YEAR - 1900)) {		/* The year must be higher or equal than 2000 */		return -EINVAL;	}	year = (rtc_tm->tm_year + 1900) - RTC_LEAP_YEAR;	mon = rtc_tm->tm_mon + 1; /* tm_mon starts at zero */	day = rtc_tm->tm_mday;	hour = rtc_tm->tm_hour;	min = rtc_tm->tm_min;	sec = rtc_tm->tm_sec;	BIN_TO_BCD(sec);	BIN_TO_BCD(min);	BIN_TO_BCD(hour);	BIN_TO_BCD(day);	BIN_TO_BCD(mon);	BIN_TO_BCD(year);	spin_lock_irq(&rtc_lock); 	/* Enable RTC control */	RTCCON |= RTCCON_EN; 	if (alm) {		ALMSEC = sec & Msk_RTCSEC;		ALMMIN = min & Msk_RTCMIN;		ALMHOUR = hour & Msk_RTCHOUR;		ALMDAY = day & Msk_RTCDAY;		ALMMON = mon & Msk_RTCMON;		ALMYEAR = year & Msk_RTCYEAR;	} 	else {		BCDSEC = sec & Msk_RTCSEC;		BCDMIN = min & Msk_RTCMIN;		BCDHOUR = hour & Msk_RTCHOUR;		BCDDAY = day & Msk_RTCDAY;		BCDMON = mon & Msk_RTCMON;		BCDYEAR = year & Msk_RTCYEAR;	}	/* Disable RTC control */	RTCCON &= ~RTCCON_EN;	spin_unlock_irq(&rtc_lock);	return 0;}static void rtc_alm_interrupt(int irq, void *dev_id, struct pt_regs *regs){	spin_lock (&rtc_lock);	/* Update IRQ data & counter */	rtc_irq_data += 0x100;	rtc_irq_data |= (RTC_AF|RTC_IRQF);	spin_unlock (&rtc_lock);	/* Now do the rest of the actions */	wake_up_interruptible(&rtc_wait);		kill_fasync (&rtc_async_queue, SIGIO, POLL_IN);}static int rtc_open(struct inode *inode, struct file *file){	MOD_INC_USE_COUNT;	spin_lock_irq(&rtc_lock);	if (rtc_status) {		spin_unlock_irq(&rtc_lock);		MOD_DEC_USE_COUNT;		return -EBUSY;	}	rtc_status = 1;	rtc_irq_data = 0;	spin_unlock_irq(&rtc_lock);	return 0;}static int rtc_release(struct inode *inode, struct file *file){	/*	 * Turn off all interrupts once the device is no longer	 * in use, and clear the data.	 */	spin_lock_irq(&rtc_lock);#ifndef CONFIG_MIZI	/* Disable alarm interrupt */	RTCCON |= RTCCON_EN;	RTCALM = RTCALM_DIS;	RTCCON &= ~RTCCON_EN;#endif	rtc_status = 0;	rtc_irq_data = 0;	spin_unlock_irq(&rtc_lock);	MOD_DEC_USE_COUNT;	return 0;}static int rtc_fasync (int fd, struct file *filp, int on){	return fasync_helper (fd, filp, on, &rtc_async_queue);}static unsigned int rtc_poll(struct file *file, poll_table *wait){	unsigned long l;	poll_wait (file, &rtc_wait, wait);	spin_lock_irq (&rtc_lock);	l = rtc_irq_data;	spin_unlock_irq (&rtc_lock);	if (l != 0) { 		return POLLIN | POLLRDNORM;	}	return 0;}ssize_t rtc_read(struct file *file, char *buf, size_t count, loff_t *ppos){	DECLARE_WAITQUEUE(wait, current);	unsigned long data;	ssize_t retval;	if (count < sizeof(unsigned long))		return -EINVAL;	add_wait_queue(&rtc_wait, &wait);	set_current_state(TASK_INTERRUPTIBLE);	while (1) {		spin_lock_irq (&rtc_lock);		data = rtc_irq_data;		rtc_irq_data = 0;		spin_unlock_irq (&rtc_lock);		if (data != 0) {			break;		}				if (file->f_flags & O_NONBLOCK) {			retval = -EAGAIN;			goto out;		}		if (signal_pending(current)) {			retval = -ERESTARTSYS;			goto out;		}		schedule();	}	retval = put_user(data, (unsigned long *)buf);	if (!retval)		retval = sizeof(unsigned long);out:	set_current_state(TASK_RUNNING);	remove_wait_queue(&rtc_wait, &wait);	return retval;}static int rtc_ioctl(struct inode *inode, struct file *file,		     unsigned int cmd, unsigned long arg){	struct rtc_time tm;	switch (cmd) {		/* Alarm interrupt on/off */	case RTC_AIE_ON:		spin_lock_irq (&rtc_lock);		RTCCON |= RTCCON_EN; 		RTCALM = RTCALM_EN; 		RTCCON &= ~RTCCON_EN;		spin_unlock_irq (&rtc_lock);		return 0;	case RTC_AIE_OFF:		spin_lock_irq (&rtc_lock);		RTCCON |= RTCCON_EN;		RTCALM = RTCALM_DIS;		RTCCON &= ~RTCCON_EN;		spin_unlock_irq (&rtc_lock);		return 0;		/* Update interrupt on/off */	case RTC_UIE_ON:	case RTC_UIE_OFF:		/* Periodic interrupt on/off */	case RTC_PIE_ON:	case RTC_PIE_OFF:				case RTC_WIE_ON:	case RTC_WIE_OFF:		/* Periodic interrupt freq get/set */	case RTC_IRQP_READ:	case RTC_IRQP_SET:		/* Epoch get/set */	case RTC_EPOCH_READ:	case RTC_EPOCH_SET:	case RTC_WKALM_SET:	case RTC_WKALM_RD:		/* Not supported */		return -EINVAL;		/* Alarm get/set */	case RTC_ALM_READ:		get_rtc_time(1, &tm);		return copy_to_user((void *)arg, &tm, sizeof(tm)) ? 			-EFAULT : 0;	case RTC_ALM_SET:		if (copy_from_user(&tm, (struct rtc_time*) arg, sizeof(tm))) {			return -EFAULT;		}		return set_rtc_time(1, &tm);		/* Time get/set */	case RTC_RD_TIME:		get_rtc_time(0, &tm);		return copy_to_user((void *)arg, &tm, sizeof(tm)) ? 			-EFAULT : 0;	case RTC_SET_TIME:		if (copy_from_user(&tm, (struct rtc_time*) arg, sizeof(tm))) {			return -EFAULT;		}		return set_rtc_time(0, &tm);	default:		return -EINVAL;	}}#ifdef CONFIG_PROC_FSstatic int rtc_read_proc(char *page, char **start, off_t off,                         int count, int *eof, void *data){	char *p = page;	int len;	struct rtc_time tm;	get_rtc_time(0, &tm);	p += sprintf(p, "rtc_time\t: %02d:%02d:%02d\n"		     "rtc_date\t: %04d-%02d-%02d\n"		     "rtc_epoch\t: %04d\n",		     tm.tm_hour, tm.tm_min, tm.tm_sec,		     tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, 		     RTC_LEAP_YEAR);	get_rtc_time(1, &tm);	p += sprintf(p, "alarm_time\t: %02d:%02d:%02d\n"		     "alarm_date\t: %04d-%02d-%02d\n",		     tm.tm_hour, tm.tm_min, tm.tm_sec,		     tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday);	p += sprintf(p, "alarm_IRQ\t: %s\n", 		     (RTCALM & RTCALM_EN) ? "yes" : "no" );	len = (p - page) - off;	if (len < 0)		len = 0;	*eof = (len <= count) ? 1 : 0;	*start = page + off;	return len;}#endifstatic struct file_operations rtc_fops = {	owner:		THIS_MODULE,	llseek:		no_llseek,	read:		rtc_read,	poll:		rtc_poll,	ioctl:		rtc_ioctl,	open:		rtc_open,	release:	rtc_release,	fasync:		rtc_fasync,};static struct miscdevice rtc_dev={	RTC_MINOR,	"rtc",	&rtc_fops};static int __init rtc_init(void){	int ret;	misc_register(&rtc_dev);#ifdef CONFIG_PROC_FS	create_proc_read_entry("driver/rtc", 0, 0, rtc_read_proc, NULL);#endif	ret = request_irq(IRQ_RTC, rtc_alm_interrupt, SA_INTERRUPT, 			  "RTC Alarm", NULL);	if (ret) {		printk("s3c2410-rtc: failed to register IRQ_RTC(%d)\n", 		       IRQ_RTC);		goto IRQ_RTC_failed;	}	printk("S3C2410 Real Time Clock Driver v" DRIVER_VERSION "\n");	return 0;IRQ_RTC_failed:#ifdef CONFIG_PROC_FS	remove_proc_entry("driver/rtc", NULL);#endif	misc_deregister(&rtc_dev);	return ret;}static void __exit rtc_exit(void){	free_irq(IRQ_RTC, NULL);#ifdef CONFIG_PROC_FS	remove_proc_entry("driver/rtc", NULL);#endif	misc_deregister(&rtc_dev);}module_init(rtc_init);module_exit(rtc_exit);MODULE_AUTHOR("Chan Gyun Jeong <cgjeong@mizi.com>");MODULE_LICENSE("GPL");MODULE_DESCRIPTION("Real Time Clock interface for Samsung S3C2410 MPU");EXPORT_NO_SYMBOLS;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
天天操天天干天天综合网| 欧美亚洲图片小说| 97国产精品videossex| 日韩一区二区电影在线| 亚洲丝袜美腿综合| 精品一区二区三区av| 91浏览器在线视频| 久久久精品人体av艺术| 偷拍与自拍一区| 91成人国产精品| 国产精品久久久久永久免费观看 | 欧美电影一区二区三区| 国产精品免费视频一区| 精品一区免费av| 4438x成人网最大色成网站| 日韩一区欧美小说| 高清不卡一二三区| 欧美大黄免费观看| 日韩不卡免费视频| 欧美乱妇15p| 亚洲成人黄色影院| 欧美日韩国产一级片| 亚洲综合成人在线视频| 91丨九色丨国产丨porny| 国产免费成人在线视频| 国内精品国产三级国产a久久| 日韩一区二区在线看片| 欧美aaa在线| 欧美一区二区久久久| 日韩专区欧美专区| 欧美男生操女生| 天涯成人国产亚洲精品一区av| 在线观看免费亚洲| 亚洲亚洲人成综合网络| 在线欧美日韩精品| 亚洲最大成人综合| 欧美日韩在线不卡| 日本成人在线网站| 精品久久久久久无| 国产精品99久久久久久宅男| 国产色爱av资源综合区| www.欧美色图| 亚洲色图.com| 精品视频1区2区| 奇米影视一区二区三区小说| 精品国产sm最大网站免费看| 国产一区999| 亚洲丝袜制服诱惑| 欧美人与禽zozo性伦| 蜜臀a∨国产成人精品| 久久久久久久久久久久电影| 成人av动漫在线| 亚洲综合激情网| 欧美一级二级在线观看| 国产成人超碰人人澡人人澡| 1024国产精品| 欧美精品99久久久**| 国内精品免费在线观看| 亚洲色图一区二区| 欧美一级免费观看| 国产成人a级片| 亚洲一级电影视频| 26uuu亚洲婷婷狠狠天堂| 99精品久久免费看蜜臀剧情介绍| 亚洲444eee在线观看| 欧美精品一区二| 一本久久a久久免费精品不卡| 视频一区欧美精品| 亚洲国产成人午夜在线一区 | 日韩欧美精品三级| 99视频国产精品| 美美哒免费高清在线观看视频一区二区 | 色婷婷一区二区三区四区| 日韩精品成人一区二区三区| 国产欧美精品一区二区色综合朱莉| 色综合天天综合网天天看片| 久久精品国产澳门| 亚洲综合一区二区三区| 国产日韩欧美高清| 日韩一级免费观看| 欧美性色黄大片| 成人免费视频免费观看| 日本三级亚洲精品| 一区二区三区成人在线视频| 国产欧美日韩精品一区| 91.xcao| 日本精品免费观看高清观看| 国产精品白丝jk白祙喷水网站 | 日韩欧美你懂的| 91蝌蚪国产九色| 国产乱国产乱300精品| 日韩不卡一二三区| 亚洲国产三级在线| 亚洲精品乱码久久久久久黑人| 久久久久久久久久久久久夜| 欧美一区二区三区在线观看| 欧美日韩一区小说| 一本大道久久a久久精二百| 国产一区二区主播在线| 日韩av不卡一区二区| 亚洲国产日产av| 亚洲激情五月婷婷| 亚洲精品成人在线| 日韩毛片高清在线播放| 国产精品日产欧美久久久久| 国产亚洲午夜高清国产拍精品 | 成人深夜视频在线观看| 极品少妇一区二区| 另类的小说在线视频另类成人小视频在线 | 欧美成人精品3d动漫h| 欧美性猛片xxxx免费看久爱| 色婷婷av一区二区三区之一色屋| 91蝌蚪porny| 91麻豆福利精品推荐| 91在线无精精品入口| 99re这里只有精品6| 99久久久无码国产精品| www.亚洲激情.com| 色综合天天综合网天天看片 | www.久久精品| 91免费在线视频观看| 欧美自拍丝袜亚洲| 欧美人与z0zoxxxx视频| 日韩一区二区麻豆国产| 久久这里都是精品| 中文幕一区二区三区久久蜜桃| 国产精品久久久久久久午夜片| 国产精品久久久爽爽爽麻豆色哟哟| 亚洲视频一区二区在线观看| 亚洲一区二区欧美日韩| 日本视频中文字幕一区二区三区| 六月婷婷色综合| 成人深夜视频在线观看| 欧美中文字幕久久| 欧美一区二区成人| 国产日产精品一区| 一区二区在线观看不卡| 亚洲成av人片在www色猫咪| 精品一区二区三区免费观看 | 亚洲免费观看高清完整| 亚洲一区二区三区激情| 精品一区二区免费看| 岛国一区二区三区| 欧美午夜免费电影| 久久久99久久| 一区二区日韩电影| 久久97超碰国产精品超碰| av色综合久久天堂av综合| 欧美日韩一区二区在线视频| 久久这里只精品最新地址| 亚洲品质自拍视频网站| 日韩国产高清在线| 不卡的av电影| 欧美一区二区三区四区视频| 国产精品国产自产拍高清av王其| 亚洲第一二三四区| 国产精品 欧美精品| 欧美日本视频在线| 国产精品福利一区二区| 免费黄网站欧美| 欧亚洲嫩模精品一区三区| 久久久久九九视频| 天堂一区二区在线| 97久久精品人人爽人人爽蜜臀| 日韩一卡二卡三卡国产欧美| 亚洲天堂a在线| 国产精品1区2区| 91精品国产福利在线观看| 亚洲日本va午夜在线影院| 韩日精品视频一区| 制服丝袜日韩国产| 亚洲一区二区在线播放相泽| 成人97人人超碰人人99| 久久久久久亚洲综合| 日本视频一区二区三区| 欧美视频一区二区| 最新久久zyz资源站| 国产经典欧美精品| 精品福利一区二区三区免费视频| 天堂成人国产精品一区| 一本色道久久综合亚洲91| 国产清纯在线一区二区www| 久久av老司机精品网站导航| 91超碰这里只有精品国产| 亚洲国产三级在线| 欧美日韩一区不卡| 亚洲一区二区视频在线| 在线观看亚洲成人| 亚洲精品美国一| 91福利在线播放| 亚洲精品国产成人久久av盗摄| 北条麻妃国产九九精品视频| 国产日产欧产精品推荐色| 国产成人免费高清| 国产日韩欧美精品在线| 国产寡妇亲子伦一区二区| 久久众筹精品私拍模特| 国产成人夜色高潮福利影视| 久久精品亚洲精品国产欧美| 国产高清精品久久久久|