⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flash.c

📁 realview下的一个arm9的bootloader烧录器.支持norflash读写
💻 C
📖 第 1 页 / 共 2 页
字号:
/*******************************************************************************
 * 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 + -