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

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

?? flashpic.c

?? 《嵌入式固件開發》一書的源碼
?? C
字號:
/* flashpic.c:   This file contains the flash-support code that is relocated to   RAM prior to execution.  This file supports all bus widths, dependent   on the definition of WIDTH8, WIDTH16, or WIDTH32 on the command line.   Refer to flash.h for definition of the width-dependent macros.*/#include "config.h"#if INCLUDE_FLASHtypedef unsigned char uchar;typedef unsigned short ushort;typedef unsigned long ulong;typedef volatile unsigned char vuchar;typedef volatile unsigned short vushort;typedef volatile unsigned long vulong;typedef volatile unsigned int vuint;typedef volatile int vint;#include "cpu.h"#include "flashdev.h"#include "flash.h"#include "endian.h"extern struct flashinfo Fdev;extern int FlashProtectWindow;/* 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);    /* 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);             while(lp < lp1) {                if (*lp++ != 0xffffffff) {                    noterased = 1;                    break;                }            }            if (noterased) {                /* 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) {        Write_f0_to_555();        val = Read_5555();    }    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){    int     i, ret;    long    cnt;    uchar   *src1;    ftype   val;    /* If destination address is not properly aligned, then build a fake   */    /* source buffer based on the current value in dest[-1] and src[0].    */    /* Then call this function to do that 2-byte operation.  Once that     */    /* completes, simply increment dest and src by 1 and continue in this  */    /* context. */    if (NotAligned(dest)) {        uchar buf[2];        buf[0] = *(dest-1);        buf[1] = *src;        Flashwrite16(fdev,dest-1,buf,2);        dest++; src++; bytecnt--;    }    /* Each pass through this loop writes 'fdev->width' bytes... */    ret = 0;    cnt = bytecnt & ~1;    src1 = (uchar *)&val;onemore:    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;    }    /* If bytecount was odd... */    /* If cnt != bytecnt then bytecnt is odd, so one more byte must be */    /* written to flash.  To do this, the one byte must be combined with */    /* the next byte that is already stored in flash; then re-written... */    if (cnt != bytecnt) {        val = (ftype)*dest | ((ftype)(*src) << 8);        src = (uchar *)&val;        bytecnt = cnt = 1;        val = ecs(val);        goto onemore;    }done:    /* Read/reset command: */    Write_f0_to_555();    val = Read_5555();    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_5555();    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_5555();    /* Wait till flash is readable, then reset: */    while(1) {        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无套直看片红桃| 欧美videos大乳护士334| 亚洲国产欧美另类丝袜| 欧美电影免费观看高清完整版在线 | 国产电影精品久久禁18| 亚洲激情五月婷婷| 国产婷婷一区二区| 免费精品视频最新在线| 1024成人网色www| 69p69国产精品| 91官网在线免费观看| 国产91精品露脸国语对白| 国产色一区二区| 日韩丝袜情趣美女图片| 一个色妞综合视频在线观看| 久久综合色播五月| 91精选在线观看| 91福利精品视频| 欧美亚州韩日在线看免费版国语版| 国产剧情一区二区三区| 国产另类ts人妖一区二区| 国产麻豆精品theporn| 亚洲欧洲精品天堂一级| 欧美精品一区二区在线播放| 欧美一区二区在线观看| 日韩视频不卡中文| 欧美日韩电影在线| 欧美日本免费一区二区三区| 日本精品一区二区三区高清 | 亚洲自拍偷拍九九九| 中文字幕欧美一| 国产精品国产三级国产aⅴ中文| 欧美大黄免费观看| 欧美电影一区二区| 欧美精品一区二区三区在线播放| 亚洲免费三区一区二区| 久久99精品网久久| 欧美图区在线视频| 国产三级一区二区三区| 五月天亚洲精品| 成人黄色小视频在线观看| 欧美日韩综合色| 国产肉丝袜一区二区| 午夜精品久久一牛影视| av亚洲精华国产精华| 精品久久久久99| 日日夜夜精品免费视频| 99精品视频在线观看免费| 精品国精品国产| 天天操天天干天天综合网| 成人午夜av影视| 欧美精品一区二区蜜臀亚洲| 五月激情综合色| 91福利视频在线| 国产精品久久久久久久久快鸭| 国内精品在线播放| 日韩欧美成人一区| 三级在线观看一区二区| 欧洲精品在线观看| 亚洲丝袜美腿综合| 色综合天天综合在线视频| 国产亚洲精品超碰| 国产成人免费9x9x人网站视频| 3atv一区二区三区| 午夜精品久久久久久久久| 久久激情综合网| 91丨porny丨蝌蚪视频| 一本大道av一区二区在线播放 | 亚洲精品国产一区二区三区四区在线| 国产一区二区三区高清播放| 欧美一区二区免费观在线| 天使萌一区二区三区免费观看| 一本大道久久a久久精二百| 国产精品久久久久久亚洲毛片| 国产91精品露脸国语对白| 久久只精品国产| 丁香婷婷综合色啪| 亚洲人123区| 欧美日韩视频在线观看一区二区三区| 国产精品色婷婷| 91色porny| 亚洲主播在线播放| 5858s免费视频成人| 美女视频网站黄色亚洲| 久久看人人爽人人| 成人aaaa免费全部观看| 综合中文字幕亚洲| 欧美精品久久久久久久久老牛影院| 日韩高清不卡一区二区| 欧美成人女星排行榜| 国产iv一区二区三区| 亚洲嫩草精品久久| 欧美日韩国产另类一区| 久久99久久久久久久久久久| 国产日韩三级在线| 色婷婷久久99综合精品jk白丝| 亚洲成人一区二区| 精品国产乱码久久久久久免费| 成人激情校园春色| 亚洲成人先锋电影| 国产欧美日韩精品a在线观看| 972aa.com艺术欧美| 奇米影视7777精品一区二区| 精品福利一区二区三区 | 亚洲成人第一页| 精品美女在线观看| 成人成人成人在线视频| 婷婷丁香久久五月婷婷| 久久久午夜电影| 91极品美女在线| 国产不卡在线视频| 亚洲成人免费电影| 国产女同互慰高潮91漫画| 欧美日韩在线观看一区二区 | 久久女同互慰一区二区三区| av电影一区二区| 蜜桃视频免费观看一区| 亚洲人成在线观看一区二区| 日韩三级.com| 在线精品观看国产| 成人午夜视频福利| 麻豆91精品视频| 亚洲va欧美va人人爽午夜| 国产精品视频一二三区 | 成人免费视频caoporn| 天堂资源在线中文精品| 日韩理论片一区二区| 久久久久久**毛片大全| 91精品国产色综合久久不卡蜜臀| 91麻豆国产福利精品| 国产sm精品调教视频网站| 奇米综合一区二区三区精品视频| 亚洲精品福利视频网站| 中文字幕精品三区| 久久久91精品国产一区二区三区| 欧美一卡二卡在线| 欧美蜜桃一区二区三区| 日本伦理一区二区| 日韩制服丝袜先锋影音| 亚洲国产综合人成综合网站| ㊣最新国产の精品bt伙计久久| 国产亚洲一本大道中文在线| 精品国产自在久精品国产| 日韩欧美在线不卡| 日韩欧美综合一区| 欧美一级片在线观看| 欧美一区二区在线播放| 欧美一区二区久久久| 欧美一卡二卡三卡| 精品av久久707| 亚洲精品一区二区三区精华液 | 欧美一区二区三级| 日韩欧美国产一区二区三区 | 国产日韩v精品一区二区| 日韩一卡二卡三卡四卡| 日韩一卡二卡三卡国产欧美| 欧美在线播放高清精品| 欧美伊人久久久久久午夜久久久久| 韩国一区二区视频| 国产精品影视在线| 成人美女视频在线看| 成人激情午夜影院| 在线观看免费亚洲| 91精品国产91综合久久蜜臀| 欧美成人官网二区| 亚洲国产精华液网站w | 91精品国产综合久久久久久久| 欧美色男人天堂| 日韩一区二区三区四区| 久久久久久久久久久久久久久99 | 69成人精品免费视频| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 91免费观看视频在线| 欧美嫩在线观看| 久久免费国产精品| 亚洲日本在线天堂| 视频一区中文字幕国产| 国产伦精品一区二区三区免费| av不卡在线播放| 91精品国产一区二区| 中文字幕精品三区| 亚洲1区2区3区视频| 国产精品乡下勾搭老头1| 在线亚洲免费视频| 精品国产91亚洲一区二区三区婷婷 | 国产精品一区二区在线观看网站| 成人教育av在线| 91精品国产91热久久久做人人| 国产欧美日韩中文久久| 亚洲电影一级片| 国产成人在线观看| 欧美日韩国产小视频在线观看| 久久精品视频网| 亚洲第一狼人社区| 成人激情黄色小说| 日韩欧美二区三区| 亚洲va欧美va天堂v国产综合| 成人午夜av影视| 亚洲精品一区二区三区香蕉| 亚洲成人免费在线观看|