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

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

?? flashpic.c

?? 《嵌入式固件開發》一書的源碼
?? C
字號:
/*******************************************************************************Copyright (c) Lucent Technologies, 1999.  All rights reserved.FILENAME:      FlashPic.cDESCRIPTION:   Flash utility================================================================================EDIT HISTORY:               09/23/99 After ewrite set cold resetDATE      INITIALS  ABSTRACT03-25-99  M. Hunag  Created.*******************************************************************************//* 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;#ifdef PPA48_BOARD#include "mpc860.h"  extern EPPC *Immr;#endif// #define FLASH_DEBUG#ifdef FLASH_DEBUG#ifdef PPA48_BOARDextern EPPC *IMMR;struct smc_uart_bd *tbd;#endif/* temporary... */#include "cpuio.h"extern uchar xbuf[];#endif#include "cpu.h"#include "flash.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.*/Flasherase16(fdev,snum)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) {#ifdef PPA48_BOARD        /* Reset WDT *///      Immr->pio_pcdat ^= (1 << (15-4) );#endif                    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.*/Flashwrite16(fdev,dest,src,bytecnt)struct  flashinfo *fdev;uchar   *src, *dest;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) {#ifdef PPA48_BOARD    /* Reset WDT *///    Immr->pio_pcdat ^= (1 << (15-4) );#endif            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;            }        }        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.*/Flashewrite16(fdev,dest,src,bytecnt)struct  flashinfo *fdev;ftype   *src, *dest;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;        }        /* inline putchar...        while((*(ushort *)TXBD0_0 & 0x8000));        xbuf[0] = (uchar)(0x41+i);        *(ushort *)TXBD0_0 |= 0x8000;        */        /* 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) {#ifdef PPA48_BOARD     /* Reset WDT *///     Immr->pio_pcdat ^= (1 << (15-4) );#endif            if (Is_ff(add)) {                if (Is_ff(add))                    break;            }            /* 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();            }        }        add += fdev->sectors[i].size;    }    /* inline putchar...    while((*(ushort *)TXBD0_0 & 0x8000));    xbuf[0] = (uchar)'!';    *(ushort *)TXBD0_0 |= 0x8000;    */    /* 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) {#ifdef PPA48_BOARD    /* Reset WDT *///    Immr->pio_pcdat ^= (1 << (15-4) );#endif            if (Is_Equal(dest,src)) {                if (Is_Equal(dest,src))                    break;            }            /* Check D5 for timeout... */            if (D5_Timeout(dest)) {                if (Is_Not_Equal(dest,src))                    return(-1);                break;            }        }        dest++;        src++;    }    /* Issue the read/reset command sequence: */    Write_f0_to_555();    val = Read_5555();    /* Wait till flash is readable, or timeout: */    for(i=0;i<FLASH_TIMEOUT;i++) {        if (Is_Equal(dest1,src1))            break;    }#ifdef FLASH_DEBUG  tbd = &IMMR->qcp_or_ud.umd.u_tbd;    /* Wait for ready bit to clear... */  while(1) {        if (!(tbd->status & 0x8000))            break;    }  #ifndef HOPOFF_BOARD  if (!(IMMR->pip_pbdat & (1 <<(31-22)) ))  #else  if (!(IMMR->pio_pcdat & (1 <<(15-7)) ))  #endif  {      *tbd->baddr = '!';      tbd->status |= 0x8000;  }#endif#ifndef ARM_BOARD  // cold init  asm ("lis 3, 0x00000000>>16&0x0000ffff");  asm ("addi    3, 3, 0x00000000&0x0000ffff");#endif    /* 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(fdev)struct flashinfo *fdev;{    int i;    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一区二区三区免费野_久草精品视频
欧美一二三在线| 一本在线高清不卡dvd| 欧美一区二区啪啪| 久久99九九99精品| 欧美精品一区二区三区蜜桃视频 | 欧美日韩黄色影视| 亚洲电影欧美电影有声小说| 91精品国产综合久久福利软件 | 国产一区二区三区四| 久久精品亚洲一区二区三区浴池| 成人免费看视频| 亚洲一区二区黄色| 欧美精品一区二区在线观看| 国产91精品免费| 亚洲男女一区二区三区| 91麻豆精品国产91久久久使用方法| 免费在线观看视频一区| 国产欧美一区二区三区鸳鸯浴| 成人av在线一区二区三区| 亚洲人成在线播放网站岛国| 欧美精品在线观看一区二区| 国产传媒一区在线| 亚洲靠逼com| 欧美成人精品福利| 成人av中文字幕| 日本不卡一区二区| 国产精品久久99| 欧美一区二区在线免费观看| 成人app网站| 日本不卡一二三区黄网| 亚洲天堂免费在线观看视频| 欧美一级理论性理论a| bt欧美亚洲午夜电影天堂| 日韩制服丝袜先锋影音| 欧美刺激午夜性久久久久久久 | 日韩视频永久免费| 国产精品美女久久福利网站| 国产经典欧美精品| 欧美日韩色综合| 日韩你懂的在线观看| 一区二区三区不卡在线观看| 欧美视频一二三区| 肉色丝袜一区二区| 亚洲综合男人的天堂| 日韩一区二区在线观看视频| 99久久综合99久久综合网站| 久久精品在线免费观看| 久久av资源站| 欧美va天堂va视频va在线| 亚洲一本大道在线| 国产精品久久777777| 久久91精品久久久久久秒播| 色成年激情久久综合| 国产高清无密码一区二区三区| 亚洲午夜一区二区| 中文字幕一区二区三区四区不卡 | 欧美精品久久久久久久多人混战 | 国产亚洲人成网站| 日韩一级视频免费观看在线| 91国产免费观看| www.欧美色图| 豆国产96在线|亚洲| 另类小说图片综合网| 天堂在线一区二区| 午夜视频一区在线观看| 一区二区三区日韩欧美精品| 亚洲欧洲一区二区在线播放| 国产亚洲综合性久久久影院| 精品国产麻豆免费人成网站| 欧美一二三区在线| 欧美一区二区三区在线观看视频| 欧美日韩精品是欧美日韩精品| 欧美色综合久久| 欧美视频一区在线| 欧美日韩一区国产| 欧美精品xxxxbbbb| 91精品国产一区二区| 91精品国产综合久久精品app| 欧美人伦禁忌dvd放荡欲情| 色欧美日韩亚洲| 欧美在线你懂的| 欧美日韩国产系列| 91精品国产一区二区人妖| 日韩一区二区中文字幕| 精品国产污网站| 国产午夜精品一区二区| 亚洲欧美综合另类在线卡通| 亚洲人成伊人成综合网小说| 亚洲午夜影视影院在线观看| 日韩电影一区二区三区| 免费在线欧美视频| 国产精品一区二区久久不卡| 成人激情动漫在线观看| 色又黄又爽网站www久久| 精品污污网站免费看| 91精品国产欧美一区二区成人| 日韩欧美在线观看一区二区三区| 精品毛片乱码1区2区3区| 国产亚洲精品超碰| 亚洲色图都市小说| 石原莉奈在线亚洲二区| 国内成人自拍视频| 99国产精品视频免费观看| 欧美午夜电影网| 精品理论电影在线观看| 国产精品久久久久影院亚瑟 | 日韩精品免费专区| 国产呦精品一区二区三区网站| 福利视频网站一区二区三区| 91浏览器在线视频| 欧美一区二区久久久| 国产日韩欧美a| 亚洲成人av福利| 成人免费毛片app| 3d动漫精品啪啪1区2区免费| 国产日本一区二区| 婷婷丁香久久五月婷婷| 福利一区二区在线| 91精品在线观看入口| 欧美极品xxx| 日本91福利区| 91视视频在线观看入口直接观看www | 久久久久亚洲综合| 亚洲综合成人网| 成人三级伦理片| 欧美一级理论性理论a| 亚洲欧美日韩在线不卡| 国产在线一区二区| 欧美性生活一区| 国产精品美女久久久久aⅴ | 国产盗摄女厕一区二区三区| 欧美日韩小视频| 亚洲欧洲在线观看av| 国产一区二区不卡在线| 欧美三区免费完整视频在线观看| 欧美极品少妇xxxxⅹ高跟鞋| 麻豆精品视频在线观看视频| 在线看日韩精品电影| 久久久久九九视频| 日本在线不卡视频一二三区| 在线区一区二视频| 国产精品理伦片| 国产成人亚洲综合a∨婷婷| 欧美一区二区免费视频| 亚洲成av人片一区二区| 91视频在线观看| 国产精品系列在线| 激情图片小说一区| 日韩欧美三级在线| 亚洲mv在线观看| 欧美色图激情小说| 怡红院av一区二区三区| 99re这里都是精品| 国产精品久久久久婷婷| 国产精品一品二品| 精品国产乱码久久| 麻豆91免费看| 欧美大白屁股肥臀xxxxxx| 日本美女一区二区三区| 制服丝袜中文字幕一区| 五月婷婷色综合| 5858s免费视频成人| 亚洲成av人片在线观看无码| 欧美综合一区二区三区| 亚洲午夜免费电影| 欧美视频精品在线| 日韩在线一区二区| 欧美一区午夜视频在线观看| 欧美a一区二区| 日韩欧美在线综合网| 久久66热偷产精品| 久久久精品欧美丰满| 国产成人精品亚洲777人妖| 欧美韩日一区二区三区四区| 国产电影一区在线| 奇米影视一区二区三区| 欧美美女一区二区在线观看| 丝袜国产日韩另类美女| 日韩一区二区精品葵司在线| 久久精品av麻豆的观看方式| 精品国产伦一区二区三区免费| 国产精品中文字幕日韩精品| 日本一区二区三区四区| 99视频在线精品| 亚洲制服丝袜在线| 91精品国产综合久久福利软件| 经典三级视频一区| 国产精品成人免费在线| 欧美亚洲国产一区在线观看网站| 五月天欧美精品| 欧美成人video| eeuss鲁片一区二区三区| 亚洲成a人v欧美综合天堂下载| 欧美一区二区三区四区五区 | 国模大尺度一区二区三区| 国产午夜精品久久| 欧美色图片你懂的| 韩日av一区二区| 一区二区三区精品久久久| 日韩欧美高清在线|