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

📄 flashdev.c

📁 umon bootloader source code, support mips cpu.
💻 C
字号:
/* flashdev.c:
 *	This code supports two different platforms:
 *	1.	29F040 boot flash with 2 by-32 banks of AMD29LV800 (4 devices)
 *		and an 8bit battery-backed ram device (DS1743W).  The 2 banks
 *		of AMD29LV800s are assumed to be in contiguous memory space.
 *		And use of BB or BT devices is supported as long as any one
 *		bank has the same set.
 *	2.	29F040 boot flash with 1 by-32 bank of AM29LV160DB (2 devices)
 *		and an 8-bit battery-backed ram device (DS1746WP).
 *
 *	For both platforms, the battery-backed ram device is configured to
 *	"look like flash" for use in TFS.
 */
#include "config.h"
#if INCLUDE_FLASH
#include "cpu.h"
#include "flashdev.h"
#include "flash.h"
#include "genlib.h"
#include "stddefs.h"

extern int	Flashtype29F040_8();
extern int	EndFlashtype29F040_8();
extern int	Flasherase29F040_8();
extern int	EndFlasherase29F040_8();
extern int	Flashwrite29F040_8();
extern int	EndFlashwrite29F040_8();
extern int	Flashewrite29F040_8();
extern int	EndFlashewrite29F040_8();

extern int	Flashtype29LV800B_32();
extern int	EndFlashtype29LV800B_32();
extern int	Flasherase29LV800B_32();
extern int	EndFlasherase29LV800B_32();
extern int	Flashwrite29LV800B_32();
extern int	EndFlashwrite29LV800B_32();
extern int	Flashewrite29LV800B_32();
extern int	EndFlashewrite29LV800B_32();

extern int	FlashCurrentBank;
extern int 	FlashProtectWindow;
extern int	NotUsed();
extern int	flashopload();
extern struct flashinfo FlashBank[FLASHBANKS];

/* 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
 *	pointers setup in FlashInit().
*/
ulong	FlashTypeFbuf040[FLASHFUNCSIZE];
ulong	FlashEraseFbuf040[FLASHFUNCSIZE];
ulong	FlashWriteFbuf040[FLASHFUNCSIZE];
ulong	FlashEwriteFbuf040[FLASHFUNCSIZE];
ulong	FlashTypeFbuf800[FLASHFUNCSIZE];
ulong	FlashEraseFbuf800[FLASHFUNCSIZE];
ulong	FlashWriteFbuf800[FLASHFUNCSIZE];
ulong	FlashEwriteFbuf800[FLASHFUNCSIZE+0x100];


/* FlashNamId[]:
 *	Used to correlate between the ID and a string representing the name
 *	of the flash device.
*/
struct flashdesc FlashNamId[] = {
	{ AMD_29F800B,		"AMD-29F800B" },
	{ AMD_29F800T,		"AMD-29F800T" },
	{ STM_29F040,		"STM-29F040" },
	{ STM_M29W040B,		"STM-M29W040B" },
	{ AMD_29F040,		"AMD-29F040" },
	{ AMD_29F010,		"AMD-29F010" },
	{ AMD_29LV800BT32,	"AMD-29LV800BTx2" },
	{ AMD_29LV800BB32,	"AMD-29LV800BBx2" },
	{ AMD_29LV160BB32,	"AMD-29LV160BBx2" },
	{ FLASHRAM,			"Battery-backed SRAM " }
};

int	SectorSizes29F040_8[] = {
		0x10000, 0x10000, 0x10000, 0x10000,
		0x10000, 0x10000, 0x10000, 0x10000,
};

int	SectorSizes29F800B_16[] = {
		0x4000,		0x2000,		0x2000,		0x8000,
		0x10000, 	0x10000,	0x10000,	0x10000,
		0x10000, 	0x10000,	0x10000,	0x10000,
		0x10000, 	0x10000,	0x10000,	0x10000,
		0x10000, 	0x10000,	0x10000
};

int	SectorSizes29LV800BB_32[] = {
		0x8000,		0x4000,		0x4000,		0x10000,
		0x20000, 	0x20000,	0x20000,	0x20000,
		0x20000, 	0x20000,	0x20000,	0x20000,
		0x20000, 	0x20000,	0x20000,	0x20000,
		0x20000, 	0x20000,	0x20000
};

int	SectorSizes29LV800BT_32[] = {
		0x20000, 	0x20000,	0x20000,	0x20000,
		0x20000, 	0x20000,	0x20000,	0x20000,
		0x20000, 	0x20000,	0x20000,	0x20000,
		0x20000, 	0x20000,	0x20000,	0x10000,
		0x4000,		0x4000,		0x8000
};

