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

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

?? flash.c

?? 完整的Bell實驗室的嵌入式文件系統TFS
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* flashcom.c: *  This file contains the portions of the flash code that are device *  independent.  Refer to the appropriate device sub-directory for the *  code that is specific to the flash device on the target. * *  General notice: *  This code is part of a boot-monitor package developed as a generic base *  platform for embedded system designs.  As such, it is likely to be *  distributed to various projects beyond the control of the original *  author.  Please notify the author of any enhancements made or bugs found *  so that all may benefit from the changes.  In addition, notification back *  to the author will allow the new user to pick up changes that may have *  been made by other users after this version of the code was distributed. * *  Note1: the majority of this code was edited with 4-space tabs. *  Note2: as more and more contributions are accepted, the term "author" *         is becoming a mis-representation of credit. * *  Original author:    Ed Sutter *  Email:              esutter@lucent.com *  Phone:              908-582-2351 */#include "config.h"#if INCLUDE_FLASH#include "cpu.h"#include "flashdev.h"#include "flash.h"#include "genlib.h"#include "ctype.h"#include "stddefs.h"#include "tfs.h"#include "cli.h"extern struct flashdesc FlashNamId[];int     FlashCurrentBank;int     sectortoaddr(int,int *,uchar **);#define SRANGE_ERROR    -1#define SRANGE_SINGLE   1#define SRANGE_RANGE    2#define SRANGE_ALL      3    /* FlashProtectWindow: *  Must be set to allow any flash operation to be done on space assumed *  to be software protected. */int FlashProtectWindow;/* FlashBank[]: *  This table contains all of the information that is needed to keep the *  flash code somewhat generic across multiple flash devices. */struct  flashinfo FlashBank[FLASHBANKS];#ifdef DISABLE_INTERRUPTS_DURING_FLASHOPS#define FLASH_INTSOFF()             intsoff()#define FLASH_INTSRESTORE(ival)     intsrestore(ival)#else#define FLASH_INTSOFF()             0#define FLASH_INTSRESTORE(ival)#endif/* showflashtype(): *  Find a match between the incoming id and an entry in the FlashNamId[] *  table.  The FlashNamId[] table is part of the device-specific code. */intshowflashtype(ulong id){    struct flashdesc *fdp;    fdp = FlashNamId;    while(fdp->desc) {        if (id == fdp->id) {            printf("Device = %s\n",fdp->desc);            return(0);        }        fdp++;    }    printf("Flash id 0x%lx not recognized\n",id);    return(-1);}/* flasherased(): * Return 1 if range of memory is all 0xff; else 0. * Scan through the range of memor specified by begin-end (inclusive) * looking for anything that is not 0xff.  Do this in three sections so * that the pointers can be 4-byte aligned for the bulk of the comparison * range... * The beginning steps through as a char pointer until aligned on a 4-byte * boundary.  Then do ulong * comparisons until the just before the end * where we once again use char pointers to align on the last few * non-aligned bytes (if any). */intflasherased(uchar *begin, uchar *end){    ulong *lp, *lp1;    /* Get pointers aligned so that we can do the bulk of the comparison     * with long pointers...     */    while(((long)begin & 3) && (begin != end)) {        if (*begin != 0xff) {            return(0);        }        begin++;    }    if (begin >= end)        return(1);    lp = (ulong *)begin;    lp1 = (ulong *)end;    (long)lp1 &= ~3;    while(lp < lp1) {        if (*lp != 0xffffffff) {            return(0);        }        lp++;    }    if (lp >= (ulong *)end)        return(1);        begin = (uchar *)lp;    do {        if (*begin++ != 0xff)            return(0);    } while(begin != end);    return(1);}/* showflashinfo(): * Dump information about specified flash device. */intshowflashinfo(struct flashinfo *fdev, char *range){    int i;    struct  sectorinfo *sp;    if (showflashtype(fdev->id) < 0)        return(-1);    printf("  Base addr   : 0x%08lx\n",(ulong)(fdev->base));    printf("  Sectors     : %d\n",fdev->sectorcnt);    printf("  Bank width  : %d\n",fdev->width);    printf("  Sector     Begin       End        Size     SWProt?  Erased?\n");    for(i=0;i<fdev->sectorcnt;i++) {        sp = &fdev->sectors[i];        if (inRange(range,sp->snum)) {            printf("    %2d    0x%08lx  0x%08lx  0x%06lx    %s       %s\n",                sp->snum, (ulong)(sp->begin), (ulong)(sp->end), sp->size,                sp->protected ? "yes" : " no",                flasherased(sp->begin,sp->end) ? "yes" : "no");        }    }    return(0);}/* flashopload(): *  Copy flash operation to ram space.   *  Note that this function assumes that cache is disabled at this point. *  This is important because we are copying text into bss space and if *  cache was on, there could be a coherency problem. */intflashopload(ulong *begin,ulong *end,ulong *copy,int size){    volatile ulong  *bp;    int ret;    /* Verify space availability: */    if (((int)end - (int)begin) >= size) {        printf("flashopload overflow ((0x%lx-0x%lx) > 0x%x)\n",            (ulong)end,(ulong)begin,size);        return(-1);    }    ret = 0;    /* Copy function() to RAM, then verify: */    bp = begin;    while(bp <= end) {        *copy = *bp;        if (*copy++ != *bp++) {            printf("flashopload failed\n");            ret = -1;            break;        }    }    return(ret);}/* flashtype(): *  Use the device-specific function pointer to call the routine *  relocated to RAM space. */intflashtype(fdev)struct flashinfo *fdev;{    return(fdev->fltype(fdev));}/* flasherase(): *  Use the device-specific function pointer to call the routine *  relocated to RAM space. *  Note that flasherase() is called with a sector number.  The sector *  number is relative to the entire system, not just the particular device. *  This means that if there is more than one flash device in the system that *  the actual sector number (relative to the device) may not be the same *  value.  This adjustment is made here so that the underlying code that is *  pumped into ram for execution does not have to be aware of this. */intflasherase(fdev,snum)struct  flashinfo *fdev;int snum;{    int size;    unsigned char *base, *end;    if (fdev->id == FLASHRAM) {        if (snum == ALL_SECTORS) {            size = fdev->end - fdev->base;            base = fdev->base;        }        else {            sectortoaddr(snum,&size,&base);        }        end = base+size;        while(base < end) {            *base = 0xff;            if (*base++ != 0xff)                return(-1);        }        return(0);    }    if ((snum != ALL_SECTORS) && (fdev->sectors[0].snum != 0)) {/*      printf("Adjusting snum from %d to",snum); */        snum -= fdev->sectors[0].snum;/*      printf(" %d.\n",snum); */    }    return(fdev->flerase(fdev,snum));}/* flashwrite(): *  Use the device-specific function pointer to call the routine *  relocated to RAM space. *  First make a few checks on the request, then write to flash if all *  checks succeed. */intflashwrite(struct flashinfo *fdev,uchar *dest,uchar *src,long bytecnt){    int j, lowsector, highsector;    register uchar  *dp, *sp, *edp;    if (fdev->id == FLASHRAM) {        uchar *sp, *dp, *end;        sp = src;        dp = dest;        end = dp+bytecnt;        while(dp < end) {            *dp = *sp;            if (*dp != *sp)                return(-1);            dp++; sp++;        }        return(0);    }    dp = dest;    sp = src;    edp = (dest + bytecnt) - 1;    /* If outside the devices space, return failed.. */    if ((edp < fdev->sectors[0].begin) ||        (dp > fdev->sectors[fdev->sectorcnt-1].end)) {        printf("flashwrite() failed: dest out of flash range\n");        return(-1);    }    /* Make sure the destination is not within a protected sector */    if (FlashProtectWindow == FLASH_PROTECT_WINDOW_CLOSED) {        /* First determine the sectors that overlap with the         * flash space to be written...         */        lowsector = highsector = -1;        for(j=0;j<fdev->sectorcnt;j++) {            if ((dp >= fdev->sectors[j].begin) &&                (dp <= fdev->sectors[j].end))                lowsector = j;        }        for(j=0;j<fdev->sectorcnt;j++) {            if ((edp >= fdev->sectors[j].begin) &&                (edp <= fdev->sectors[j].end))                highsector = j;        }        if ((lowsector == -1) || (highsector == -1)) {            printf("flashwrite() failed: can't find sector\n");            return(-1);        }        /* Now that the range of affected sectors is known,         * verify that those sectors are not protected...         */        for(j=lowsector;j<=highsector;j++) {            if (fdev->sectors[j].protected) {                printf("flashwrite() failed: sector protected\n");                return(-1);            }        }    }    /* Now make sure that there is no attempt to transition a bit     * in the affected range from 0 to 1...  A flash write can only     * bring bits low (erase brings them  high).     */    while(dp < edp) {        if ((*dp & *sp) != *sp) {            printf("flashwrite() failed: bit 0->1 rqst denied.\n");            return(-1);        }        dp++;         sp++;    }    return(fdev->flwrite(fdev,dest,src,bytecnt));}/* flashewrite(): *  Use the device-specific function pointer to call the routine *  relocated to RAM space. */intflashewrite(struct flashinfo *fdev,uchar *dest,uchar *src,long bytecnt){    int i;    /* Source and destination addresses must be long-aligned. */    if (((int)src & 3) || ((int)dest & 3))        return(-1);    /* If the protection window is closed, then verify that no protected     * sectors will be written over...     */    if (FlashProtectWindow == FLASH_PROTECT_WINDOW_CLOSED) {        for (i=0;i<fdev->sectorcnt;i++) {            if((((uchar *)dest) > (fdev->sectors[i].end)) ||                (((uchar *)dest+bytecnt) < (fdev->sectors[i].begin)))                continue;            else                if (fdev->sectors[i].protected)                    return(-1);        }    }    return(fdev->flewrite(fdev,dest,src,bytecnt));}/* addrtosector(): *  Incoming address is translated to sector number, size of sector *  and base of sector. *  Return 0 if successful; else -1. */intaddrtosector(uchar *addr,int *sector,int *size,uchar **base){    struct flashinfo *fbnk;    struct  sectorinfo *sinfo;    int     dev, sec, i;    sec = 0;    for(dev=0;dev<FLASHBANKS;dev++) {        fbnk = &FlashBank[dev];        for(i=0;i<fbnk->sectorcnt;i++,sec++) {            sinfo = &fbnk->sectors[i];            if ((addr >= sinfo->begin) && (addr <= sinfo->end)) {                if (sector) {                    *sector = sec;                }                if (base) {                    *base = sinfo->begin;                }                if (size) {                    *size = sinfo->size;                }                return(0);            }        }    }    printf("addrtosector(0x%lx) failed\n",(ulong)addr);    return(-1);}/* addrtobank(): *  From the incoming address, return a pointer to the flash bank that *  this address is within. */struct flashinfo *addrtobank(uchar *addr){    struct flashinfo *fbnk;    int     dev;    for(dev=0;dev<FLASHBANKS;dev++) {        fbnk = &FlashBank[dev];        if ((addr >= fbnk->base) && (addr <= fbnk->end))            return(fbnk);    }    printf("addrtobank(0x%lx) failed\n",(ulong)addr);    return(0);}int

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产91精品在线观看| 午夜成人免费电影| 亚洲福利一区二区三区| 欧美a级理论片| 成人激情动漫在线观看| 欧美日韩一区久久| 26uuu久久综合| 一区二区免费在线| 黑人精品欧美一区二区蜜桃| 成人免费视频一区| 日韩午夜精品视频| 精品精品欲导航| 中文字幕中文字幕在线一区 | 春色校园综合激情亚洲| 欧美在线播放高清精品| 国产日本亚洲高清| 蜜桃91丨九色丨蝌蚪91桃色| 99久久国产免费看| 久久久亚洲精品石原莉奈| 亚洲高清视频中文字幕| 国产自产v一区二区三区c| 91福利精品第一导航| 久久久久久久久久久久电影| 亚洲在线视频一区| 国产**成人网毛片九色| 911精品国产一区二区在线| 国产精品成人一区二区三区夜夜夜| 午夜精品久久久久久久久久久| 奇米888四色在线精品| 不卡电影一区二区三区| 精品国产乱子伦一区| 亚洲午夜免费视频| 91在线观看污| 久久久国产午夜精品 | 欧美丰满少妇xxxbbb| 亚洲乱码国产乱码精品精小说 | 蜜桃视频在线观看一区二区| 欧美在线制服丝袜| 亚洲乱码国产乱码精品精98午夜| 国产成人在线看| 欧美v国产在线一区二区三区| 亚洲国产成人av网| 色婷婷亚洲精品| 成人免费小视频| 大白屁股一区二区视频| 久久影院电视剧免费观看| 狠狠色丁香婷综合久久| 日韩免费福利电影在线观看| 日韩av一区二区在线影视| 欧美精品日韩精品| 国产精品高潮呻吟久久| 99久久精品国产观看| 18涩涩午夜精品.www| 色综合久久天天| 亚洲蜜臀av乱码久久精品 | 国产成人在线免费观看| 久久久美女艺术照精彩视频福利播放| 美女任你摸久久 | 在线不卡中文字幕播放| 午夜精品久久久久| 51精品秘密在线观看| 美洲天堂一区二卡三卡四卡视频 | 欧美日韩精品电影| 日韩精品欧美精品| 欧美精品一区二区三区在线播放 | 欧美精品在线观看播放| 午夜一区二区三区视频| 日韩欧美你懂的| 国产伦精一区二区三区| 国产欧美一区在线| 韩国在线一区二区| 欧美韩国日本不卡| 99精品黄色片免费大全| 一区二区视频在线看| 在线观看亚洲专区| 99精品偷自拍| 夜夜嗨av一区二区三区四季av| 欧美日韩mp4| 国内精品伊人久久久久影院对白| www国产成人| 97精品视频在线观看自产线路二| 亚洲人成伊人成综合网小说| 欧美猛男超大videosgay| 激情欧美一区二区三区在线观看| 国产校园另类小说区| 在线观看国产一区二区| 国产一区二区按摩在线观看| 亚洲天堂2014| 欧美本精品男人aⅴ天堂| 成人激情午夜影院| 一区二区三区波多野结衣在线观看| 欧美日韩国产一级二级| 成人黄色小视频在线观看| 亚洲高清在线精品| 国产片一区二区三区| 在线播放视频一区| 成人精品视频一区| 日韩电影免费在线观看网站| 国产精品狼人久久影院观看方式| 欧美日本高清视频在线观看| 久久99精品视频| 亚洲午夜精品一区二区三区他趣| 久久综合av免费| 欧美日韩国产成人在线免费| 9i在线看片成人免费| 蜜臀av一区二区在线免费观看 | 欧美色成人综合| 成人精品免费视频| 激情五月婷婷综合| 日韩av中文字幕一区二区三区| 亚洲天堂网中文字| 国产精品乱人伦| 久久综合资源网| 日韩一级免费观看| 欧美日韩一区不卡| 在线观看av不卡| 成人激情免费电影网址| 国产在线视频一区二区| 精品一区二区免费| 美女诱惑一区二区| 天堂久久一区二区三区| 亚洲欧洲日韩在线| 日本一区二区三区在线不卡 | 久久久久久久综合色一本| 欧美一区二区三区免费| 7777精品伊人久久久大香线蕉完整版 | 欧美一区二区三区在线| 欧美视频在线不卡| 欧美性受xxxx| 91久久线看在观草草青青| 国产精品99久久久| 国产不卡在线视频| 国产精品中文字幕一区二区三区| 韩国v欧美v日本v亚洲v| 国产一区二区三区最好精华液| 麻豆国产精品视频| 久久综合综合久久综合| 久久99久久99小草精品免视看| 午夜视频一区在线观看| 亚洲乱码中文字幕综合| 亚洲小说欧美激情另类| 丝袜美腿一区二区三区| 久久超碰97人人做人人爱| 懂色av一区二区夜夜嗨| 欧美日韩一区久久| 久久久久久毛片| 亚洲一区二区三区四区五区中文| 成人丝袜高跟foot| 欧美日韩色综合| 久久综合av免费| 亚洲一区欧美一区| 国产精品中文欧美| 欧美日韩一区二区三区在线| 国产欧美一区二区在线观看| 亚洲成av人片一区二区梦乃| 久久av老司机精品网站导航| 91小视频在线免费看| 91精品黄色片免费大全| 中文字幕日韩一区二区| 久久99精品久久久久婷婷| 91激情在线视频| 久久精品男人的天堂| 亚洲成年人网站在线观看| 成人免费毛片app| 欧美一级欧美三级在线观看| 自拍偷拍国产精品| 国产精品综合网| 欧美美女激情18p| 亚洲人吸女人奶水| 国产成人在线视频网站| 欧美一二三区精品| 午夜影院在线观看欧美| 成人h精品动漫一区二区三区| 精品乱人伦一区二区三区| 亚洲成a人在线观看| 99re成人在线| 亚洲国产激情av| 国产一区二区三区黄视频| 666欧美在线视频| 亚洲最大色网站| 91同城在线观看| 国产精品色噜噜| 国产综合色在线| 亚洲精品在线观| 久久99热这里只有精品| 欧美一区二区三区婷婷月色| 性做久久久久久久久| 欧美性感一区二区三区| 亚洲激情成人在线| 91视视频在线直接观看在线看网页在线看| xfplay精品久久| 国产精品一二三四| 久久久精品2019中文字幕之3| 精品在线免费观看| 精品成人在线观看| 国产综合成人久久大片91| 久久综合色天天久久综合图片| 久久精品国产精品青草| 久久综合久久久久88| 国产精品一区二区视频|