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

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

?? m48t59.c

?? QEMU 0.91 source code, supports ARM processor including S3C24xx series
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * QEMU M48T59 and M48T08 NVRAM emulation for PPC PREP and Sparc platforms * * Copyright (c) 2003-2005, 2007 Jocelyn Mayer * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */#include "hw.h"#include "nvram.h"#include "isa.h"#include "qemu-timer.h"#include "sysemu.h"//#define DEBUG_NVRAM#if defined(DEBUG_NVRAM)#define NVRAM_PRINTF(fmt, args...) do { printf(fmt , ##args); } while (0)#else#define NVRAM_PRINTF(fmt, args...) do { } while (0)#endif/* * The M48T02, M48T08 and M48T59 chips are very similar. The newer '59 has * alarm and a watchdog timer and related control registers. In the * PPC platform there is also a nvram lock function. */struct m48t59_t {    /* Model parameters */    int type; // 2 = m48t02, 8 = m48t08, 59 = m48t59    /* Hardware parameters */    qemu_irq IRQ;    int mem_index;    target_phys_addr_t mem_base;    uint32_t io_base;    uint16_t size;    /* RTC management */    time_t   time_offset;    time_t   stop_time;    /* Alarm & watchdog */    time_t   alarm;    struct QEMUTimer *alrm_timer;    struct QEMUTimer *wd_timer;    /* NVRAM storage */    uint8_t  lock;    uint16_t addr;    uint8_t *buffer;};/* Fake timer functions *//* Generic helpers for BCD */static inline uint8_t toBCD (uint8_t value){    return (((value / 10) % 10) << 4) | (value % 10);}static inline uint8_t fromBCD (uint8_t BCD){    return ((BCD >> 4) * 10) + (BCD & 0x0F);}/* RTC management helpers */static void get_time (m48t59_t *NVRAM, struct tm *tm){    time_t t;    t = time(NULL) + NVRAM->time_offset;#ifdef _WIN32    memcpy(tm,localtime(&t),sizeof(*tm));#else    if (rtc_utc)        gmtime_r (&t, tm);    else        localtime_r (&t, tm) ;#endif}static void set_time (m48t59_t *NVRAM, struct tm *tm){    time_t now, new_time;    new_time = mktime(tm);    now = time(NULL);    NVRAM->time_offset = new_time - now;}/* Alarm management */static void alarm_cb (void *opaque){    struct tm tm, tm_now;    uint64_t next_time;    m48t59_t *NVRAM = opaque;    qemu_set_irq(NVRAM->IRQ, 1);    if ((NVRAM->buffer[0x1FF5] & 0x80) == 0 &&	(NVRAM->buffer[0x1FF4] & 0x80) == 0 &&	(NVRAM->buffer[0x1FF3] & 0x80) == 0 &&	(NVRAM->buffer[0x1FF2] & 0x80) == 0) {	/* Repeat once a month */	get_time(NVRAM, &tm_now);	memcpy(&tm, &tm_now, sizeof(struct tm));	tm.tm_mon++;	if (tm.tm_mon == 13) {	    tm.tm_mon = 1;	    tm.tm_year++;	}	next_time = mktime(&tm);    } else if ((NVRAM->buffer[0x1FF5] & 0x80) != 0 &&	       (NVRAM->buffer[0x1FF4] & 0x80) == 0 &&	       (NVRAM->buffer[0x1FF3] & 0x80) == 0 &&	       (NVRAM->buffer[0x1FF2] & 0x80) == 0) {	/* Repeat once a day */	next_time = 24 * 60 * 60 + mktime(&tm_now);    } else if ((NVRAM->buffer[0x1FF5] & 0x80) != 0 &&	       (NVRAM->buffer[0x1FF4] & 0x80) != 0 &&	       (NVRAM->buffer[0x1FF3] & 0x80) == 0 &&	       (NVRAM->buffer[0x1FF2] & 0x80) == 0) {	/* Repeat once an hour */	next_time = 60 * 60 + mktime(&tm_now);    } else if ((NVRAM->buffer[0x1FF5] & 0x80) != 0 &&	       (NVRAM->buffer[0x1FF4] & 0x80) != 0 &&	       (NVRAM->buffer[0x1FF3] & 0x80) != 0 &&	       (NVRAM->buffer[0x1FF2] & 0x80) == 0) {	/* Repeat once a minute */	next_time = 60 + mktime(&tm_now);    } else {	/* Repeat once a second */	next_time = 1 + mktime(&tm_now);    }    qemu_mod_timer(NVRAM->alrm_timer, next_time * 1000);    qemu_set_irq(NVRAM->IRQ, 0);}static void get_alarm (m48t59_t *NVRAM, struct tm *tm){#ifdef _WIN32    memcpy(tm,localtime(&NVRAM->alarm),sizeof(*tm));#else    if (rtc_utc)        gmtime_r (&NVRAM->alarm, tm);    else        localtime_r (&NVRAM->alarm, tm);#endif}static void set_alarm (m48t59_t *NVRAM, struct tm *tm){    NVRAM->alarm = mktime(tm);    if (NVRAM->alrm_timer != NULL) {        qemu_del_timer(NVRAM->alrm_timer);        if (NVRAM->alarm - time(NULL) > 0)            qemu_mod_timer(NVRAM->alrm_timer, NVRAM->alarm * 1000);    }}/* Watchdog management */static void watchdog_cb (void *opaque){    m48t59_t *NVRAM = opaque;    NVRAM->buffer[0x1FF0] |= 0x80;    if (NVRAM->buffer[0x1FF7] & 0x80) {	NVRAM->buffer[0x1FF7] = 0x00;	NVRAM->buffer[0x1FFC] &= ~0x40;        /* May it be a hw CPU Reset instead ? */        qemu_system_reset_request();    } else {	qemu_set_irq(NVRAM->IRQ, 1);	qemu_set_irq(NVRAM->IRQ, 0);    }}static void set_up_watchdog (m48t59_t *NVRAM, uint8_t value){    uint64_t interval; /* in 1/16 seconds */    NVRAM->buffer[0x1FF0] &= ~0x80;    if (NVRAM->wd_timer != NULL) {        qemu_del_timer(NVRAM->wd_timer);        if (value != 0) {            interval = (1 << (2 * (value & 0x03))) * ((value >> 2) & 0x1F);            qemu_mod_timer(NVRAM->wd_timer, ((uint64_t)time(NULL) * 1000) +                           ((interval * 1000) >> 4));        }    }}/* Direct access to NVRAM */void m48t59_write (void *opaque, uint32_t addr, uint32_t val){    m48t59_t *NVRAM = opaque;    struct tm tm;    int tmp;    if (addr > 0x1FF8 && addr < 0x2000)	NVRAM_PRINTF("%s: 0x%08x => 0x%08x\n", __func__, addr, val);    /* check for NVRAM access */    if ((NVRAM->type == 2 && addr < 0x7f8) ||        (NVRAM->type == 8 && addr < 0x1ff8) ||        (NVRAM->type == 59 && addr < 0x1ff0))        goto do_write;    /* TOD access */    switch (addr) {    case 0x1FF0:        /* flags register : read-only */        break;    case 0x1FF1:        /* unused */        break;    case 0x1FF2:        /* alarm seconds */        tmp = fromBCD(val & 0x7F);        if (tmp >= 0 && tmp <= 59) {            get_alarm(NVRAM, &tm);            tm.tm_sec = tmp;            NVRAM->buffer[0x1FF2] = val;            set_alarm(NVRAM, &tm);        }        break;    case 0x1FF3:        /* alarm minutes */        tmp = fromBCD(val & 0x7F);        if (tmp >= 0 && tmp <= 59) {            get_alarm(NVRAM, &tm);            tm.tm_min = tmp;            NVRAM->buffer[0x1FF3] = val;            set_alarm(NVRAM, &tm);        }        break;    case 0x1FF4:        /* alarm hours */        tmp = fromBCD(val & 0x3F);        if (tmp >= 0 && tmp <= 23) {            get_alarm(NVRAM, &tm);            tm.tm_hour = tmp;            NVRAM->buffer[0x1FF4] = val;            set_alarm(NVRAM, &tm);        }        break;    case 0x1FF5:        /* alarm date */        tmp = fromBCD(val & 0x1F);        if (tmp != 0) {            get_alarm(NVRAM, &tm);            tm.tm_mday = tmp;            NVRAM->buffer[0x1FF5] = val;            set_alarm(NVRAM, &tm);        }        break;    case 0x1FF6:        /* interrupts */        NVRAM->buffer[0x1FF6] = val;        break;    case 0x1FF7:        /* watchdog */        NVRAM->buffer[0x1FF7] = val;        set_up_watchdog(NVRAM, val);        break;    case 0x1FF8:    case 0x07F8:        /* control */       NVRAM->buffer[addr] = (val & ~0xA0) | 0x90;        break;    case 0x1FF9:    case 0x07F9:        /* seconds (BCD) */	tmp = fromBCD(val & 0x7F);	if (tmp >= 0 && tmp <= 59) {	    get_time(NVRAM, &tm);	    tm.tm_sec = tmp;	    set_time(NVRAM, &tm);	}       if ((val & 0x80) ^ (NVRAM->buffer[addr] & 0x80)) {	    if (val & 0x80) {		NVRAM->stop_time = time(NULL);	    } else {		NVRAM->time_offset += NVRAM->stop_time - time(NULL);		NVRAM->stop_time = 0;	    }	}       NVRAM->buffer[addr] = val & 0x80;        break;    case 0x1FFA:    case 0x07FA:        /* minutes (BCD) */	tmp = fromBCD(val & 0x7F);	if (tmp >= 0 && tmp <= 59) {	    get_time(NVRAM, &tm);	    tm.tm_min = tmp;	    set_time(NVRAM, &tm);	}        break;    case 0x1FFB:    case 0x07FB:        /* hours (BCD) */	tmp = fromBCD(val & 0x3F);	if (tmp >= 0 && tmp <= 23) {	    get_time(NVRAM, &tm);	    tm.tm_hour = tmp;	    set_time(NVRAM, &tm);	}        break;    case 0x1FFC:    case 0x07FC:        /* day of the week / century */	tmp = fromBCD(val & 0x07);	get_time(NVRAM, &tm);	tm.tm_wday = tmp;	set_time(NVRAM, &tm);        NVRAM->buffer[addr] = val & 0x40;        break;    case 0x1FFD:    case 0x07FD:        /* date */	tmp = fromBCD(val & 0x1F);	if (tmp != 0) {	    get_time(NVRAM, &tm);	    tm.tm_mday = tmp;	    set_time(NVRAM, &tm);	}        break;    case 0x1FFE:    case 0x07FE:        /* month */	tmp = fromBCD(val & 0x1F);	if (tmp >= 1 && tmp <= 12) {	    get_time(NVRAM, &tm);	    tm.tm_mon = tmp - 1;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区成人| 精品国精品国产尤物美女| 一级日本不卡的影视| 99精品国产热久久91蜜凸| 亚洲欧洲精品天堂一级| 一本一道久久a久久精品| 亚洲一区二区影院| 日韩一级在线观看| 国产成人欧美日韩在线电影| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 国产精品久久久久久久久快鸭 | 色综合中文字幕国产 | 中文字幕第一页久久| 91网站在线观看视频| 亚洲激情av在线| 日韩精品自拍偷拍| 不卡影院免费观看| 午夜精品123| 久久久久9999亚洲精品| 91蜜桃传媒精品久久久一区二区| 亚洲一卡二卡三卡四卡无卡久久| 欧美日韩一本到| 国产乱一区二区| 亚洲美女视频在线| 欧美成人精品1314www| jlzzjlzz国产精品久久| 肉丝袜脚交视频一区二区| 26uuu亚洲婷婷狠狠天堂| 91片黄在线观看| 国产在线国偷精品免费看| 亚洲欧美怡红院| 欧美r级电影在线观看| 91麻豆成人久久精品二区三区| 日韩精品亚洲一区| 中文字幕一区二区三区精华液 | 国产精品网站一区| 欧美日韩日本视频| 国产大陆a不卡| 天堂精品中文字幕在线| 国产精品视频yy9299一区| 欧美视频三区在线播放| 成人手机电影网| 精品中文av资源站在线观看| 亚洲精品va在线观看| 国产三级精品视频| 日韩欧美国产一区二区在线播放| 色先锋资源久久综合| 国产老女人精品毛片久久| 午夜精品福利久久久| 一区在线中文字幕| 久久久精品天堂| 日韩免费高清av| 国产色婷婷亚洲99精品小说| 欧美日韩国产经典色站一区二区三区| 大白屁股一区二区视频| 奇米精品一区二区三区在线观看一| 亚洲欧美另类小说视频| 国产亚洲综合在线| 欧美mv和日韩mv的网站| 在线成人免费视频| 欧美无砖专区一中文字| 91一区二区三区在线观看| 成人免费观看男女羞羞视频| 国产一区二区在线视频| 激情综合五月婷婷| 免费成人深夜小野草| 午夜精品福利一区二区蜜股av| 一区二区三区欧美激情| 成人免费在线视频| 国产精品黄色在线观看| 国产精品素人视频| 国产精品国产a| 国产精品卡一卡二| 中文字幕av在线一区二区三区| 精品国产一区二区精华| 精品久久一区二区| 精品捆绑美女sm三区| 精品精品国产高清a毛片牛牛| 日韩精品在线看片z| 欧美tickling网站挠脚心| 精品国产伦一区二区三区观看体验| 欧美大尺度电影在线| 欧美成人三级电影在线| 亚洲精品一区在线观看| 久久久久久久久蜜桃| 中文字幕av资源一区| 亚洲日本在线看| 亚洲一区二区三区四区在线免费观看 | 麻豆成人久久精品二区三区小说| 日韩—二三区免费观看av| 奇米色777欧美一区二区| 久久国产尿小便嘘嘘尿| 国产一区二区精品久久| 成a人片国产精品| 在线免费观看视频一区| 欧美一级欧美三级在线观看| 日韩视频免费观看高清完整版在线观看| 精品免费日韩av| 日本一区二区视频在线观看| 国产精品不卡视频| 国产a精品视频| av中文字幕不卡| 欧美视频精品在线| 欧美一区二区精品久久911| 国产亚洲欧美在线| 亚洲免费在线电影| 人人狠狠综合久久亚洲| 成人免费看片app下载| 欧美视频精品在线| 久久精品网站免费观看| 亚洲乱码日产精品bd| 久久精品国产亚洲高清剧情介绍| 丁香桃色午夜亚洲一区二区三区| 色94色欧美sute亚洲线路二| 日韩欧美亚洲国产精品字幕久久久 | 欧美一区二区三区精品| 久久精品视频一区二区三区| 亚洲一区二区三区在线播放| 国产精品一区久久久久| 91高清视频在线| 久久综合狠狠综合| 亚洲一区二区在线免费看| 国产乱码精品一区二区三区忘忧草| 91视频国产观看| 精品久久久久久最新网址| 亚洲欧美日韩在线播放| 黑人精品欧美一区二区蜜桃| 日本高清无吗v一区| 久久香蕉国产线看观看99| 亚洲成av人片一区二区梦乃 | 青青草原综合久久大伊人精品优势| 高清在线成人网| 日韩三级视频在线观看| 亚洲青青青在线视频| 国产揄拍国内精品对白| 欧美日韩大陆一区二区| 国产精品麻豆视频| 国产综合一区二区| 在线综合视频播放| 亚洲人成网站在线| 国产乱子伦视频一区二区三区| 7777精品伊人久久久大香线蕉完整版 | 成人app下载| 精品福利在线导航| 天天av天天翘天天综合网 | 黄色日韩网站视频| 欧美猛男男办公室激情| 亚洲美女屁股眼交3| 成人性生交大合| 久久综合狠狠综合| 美女被吸乳得到大胸91| 欧美日韩成人综合天天影院| 亚洲精品伦理在线| 99精品欧美一区二区三区小说| 国产欧美一区二区三区沐欲 | bt7086福利一区国产| 久久色成人在线| 国产资源在线一区| 精品国精品国产| 国产在线不卡一区| 亚洲精品在线电影| 国产自产视频一区二区三区| 欧美大黄免费观看| 麻豆高清免费国产一区| 日韩一区和二区| 理论电影国产精品| 久久综合网色—综合色88| 韩国毛片一区二区三区| 26uuu久久天堂性欧美| 精品一区二区av| 久久久精品天堂| av在线不卡电影| 亚洲免费观看高清| 色婷婷香蕉在线一区二区| 亚洲精品日韩综合观看成人91| 欧美在线视频日韩| 亚洲综合偷拍欧美一区色| 欧美日韩免费一区二区三区视频| 午夜天堂影视香蕉久久| 欧美一区二区三区爱爱| 国内精品国产成人国产三级粉色| 久久久天堂av| 91视频一区二区三区| 亚洲综合精品自拍| 91精品国产综合久久小美女| 老司机精品视频一区二区三区| 久久免费国产精品| av一二三不卡影片| 亚洲高清在线视频| 日韩一级片在线观看| 成人一二三区视频| 亚洲国产cao| 久久日韩粉嫩一区二区三区| 91香蕉视频mp4| 日韩经典一区二区| 国产人久久人人人人爽| 欧美亚洲动漫另类| 久久av中文字幕片| 成人免费小视频| 欧美一二区视频|