⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flashdev.c

📁 《嵌入式固件开发》一书的源码
💻 C
字号:
/* This file contains all of the flash support code that does not need * to be relocated to RAM.  Two separate files (flash.c and flashpic.c) * are maintained because under certain compilers, they may need to be * compiled with different options to be made position independent. * * NOTE: THESE FUNCTIONS ARE NOT RE-ENTRANT!!!  All of the FLASH routines * assume they can copy themselves into the array FlashFunc[]; hence, only * one operation can be active at any time. */#include "config.h"#if INCLUDE_FLASH#include "cpu.h"#include "stddefs.h"#include "flashdev.h"#include "flash.h"extern int FLASHTYPE();extern int ENDFLASHTYPE();extern int FLASHWRITE();extern int ENDFLASHWRITE();extern int FLASHEWRITE();extern int ENDFLASHEWRITE();extern int FLASHERASE();extern int ENDFLASHERASE();/* FlashXXXFbuf[]: * These arrays will contain the flash operation function that is executing. * Recall that to operate on the flash, you cannot be executing out of it. * The flash functions are copied here, then executed through the function * pointer flashfunc which is set to point to FlashFunc. */ulong    FlashTypeFbuf[FLASHFUNCSIZE];ulong    FlashEraseFbuf[FLASHFUNCSIZE];ulong    FlashWriteFbuf[FLASHFUNCSIZE];ulong    FlashEwriteFbuf[FLASHFUNCSIZE];/* FlashBank[]: * This structure contains all of the information that must be made available * to the various flash operation commands.  It is initialized by flashtype() * and used thereafter by the other operations. */struct  flashinfo FlashBank[FLASHBANKS];/* FlashNamId[]: * Used to correlate between the ID and a string representing the name * of the flash device.  */struct flashdesc FlashNamId[] = {        { AMD29PL160C,  "AMD-29PL160C" },         { 0,    (char *)0 },};/* SectorSizes160C: *  There are a total of 11 sectors for this part.  This table reflects the *  size of each sector based on the fact that this configuration is for a *  x16 configuration. */int SectorSizes160C[] = {        0x4000,  0x2000,  0x2000,  0x38000, 0x40000,        0x40000, 0x40000, 0x40000, 0x40000, 0x40000,        0x40000};struct sectorinfo sinfo160[10];/* FlashInit(): * Initialize data structures for each bank of flash... */intFlashInit(){    int i,  snum;    uchar   *begin;    struct  flashinfo *fbnk;    snum = 0;    FlashCurrentBank = 0;    /* Copy functions to ram space... */    /* Note that this MUST be done when cache is disabled to assure that */    /* the RAM is occupied by the designated block of code. */    if (flashopload((ulong *)FLASHTYPE,(ulong *)ENDFLASHTYPE,        FlashTypeFbuf,sizeof(FlashTypeFbuf)) < 0)        return(-1);    if (flashopload((ulong *)FLASHERASE,(ulong *)ENDFLASHERASE,        FlashEraseFbuf,sizeof(FlashEraseFbuf)) < 0)        return(-1);    if (flashopload((ulong *)FLASHEWRITE,(ulong *)ENDFLASHEWRITE,        FlashEwriteFbuf,sizeof(FlashEwriteFbuf)) < 0)        return(-1);    if (flashopload((ulong *)FLASHWRITE,(ulong *)ENDFLASHWRITE,        FlashWriteFbuf,sizeof(FlashWriteFbuf)) < 0)        return(-1);    fbnk = &FlashBank[0];    fbnk->id = AMD29PL160C;    fbnk->base = (unsigned char *)FLASH_BANK0_BASE_ADDR;    fbnk->end = fbnk->base + 0x3fffff;    fbnk->sectorcnt = sizeof(SectorSizes160C)/sizeof(int);    fbnk->width = FLASH_BANK0_WIDTH;    fbnk->fltype = (int(*)())FlashTypeFbuf;         /* flashtype(). */    fbnk->flerase = (int(*)())FlashEraseFbuf;       /* flasherase(). */    fbnk->flwrite = (int(*)())FlashWriteFbuf;       /* flashwrite(). */    fbnk->flewrite = (int(*)())FlashEwriteFbuf;     /* flashewrite(). */    fbnk->sectors = sinfo160;    begin = fbnk->base;    printf("type = 0x%lx\n",FLASHTYPE());    for(i=0;i<fbnk->sectorcnt;i++,snum++) {        int ssize;        ssize = SectorSizes160C[i];        fbnk->sectors[i].snum = snum;        fbnk->sectors[i].size = ssize;        fbnk->sectors[i].begin = begin;        fbnk->sectors[i].end =            fbnk->sectors[i].begin + ssize - 1;        fbnk->sectors[i].protected = 0;        begin += ssize;    }    sectorProtect(FLASH_PROTECT_RANGE,1);    /* Additional flash memory banks would be initialized here... */    return(0);}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -