📄 flash.c
字号:
if (ret < 0) printf("AppFlashWrite(0x%x,0x%x,%d) failed\n", dest,src,bytecnt); return(ret);}AppFlashEraseAll(){ int ret, i; ulong oints; struct flashinfo *fbnk; oints = intsoff(); fbnk = FlashBank; for(i=0;i<FLASHBANKS;i++,fbnk++) { ret = flasherase(fbnk,ALL_SECTORS); if (ret == -1) break; } intsrestore(oints); return(ret);}/* Erase the flash sector specified. */AppFlashErase(snum) /* erase specified sector */int snum;{ ulong oints; char *base; int ret, size; struct flashinfo *fbnk; sectortoaddr(snum,&size,&base); fbnk = addrtobank(base); if (!fbnk) return(-1); oints = intsoff(); ret = flasherase(fbnk,snum); intsrestore(oints); return(ret);}/* FlashCmd(): Code that handles the user interface. See FlashHelp[] below for usage.*/FlashCmd(argc,argv)int argc;char **argv;{ int snum, ret; ulong dest, src, oints; long bytecnt, size, rslt; struct flashinfo *fbnk; oints = intsoff(); fbnk = &FlashBank[CurrentBank]; ret = 0; if (strcmp(argv[1],"init") == 0) FlashInit(); else if (strcmp(argv[1],"info") == 0) showflashinfo(fbnk); else if (strcmp(argv[1],"bank") == 0) { int tmpbank; if (argc == 3) { tmpbank = atoi(argv[2]); if (tmpbank < FLASHBANKS) CurrentBank = tmpbank; printf("Subsequent flash ops apply to bank %d\n",CurrentBank); } else printf("Current flash bank: %d\n",CurrentBank); } else if (strcmp(argv[1],"ewrite") == 0) { if (argc == 5) { dest = strtoul(argv[2],(char **)0,0); src = strtoul(argv[3],(char **)0,0); bytecnt = (long)strtoul(argv[4],(char **)0,0); if (flashewrite(fbnk,dest,src,bytecnt) == -1) printf("ewrite failed\n"); } else ret = -1; } else if (strcmp(argv[1],"write") == 0) { if (argc == 5) { dest = strtoul(argv[2],(char **)0,0); src = strtoul(argv[3],(char **)0,0); bytecnt = (long)strtoul(argv[4],(char **)0,0); rslt = flashwrite(fbnk,dest,src,bytecnt); if (rslt == -1) printf("Write failed\n"); } else ret = -1; } else if (strcmp(argv[1],"opw") == 0) { FlashProtectWindow = 2; } else if (strcmp(argv[1],"erase") == 0) { if (argc != 3) printf("Bad 'erase' arg count..."); else if (strcmp(argv[2],"all") == 0) snum = ALL_SECTORS; else snum = (int)strtoul(argv[2],(char **)0,0); rslt = flasherase(fbnk,snum); if (rslt == -1) printf("Erase failed\n"); } else { ret = -1; } intsrestore(oints); return(ret);}NotUsed(){ printf("ERROR: flash operation not supported\n");}char *FlashHelp[] = { "Flash memory operations", "{op} [args]", "Ops...", " opw", " info", " init", " bank [#]", " erase {# | all}", " write {dest} {src} {byte_cnt}", " ewrite {dest} {src} {byte_cnt}", 0,};/* FlashInit(): Initialize data structures for each bank of flash...*/FlashInit(){ int i, snum; uchar *begin; struct flashinfo *fbnk; CurrentBank = 0; snum = 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 *)Flashtype29F040_8, (ulong *)EndFlashtype29F040_8, FlashTypeFbuf040,sizeof(FlashTypeFbuf040)) < 0) return(-1); if (flashopload((ulong *)Flasherase29F040_8, (ulong *)EndFlasherase29F040_8, FlashEraseFbuf040,sizeof(FlashEraseFbuf040)) < 0) return(-1); if (flashopload((ulong *)Flashewrite29F040_8, (ulong *)EndFlashewrite29F040_8, FlashEwriteFbuf040,sizeof(FlashEwriteFbuf040)) < 0) return(-1); if (flashopload((ulong *)Flashwrite29F040_8, (ulong *)EndFlashwrite29F040_8, FlashWriteFbuf040,sizeof(FlashWriteFbuf040)) < 0) return(-1); if (flashopload((ulong *)Flashtype29F800B_16, (ulong *)EndFlashtype29F800B_16, FlashTypeFbuf800,sizeof(FlashTypeFbuf800)) < 0) return(-1); if (flashopload((ulong *)Flasherase29F800B_16, (ulong *)EndFlasherase29F800B_16, FlashEraseFbuf800,sizeof(FlashEraseFbuf800)) < 0) return(-1); if (flashopload((ulong *)Flashewrite29F800B_16, (ulong *)EndFlashewrite29F800B_16, FlashEwriteFbuf800,sizeof(FlashEwriteFbuf800)) < 0) return(-1); if (flashopload((ulong *)Flashwrite29F800B_16, (ulong *)EndFlashwrite29F800B_16, FlashWriteFbuf800,sizeof(FlashWriteFbuf800)) < 0) return(-1); /* Initialize each bank of flash... */ fbnk = &FlashBank[0]; fbnk->id = AMD29F040; /* Device id. */ fbnk->base = (uchar *)FLASH_BANK0_BASE_ADDR;/* Base address of bank. */ fbnk->end = fbnk->base + 0x7ffff; /* End address of bank. */ fbnk->sectorcnt = 8; /* Number of sectors. */ fbnk->width = 1; /* Width (in bytes). */ fbnk->fltype = (int(*)())FlashTypeFbuf040; /* Flashtype(). */ fbnk->flerase = (int(*)())FlashEraseFbuf040; /* Flasherase(). */ fbnk->flwrite = (int(*)())FlashWriteFbuf040; /* Flashwrite(). */ fbnk->flewrite = (int(*)())FlashEwriteFbuf040; /* Flashewrite(). */ fbnk->sectors = sinfo040; begin = fbnk->base; for(i=0;i<fbnk->sectorcnt;i++,snum++) { sinfo040[i].snum = snum; sinfo040[i].size = SectorSizes29F040_8[i]; sinfo040[i].begin = begin; sinfo040[i].end = sinfo040[i].begin + sinfo040[i].size - 1; /* All sectors of bank 0 whose base is less than FLASH_PROTECT_SIZE */ /* are marked as protected... */ if (begin < (uchar *)(FLASH_BANK0_BASE_ADDR + FLASH_PROTECT_SIZE)) sinfo040[i].protected = 1; else sinfo040[i].protected = 0; begin += SectorSizes29F040_8[i]; } fbnk = &FlashBank[1]; fbnk->id = AMD29F800B; /* Device id. */ fbnk->base = (uchar *)FLASH_BANK1_BASE_ADDR;/* Base address of bank. */ fbnk->end = fbnk->base + 0xfffff; /* End address of bank. */ fbnk->sectorcnt = 19; /* Number of sectors. */ fbnk->width = 2; /* Width (in bytes). */ fbnk->fltype = (int(*)())FlashTypeFbuf800; /* Flashtype(). */ fbnk->flerase = (int(*)())FlashEraseFbuf800; /* Flasherase(). */ fbnk->flwrite = (int(*)())FlashWriteFbuf800; /* Flashwrite(). */ fbnk->flewrite = (int(*)())FlashEwriteFbuf800; /* Flashewrite(). */ fbnk->sectors = sinfo800; /* Pointer to sector size table. */ begin = fbnk->base; for(i=0;i<fbnk->sectorcnt;i++,snum++) { sinfo800[i].snum = snum; sinfo800[i].size = SectorSizes29F800B_16[i]; sinfo800[i].begin = begin; sinfo800[i].end = sinfo800[i].begin + sinfo800[i].size - 1; sinfo800[i].protected = 0; begin += SectorSizes29F800B_16[i]; } if (FLASHBANKS < 3) return(0); /* This is a TFS FLASH/RAM bank... */ fbnk = &FlashBank[2]; fbnk->id = FLASHRAM; /* Device id. */ fbnk->base = (uchar *)FLASHRAM_BASE; /* Base address of bank. */ fbnk->end = (uchar *)FLASHRAM_END; /* End address of bank. */ fbnk->sectorcnt = (FLASHRAM_SIZE/FLASHRAM_SSIZE);/* Number of sectors. */ fbnk->width = 0; /* Width (in bytes). */ fbnk->fltype = NotUsed; /* Flashtype() function. */ fbnk->flerase = NotUsed; /* Flasherase() function. */ fbnk->flwrite = NotUsed; /* Flashwrite() function. */ fbnk->flewrite = NotUsed; /* Flashewrite() function. */ fbnk->sectors = sinfoRAM; /* Pointer to sector size table. */ begin = fbnk->base; for(i=0;i<fbnk->sectorcnt;i++,snum++) { sinfoRAM[i].snum = snum; sinfoRAM[i].size = FLASHRAM_SSIZE; sinfoRAM[i].begin = begin; sinfoRAM[i].end = sinfoRAM[i].begin + sinfoRAM[i].size - 1; sinfoRAM[i].protected = 0; begin += FLASHRAM_SSIZE; } return(0);}/* addrtosector(): Incoming address is translated to sector number, size of sector and base of sector. Return 0 if successful; else -1.*/addrtosector(addr,sector,size,base)uchar *addr, **base;int *sector, *size;{ 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%x) failed\n",addr); return(-1);}struct flashinfo *addrtobank(addr)uchar *addr;{ struct flashinfo *fbnk; struct sectorinfo *sinfo; int dev, i; for(dev=0;dev<FLASHBANKS;dev++) { fbnk = &FlashBank[dev]; if ((addr >= fbnk->base) && (addr <= fbnk->end)) return(fbnk); } printf("addrtobank(0x%x) failed\n",addr); return(0);}sectortoaddr(sector,size,base)uchar **base;int sector, *size;{ 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++) { if (sec == sector) { sinfo = &fbnk->sectors[i]; if (base) *base = sinfo->begin; if (size) *size = sinfo->size; return(0); } } } printf("sectortoaddr(%d) failed\n",sector); return(-1);}voidLowerFlashProtectWindow(){ if (FlashProtectWindow) FlashProtectWindow--;}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -