📄 flash.c
字号:
/*******************************************************************************
* Copyright Statement:
* --------------------
* This software is protected by Copyright and the information contained herein
* is confidential. The software may not be copied and the information
* contained herein may not be used or disclosed except with the written
* permission of INFOMAX COMMUNICATION CO.,LTD.
*
* MODULE NAME:
* DESCRIPTION:
* AUTHOR:
* BEGIN DATE:
* LAST MODIFICATION:
*****************************************************************************/
/*******************************************************************************
Include/header files
*******************************************************************************/
#include "flash.h"
#include "gptimer.h"
#include "assert.h"
/*******************************************************************************
Constant/Marco
*******************************************************************************/
#define M58LR128FT
#define Correct_block 0x20000000
/*******************************************************************************
Structure/Union/Enum/Typedef
*******************************************************************************/
#ifdef M58LR128FT /* The M58LR128FT device */
/* 1Mbit/block*15(banks)*8(blocks) +
1Mbit/block*1(banks)*7(blocks) + 256Kbit/block*1(banks)*4(blocks)*/
/* 15(banks)*8(blocks)*1Mbit + {1(banks)*7(blocks)*1Mbit + 1(banks)*4(blocks)*256Kbit}
-> 16(banks)*8(Mbit) */
const UINT32 BlockOffset[] = { // 8Mbit/banks ; bank:0-14->1Mbit/block ; bank:15->frist 7 blocks is 1Mbit/block, the other four is 256Kbit/block
//1Mbit/block[2^20 bit] [128KByte/block : 2^17 byte]
0x10000000, /* Start offset of block 0 */ //0x10000000
0x10020000, /* Start offset of block 1 */ //0x10020000
0x10040000, /* Start offset of block 2 */
0x10060000, /* Start offset of block 3 */
0x10080000, /* Start offset of block 4 */
0x100A0000, /* Start offset of block 5 */
0x100C0000, /* Start offset of block 6 */
0x100E0000, /* Start offset of block 7 */
//1Mbit/block
0x10100000, /* Start offset of block 8 */
0x10120000, /* Start offset of block 9 */
0x10140000, /* Start offset of block 10 */
0x10160000, /* Start offset of block 11 */
0x10180000, /* Start offset of block 12 */
0x101A0000, /* Start offset of block 13 */
0x101C0000, /* Start offset of block 14 */
0x101E0000, /* Start offset of block 15 */
//1Mbit/block
0x10200000, /* Start offset of block 16 */
0x10220000, /* Start offset of block 17 */
0x10240000, /* Start offset of block 18 */
0x10260000, /* Start offset of block 19 */
0x10280000, /* Start offset of block 20 */
0x102A0000, /* Start offset of block 21 */
0x102C0000, /* Start offset of block 22 */
0x102E0000, /* Start offset of block 23 */
//1Mbit/block
0x10300000, /* Start offset of block 24 */
0x10320000, /* Start offset of block 25 */
0x10340000, /* Start offset of block 26 */
0x10360000, /* Start offset of block 27 */
0x10380000, /* Start offset of block 28 */
0x103A0000, /* Start offset of block 29 */
0x103C0000, /* Start offset of block 30 */
0x103E0000, /* Start offset of block 31 */
//1Mbit/block
0x10400000, /* Start offset of block 32 */
0x10420000, /* Start offset of block 33 */
0x10440000, /* Start offset of block 34 */
0x10460000, /* Start offset of block 35 */
0x10480000, /* Start offset of block 36 */
0x104A0000, /* Start offset of block 37 */
0x104C0000, /* Start offset of block 38 */
0x104E0000, /* Start offset of block 39 */
//1Mbit/block
0x10500000, /* Start offset of block 40 */
0x10520000, /* Start offset of block 41 */
0x10540000, /* Start offset of block 42 */
0x10560000, /* Start offset of block 43 */
0x10580000, /* Start offset of block 44 */
0x105A0000, /* Start offset of block 45 */
0x105C0000, /* Start offset of block 46 */
0x105E0000, /* Start offset of block 47 */
//1Mbit/block
0x10600000, /* Start offset of block 48 */
0x10620000, /* Start offset of block 49 */
0x10640000, /* Start offset of block 50 */
0x10660000, /* Start offset of block 51 */
0x10680000, /* Start offset of block 52 */
0x106A0000, /* Start offset of block 53 */
0x106C0000, /* Start offset of block 54 */
0x106E0000, /* Start offset of block 55 */
//1Mbit/block
0x10700000, /* Start offset of block 56 */
0x10720000, /* Start offset of block 57 */
0x10740000, /* Start offset of block 58 */
0x10760000, /* Start offset of block 59 */
0x10780000, /* Start offset of block 60 */
0x107A0000, /* Start offset of block 61 */
0x107C0000, /* Start offset of block 62 */
0x107E0000, /* Start offset of block 63 */
//1Mbit/block
0x10800000, /* Start offset of block 64 */
0x10820000, /* Start offset of block 65 */
0x10840000, /* Start offset of block 66 */
0x10860000, /* Start offset of block 67 */
0x10880000, /* Start offset of block 68 */
0x108A0000, /* Start offset of block 69 */
0x108C0000, /* Start offset of block 70 */
0x108E0000, /* Start offset of block 71 */
//1Mbit/block
0x10900000, /* Start offset of block 72 */
0x10920000, /* Start offset of block 73 */
0x10940000, /* Start offset of block 74 */
0x10960000, /* Start offset of block 75 */
0x10980000, /* Start offset of block 76 */
0x109A0000, /* Start offset of block 77 */
0x109C0000, /* Start offset of block 78 */
0x109E0000, /* Start offset of block 79 */
//1Mbit/block
0x10A00000, /* Start offset of block 80 */
0x10A20000, /* Start offset of block 81 */
0x10A40000, /* Start offset of block 82 */
0x10A60000, /* Start offset of block 83 */
0x10A80000, /* Start offset of block 84 */
0x10AA0000, /* Start offset of block 85 */
0x10AC0000, /* Start offset of block 86 */
0x10AE0000, /* Start offset of block 87 */
//1Mbit/block
0x10B00000, /* Start offset of block 88 */
0x10B20000, /* Start offset of block 89 */
0x10B40000, /* Start offset of block 90 */
0x10B60000, /* Start offset of block 91 */
0x10B80000, /* Start offset of block 92 */
0x10BA0000, /* Start offset of block 93 */
0x10BC0000, /* Start offset of block 94 */
0x10BE0000, /* Start offset of block 95 */
//1Mbit/block
0x10C00000, /* Start offset of block 96 */
0x10C20000, /* Start offset of block 97 */
0x10C40000, /* Start offset of block 98 */
0x10C60000, /* Start offset of block 99 */
0x10C80000, /* Start offset of block 100 */
0x10CA0000, /* Start offset of block 101 */
0x10CC0000, /* Start offset of block 102 */
0x10CE0000, /* Start offset of block 103 */
//1Mbit/block
0x10D00000, /* Start offset of block 104 */
0x10D20000, /* Start offset of block 105 */
0x10D40000, /* Start offset of block 106 */
0x10D60000, /* Start offset of block 107 */
0x10D80000, /* Start offset of block 108 */
0x10DA0000, /* Start offset of block 109 */
0x10DC0000, /* Start offset of block 110 */
0x10DE0000, /* Start offset of block 111 */
//1Mbit/block
0x10E00000, /* Start offset of block 112 */
0x10E20000, /* Start offset of block 113 */
0x10E40000, /* Start offset of block 114 */
0x10E60000, /* Start offset of block 115 */
0x10E80000, /* Start offset of block 116 */
0x10EA0000, /* Start offset of block 117 */
0x10EC0000, /* Start offset of block 118 */
0x10EE0000, /* Start offset of block 119 */
//1Mbit/block
0x10F00000, /* Start offset of block 120 */
0x10F20000, /* Start offset of block 121 */
0x10F40000, /* Start offset of block 122 */
0x10F60000, /* Start offset of block 123 */
0x10F80000, /* Start offset of block 124 */
0x10FA0000, /* Start offset of block 125 */
0x10FC0000, /* Start offset of block 126 */ //1Mbit/block
//256Kbit/block [32KByte/block: 2^15]
0x10FE0000, /* Start offset of block 127 */
0x10FE8000, /* Start offset of block 128 */
0x10FF0000, /* Start offset of block 129 */
0x10FF8000, /* Start offset of block 130 */
0x11000000 /* End offset+1 131*/
}; /* EndArray BlockOffset[] */
const UINT32 BankFirstBlock[] = { //16 banks : 8Mb/bank
0, /* First Block of bank 0 */ //8blocks
8, /* First Block of bank 1 */ //8blocks
16, /* First Block of bank 2 */ //8blocks
24, /* First Block of bank 3 */ //8blocks
32, /* First Block of bank 4 */ //8blocks
40, /* First Block of bank 5 */ //8blocks
48, /* First Block of bank 6 */ //8blocks
56, /* First Block of bank 7 */ //8blocks
64, /* First Block of bank 8 */ //8blocks
72, /* First Block of bank 9 */ //8blocks
80, /* First Block of bank 10 */ //8blocks
88, /* First Block of bank 11 */ //8blocks
96, /* First Block of bank 12 */ //8blocks
104, /* First Block of bank 13 */ //8blocks
112, /* First Block of bank 14 */ //8blocks
120 /* First Block of bank 15 */ //11blocks
}; /* EndArray BankFirstBlock[] */
const UINT32 NUM_BANKS = (sizeof(BankFirstBlock)/sizeof(BankFirstBlock[0])); //size = 16
const UINT32 NUM_BLOCKS = (sizeof(BlockOffset)/sizeof(BlockOffset[0])); //flash block size = 131 = NUM_BLOCKS-1
#endif /* USE_M58LR128FT */
/*
const UINT32 NUM_BANKS = (sizeof(BankFirstBlock)/sizeof(BankFirstBlock[0])); //size = 16
const UINT32 NUM_BLOCKS = (sizeof(BlockOffset)/sizeof(BlockOffset[0])); //size = 131
*/
/*******************************************************************************
Local function prototype
*******************************************************************************/
/*******************************************************************************
Global/Local variables
*******************************************************************************/
/*******************************************************************************
Function implementation
*******************************************************************************/
/**
@Desc
Description for function_name
@Param parameter 1
Put parameter 1 description here
@Param parameter 2
Put parameter 2 description here
@Return Return value 1 and it description
@Return Return value 1 and it description
*/
void flash_init(void)
{
/* None for now, add wait state setting later */
}
/**
@Desc
FLASH read
@Param flash_offset
Starting position to read (FLASH_BASE + flash_offset)
@Param read_size
number of data units (16-bit) to read
@Param read_buf_ptr
Destination area to hold the data read from FLASH
@Return VOID
*/
void flash_read(unsigned int flash_offset, unsigned int read_size, unsigned short *read_buf_ptr)
{
int i;
unsigned int flash_read_starting_address;
flash_read_starting_address = FLASH_BASE + (flash_offset << 1);
/* Validate paratmers */
if( ( read_buf_ptr == NULL ) ) /* Add flash parameter checking later */
{
while(1);
}
for(i=0; i<read_size; i++)
{
*(read_buf_ptr+i) = *( (unsigned short *)(flash_read_starting_address) + i);
}
}
unsigned int flash_write(unsigned int flash_offset, unsigned int write_size, unsigned short *write_buf_ptr, unsigned int lock_block)
{
int i;
unsigned int flash_write_starting_address;
unsigned short flash_status_reg;
// unsigned int flash_block_address;
// unsigned int lock_block;
flash_write_starting_address = FLASH_BASE + (flash_offset << 1);
/* Validate paratmers */
if( ( write_buf_ptr == NULL ) ) /* Add flash parameter checking later */
{
while(1);
}
for(i=0; i<write_size; i++)
{
lock_block = flash_block_unlock((flash_write_starting_address) + i , lock_block);
*( (unsigned short *)(flash_write_starting_address) + i) = (unsigned short)FLASH_CMD_WRITE;
*( (unsigned short *)(flash_write_starting_address) + i) = *(write_buf_ptr+i);
do
{
flash_status_reg = *( (unsigned short *)(flash_write_starting_address) + i);
}
while( (flash_status_reg & SR7) == 0);
if( ( (flash_status_reg & SR3) == SR3 ) ||
( (flash_status_reg & SR4) == SR4 ) ||
( (flash_status_reg & SR1) == SR1 ) )
{
////printf("%x write error! status=%x\n",flash_write_starting_address+i,flash_status_reg);
//while(1);
}
lock_block = flash_block_lock((flash_write_starting_address) + i ,lock_block);
}
return lock_block;
}
void ghdi_target_nvmem_format (void)
{
UINT32 CurrenBlockNumber;
for( CurrenBlockNumber = 0; CurrenBlockNumber < NUM_BLOCKS-1; CurrenBlockNumber++ ) { //total 131: CurBlock = 0~130
ghdi_flash_block_erase(BlockOffset[CurrenBlockNumber]);
}
/*
for (test_count=0;test_count<50;test_count++)
{
led_on(3);
// Wait for a moment
for(i=0; i<100000; i++);
}*/
}
unsigned int flash_find_block_address(unsigned int flash_offset,unsigned int lock_block)
{
unsigned int ret_val;
UINT32 CurrenBlockNumber;
if (flash_offset >= BlockOffset[lock_block])
{
for( CurrenBlockNumber = lock_block; CurrenBlockNumber <= NUM_BLOCKS-1; CurrenBlockNumber++ ) { //total 131: CurBlock = 0~130
if ((flash_offset>=BlockOffset[CurrenBlockNumber]) && (flash_offset<BlockOffset[CurrenBlockNumber+1]) ) {
ret_val = CurrenBlockNumber;
break;
}
}
}
else if (flash_offset < BlockOffset[lock_block])
{
for( CurrenBlockNumber = 0; CurrenBlockNumber < lock_block; CurrenBlockNumber++ ) { //total 131: CurBlock = 0~130
if ((flash_offset>=BlockOffset[CurrenBlockNumber]) && (flash_offset<BlockOffset[CurrenBlockNumber+1]) ) {
ret_val = CurrenBlockNumber;
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -