- 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)
|
void cfi_init(flash_t *pObj, UINT32 base_addr)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
UINT8 *pInfo;
|
UINT8 *pInfo;
|
||||||
|
UINT32 endian;
|
||||||
|
UINT8 *pEndian;
|
||||||
|
|
||||||
pObj->pBase = (void*)base_addr;
|
pObj->pBase = (void*)base_addr;
|
||||||
|
|
||||||
@@ -43,6 +34,14 @@ void cfi_init(flash_t *pObj, UINT32 base_addr)
|
|||||||
{
|
{
|
||||||
pInfo[i] = 0;
|
pInfo[i] = 0;
|
||||||
}
|
}
|
||||||
|
pObj->eb = 0;
|
||||||
|
endian = 0x12345678;
|
||||||
|
pEndian = (UINT8*)&endian;
|
||||||
|
if (*pEndian == 0x12)
|
||||||
|
{
|
||||||
|
pObj->eb = 1;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT32 cfi_find(flash_t *pObj)
|
UINT32 cfi_find(flash_t *pObj)
|
||||||
@@ -50,7 +49,7 @@ UINT32 cfi_find(flash_t *pObj)
|
|||||||
int i;
|
int i;
|
||||||
volatile UINT32 *pF;
|
volatile UINT32 *pF;
|
||||||
volatile UINT16 *pF16;
|
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;
|
UINT32 size;
|
||||||
|
|
||||||
pF = (UINT32*)pObj->pBase;
|
pF = (UINT32*)pObj->pBase;
|
||||||
@@ -58,9 +57,9 @@ UINT32 cfi_find(flash_t *pObj)
|
|||||||
|
|
||||||
// Look for flash
|
// Look for flash
|
||||||
*pF = 0x00980098;
|
*pF = 0x00980098;
|
||||||
for (i=0; i < sizeof(qry_ref); i++)
|
// for (i=0; i < sizeof(qry_ref); i++)
|
||||||
if (((UINT8*)(&pF[0x10]))[i] != qry_ref[i])
|
// if (((UINT8*)(&pF[0x10]))[i] != qry_ref[i])
|
||||||
return (UINT32)-1;
|
// return (UINT32)-1;
|
||||||
|
|
||||||
*pF = 0x00FF00FF;
|
*pF = 0x00FF00FF;
|
||||||
*pF = 0x00900090;
|
*pF = 0x00900090;
|
||||||
@@ -262,3 +261,23 @@ UINT32 flash_verify(flash_t *pObj, UINT32 offset, UINT8 *pData, UINT32 size)
|
|||||||
|
|
||||||
return 0;
|
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
|
typedef struct _sflash_t
|
||||||
{
|
{
|
||||||
void *pBase;
|
void *pBase;
|
||||||
|
UINT32 eb;
|
||||||
flash_info_t info;
|
flash_info_t info;
|
||||||
|
|
||||||
} flash_t;
|
} 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_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 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_find(flash_t *pObj, UINT32 base_addr);
|
||||||
UINT32 flash_erase(flash_t *pObj, UINT32 offset, UINT32 size);
|
UINT32 flash_erase(flash_t *pObj, UINT32 offset, UINT32 size);
|
||||||
UINT32 flash_program(flash_t *pObj, UINT32 offset, UINT8 *pData, UINT32 size);
|
UINT32 flash_program(flash_t *pObj, UINT32 offset, UINT8 *pData, UINT32 size);
|
||||||
|
|||||||
Reference in New Issue
Block a user