int	SectorSizes29LV160BB_32[] = {
		0x8000,		0x4000,		0x4000,		0x10000,
		0x20000, 	0x20000,	0x20000,	0x20000,
		0x20000, 	0x20000,	0x20000,	0x20000,
		0x20000, 	0x20000,	0x20000,	0x20000,
		0x20000, 	0x20000,	0x20000,	0x20000,
		0x20000, 	0x20000,	0x20000,	0x20000,
		0x20000, 	0x20000,	0x20000,	0x20000,
		0x20000, 	0x20000,	0x20000,	0x20000,
		0x20000, 	0x20000,	0x20000,
};

#if PLATFORM_HDIRD | PLATFORM_TXA
int	SectorSizesDS1743[] = {
		0x100, 0x400, 0x400, 0x400, 0x400, 0x700, 0x800-64
};
struct sectorinfo	sinfoRAM[sizeof(SectorSizesDS1743)/sizeof(int)];
#else
int	SectorSizesDS1746[] = {
		0x1000,	0x1000,	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000,
		0x1000,	0x1000,	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000,
		0x1000,	0x1000,	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000,
		0x1000,	0x1000,	0x1000, 0x1000, 0x1000, 0x1000, 0x2000-64
};
struct sectorinfo	sinfoRAM[sizeof(SectorSizesDS1746)/sizeof(int)];
#endif

struct sectorinfo	sinfo800a[sizeof(SectorSizes29LV800BB_32)/sizeof(int)];
struct sectorinfo	sinfo800b[sizeof(SectorSizes29LV800BB_32)/sizeof(int)];
struct sectorinfo	sinfo160[sizeof(SectorSizes29LV160BB_32)/sizeof(int)];
struct sectorinfo	sinfo040[sizeof(SectorSizes29F040_8)/sizeof(int)];


/* FlashBankInit():
 *	Assuming a device is of a particular family, this function can 
 *	be used to initialize some of the device-specific information based
 *	on the device-id read in.
 *	This idea is typically used when we are using the same code to
 *	deal with "similar" devices... For this case the 28LV800BB or 28LV800BT
 *	devices.
 */
int
FlashBankInit(struct flashinfo *fbnk, int snum)
{
    int	    i;
    uchar   *begin;
	struct	sectorinfo *sinfo;

    flashtype(fbnk);
    switch(fbnk->id) {
	    case AMD_29LV800BB32:
			fbnk->sectorcnt = 19;
	    	begin = fbnk->base;
			sinfo = fbnk->sectors;
		    for(i=0;i<fbnk->sectorcnt;i++,snum++,sinfo++) {
				sinfo->snum = snum;
				sinfo->size = SectorSizes29LV800BB_32[i];
				sinfo->begin = begin;
				sinfo->end = sinfo->begin + sinfo->size - 1;
				sinfo->protected = 0;
				begin += sinfo->size;
		    }
			break;
	    case AMD_29LV800BT32:
			fbnk->sectorcnt = 19;
	    	begin = fbnk->base;
			sinfo = fbnk->sectors;
		    for(i=0;i<fbnk->sectorcnt;i++,snum++,sinfo++) {
				sinfo->snum = snum;
				sinfo->size = SectorSizes29LV800BT_32[i];
				sinfo->begin = begin;
				sinfo->end = sinfo->begin + sinfo->size - 1;
				sinfo->protected = 0;
				begin += sinfo->size;
		    }
			break;
	    case AMD_29LV800BBBT:
	    case AMD_29LV800BTBB:
			printf("ERROR: BT/BB (0x%lx) devices in same flash bank.\n",
				fbnk->id);
			return(-1);
	    default:
			printf("ERROR: Flash type 0x%lx unrecognized\n",fbnk->id);
			return(-1);
    }
    return (snum);
}

/* FlashInit():
 *	Initialize data structures for each bank of flash...
*/
int
FlashInit(void)
{
    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 *)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 *)Flashtype29LV800B_32,
		(ulong *)EndFlashtype29LV800B_32,
		FlashTypeFbuf800,sizeof(FlashTypeFbuf800)) < 0)
		return(-1);
	if (flashopload((ulong *)Flasherase29LV800B_32,
		(ulong *)EndFlasherase29LV800B_32,
		FlashEraseFbuf800,sizeof(FlashEraseFbuf800)) < 0)
		return(-1);
	if (flashopload((ulong *)Flashewrite29LV800B_32,
		(ulong *)EndFlashewrite29LV800B_32,
		FlashEwriteFbuf800,sizeof(FlashEwriteFbuf800)) < 0)
		return(-1);
	if (flashopload((ulong *)Flashwrite29LV800B_32,
		(ulong *)EndFlashwrite29LV800B_32,
		FlashWriteFbuf800,sizeof(FlashWriteFbuf800)) < 0)
		return(-1);

	/*
	 * Set up BANK 0:
	 * The device is a 29F040.
	 */
    fbnk = &FlashBank[0];
    fbnk->id = AMD_29F040;
    fbnk->base = (uchar *)FLASH_BANK0_BASE_ADDR;
    fbnk->end = fbnk->base + (FLASH_BANK0_SIZE-1);
    fbnk->sectorcnt = 8;
    fbnk->width = 1;
	/* Establish flash operation function pointers: */
    fbnk->fltype = (int(*)())FlashTypeFbuf040;
    fbnk->flerase = (int(*)())FlashEraseFbuf040;
    fbnk->flwrite = (int(*)())FlashWriteFbuf040;
    fbnk->flewrite = (int(*)())FlashEwriteFbuf040;
    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;
		begin += SectorSizes29F040_8[i];
	}

	/* Protect sectors designated by FLASH_PROTECT_RANGE: */
	sectorProtect(FLASH_PROTECT_RANGE,1);

