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

📄 bl_imageloader.c

📁 ARM Bootloader程序
💻 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 MediaTek Inc. (C) 2005
*
*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
*
*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. 
*
*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
*
*****************************************************************************/

/*****************************************************************************
 *
 * Filename:
 * ---------
 *   bl_ImageLoader.c
 *
 * Project:
 * --------
 *   NFB - Bootloader
 *
 * Description:
 * ------------
 *   Reponsible for loading image.
 *
 * Author:
 * -------
 * -------
 *
 *============================================================================
 *             HISTORY
 * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
 *------------------------------------------------------------------------------
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 *------------------------------------------------------------------------------
 * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
 *============================================================================
 ****************************************************************************/
 
#include <kal_release.h>
#include <bl_Init.h>
#include <bl_loader.h>
#include <bl_NFI.h>
#include <stdio.h>
#include <stdlib.h>
 
 
#define TOTAL_BIN_PACK   8

#define BACK_UP_ADDRESS  0x40000000

/*
typedef struct _BOOTLHeader_
{
   kal_char    ID1[12];
   kal_char    version[4];
   kal_uint32  length;
   kal_uint32  startAddr;
   kal_uint32  checksum;
   kal_char    ID2[8];
   NFI_MENU    NFIinfo;
   kal_uint16  pagesPerBlock;   
   kal_uint16  totalBlocks;
   kal_uint16  blockShift;
   kal_uint16  linkAddr[6];
   kal_uint16  lastBlock;
} BOOTL_HEADER;
*/
BOOTL_HEADER  BLHeader;   

#pragma arm section zidata = "INTERNZI"

/*
typedef struct {
	kal_uint32  m_load_addr;
	kal_uint32  m_length;
} Nand_ImageInfo_S;


typedef struct {
	Nand_ImageInfo_S	m_image[10];
	kal_uint32        m_image_count;
} Nand_ImageList_S;
*/
Nand_ImageList_S ImageHeader; 

#pragma arm section zidata


const kal_char blID1[12] = "BOOTLOADER!";
const kal_char blID2[8] = "NFIINFO";


extern const kal_int8 BootLDVerno[];
extern void jump_cmd(kal_uint32 baseAddr);
 
 
/**********************************************************
Description : C entry of the project.
Input       : None
Output      : None
***********************************************************/
void _errorExit(_RET_CODE errorCode, kal_uint32 pageNo, kal_uint32 *ptr)
{
   switch ( errorCode )
   {
      case NFI_ZERO_POINTER: 
         dbg_print("\n\n\rNFI Read Error: Zero pointer is encountered!\n\r");
         break;
      case NFI_READ_DATA_TIMEOUT:          
         dbg_print("\n\n\rNFI Read Error: Timeout while reading data!\n\r");
         break;
      case NFI_READ_SPARE_TIMEOUT:          
         dbg_print("\n\n\rNFI Read Error: Timeout while reading spare data!\n\r");
         break;
      case DMA_TRANSFER_DATA_TIMEOUT:          
         dbg_print("\n\n\rNFI Read Error: DMA timeout while transferring data!\n\r");
         break;
      case DMA_TRANSFER_SPARE_TIMEOUT:          
         dbg_print("\n\n\rNFI Read Error: DMA timeout while transferring spare data!\n\r");
         break;
      case NFI_ECC_2BITS_ERR: 
         dbg_print("\n\n\rNFI Read Error: NFI ECC 2-bits error!\n\r");
         break;
      default:
         break;
   }
   
   dbg_print(".....@ Page numberd %d, desitination address %x\n\r", pageNo, (kal_uint32)ptr);
   dbg_print(".....Good-bye with error!\n\n\n\r");
   
   while (1)
      WacthDogRestart();
}


/**********************************************************
Description : MultiPagaReading
Input       : None
Output      : None
***********************************************************/
static kal_uint32 MultiPagaReading(kal_uint8 index)
{
   _RET_CODE   status;
   kal_uint32  *ptr;
   kal_int32   length;
   kal_uint32  blockNo, maskI, pageTracking;
   kal_uint32  curPosition; /* in terms of pages */
   kal_uint32  addr1;
   kal_uint16  addr2;   
   kal_uint32  spare[64>>2];
   
   pageTracking = 0;
   blockNo = ImageHeader.m_image[index].m_start_block;   ;
   maskI = (0xffffffff >> (32-(BLHeader.blockShift - BLHeader.NFIinfo.pageShift)));
   /* Current position in terms of page */
   curPosition = blockNo << (BLHeader.blockShift - BLHeader.NFIinfo.pageShift);
      
   /* Exact position in terms of pages */
   addr1 = curPosition << BLHeader.NFIinfo.pageShift;
   addr2 = 0;
   if ( BLHeader.NFIinfo.addressCycle>4 )
   {
      if ( curPosition&0xffff0000 )
         addr2 = (kal_uint32)(curPosition >> BLHeader.NFIinfo.pageShift);
   }

   length = ImageHeader.m_image[index].m_length;   
   ptr = (kal_uint32 *)ImageHeader.m_image[index].m_load_addr;   
   
   /* The first block, which contains Image Header at last page, 
      must be skipped; thre processing is seperated from the others 
      blocks for performance consideration */      
   if ( length>(BLHeader.NFIinfo.pageSize*(BLHeader.pagesPerBlock-1)) )
   {
      while ( pageTracking<(BLHeader.pagesPerBlock-1) )
      {
#ifdef BIT_ERROR_TEST
		EmulateBitError((kal_uint32 *)ptr, (kal_uint32 *)&spare[0], 
 			BLHeader.NFIinfo.addressCycle, addr1, addr2, BLHeader.NFIinfo.pageSize);
#endif

#ifdef BL_ECC_ENABLE     
         status = NFI_PageRead(ptr, &spare[0], BLHeader.NFIinfo.pageSize, \
                               BLHeader.NFIinfo.addressCycle, addr1, addr2, \
                               BLHeader.NFIinfo.pageSize, KAL_TRUE, KAL_FALSE);
         if ( status!=NFI_SUCCESS )
            _errorExit(status, curPosition, ptr);
   
         status = NFI_ParityCheck(ptr, &spare[0], BLHeader.NFIinfo.addressCycle, addr1, addr2, \
                                  BLHeader.NFIinfo.pageSize, BLHeader.NFIinfo.IOInterface, \
                                  BLHeader.NFIinfo.pageSize*BLHeader.pagesPerBlock);                          
         if ( status<0 )
            _errorExit(status, curPosition, ptr);
#else
         status = NFI_PageRead(ptr, &spare[0], BLHeader.NFIinfo.pageSize, \
                               BLHeader.NFIinfo.addressCycle, addr1, addr2, \
                               BLHeader.NFIinfo.pageSize, KAL_TRUE, KAL_FALSE);
         if ( status!=NFI_SUCCESS )
            _errorExit(status, curPosition, ptr);
#endif /* BL_ECC_ENABLE */    
   
         ptr = (kal_uint32 *)((kal_uint32)ptr + BLHeader.NFIinfo.pageSize);
         length -= BLHeader.NFIinfo.pageSize;
         pageTracking++;
         if ( pageTracking==(BLHeader.pagesPerBlock-1) )
            curPosition += 2;
         else
            curPosition++;
         addr1 = curPosition << BLHeader.NFIinfo.pageShift;  
         addr2 = 0;      

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -