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

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

?? flashpic.c

?? 《嵌入式固件開發》一書的源碼
?? C
字號:
/* flashpic.c: * This file contains the flash-support code that is relocated to * RAM prior to execution. */#include "config.h"#if INCLUDE_FLASH#include "stddefs.h"#include "cpu.h"#include "flashdev.h"#include "flash.h"/* Flasherase(): * Based on the 'snum' value, erase the appropriate sector(s). * Return 0 if success, else -1. */intFlasherase16(struct flashinfo *fdev,int snum){    ftype   val;    ulong   add;    int ret, sector;    ret = 0;    add = (ulong)(fdev->base);*(int *)0xb8000 = snum;*(int *)0xb8004 = 0xdeadbeef;    /* Erase the request sector(s): */    for (sector=0;sector<fdev->sectorcnt;sector++) {        if ((!FlashProtectWindow) &&            (fdev->sectors[sector].protected)) {            add += fdev->sectors[sector].size;            continue;        }        if ((snum == ALL_SECTORS) || (snum == sector)) {            register ulong *lp, *lp1;            int noterased;            /* See if the sector is already erased: */            noterased = 0;            lp = (ulong *)fdev->sectors[sector].begin;             lp1 = (ulong *)((char *)lp + fdev->sectors[sector].size);             if (lp1 == 0) lp1 = (ulong *)0xffffffff;            while(lp < lp1) {                if (*lp++ != 0xffffffff) {                    noterased = 1;                    break;                }            }*(int *)0xb8008 = 0;            if (noterased) {*(int *)0xb8008 = 1;                /* Issue the sector erase command sequence: */                Write_aa_to_555();                Write_55_to_2aa();                Write_80_to_555();                Write_aa_to_555();                Write_55_to_2aa();                Write_30_to_(add);                /* Wait for sector erase to complete or timeout.. */                /* DQ7 polling: wait for D7 to be 1. */                /* DQ6 toggling: wait for D6 to not toggle. */                /* DQ5 timeout: if DQ7 is 0, and DQ5 = 1, timeout. */                while(1) {                    if (Is_ff(add)) {                        if (Is_ff(add))                            break;                    }                    if (D5_Timeout(add)) {                        if (Is_not_ff(add))                            ret = -1;                        break;                    }                }            }        }        add += fdev->sectors[sector].size;    }    /* If the erase failed for some reason, then issue the read/reset     * command sequence prior to returning...     */    if (ret == -1) {*(int *)0xb800c = 0x2;        Write_f0_to_555();        val = Read_555();    }*(int *)0xb800c = 0x3;    return(ret);}/* EndFlasherase(): * Function place holder to determine the "end" of the * sectorerase() function. */voidEndFlasherase16(){}/* Flashwrite(): * Return 0 if successful, else -1. */intFlashwrite16(struct flashinfo *fdev,uchar *dest,uchar *src,long bytecnt){    ftype   val;    long    cnt;    int     i, ret;    uchar   *src1;    ret = 0;    cnt = bytecnt & ~1;    src1 = (uchar *)&val;    /* Since we are working on a 2-byte wide device, every write to the     * device must be aligned on a 2-byte boundary.  If our incoming     * destination address is odd, then decrement the destination by one     * and build a fake source using *dest-1 and src[0]...     */    if (NotAligned(dest)) {        dest--;                src1[0] = *dest;        src1[1] = *src;        /* Flash write command */        Write_aa_to_555();        Write_55_to_2aa();        Write_a0_to_555();        Fwrite(dest,src1);        /* Wait for write to complete or timeout. */        while(1) {            if (Is_Equal(dest,src1)) {                if (Is_Equal(dest,src1))                    break;            }            /* Check D5 for timeout... */            if (D5_Timeout(dest)) {                if (Is_Not_Equal(dest,src1)) {                    ret = -1;                    goto done;                }                break;            }        }        dest += 2;        src++;        bytecnt--;    }    /* Each pass through this loop writes 'fdev->width' bytes...     */    for (i=0;i<cnt;i+=fdev->width) {        /* Flash write command */        Write_aa_to_555();        Write_55_to_2aa();        Write_a0_to_555();                /* Just in case src is not aligned... */        src1[0] = src[0];        src1[1] = src[1];        /* Write the value */        Fwrite(dest,src1);        /* Wait for write to complete or timeout. */        while(1) {            if (Is_Equal(dest,src1)) {                if (Is_Equal(dest,src1))                    break;            }            /* Check D5 for timeout... */            if (D5_Timeout(dest)) {                if (Is_Not_Equal(dest,src1)) {                    ret = -1;                    goto done;                }                break;            }        }        dest += fdev->width;         src += fdev->width;    }    /* Similar to the front end of this function, if the byte count is not     * even, then we have one byte left to write, so we need to write a      * 16-bit value by writing the last byte, plus whatever is already in     * the next flash location.     */    if (cnt != bytecnt) {        src1[0] = *src;        src1[1] = dest[1];        /* Flash write command */        Write_aa_to_555();        Write_55_to_2aa();        Write_a0_to_555();        Fwrite(dest,src1);        /* Wait for write to complete or timeout. */        while(1) {            if (Is_Equal(dest,src1)) {                if (Is_Equal(dest,src1))                    break;            }            /* Check D5 for timeout... */            if (D5_Timeout(dest)) {                if (Is_Not_Equal(dest,src1)) {                    ret = -1;                    goto done;                }                break;            }        }    }done:    /* Read/reset command: */    Write_f0_to_555();    return(ret);}/* EndFlashwrite(): *  Function place holder to determine the "end" of the *  Flashwrite() function. */voidEndFlashwrite16(){}/* Ewrite(): * Erase all sectors that are part of the address space to be written, * then write the data to that address space.  This is basically a * concatenation of flasherase and flashwrite done in one step.  This is * necessary primarily for re-writing the bootcode; because after the boot * code is erased, there is nowhere to return so the re-write must be done * while executing out of ram also. */intFlashewrite16(struct flashinfo *fdev,ftype *dest,ftype *src,int bytecnt){    int i;    ulong   add;    void    (*reset)();    ftype   val, *src1, *dest1;    add = (ulong)(fdev->base);    src1 = src;    dest1 = dest;    /* For each sector, if it overlaps any of the destination space     * then erase that sector.     */    for (i=0;i<fdev->sectorcnt;i++) {        if ((((uchar *)dest) > (fdev->sectors[i].end)) ||            (((uchar *)dest+bytecnt) < (fdev->sectors[i].begin))) {            add += fdev->sectors[i].size;            continue;        }        /* Sector erase command: */        Write_aa_to_555();        Write_55_to_2aa();        Write_80_to_555();        Write_aa_to_555();        Write_55_to_2aa();        Write_30_to_(add);        /* Wait for sector erase to complete or timeout..         * DQ7 polling: wait for D7 to be 1.         * DQ6 toggling: wait for D6 to not toggle.         * DQ5 timeout: if DQ7 is 0, and DQ5 = 1, timeout.         */        while(1) {            if (Is_ff(add)) {                if (Is_ff(add))                    break;            }#if 0            /* Check D5 for timeout...             * In this case, there is nothing to return to             * because the flash was just erased, so just break.             */            if (D5_Timeout(add)) {                reset = RESETFUNC();                reset();            }#endif        }        add += fdev->sectors[i].size;    }    /* Read/reset command: */    Write_f0_to_555();    val = Read_555();    for(i=0;i<bytecnt;i+=fdev->width) {        /* Write command: */        Write_aa_to_555();        Write_55_to_2aa();        Write_a0_to_555();        Fwrite(dest,src);        while(1) {            if (Is_Equal(dest,src)) {                if (Is_Equal(dest,src))                    break;            }#if 0            /* Check D5 for timeout... */            if (D5_Timeout(dest)) {                if (Is_Not_Equal(dest,src))                    return(-1);                break;            }#endif        }        dest++;         src++;    }    /* Issue the read/reset command sequence: */    Write_f0_to_555();    val = Read_555();    /* Wait till flash is readable, or timeout: */    for(i=0;i<FLASH_TIMEOUT;i++) {        if (Is_Equal(dest1,src1))            break;    }    /* Now that the re-programming of flash is complete, reset: */    reset = RESETFUNC();    reset();    return(0);  /* won't get here */}/* EndFlashewrite(): *  Function place holder to determine the "end" of the *  FlashEraseAndWrite() function. */voidEndFlashewrite16(){}/* Flashtype():   Use the AUTOSELECT command sequence to determine the type of device.*/intFlashtype16(struct flashinfo *fdev){    ftype   val;    ushort  man, dev;    ulong   id;    val = Read_0000();    /* Issue the autoselect command sequence: */    Write_aa_to_555();    Write_55_to_2aa();    Write_90_to_555();    man = (ushort)Read_0000();  /* manufacturer ID */    dev = (ushort)Read_0001();  /* device ID */    id = man;    id <<= 16;    id |= dev;    fdev->id = id;    /* Issue the read/reset command sequence: */    Write_f0_to_555();    val = Read_0000();    return((int)(fdev->id));}/* EndFlashtype():    Function place holder to determine the "end" of the    Flashtype() function.*/voidEndFlashtype16(){}#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产欧美日韩另类一区| 国产精品久久精品日日| 欧美视频一区二区三区在线观看| 国产宾馆实践打屁股91| 国产自产v一区二区三区c| 精品亚洲成av人在线观看| 久久国产免费看| 国产伦理精品不卡| 丁香亚洲综合激情啪啪综合| 春色校园综合激情亚洲| 成人激情综合网站| 激情综合色综合久久| 成人性视频免费网站| 成人一道本在线| 91国偷自产一区二区三区成为亚洲经典 | 日韩国产一二三区| 肉色丝袜一区二区| 韩国v欧美v亚洲v日本v| 丁香激情综合五月| 91久久免费观看| 欧美一二三四区在线| 国产偷v国产偷v亚洲高清| 综合网在线视频| 日韩电影免费在线观看网站| 国产精品一区在线观看乱码| av电影在线不卡| 欧美精品久久久久久久久老牛影院| 欧美大肚乱孕交hd孕妇| 国产精品视频一二三区| 日韩精品一二三| 成人国产视频在线观看| 欧美日韩国产综合视频在线观看| 精品1区2区在线观看| 亚洲女同一区二区| 韩国在线一区二区| 色婷婷久久99综合精品jk白丝| 欧美一区二区三区影视| 日韩毛片精品高清免费| 黄色日韩网站视频| 亚洲激情自拍视频| 国产一区91精品张津瑜| 欧美又粗又大又爽| 国产无遮挡一区二区三区毛片日本| 亚洲女同女同女同女同女同69| 久久国产婷婷国产香蕉| 欧美午夜电影一区| 亚洲欧美怡红院| 国产一区二区精品久久91| 欧美精品精品一区| 亚洲人快播电影网| 国产91精品欧美| 欧美v国产在线一区二区三区| 亚洲综合在线视频| a级高清视频欧美日韩| 久久久久久久久一| 日韩精品久久理论片| 在线看日本不卡| 日韩伦理电影网| 99久久精品国产网站| 国产女同性恋一区二区| 国产原创一区二区三区| 欧美不卡激情三级在线观看| 偷拍日韩校园综合在线| 欧美三级电影一区| 一个色在线综合| 综合在线观看色| 99久久久精品| 国产精品美女久久久久av爽李琼 | 午夜精品久久久久久久久久久| aaa欧美日韩| 中文字幕国产一区| 成人国产在线观看| 日韩毛片视频在线看| 色一区在线观看| 亚洲精品第1页| 91成人在线观看喷潮| 亚洲已满18点击进入久久| 欧美午夜精品久久久久久超碰| 一区二区三区精品| 欧美日韩综合一区| 日韩精品成人一区二区三区| 欧美一卡二卡在线| 狠狠久久亚洲欧美| 国产精品美女久久久久aⅴ国产馆| 成人午夜在线免费| 亚洲男人的天堂在线aⅴ视频| 一本一道久久a久久精品| 亚洲一区二区三区四区在线免费观看 | 欧美精品日韩一本| 日韩黄色免费网站| 精品88久久久久88久久久| 国产激情偷乱视频一区二区三区| 欧美韩日一区二区三区四区| 不卡的av网站| 天天影视网天天综合色在线播放| 91精品中文字幕一区二区三区| 精品一区二区免费| 日韩一区在线看| 在线电影一区二区三区| 国产专区综合网| 一区二区三区小说| 精品国产自在久精品国产| 成人免费毛片高清视频| 亚洲成av人影院在线观看网| 欧美成人伊人久久综合网| 不卡av在线网| 奇米影视在线99精品| 欧美国产精品专区| 欧美群妇大交群中文字幕| 韩国视频一区二区| 亚洲一区二区精品久久av| 精品日韩一区二区三区免费视频| aaa国产一区| 久久99国产精品成人| 一区二区三区四区在线播放| 26uuu亚洲综合色| 亚洲国产欧美另类丝袜| 国产亚洲成aⅴ人片在线观看| 在线观看视频91| 国产久卡久卡久卡久卡视频精品| 亚洲国产日韩精品| 亚洲欧洲精品一区二区三区不卡| 91麻豆精品国产综合久久久久久| 99久久精品国产精品久久| 精品一区二区在线免费观看| 亚洲最大的成人av| 国产精品国产三级国产有无不卡 | 亚洲精品成人精品456| 国产欧美一区二区精品仙草咪| 欧美精品九九99久久| 色妹子一区二区| bt欧美亚洲午夜电影天堂| 韩国精品在线观看| 另类小说综合欧美亚洲| 天堂久久久久va久久久久| 亚洲欧美另类综合偷拍| 欧美高清一级片在线观看| 久久免费看少妇高潮| 日韩免费性生活视频播放| 欧美日韩国产综合视频在线观看 | 欧美日韩精品一区二区三区四区| 国产精品99久久久| 裸体一区二区三区| 免费成人性网站| 麻豆91免费看| 九九视频精品免费| 麻豆精品在线观看| 精品一区二区精品| 国产成人综合网站| 高清久久久久久| 粗大黑人巨茎大战欧美成人| 国产91丝袜在线观看| 粉嫩av一区二区三区在线播放 | 极品瑜伽女神91| 麻豆精品一区二区综合av| 精品制服美女丁香| 经典三级一区二区| 丁香网亚洲国际| 波多野结衣中文字幕一区| 99久久精品免费| 欧美无乱码久久久免费午夜一区 | 一区二区三区日韩精品| 亚洲一线二线三线视频| 亚洲成av人片在www色猫咪| 日本特黄久久久高潮| 久久99热这里只有精品| 国产精品美女久久久久久久久久久| 国产精品美女久久久久久久久 | 欧美又粗又大又爽| 欧美精品三级在线观看| www一区二区| 综合自拍亚洲综合图不卡区| 亚洲高清免费在线| 久久99精品国产麻豆不卡| 成人免费电影视频| 欧美伊人久久大香线蕉综合69| 4438成人网| 国产精品欧美久久久久一区二区| 亚洲人被黑人高潮完整版| 人人超碰91尤物精品国产| 国产乱人伦偷精品视频免下载| k8久久久一区二区三区| 欧美性xxxxx极品少妇| www欧美成人18+| 亚洲国产毛片aaaaa无费看| 国产麻豆9l精品三级站| 91丝袜高跟美女视频| 日韩写真欧美这视频| |精品福利一区二区三区| 亚洲成av人片在www色猫咪| 国产寡妇亲子伦一区二区| 欧美视频完全免费看| 欧美国产一区视频在线观看| 香蕉成人伊视频在线观看| 精品一区二区三区免费毛片爱| 色先锋aa成人| 国产欧美一区二区在线观看| 石原莉奈在线亚洲三区| 成人app软件下载大全免费| 欧美不卡一区二区三区|