- 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:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user