亚洲欧美第一页_禁久久精品乱码_粉嫩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"#include "endian.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 "flashdev.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一区二区三区免费野_久草精品视频
国产精品一区二区在线观看网站 | 亚洲成人一区二区| 色猫猫国产区一区二在线视频| 国产精品国产三级国产| 成人黄色a**站在线观看| 中文字幕一区二区三区色视频| 成人免费毛片嘿嘿连载视频| 亚洲欧美国产三级| 欧美日韩国产电影| 国模无码大尺度一区二区三区| 日本一区二区综合亚洲| 色综合天天综合在线视频| 亚洲一区二区影院| 日韩精品中文字幕一区二区三区| 精品在线播放午夜| 国产精品久久久久久久久快鸭| 一本色道久久综合精品竹菊 | 天天综合网天天综合色| 日韩视频永久免费| 成人av影视在线观看| 亚洲小说欧美激情另类| 日韩欧美视频在线| av不卡在线观看| 偷拍日韩校园综合在线| 久久精品视频网| 欧美日韩一区视频| 激情久久五月天| 亚洲一区中文日韩| 久久久蜜臀国产一区二区| 91传媒视频在线播放| 国产一区在线观看视频| 亚洲另类春色校园小说| 欧美大片国产精品| 日本国产一区二区| 国产成人一区在线| 日韩影院在线观看| 亚洲日本在线a| 久久这里只精品最新地址| 欧美日韩视频在线观看一区二区三区| 国产一区二区三区免费观看| 亚洲一区二区在线观看视频| 久久精品欧美一区二区三区不卡 | 激情文学综合网| 亚洲一区在线电影| 国产精品美女久久久久久| 欧美一区二区三区爱爱| 91极品美女在线| 成人国产精品免费观看动漫 | 国产欧美在线观看一区| 51精品视频一区二区三区| 99riav久久精品riav| 狠狠色狠狠色综合系列| 亚洲bt欧美bt精品| 一区二区视频在线| 中文字幕中文在线不卡住| 久久久久88色偷偷免费| 欧美另类一区二区三区| 在线观看三级视频欧美| fc2成人免费人成在线观看播放| 国产自产视频一区二区三区| 麻豆成人免费电影| 日韩国产在线观看一区| 亚洲电影一区二区| 亚洲女人小视频在线观看| 久久精品一区四区| 久久一日本道色综合| 精品国产一区久久| 日韩精品中文字幕一区| 91精品国产乱码| 欧美一区二区三区在线看| 欧美久久久久中文字幕| 4438x成人网最大色成网站| 欧美日韩精品免费观看视频 | 91欧美激情一区二区三区成人| 国产成人av影院| 国产精品18久久久久久久久| 国产精品乡下勾搭老头1| 国产精品一区二区果冻传媒| 国产揄拍国内精品对白| 国产精品一区二区不卡| 国产91精品露脸国语对白| 国产成人综合视频| 成人午夜伦理影院| 99热99精品| 欧美三级中文字| 日韩一区二区三区免费看 | 欧美丰满高潮xxxx喷水动漫| 欧美日韩精品欧美日韩精品一| 欧美日韩不卡在线| 日韩美女视频在线| 久久影视一区二区| 国产精品久久久99| 亚洲在线一区二区三区| 日本成人在线看| 激情综合网激情| 国产成人夜色高潮福利影视| 99久久久免费精品国产一区二区| 日本电影亚洲天堂一区| 欧美日本在线观看| 久久九九国产精品| 亚洲夂夂婷婷色拍ww47| 久久精品国产99久久6| 成熟亚洲日本毛茸茸凸凹| 91女人视频在线观看| 777午夜精品免费视频| 久久综合九色综合97_久久久| 中文字幕中文乱码欧美一区二区 | 91日韩在线专区| 这里只有精品免费| 亚洲国产精品精华液2区45| 亚洲男帅同性gay1069| 日韩国产精品91| 国产v日产∨综合v精品视频| 欧美四级电影在线观看| 久久这里都是精品| 亚洲不卡av一区二区三区| 国内精品视频一区二区三区八戒| 99精品一区二区三区| 日韩亚洲欧美在线观看| 中文字幕中文字幕一区| 久久精品国产亚洲a| 91碰在线视频| 国产婷婷精品av在线| 五月婷婷欧美视频| 99精品欧美一区二区三区综合在线| 777奇米成人网| 亚洲嫩草精品久久| 国产精品1024| 日韩午夜激情av| 亚洲精品国产精华液| 国内精品视频666| 欧美一区二区美女| 美女网站视频久久| 91精品1区2区| 亚洲精品乱码久久久久| 国产无遮挡一区二区三区毛片日本| 国产精品国产成人国产三级| 免费日本视频一区| 日本伦理一区二区| 国产精品久久精品日日| 国内外成人在线| 欧美高清hd18日本| 亚洲香肠在线观看| 91亚洲午夜精品久久久久久| 亚洲精品一区二区三区四区高清 | 色综合久久久久综合| 2019国产精品| 日本三级亚洲精品| 欧美精品乱码久久久久久按摩| 亚洲天堂中文字幕| 成人av资源在线| 欧美国产一区在线| 国产毛片一区二区| 2023国产精品自拍| 久久99精品久久久久| 91精品在线麻豆| 日韩精品亚洲一区二区三区免费| 91久久精品日日躁夜夜躁欧美| 国产精品国产三级国产a| 丁香激情综合国产| 国产欧美精品区一区二区三区 | 日韩黄色片在线观看| 在线观看国产精品网站| 亚洲欧美一区二区三区国产精品 | 色网综合在线观看| 亚洲色图视频网站| 91麻豆高清视频| 一区二区在线看| 欧美精品一卡两卡| 免费看日韩精品| 精品欧美一区二区三区精品久久| 毛片基地黄久久久久久天堂| 欧美一区二区三区在线| 日韩影视精彩在线| 精品少妇一区二区三区视频免付费| 欧美aaa在线| 久久综合九色综合97婷婷| 国产.欧美.日韩| 国产精品免费视频观看| 91社区在线播放| 亚洲不卡av一区二区三区| 欧美一级一级性生活免费录像| 久久精品国产久精国产| 欧美国产精品一区| 在线国产电影不卡| 免费成人在线视频观看| 久久久亚洲国产美女国产盗摄 | 国产 日韩 欧美大片| 国产精品麻豆一区二区 | 99re视频精品| 午夜精品123| 久久综合九色综合欧美就去吻| av色综合久久天堂av综合| 亚洲一区日韩精品中文字幕| 7777精品伊人久久久大香线蕉 | 在线免费不卡视频| 色综合中文综合网| av高清不卡在线| 亚洲一卡二卡三卡四卡五卡| 欧美日韩日日摸|