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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? sh_timer.c

?? QEMU 0.91 source code, supports ARM processor including S3C24xx series
?? C
字號:
/* * SuperH Timer modules. * * Copyright (c) 2007 Magnus Damm * Based on arm_timer.c by Paul Brook * Copyright (c) 2005-2006 CodeSourcery. * * This code is licenced under the GPL. */#include "hw.h"#include "sh.h"#include "qemu-timer.h"//#define DEBUG_TIMER#define TIMER_TCR_TPSC          (7 << 0)#define TIMER_TCR_CKEG          (3 << 3)#define TIMER_TCR_UNIE          (1 << 5)#define TIMER_TCR_ICPE          (3 << 6)#define TIMER_TCR_UNF           (1 << 8)#define TIMER_TCR_ICPF          (1 << 9)#define TIMER_TCR_RESERVED      (0x3f << 10)#define TIMER_FEAT_CAPT   (1 << 0)#define TIMER_FEAT_EXTCLK (1 << 1)typedef struct {    ptimer_state *timer;    uint32_t tcnt;    uint32_t tcor;    uint32_t tcr;    uint32_t tcpr;    int freq;    int int_level;    int old_level;    int feat;    int enabled;    struct intc_source *irq;} sh_timer_state;/* Check all active timers, and schedule the next timer interrupt. */static void sh_timer_update(sh_timer_state *s){    int new_level = s->int_level && (s->tcr & TIMER_TCR_UNIE);    if (new_level != s->old_level)      sh_intc_toggle_source(s->irq, 0, new_level ? 1 : -1);    s->old_level = s->int_level;    s->int_level = new_level;}static uint32_t sh_timer_read(void *opaque, target_phys_addr_t offset){    sh_timer_state *s = (sh_timer_state *)opaque;    switch (offset >> 2) {    case 0:        return s->tcor;    case 1:        return ptimer_get_count(s->timer);    case 2:        return s->tcr | (s->int_level ? TIMER_TCR_UNF : 0);    case 3:        if (s->feat & TIMER_FEAT_CAPT)            return s->tcpr;    default:        cpu_abort (cpu_single_env, "sh_timer_read: Bad offset %x\n",                   (int)offset);        return 0;    }}static void sh_timer_write(void *opaque, target_phys_addr_t offset,                            uint32_t value){    sh_timer_state *s = (sh_timer_state *)opaque;    int freq;    switch (offset >> 2) {    case 0:        s->tcor = value;        ptimer_set_limit(s->timer, s->tcor, 0);        break;    case 1:        s->tcnt = value;        ptimer_set_count(s->timer, s->tcnt);        break;    case 2:        if (s->enabled) {            /* Pause the timer if it is running.  This may cause some               inaccuracy dure to rounding, but avoids a whole lot of other               messyness.  */            ptimer_stop(s->timer);        }        freq = s->freq;        /* ??? Need to recalculate expiry time after changing divisor.  */        switch (value & TIMER_TCR_TPSC) {        case 0: freq >>= 2; break;        case 1: freq >>= 4; break;        case 2: freq >>= 6; break;        case 3: freq >>= 8; break;        case 4: freq >>= 10; break;	case 6:	case 7: if (s->feat & TIMER_FEAT_EXTCLK) break;	default: cpu_abort (cpu_single_env,			   "sh_timer_write: Reserved TPSC value\n"); break;        }        switch ((value & TIMER_TCR_CKEG) >> 3) {	case 0: break;        case 1:        case 2:        case 3: if (s->feat & TIMER_FEAT_EXTCLK) break;	default: cpu_abort (cpu_single_env,			   "sh_timer_write: Reserved CKEG value\n"); break;        }        switch ((value & TIMER_TCR_ICPE) >> 6) {	case 0: break;        case 2:        case 3: if (s->feat & TIMER_FEAT_CAPT) break;	default: cpu_abort (cpu_single_env,			   "sh_timer_write: Reserved ICPE value\n"); break;        }	if ((value & TIMER_TCR_UNF) == 0)            s->int_level = 0;	value &= ~TIMER_TCR_UNF;	if ((value & TIMER_TCR_ICPF) && (!(s->feat & TIMER_FEAT_CAPT)))            cpu_abort (cpu_single_env,		       "sh_timer_write: Reserved ICPF value\n");	value &= ~TIMER_TCR_ICPF; /* capture not supported */	if (value & TIMER_TCR_RESERVED)            cpu_abort (cpu_single_env,		       "sh_timer_write: Reserved TCR bits set\n");        s->tcr = value;        ptimer_set_limit(s->timer, s->tcor, 0);        ptimer_set_freq(s->timer, freq);        if (s->enabled) {            /* Restart the timer if still enabled.  */            ptimer_run(s->timer, 0);        }        break;    case 3:        if (s->feat & TIMER_FEAT_CAPT) {            s->tcpr = value;	    break;	}    default:        cpu_abort (cpu_single_env, "sh_timer_write: Bad offset %x\n",                   (int)offset);    }    sh_timer_update(s);}static void sh_timer_start_stop(void *opaque, int enable){    sh_timer_state *s = (sh_timer_state *)opaque;#ifdef DEBUG_TIMER    printf("sh_timer_start_stop %d (%d)\n", enable, s->enabled);#endif    if (s->enabled && !enable) {        ptimer_stop(s->timer);    }    if (!s->enabled && enable) {        ptimer_run(s->timer, 0);    }    s->enabled = !!enable;#ifdef DEBUG_TIMER    printf("sh_timer_start_stop done %d\n", s->enabled);#endif}static void sh_timer_tick(void *opaque){    sh_timer_state *s = (sh_timer_state *)opaque;    s->int_level = s->enabled;    sh_timer_update(s);}static void *sh_timer_init(uint32_t freq, int feat, struct intc_source *irq){    sh_timer_state *s;    QEMUBH *bh;    s = (sh_timer_state *)qemu_mallocz(sizeof(sh_timer_state));    s->freq = freq;    s->feat = feat;    s->tcor = 0xffffffff;    s->tcnt = 0xffffffff;    s->tcpr = 0xdeadbeef;    s->tcor = 0;    s->enabled = 0;    s->irq = irq;    bh = qemu_bh_new(sh_timer_tick, s);    s->timer = ptimer_init(bh);    /* ??? Save/restore.  */    return s;}typedef struct {    void *timer[3];    int level[3];    uint32_t tocr;    uint32_t tstr;    target_phys_addr_t base;    int feat;} tmu012_state;static uint32_t tmu012_read(void *opaque, target_phys_addr_t offset){    tmu012_state *s = (tmu012_state *)opaque;#ifdef DEBUG_TIMER    printf("tmu012_read 0x%lx\n", (unsigned long) offset);#endif    offset -= s->base;    if (offset >= 0x20) {        if (!(s->feat & TMU012_FEAT_3CHAN))	    cpu_abort (cpu_single_env, "tmu012_write: Bad channel offset %x\n",		       (int)offset);        return sh_timer_read(s->timer[2], offset - 0x20);    }    if (offset >= 0x14)        return sh_timer_read(s->timer[1], offset - 0x14);    if (offset >= 0x08)        return sh_timer_read(s->timer[0], offset - 0x08);    if (offset == 4)        return s->tstr;    if ((s->feat & TMU012_FEAT_TOCR) && offset == 0)        return s->tocr;    cpu_abort (cpu_single_env, "tmu012_write: Bad offset %x\n",	       (int)offset);    return 0;}static void tmu012_write(void *opaque, target_phys_addr_t offset,                        uint32_t value){    tmu012_state *s = (tmu012_state *)opaque;#ifdef DEBUG_TIMER    printf("tmu012_write 0x%lx 0x%08x\n", (unsigned long) offset, value);#endif    offset -= s->base;    if (offset >= 0x20) {        if (!(s->feat & TMU012_FEAT_3CHAN))	    cpu_abort (cpu_single_env, "tmu012_write: Bad channel offset %x\n",		       (int)offset);        sh_timer_write(s->timer[2], offset - 0x20, value);	return;    }    if (offset >= 0x14) {        sh_timer_write(s->timer[1], offset - 0x14, value);	return;    }    if (offset >= 0x08) {        sh_timer_write(s->timer[0], offset - 0x08, value);	return;    }    if (offset == 4) {        sh_timer_start_stop(s->timer[0], value & (1 << 0));        sh_timer_start_stop(s->timer[1], value & (1 << 1));        if (s->feat & TMU012_FEAT_3CHAN)            sh_timer_start_stop(s->timer[2], value & (1 << 2));	else            if (value & (1 << 2))                cpu_abort (cpu_single_env, "tmu012_write: Bad channel\n");	s->tstr = value;	return;    }    if ((s->feat & TMU012_FEAT_TOCR) && offset == 0) {        s->tocr = value & (1 << 0);    }}static CPUReadMemoryFunc *tmu012_readfn[] = {    tmu012_read,    tmu012_read,    tmu012_read};static CPUWriteMemoryFunc *tmu012_writefn[] = {    tmu012_write,    tmu012_write,    tmu012_write};void tmu012_init(target_phys_addr_t base, int feat, uint32_t freq,		 struct intc_source *ch0_irq, struct intc_source *ch1_irq,		 struct intc_source *ch2_irq0, struct intc_source *ch2_irq1){    int iomemtype;    tmu012_state *s;    int timer_feat = (feat & TMU012_FEAT_EXTCLK) ? TIMER_FEAT_EXTCLK : 0;    s = (tmu012_state *)qemu_mallocz(sizeof(tmu012_state));    s->base = base;    s->feat = feat;    s->timer[0] = sh_timer_init(freq, timer_feat, ch0_irq);    s->timer[1] = sh_timer_init(freq, timer_feat, ch1_irq);    if (feat & TMU012_FEAT_3CHAN)        s->timer[2] = sh_timer_init(freq, timer_feat | TIMER_FEAT_CAPT,				    ch2_irq0); /* ch2_irq1 not supported */    iomemtype = cpu_register_io_memory(0, tmu012_readfn,                                       tmu012_writefn, s);    cpu_register_physical_memory(base, 0x00001000, iomemtype);    /* ??? Save/restore.  */}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线观看网站黄不卡| 国产精品成人一区二区艾草| 色老汉av一区二区三区| 懂色中文一区二区在线播放| 国产精品一区一区| 国模娜娜一区二区三区| 日本va欧美va精品发布| 奇米影视一区二区三区小说| 美女一区二区三区在线观看| 日韩精品电影一区亚洲| 美国av一区二区| 韩国av一区二区三区四区 | 国产成人精品亚洲午夜麻豆| 久久精品国产在热久久| 久88久久88久久久| 国产精品77777| 国产激情一区二区三区| 成人激情文学综合网| 在线观看亚洲精品| 67194成人在线观看| 日韩一区二区免费视频| 久久中文字幕电影| 日韩毛片高清在线播放| 亚洲一区二区三区小说| 午夜精品福利视频网站| 欧美a一区二区| 国产精品91xxx| 91精品福利视频| 91精品国产色综合久久久蜜香臀| 日韩亚洲欧美在线观看| 国产视频一区二区在线| 首页国产欧美久久| 久久成人久久爱| 成人妖精视频yjsp地址| 欧美日韩dvd在线观看| 久久免费看少妇高潮| 亚洲日本电影在线| 麻豆成人av在线| 99精品视频在线免费观看| 精品1区2区3区| 欧美国产精品一区二区| 午夜电影久久久| 高清久久久久久| 欧美人体做爰大胆视频| 中文字幕欧美激情一区| 视频在线观看国产精品| 91丨porny丨在线| 久久久蜜桃精品| 亚洲精品免费视频| 国产一区在线看| 制服丝袜中文字幕一区| 国产精品女主播在线观看| 蜜臀av一区二区在线观看| 欧洲另类一二三四区| 欧美国产日产图区| 精品无人码麻豆乱码1区2区| 欧美日韩综合不卡| 亚洲品质自拍视频网站| 国产精品123| 日韩精品一区二区三区三区免费| 亚洲男人的天堂在线观看| 顶级嫩模精品视频在线看| 欧美大度的电影原声| 亚洲123区在线观看| 91精品福利视频| 亚洲视频狠狠干| 国产成人免费xxxxxxxx| 欧美精品一区二区三区一线天视频 | 青青草国产精品亚洲专区无| 色一区在线观看| 亚洲欧美日本韩国| 成人综合婷婷国产精品久久蜜臀| 精品福利在线导航| 久久超碰97中文字幕| 欧美一卡2卡3卡4卡| 日韩高清在线不卡| 欧美日韩国产在线观看| 亚洲久草在线视频| 91丨九色丨黑人外教| 亚洲免费在线观看| 成人av综合一区| 中文字幕中文字幕一区二区| 国产成人精品网址| 欧美经典一区二区三区| 高清不卡在线观看| 中文字幕字幕中文在线中不卡视频| 成人短视频下载| 亚洲人妖av一区二区| 色婷婷久久久综合中文字幕| 有码一区二区三区| 欧美日韩成人在线| 久久99精品国产麻豆婷婷洗澡| 精品久久一区二区三区| 韩国三级在线一区| 国产精品久久一卡二卡| 91丨porny丨国产入口| 亚洲影视在线播放| 欧美日韩电影一区| 久久99精品久久久久久| 亚洲国产精品成人综合| 99国产精品一区| 依依成人精品视频| 日韩精品一区二区三区视频 | 秋霞成人午夜伦在线观看| 717成人午夜免费福利电影| 精品亚洲国内自在自线福利| 日本一区二区免费在线观看视频 | 国产欧美日韩一区二区三区在线观看| 美女视频黄频大全不卡视频在线播放| 精品久久久影院| 成人av免费在线观看| 五月天中文字幕一区二区| 精品国产91洋老外米糕| 成人a级免费电影| 日韩福利视频网| 欧美国产精品劲爆| 7777精品久久久大香线蕉| 成人一道本在线| 蜜桃av一区二区在线观看| 国产欧美一区二区三区在线看蜜臀 | 精品无人码麻豆乱码1区2区 | 99精品热视频| 亚洲成在线观看| 国产精品久久久久久一区二区三区| 欧美性色黄大片| 国产精品99久久久久久有的能看 | 色综合久久九月婷婷色综合| 亚洲综合激情另类小说区| 日韩精品专区在线影院观看| 色哟哟一区二区| 国产伦精品一区二区三区在线观看| 一区二区免费在线| 久久久亚洲午夜电影| 日韩午夜电影在线观看| 91天堂素人约啪| 97精品国产露脸对白| 精品无人码麻豆乱码1区2区| 日本不卡不码高清免费观看| 日韩一区日韩二区| 欧美国产一区二区在线观看| 亚洲精品一区二区三区香蕉| 欧美精品色综合| 欧美影视一区在线| 色综合夜色一区| 97超碰欧美中文字幕| 粉嫩av亚洲一区二区图片| 久久精品噜噜噜成人av农村| 视频精品一区二区| 亚洲mv在线观看| 亚洲bt欧美bt精品| 一二三区精品视频| 一区二区三区欧美亚洲| 亚洲视频免费看| 综合久久久久久| 亚洲区小说区图片区qvod| 日韩美女啊v在线免费观看| 亚洲人成亚洲人成在线观看图片| 国产精品美女久久久久久久久久久 | 欧美变态口味重另类| 日韩精品一区在线| 精品久久久影院| 国产肉丝袜一区二区| 国产精品乱码久久久久久 | 欧美色爱综合网| 91国在线观看| 欧美裸体一区二区三区| 在线视频观看一区| 欧美精品99久久久**| 日韩一区二区免费在线观看| 精品国产一区二区三区av性色| 欧美一区二区免费观在线| 亚洲欧美在线观看| 一区二区三区中文在线观看| 亚洲国产精品久久不卡毛片| 视频一区二区中文字幕| 国产在线不卡一卡二卡三卡四卡| 国产成人在线电影| 99re免费视频精品全部| 欧美日韩在线播放三区四区| 日韩久久久久久| 国产精品久久综合| 视频一区国产视频| 国产乱人伦偷精品视频不卡| 99久久伊人网影院| 在线播放日韩导航| 欧美国产亚洲另类动漫| 丝袜美腿成人在线| 成熟亚洲日本毛茸茸凸凹| 日本道免费精品一区二区三区| 555www色欧美视频| 国产亚洲一区二区在线观看| 一区二区欧美国产| 国产激情精品久久久第一区二区| 99国产精品久久久久久久久久| 欧美三日本三级三级在线播放| 久久综合九色综合欧美就去吻| 亚洲视频在线观看一区| 捆绑紧缚一区二区三区视频 | 国产自产视频一区二区三区| 色综合久久六月婷婷中文字幕|