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

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

?? time.c

?? ARM 嵌入式 系統 設計與實例開發 實驗教材 二源碼
?? C
字號:
/* * linux/arch/m68k/atari/time.c * * Atari time and real time clock stuff * * Assembled of parts of former atari/config.c 97-12-18 by Roman Hodek *   * This file is subject to the terms and conditions of the GNU General Public * License.  See the file COPYING in the main directory of this archive * for more details. */#include <linux/types.h>#include <linux/mc146818rtc.h>#include <linux/interrupt.h>#include <linux/init.h>#include <asm/rtc.h>void __initatari_sched_init(void (*timer_routine)(int, void *, struct pt_regs *)){    /* set Timer C data Register */    mfp.tim_dt_c = INT_TICKS;    /* start timer C, div = 1:100 */    mfp.tim_ct_cd = (mfp.tim_ct_cd & 15) | 0x60;     /* install interrupt service routine for MFP Timer C */    request_irq(IRQ_MFP_TIMC, timer_routine, IRQ_TYPE_SLOW,                "timer", timer_routine);}/* ++andreas: gettimeoffset fixed to check for pending interrupt */#define TICK_SIZE 10000  /* This is always executed with interrupts disabled.  */unsigned long atari_gettimeoffset (void){  unsigned long ticks, offset = 0;  /* read MFP timer C current value */  ticks = mfp.tim_dt_c;  /* The probability of underflow is less than 2% */  if (ticks > INT_TICKS - INT_TICKS / 50)    /* Check for pending timer interrupt */    if (mfp.int_pn_b & (1 << 5))      offset = TICK_SIZE;  ticks = INT_TICKS - ticks;  ticks = ticks * 10000L / INT_TICKS;  return ticks + offset;}static void mste_read(struct MSTE_RTC *val){#define COPY(v) val->v=(mste_rtc.v & 0xf)	do {		COPY(sec_ones) ; COPY(sec_tens) ; COPY(min_ones) ; 		COPY(min_tens) ; COPY(hr_ones) ; COPY(hr_tens) ; 		COPY(weekday) ; COPY(day_ones) ; COPY(day_tens) ; 		COPY(mon_ones) ; COPY(mon_tens) ; COPY(year_ones) ;		COPY(year_tens) ;	/* prevent from reading the clock while it changed */	} while (val->sec_ones != (mste_rtc.sec_ones & 0xf));#undef COPY}static void mste_write(struct MSTE_RTC *val){#define COPY(v) mste_rtc.v=val->v	do {		COPY(sec_ones) ; COPY(sec_tens) ; COPY(min_ones) ; 		COPY(min_tens) ; COPY(hr_ones) ; COPY(hr_tens) ; 		COPY(weekday) ; COPY(day_ones) ; COPY(day_tens) ; 		COPY(mon_ones) ; COPY(mon_tens) ; COPY(year_ones) ;		COPY(year_tens) ;	/* prevent from writing the clock while it changed */	} while (val->sec_ones != (mste_rtc.sec_ones & 0xf));#undef COPY}#define	RTC_READ(reg)				\    ({	unsigned char	__val;			\		(void) writeb(reg,&tt_rtc.regsel);	\		__val = tt_rtc.data;		\		__val;				\	})#define	RTC_WRITE(reg,val)			\    do {					\		writeb(reg,&tt_rtc.regsel);	\		tt_rtc.data = (val);		\	} while(0)void atari_mste_gettod (int *yearp, int *monp, int *dayp,			int *hourp, int *minp, int *secp){    int hr24=0, hour;    struct MSTE_RTC val;    mste_rtc.mode=(mste_rtc.mode | 1);    hr24=mste_rtc.mon_tens & 1;    mste_rtc.mode=(mste_rtc.mode & ~1);    mste_read(&val);    *secp = val.sec_ones + val.sec_tens * 10;    *minp = val.min_ones + val.min_tens * 10;    hour = val.hr_ones + val.hr_tens * 10;    if (!hr24) {        if (hour == 12 || hour == 12 + 20)	    hour -= 12;	if (hour >= 20)	    hour += 12 - 20;    }    *hourp = hour;    *dayp = val.day_ones + val.day_tens * 10;    *monp = val.mon_ones + val.mon_tens * 10;    *yearp = val.year_ones + val.year_tens * 10 + 80;	}  void atari_tt_gettod (int *yearp, int *monp, int *dayp,		      int *hourp, int *minp, int *secp){    unsigned char	ctrl;    int hour, pm;    while (!(RTC_READ(RTC_FREQ_SELECT) & RTC_UIP)) ;    while (RTC_READ(RTC_FREQ_SELECT) & RTC_UIP) ;    *secp  = RTC_READ(RTC_SECONDS);    *minp  = RTC_READ(RTC_MINUTES);    hour = RTC_READ(RTC_HOURS);    *dayp  = RTC_READ(RTC_DAY_OF_MONTH);    *monp  = RTC_READ(RTC_MONTH);    *yearp = RTC_READ(RTC_YEAR);    pm = hour & 0x80;    hour &= ~0x80;    ctrl = RTC_READ(RTC_CONTROL);     if (!(ctrl & RTC_DM_BINARY)) {        BCD_TO_BIN(*secp);        BCD_TO_BIN(*minp);        BCD_TO_BIN(hour);        BCD_TO_BIN(*dayp);        BCD_TO_BIN(*monp);        BCD_TO_BIN(*yearp);    }    if (!(ctrl & RTC_24H)) {	if (!pm && hour == 12)	    hour = 0;	else if (pm && hour != 12)            hour += 12;    }    *hourp = hour;    /* Adjust values (let the setup valid) */    *yearp += atari_rtc_year_offset;}#define HWCLK_POLL_INTERVAL	5int atari_mste_hwclk( int op, struct hwclk_time *t ){    int hour, year;    int hr24=0;    struct MSTE_RTC val;        mste_rtc.mode=(mste_rtc.mode | 1);    hr24=mste_rtc.mon_tens & 1;    mste_rtc.mode=(mste_rtc.mode & ~1);    if (op) {        /* write: prepare values */                val.sec_ones = t->sec % 10;        val.sec_tens = t->sec / 10;        val.min_ones = t->min % 10;        val.min_tens = t->min / 10;        hour = t->hour;        if (!hr24) {	    if (hour > 11)		hour += 20 - 12;	    if (hour == 0 || hour == 20)		hour += 12;        }        val.hr_ones = hour % 10;        val.hr_tens = hour / 10;        val.day_ones = t->day % 10;        val.day_tens = t->day / 10;        val.mon_ones = (t->mon+1) % 10;        val.mon_tens = (t->mon+1) / 10;        year = t->year - 80;        val.year_ones = year % 10;        val.year_tens = year / 10;        val.weekday = t->wday;        mste_write(&val);        mste_rtc.mode=(mste_rtc.mode | 1);        val.year_ones = (year % 4);	/* leap year register */        mste_rtc.mode=(mste_rtc.mode & ~1);    }    else {        mste_read(&val);        t->sec = val.sec_ones + val.sec_tens * 10;        t->min = val.min_ones + val.min_tens * 10;        hour = val.hr_ones + val.hr_tens * 10;	if (!hr24) {	    if (hour == 12 || hour == 12 + 20)		hour -= 12;	    if (hour >= 20)                hour += 12 - 20;        }	t->hour = hour;	t->day = val.day_ones + val.day_tens * 10;        t->mon = val.mon_ones + val.mon_tens * 10 - 1;        t->year = val.year_ones + val.year_tens * 10 + 80;        t->wday = val.weekday;    }    return 0;}int atari_tt_hwclk( int op, struct hwclk_time *t ){    int sec=0, min=0, hour=0, day=0, mon=0, year=0, wday=0;     unsigned long 	flags;    unsigned char	ctrl;    int pm = 0;    ctrl = RTC_READ(RTC_CONTROL); /* control registers are                                   * independent from the UIP */    if (op) {        /* write: prepare values */                sec  = t->sec;        min  = t->min;        hour = t->hour;        day  = t->day;        mon  = t->mon + 1;        year = t->year - atari_rtc_year_offset;        wday = t->wday + (t->wday >= 0);                if (!(ctrl & RTC_24H)) {	    if (hour > 11) {		pm = 0x80;		if (hour != 12)		    hour -= 12;	    }	    else if (hour == 0)		hour = 12;        }                if (!(ctrl & RTC_DM_BINARY)) {            BIN_TO_BCD(sec);            BIN_TO_BCD(min);            BIN_TO_BCD(hour);            BIN_TO_BCD(day);            BIN_TO_BCD(mon);            BIN_TO_BCD(year);            if (wday >= 0) BIN_TO_BCD(wday);        }    }        /* Reading/writing the clock registers is a bit critical due to     * the regular update cycle of the RTC. While an update is in     * progress, registers 0..9 shouldn't be touched.     * The problem is solved like that: If an update is currently in     * progress (the UIP bit is set), the process sleeps for a while     * (50ms). This really should be enough, since the update cycle     * normally needs 2 ms.     * If the UIP bit reads as 0, we have at least 244 usecs until the     * update starts. This should be enough... But to be sure,     * additionally the RTC_SET bit is set to prevent an update cycle.     */    while( RTC_READ(RTC_FREQ_SELECT) & RTC_UIP ) {        current->state = TASK_INTERRUPTIBLE;        schedule_timeout(HWCLK_POLL_INTERVAL);    }    save_flags(flags);    cli();    RTC_WRITE( RTC_CONTROL, ctrl | RTC_SET );    if (!op) {        sec  = RTC_READ( RTC_SECONDS );        min  = RTC_READ( RTC_MINUTES );        hour = RTC_READ( RTC_HOURS );        day  = RTC_READ( RTC_DAY_OF_MONTH );        mon  = RTC_READ( RTC_MONTH );        year = RTC_READ( RTC_YEAR );        wday = RTC_READ( RTC_DAY_OF_WEEK );    }    else {        RTC_WRITE( RTC_SECONDS, sec );        RTC_WRITE( RTC_MINUTES, min );        RTC_WRITE( RTC_HOURS, hour + pm);        RTC_WRITE( RTC_DAY_OF_MONTH, day );        RTC_WRITE( RTC_MONTH, mon );        RTC_WRITE( RTC_YEAR, year );        if (wday >= 0) RTC_WRITE( RTC_DAY_OF_WEEK, wday );    }    RTC_WRITE( RTC_CONTROL, ctrl & ~RTC_SET );    restore_flags(flags);    if (!op) {        /* read: adjust values */                if (hour & 0x80) {	    hour &= ~0x80;	    pm = 1;	}	if (!(ctrl & RTC_DM_BINARY)) {            BCD_TO_BIN(sec);            BCD_TO_BIN(min);            BCD_TO_BIN(hour);            BCD_TO_BIN(day);            BCD_TO_BIN(mon);            BCD_TO_BIN(year);            BCD_TO_BIN(wday);        }        if (!(ctrl & RTC_24H)) {	    if (!pm && hour == 12)		hour = 0;	    else if (pm && hour != 12)		hour += 12;        }        t->sec  = sec;        t->min  = min;        t->hour = hour;        t->day  = day;        t->mon  = mon - 1;        t->year = year + atari_rtc_year_offset;        t->wday = wday - 1;    }    return( 0 );}int atari_mste_set_clock_mmss (unsigned long nowtime){    short real_seconds = nowtime % 60, real_minutes = (nowtime / 60) % 60;    struct MSTE_RTC val;    unsigned char rtc_minutes;    mste_read(&val);      rtc_minutes= val.min_ones + val.min_tens * 10;    if ((rtc_minutes < real_minutes         ? real_minutes - rtc_minutes         : rtc_minutes - real_minutes) < 30)    {        val.sec_ones = real_seconds % 10;        val.sec_tens = real_seconds / 10;        val.min_ones = real_minutes % 10;        val.min_tens = real_minutes / 10;        mste_write(&val);    }    else        return -1;    return 0;}int atari_tt_set_clock_mmss (unsigned long nowtime){    int retval = 0;    short real_seconds = nowtime % 60, real_minutes = (nowtime / 60) % 60;    unsigned char save_control, save_freq_select, rtc_minutes;    save_control = RTC_READ (RTC_CONTROL); /* tell the clock it's being set */    RTC_WRITE (RTC_CONTROL, save_control | RTC_SET);    save_freq_select = RTC_READ (RTC_FREQ_SELECT); /* stop and reset prescaler */    RTC_WRITE (RTC_FREQ_SELECT, save_freq_select | RTC_DIV_RESET2);    rtc_minutes = RTC_READ (RTC_MINUTES);    if (!(save_control & RTC_DM_BINARY))        BCD_TO_BIN (rtc_minutes);    /* Since we're only adjusting minutes and seconds, don't interfere       with hour overflow.  This avoids messing with unknown time zones       but requires your RTC not to be off by more than 30 minutes.  */    if ((rtc_minutes < real_minutes         ? real_minutes - rtc_minutes         : rtc_minutes - real_minutes) < 30)        {            if (!(save_control & RTC_DM_BINARY))                {                    BIN_TO_BCD (real_seconds);                    BIN_TO_BCD (real_minutes);                }            RTC_WRITE (RTC_SECONDS, real_seconds);            RTC_WRITE (RTC_MINUTES, real_minutes);        }    else        retval = -1;    RTC_WRITE (RTC_FREQ_SELECT, save_freq_select);    RTC_WRITE (RTC_CONTROL, save_control);    return retval;}/* * Local variables: *  c-indent-level: 4 *  tab-width: 8 * End: */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国内成+人亚洲+欧美+综合在线| av一二三不卡影片| 国产麻豆精品在线观看| av电影天堂一区二区在线观看| 99re免费视频精品全部| 日韩一级完整毛片| 亚洲人成网站在线| 九一久久久久久| 欧美丰满少妇xxxxx高潮对白 | 国产日韩欧美精品一区| 久久精品国产精品青草| av成人免费在线| 久久夜色精品国产噜噜av| 亚洲不卡在线观看| 一本大道久久a久久精二百| 久久久亚洲精华液精华液精华液| 日韩专区在线视频| 色综合久久精品| 久久九九国产精品| 国精产品一区一区三区mba视频| 欧美日韩在线观看一区二区 | 精品久久人人做人人爰| 亚洲国产精品一区二区www在线| jizzjizzjizz欧美| 中文文精品字幕一区二区| 久久精品噜噜噜成人88aⅴ| 欧美日免费三级在线| 亚洲欧美欧美一区二区三区| 国产成人亚洲综合a∨猫咪 | 欧美中文字幕一二三区视频| 成人欧美一区二区三区在线播放| 国产高清在线精品| 国产亚洲精品bt天堂精选| 精品一区二区精品| 精品国产一二三区| 久久精品二区亚洲w码| 日韩情涩欧美日韩视频| 久久69国产一区二区蜜臀| 日韩欧美一区二区久久婷婷| 免费观看一级特黄欧美大片| 欧美一区国产二区| 日本免费新一区视频 | 99国内精品久久| 国产精品国产三级国产| 欧美日韩美少妇| 亚洲成人1区2区| 91精品视频网| 久久精品99国产精品| 久久综合色天天久久综合图片| 久久69国产一区二区蜜臀| 国产视频不卡一区| 91小视频在线| 亚洲国产精品久久不卡毛片| 91精品国产综合久久小美女| 久久电影网电视剧免费观看| 国产调教视频一区| 91麻豆swag| 午夜精品视频一区| 欧美精品一区二区高清在线观看| 国产一区视频导航| 亚洲精品中文字幕乱码三区| 在线观看91av| 高清不卡在线观看av| 一区二区三区蜜桃网| 欧美日本在线视频| 国产高清在线精品| 亚洲午夜免费视频| 久久一日本道色综合| 色综合天天综合色综合av | 欧美三级电影精品| 精品亚洲porn| 亚洲精品乱码久久久久| 精品欧美一区二区三区精品久久 | 国产主播一区二区三区| 亚洲人成小说网站色在线| 日韩一级完整毛片| 99热99精品| 麻豆高清免费国产一区| 中文字幕在线不卡国产视频| 日韩一区二区中文字幕| av不卡一区二区三区| 老司机精品视频线观看86| 亚洲天堂2014| 亚洲精品在线网站| 欧美三级午夜理伦三级中视频| 国产精品一区三区| 日韩在线一区二区三区| 国产精品区一区二区三区| 日韩欧美精品在线| 色猫猫国产区一区二在线视频| 国产一区二三区| 日产欧产美韩系列久久99| 中文字幕中文乱码欧美一区二区| 欧美一卡二卡在线| 欧美三级三级三级| 99久久精品免费看| 国产成人免费高清| 久久国产福利国产秒拍| 日韩黄色免费电影| 亚洲天堂av一区| 国产精品麻豆欧美日韩ww| 欧美变态tickle挠乳网站| 欧美色综合久久| 色一情一乱一乱一91av| 成人精品一区二区三区中文字幕| 韩国成人在线视频| 美国毛片一区二区| 日韩电影在线一区| 午夜电影一区二区三区| 一区二区三区在线免费播放| 亚洲视频一区在线| 国产精品萝li| 国产精品久久久一本精品| 国产婷婷色一区二区三区四区 | 亚洲欧洲另类国产综合| 久久久亚洲午夜电影| 亚洲精品在线电影| 欧美精品一区二区不卡| 欧美精品一区二| 国产日韩综合av| 国产精品理论片| 国产精品成人免费| 国产精品卡一卡二| 成人精品视频一区二区三区| 欧美丰满高潮xxxx喷水动漫| jizz一区二区| 色视频成人在线观看免| 97久久精品人人做人人爽| 不卡电影一区二区三区| 91在线你懂得| 欧美日韩一级视频| 欧美放荡的少妇| 精品少妇一区二区三区日产乱码 | 美女在线一区二区| 蜜臀av一区二区在线观看| 精一区二区三区| 国产精品1区2区3区| 国产一区三区三区| youjizz久久| 91久久人澡人人添人人爽欧美| 欧美视频在线一区| 在线成人av影院| 久久久午夜精品理论片中文字幕| 最好看的中文字幕久久| 丝袜国产日韩另类美女| 国产美女一区二区| 99re6这里只有精品视频在线观看| 欧美性大战久久久久久久| 日韩一区二区三区免费看| 日本一区二区三区四区| 亚洲一级二级在线| 国产最新精品免费| 在线观看欧美黄色| 欧美精品一区二区三区蜜桃| 亚洲免费在线看| 国产在线精品一区二区不卡了| 欧美色爱综合网| 精品国产成人系列| 亚洲靠逼com| 国产成人精品综合在线观看 | 亚洲综合色噜噜狠狠| 日本在线观看不卡视频| 国产91精品露脸国语对白| 在线电影国产精品| 亚洲欧洲99久久| 蜜臀精品久久久久久蜜臀 | 欧美午夜影院一区| 久久久久国产精品人| 夜夜嗨av一区二区三区网页| 国产成人一区在线| 欧美丰满少妇xxxxx高潮对白| 日韩一区中文字幕| 国产真实精品久久二三区| 日本道免费精品一区二区三区| 欧美精品一区二区在线播放| 丝袜国产日韩另类美女| 91视频精品在这里| 国产女主播一区| 久久精品国产免费| 91精品视频网| 亚洲图片欧美综合| 91麻豆文化传媒在线观看| www国产精品av| 免费在线观看视频一区| 欧美午夜片在线看| 亚洲色图清纯唯美| 不卡电影一区二区三区| 久久青草欧美一区二区三区| 蜜桃精品视频在线| 欧美一区二区三区视频在线| 亚洲伊人色欲综合网| 一本色道亚洲精品aⅴ| 国产精品美女久久久久久久网站| 国产另类ts人妖一区二区| 久久综合久久鬼色| 国内精品国产成人国产三级粉色 | 美女视频黄a大片欧美| 欧美日韩黄色影视| 亚洲第一主播视频| 欧美三级日韩三级|