#if PLATFORM_HDIRD | PLATFORM_TXA
	/*
	 * Set up HDIRD/TXA BANK 1:
	 * The device may be a 29LV800BB or 29LV800BT
	 */
    fbnk = &FlashBank[1];
	/* Establish flash-op function pointers: */
    fbnk->fltype = (int(*)())FlashTypeFbuf800;
    fbnk->flerase = (int(*)())FlashEraseFbuf800;
    fbnk->flwrite = (int(*)())FlashWriteFbuf800;
    fbnk->flewrite = (int(*)())FlashEwriteFbuf800;
	/* Establish flash bank characteristics: */
    fbnk->base = (uchar *)FLASH_BANK1_BASE_ADDR;
    fbnk->end = fbnk->base + (FLASH_BANK1_SIZE-1);
    fbnk->width = FLASH_BANK1_WIDTH;
    fbnk->sectors = sinfo800a;
	snum = FlashBankInit(fbnk,snum);
	if (snum == -1)
		return(-1);

	/*
	 * Set up HDIRD/TXA BANK 2:
	 * The device may be a 29LV800BB or 29LV800BT
	 */
    fbnk = &FlashBank[2];
	/* Establish flash-op function pointers: */
    fbnk->fltype = (int(*)())FlashTypeFbuf800;
    fbnk->flerase = (int(*)())FlashEraseFbuf800;
    fbnk->flwrite = (int(*)())FlashWriteFbuf800;
    fbnk->flewrite = (int(*)())FlashEwriteFbuf800;
	/* Establish flash bank characteristics: */
    fbnk->base = (uchar *)FLASH_BANK2_BASE_ADDR;	/* Base address of bank. */
    fbnk->end = fbnk->base + (FLASH_BANK2_SIZE-1);	/* End address of bank. */
    fbnk->width = FLASH_BANK2_WIDTH;				/* Width (in bytes). */
    fbnk->sectors = sinfo800b;				/* Pointer to sector size table. */
	snum = FlashBankInit(fbnk,snum);
	if (snum == -1)
		return(-1);

	/*
	 * Set up HDIRD/TXA BANK 3:
	 * This is the battery backed ram for HDIRD & TXA platforms.
	 */
	snum = FlashRamInit(snum, sizeof(SectorSizesDS1743)/sizeof(int),
		&FlashBank[3], sinfoRAM, SectorSizesDS1743);
#else
	/*
	 * Set up NETDEC BANK 1:
	 * The device is a 29LV160BB
	 */
    fbnk = &FlashBank[1];
    fbnk->id = AMD_29LV160BB32;						/* Device id. */
    fbnk->base = (uchar *)FLASH_BANK1_BASE_ADDR;	/* Base address of bank. */
    fbnk->end = fbnk->base + (FLASH_BANK1_SIZE-1);	/* End address of bank. */
    fbnk->sectorcnt = sizeof(SectorSizes29LV160BB_32)/sizeof(int);
    fbnk->width = FLASH_BANK1_WIDTH;				/* Width (in bytes). */
    fbnk->fltype = (int(*)())FlashTypeFbuf800;	
    fbnk->flerase = (int(*)())FlashEraseFbuf800;
    fbnk->flwrite = (int(*)())FlashWriteFbuf800;
    fbnk->flewrite = (int(*)())FlashEwriteFbuf800;
    fbnk->sectors = sinfo160;		/* Pointer to sector size table. */
    begin = fbnk->base;
    for(i=0;i<fbnk->sectorcnt;i++,snum++) {
		sinfo160[i].snum = snum;
		sinfo160[i].size = SectorSizes29LV160BB_32[i];
		sinfo160[i].begin = begin;
		sinfo160[i].end = sinfo160[i].begin + sinfo160[i].size - 1;
		sinfo160[i].protected = 0;
		begin += SectorSizes29LV160BB_32[i];
    }

	/*
	 * Set up NETDEC BANK 3:
	 * This is the battery backed ram for NETDEC platform.
	 */
	snum = FlashRamInit(snum, sizeof(SectorSizesDS1746)/sizeof(int),
		&FlashBank[2], sinfoRAM, SectorSizesDS1746);
#endif

    return(0);
}

#endif

⌨️ 快捷键说明

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