- 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
This commit is contained in:
2009-04-15 13:41:41 +00:00
parent 893e93530d
commit e19528b20f
2 changed files with 37 additions and 16 deletions
+34 -15
View File
@@ -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;
}
+3 -1
View File
@@ -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);