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

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

?? time.c

?? linux嵌入式課程實踐中的一個關于聲卡驅動程序 。
?? 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一区二区三区免费野_久草精品视频
成人精品视频一区| 日韩久久久精品| 精品少妇一区二区三区| 国产精品久久久久久久久晋中 | 色哟哟国产精品| 欧美成人vr18sexvr| 亚洲精品自拍动漫在线| 国产精品99久久久久久有的能看| 欧美日韩精品一区二区| 国产精品无圣光一区二区| 日韩在线一区二区三区| 91免费看视频| 国产精品美女久久久久久久久久久 | 不卡av免费在线观看| 日韩精品一区二区在线| 亚洲mv在线观看| 色综合天天综合| 久久久久久久久岛国免费| 日韩国产在线一| 一本色道久久综合狠狠躁的推荐| 久久精子c满五个校花| 青青草一区二区三区| 欧美在线|欧美| 亚洲人精品午夜| 99麻豆久久久国产精品免费| 久久久久99精品一区| 免费欧美高清视频| 欧美男人的天堂一二区| 一区二区三国产精华液| 91美女片黄在线观看91美女| 日韩理论在线观看| 91视频国产观看| 中文字幕日韩一区| 白白色亚洲国产精品| 欧美激情中文不卡| 国产成人综合在线观看| 久久久美女毛片 | 日韩二区在线观看| 欧美美女bb生活片| 日产国产高清一区二区三区 | 中文字幕不卡在线播放| 成人综合激情网| 综合久久久久久| 欧美在线你懂的| 日韩成人午夜电影| 欧美videofree性高清杂交| 久草在线在线精品观看| 久久精品夜夜夜夜久久| av资源网一区| 亚洲高清免费观看| 欧美一级高清大全免费观看| 极品销魂美女一区二区三区| 国产日韩欧美在线一区| av不卡在线观看| 一区二区三区日韩| 欧美夫妻性生活| 国产在线一区观看| 一区视频在线播放| 欧美三级电影网| 精品一区二区三区免费视频| 中文无字幕一区二区三区| 不卡一区二区中文字幕| 亚洲电影欧美电影有声小说| 精品久久久久久久久久久久包黑料| 国产成人精品亚洲日本在线桃色 | 亚洲高清免费观看| 精品国产伦一区二区三区观看体验 | 亚洲色图清纯唯美| 欧美日本韩国一区| 国产成人三级在线观看| 亚洲永久精品国产| 国产亚洲污的网站| 欧洲一区在线电影| 国产精品一二三在| 亚洲综合一二三区| 久久久久久免费| 欧美日韩在线播放三区四区| 国产精品一区二区久久不卡| 亚洲成a人在线观看| 久久婷婷色综合| 欧美日韩高清一区二区不卡| 国产91在线观看丝袜| 五月综合激情网| 中日韩免费视频中文字幕| 欧美精品久久久久久久多人混战 | 国产精品一级二级三级| 午夜视频一区二区| 中文字幕日韩av资源站| 2014亚洲片线观看视频免费| 日本韩国欧美三级| 国产大片一区二区| 久久福利资源站| 婷婷国产在线综合| 夜夜嗨av一区二区三区中文字幕| 国产女主播一区| 久久欧美中文字幕| 日韩一级黄色大片| 在线播放一区二区三区| 在线看日本不卡| 91蜜桃在线观看| 北条麻妃一区二区三区| 国产精品69毛片高清亚洲| 蜜桃一区二区三区在线观看| 亚洲国产人成综合网站| 亚洲精品国产一区二区精华液| 日本一区二区三区视频视频| 久久青草国产手机看片福利盒子| 日韩精品中文字幕在线不卡尤物| 欧美一区二区三区在线视频| 欧美性生活久久| 在线视频观看一区| 欧洲一区在线电影| 欧美日韩中字一区| 欧美性猛片aaaaaaa做受| 91蝌蚪porny| 91浏览器在线视频| 91麻豆国产在线观看| 波多野结衣中文字幕一区二区三区| 国产盗摄一区二区三区| 国产91精品免费| 成人激情免费网站| 91免费在线视频观看| 91国产免费观看| 欧美日韩久久久一区| 91精品国产综合久久久久| 在线电影国产精品| 日韩欧美区一区二| 久久久精品tv| 国产精品丝袜久久久久久app| 一区在线观看视频| 亚洲五码中文字幕| 日韩精品一级中文字幕精品视频免费观看 | 狠狠色丁香久久婷婷综| 国产成人av电影在线| 99re视频这里只有精品| 欧美三级视频在线| 欧美成人vps| 国产精品久久久久影院老司| 亚洲综合丝袜美腿| 久久精品国产秦先生| 国产成人精品www牛牛影视| 91小视频在线观看| 欧美日韩不卡在线| 欧美精品一区二区在线观看| 1000部国产精品成人观看| 午夜欧美电影在线观看| 国产在线不卡一区| 91美女片黄在线观看91美女| 91精品国产欧美日韩| 欧美激情一区在线| 午夜影院久久久| 国产成人亚洲综合a∨猫咪| 欧美亚洲综合一区| 欧美xxxx老人做受| 亚洲免费观看高清完整版在线| 日本vs亚洲vs韩国一区三区二区| 国产99久久久精品| 欧美日韩国产123区| 国产精品免费aⅴ片在线观看| 亚洲国产综合视频在线观看| 精品制服美女久久| 91福利在线免费观看| 久久天堂av综合合色蜜桃网| 亚洲久本草在线中文字幕| 国产在线精品免费| 欧美人妖巨大在线| 亚洲欧洲成人自拍| 久久精品国产成人一区二区三区| 色综合久久久久综合体| 久久女同精品一区二区| 亚洲成av人片一区二区梦乃 | 亚洲人午夜精品天堂一二香蕉| 久草这里只有精品视频| 欧美日韩一区二区三区四区五区| 国产精品美女久久久久久久久| 美腿丝袜亚洲一区| 欧美亚洲一区二区三区四区| 中文字幕精品—区二区四季| 美女一区二区在线观看| 欧美日本国产一区| 一区二区三区久久| 91亚洲资源网| 国产精品三级av| 国产成人啪午夜精品网站男同| 欧美一区二区女人| 五月婷婷激情综合| 欧美性videosxxxxx| 亚洲三级电影全部在线观看高清| 国产大陆a不卡| 久久久久高清精品| 国产一本一道久久香蕉| 精品久久国产字幕高潮| 天天影视色香欲综合网老头| 欧洲视频一区二区| 亚洲一区二区三区视频在线 | 欧美mv和日韩mv的网站| 日韩精品乱码免费| 91麻豆精品国产91久久久久久| 亚洲成a天堂v人片| 欧美日韩不卡在线|