diff options
Diffstat (limited to 'board/esd/ar405/flash.c')
-rw-r--r-- | board/esd/ar405/flash.c | 95 |
1 files changed, 35 insertions, 60 deletions
diff --git a/board/esd/ar405/flash.c b/board/esd/ar405/flash.c index a651b6f..89af119 100644 --- a/board/esd/ar405/flash.c +++ b/board/esd/ar405/flash.c @@ -33,18 +33,19 @@ /*----------------------------------------------------------------------- * Functions */ -static ulong flash_get_size (vu_long *addr, flash_info_t *info); -static void flash_get_offsets (ulong base, flash_info_t *info); +static ulong flash_get_size (vu_long * addr, flash_info_t * info); +static void flash_get_offsets (ulong base, flash_info_t * info); /*----------------------------------------------------------------------- */ unsigned long flash_init (void) { - unsigned long size_b0, size_b1; + unsigned long size_b0; int i; uint pbcr; - unsigned long base_b0, base_b1; + unsigned long base_b0; + int size_val = 0; /* Init: no FLASHes known */ for (i=0; i<CFG_MAX_FLASH_BANKS; ++i) { @@ -53,74 +54,48 @@ unsigned long flash_init (void) /* Static FLASH Bank configuration here - FIXME XXX */ - base_b0 = FLASH_BASE0_PRELIM; - size_b0 = flash_get_size((vu_long *)base_b0, &flash_info[0]); + size_b0 = flash_get_size((vu_long *)FLASH_BASE0_PRELIM, &flash_info[0]); if (flash_info[0].flash_id == FLASH_UNKNOWN) { printf ("## Unknown FLASH on Bank 0 - Size = 0x%08lx = %ld MB\n", size_b0, size_b0<<20); } - base_b1 = FLASH_BASE1_PRELIM; - size_b1 = flash_get_size((vu_long *)base_b1, &flash_info[1]); + /* Setup offsets */ + flash_get_offsets (-size_b0, &flash_info[0]); /* Re-do sizing to get full correct info */ + mtdcr(ebccfga, pb0cr); + pbcr = mfdcr(ebccfgd); + mtdcr(ebccfga, pb0cr); + base_b0 = -size_b0; + switch (size_b0) { + case 1 << 20: + size_val = 0; + break; + case 2 << 20: + size_val = 1; + break; + case 4 << 20: + size_val = 2; + break; + case 8 << 20: + size_val = 3; + break; + case 16 << 20: + size_val = 4; + break; + } + pbcr = (pbcr & 0x0001ffff) | base_b0 | (size_val << 17); + mtdcr(ebccfgd, pbcr); - if (size_b1) - { - mtdcr(ebccfga, pb0cr); - pbcr = mfdcr(ebccfgd); - mtdcr(ebccfga, pb0cr); - base_b1 = -size_b1; - pbcr = (pbcr & 0x0001ffff) | base_b1 | (((size_b1/1024/1024)-1)<<17); - mtdcr(ebccfgd, pbcr); - /* printf("pb1cr = %x\n", pbcr); */ - } - - if (size_b0) - { - mtdcr(ebccfga, pb1cr); - pbcr = mfdcr(ebccfgd); - mtdcr(ebccfga, pb1cr); - base_b0 = base_b1 - size_b0; - pbcr = (pbcr & 0x0001ffff) | base_b0 | (((size_b0/1024/1024)-1)<<17); - mtdcr(ebccfgd, pbcr); - /* printf("pb0cr = %x\n", pbcr); */ - } - - size_b0 = flash_get_size((vu_long *)base_b0, &flash_info[0]); - - flash_get_offsets (base_b0, &flash_info[0]); - - /* monitor protection ON by default */ + /* Monitor protection ON by default */ (void)flash_protect(FLAG_PROTECT_SET, - base_b0+size_b0-monitor_flash_len, - base_b0+size_b0-1, + -CFG_MONITOR_LEN, + 0xffffffff, &flash_info[0]); - if (size_b1) { - /* Re-do sizing to get full correct info */ - size_b1 = flash_get_size((vu_long *)base_b1, &flash_info[1]); - - flash_get_offsets (base_b1, &flash_info[1]); - - /* monitor protection ON by default */ - (void)flash_protect(FLAG_PROTECT_SET, - base_b1+size_b1-monitor_flash_len, - base_b1+size_b1-1, - &flash_info[1]); - /* monitor protection OFF by default (one is enough) */ - (void)flash_protect(FLAG_PROTECT_CLEAR, - base_b0+size_b0-monitor_flash_len, - base_b0+size_b0-1, - &flash_info[0]); - } else { - flash_info[1].flash_id = FLASH_UNKNOWN; - flash_info[1].sector_count = -1; - } - flash_info[0].size = size_b0; - flash_info[1].size = size_b1; - return (size_b0 + size_b1); + return (size_b0); } |