From e19528b20fb3e762685067060178fe731635f645 Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Wed, 15 Apr 2009 13:41:41 +0000 Subject: [PATCH] - added support functions: flash_aligned_addr_by...() to obtain block aligned addresses - removed query in flash_find due to stack-problems Committed on the Free edition of March Hare Software CVSNT Server. Upgrade to CVS Suite for more features and support: http://march-hare.com/cvsnt/ git-svn-id: http://moon:8086/svn/vhdl/trunk@435 cc03376c-175c-47c8-b038-4cd826a8556b --- lib/CPUs/MIPS/bsp/examples/cfiflash.c | 49 +++++++++++++++++++-------- lib/CPUs/MIPS/bsp/examples/cfiflash.h | 4 ++- 2 files changed, 37 insertions(+), 16 deletions(-) diff --git a/lib/CPUs/MIPS/bsp/examples/cfiflash.c b/lib/CPUs/MIPS/bsp/examples/cfiflash.c index 483ef85..92aeaed 100644 --- a/lib/CPUs/MIPS/bsp/examples/cfiflash.c +++ b/lib/CPUs/MIPS/bsp/examples/cfiflash.c @@ -20,21 +20,12 @@ UINT32 cfi_get_status(flash_t *pObj) } -UINT32 flash_get_nextblock(flash_t *pObj, UINT32 offset) -{ - UINT32 blocknum; - - blocknum = offset/pObj->info.blocksize; - if (offset%pObj->info.blocksize) - blocknum++; - - return blocknum*pObj->info.blocksize; -} - void cfi_init(flash_t *pObj, UINT32 base_addr) { int i; UINT8 *pInfo; + UINT32 endian; + UINT8 *pEndian; pObj->pBase = (void*)base_addr; @@ -43,6 +34,14 @@ void cfi_init(flash_t *pObj, UINT32 base_addr) { pInfo[i] = 0; } + pObj->eb = 0; + endian = 0x12345678; + pEndian = (UINT8*)&endian; + if (*pEndian == 0x12) + { + pObj->eb = 1; + } + } UINT32 cfi_find(flash_t *pObj) @@ -50,7 +49,7 @@ UINT32 cfi_find(flash_t *pObj) int i; volatile UINT32 *pF; volatile UINT16 *pF16; - UINT8 qry_ref[12] = {0x51, 0x00, 0x51, 0x00, 0x52, 0x00, 0x52, 0x00, 0x59, 0x00, 0x59, 0x00}; +// UINT8 qry_ref[12] = {0x51, 0x00, 0x51, 0x00, 0x52, 0x00, 0x52, 0x00, 0x59, 0x00, 0x59, 0x00}; UINT32 size; pF = (UINT32*)pObj->pBase; @@ -58,9 +57,9 @@ UINT32 cfi_find(flash_t *pObj) // Look for flash *pF = 0x00980098; - for (i=0; i < sizeof(qry_ref); i++) - if (((UINT8*)(&pF[0x10]))[i] != qry_ref[i]) - return (UINT32)-1; +// for (i=0; i < sizeof(qry_ref); i++) +// if (((UINT8*)(&pF[0x10]))[i] != qry_ref[i]) +// return (UINT32)-1; *pF = 0x00FF00FF; *pF = 0x00900090; @@ -262,3 +261,23 @@ UINT32 flash_verify(flash_t *pObj, UINT32 offset, UINT8 *pData, UINT32 size) return 0; } + +UINT32 flash_aligned_addr_by_offset(flash_t *pObj, UINT32 offset) +{ + UINT32 blocknum; + + blocknum = offset/pObj->info.blocksize; + if (offset%pObj->info.blocksize) + blocknum++; + + return blocknum*pObj->info.blocksize; +} + +UINT32 flash_aligned_addr_by_blocknum(flash_t *pObj, UINT32 blocknum) +{ + if (blocknum >= pObj->info.nblocks) + blocknum = pObj->info.nblocks - 1; + + return blocknum*pObj->info.blocksize; +} + diff --git a/lib/CPUs/MIPS/bsp/examples/cfiflash.h b/lib/CPUs/MIPS/bsp/examples/cfiflash.h index 95e5ea2..4089537 100644 --- a/lib/CPUs/MIPS/bsp/examples/cfiflash.h +++ b/lib/CPUs/MIPS/bsp/examples/cfiflash.h @@ -26,6 +26,7 @@ typedef struct _sflash_info_t typedef struct _sflash_t { void *pBase; + UINT32 eb; flash_info_t info; } flash_t; @@ -36,7 +37,8 @@ UINT32 cfi_block_erase(flash_t *pObj, UINT32 word_index); UINT32 cfi_program_single(flash_t *pObj, UINT32 word_index, UINT32 word); UINT32 cfi_program_multi(flash_t *pObj, UINT32 word_index, UINT32 *pWords, UINT32 num_words); -UINT32 flash_get_nextblock(flash_t *pObj, UINT32 offset); +UINT32 flash_aligned_addr_by_offset(flash_t *pObj, UINT32 offset); +UINT32 flash_aligned_addr_by_blocknum(flash_t *pObj, UINT32 blocknum); UINT32 flash_find(flash_t *pObj, UINT32 base_addr); UINT32 flash_erase(flash_t *pObj, UINT32 offset, UINT32 size); UINT32 flash_program(flash_t *pObj, UINT32 offset, UINT8 *pData, UINT32 size);