bl_main.c

来自「MTK 平台启动源码」· C语言 代码 · 共 393 行

C
393
字号
/*****************************************************************************
*  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_main.c
 *
 * Project:
 * --------
 *   Bootloader
 *
 * Description:
 * ------------
 *   This file defines the major procedure of bootloader
 *
 * 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!
 * removed!
 * removed!
 *------------------------------------------------------------------------------
 * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
 *============================================================================
 ****************************************************************************/
 
#include <bl_types.h>
#include <bl_MTK_BB_REG.H>
#include <bl_Init.h>
#include <bl_loader.h>
#include <bl_NFI.h>
#include <rt_misc.h>   /* for __rt_lib_init() */ 
#include <bl_uart_hw.h>
#include <bl_uart_sw.h>
 
extern Nand_ImageList_S ImageHeader; 

extern void PutUARTByte(kal_uint8 data);
extern void Connect_FactoryTool(void);
extern kal_uint32 custom_ROM_baseaddr(void);
extern void USBDL_UART_Init(void);
extern kal_uint8 USBDL_CheckStartCmd(void);
extern kal_bool USBDL_Update_USB_Download_Mode(void);
extern kal_bool USBDL_Is_USB_Download_Mode(void);
extern void INT_RestorePLL(void);
extern void WatchDogResetAll(void);
extern kal_uint32 SST_Get_Secinfo(kal_uint32 rom_base, kal_bool check_mac);
extern kal_int32 SST_VerifyImageContent(kal_uint32 secinfo_addr, kal_uint32 mac_addr);

/**********************************************************
Description : HW ID check with software load version
Input       : None
Output      : None
***********************************************************/
void INT_Version_Check_UART_WriteReg(kal_uint32 addr, kal_uint16 data)
{
   *(volatile kal_uint8 *) addr = (kal_uint8)data;
}


kal_uint16 INT_Version_Check_UART_ReadReg(kal_uint32 addr)
{
   volatile kal_uint8 tmp;
   tmp = *(volatile kal_uint8 *) addr;
   return (kal_uint16)tmp;
}

void INT_Version_Check_PutUARTByte(kal_uint8 data)
{
   volatile kal_uint16 LSR;

   while(1)
   {
      LSR = INT_Version_Check_UART_ReadReg(UART1_LSR);
      if ( LSR & UART_LSR_THRE )
      {
         INT_Version_Check_UART_WriteReg(UART1_THR, (kal_uint16)data);
         break;
      }
   }
}

void INT_Version_Check(void)
{
   volatile register kal_uint16 HwCode;
   register kal_uint8 HExtra = ' ';
   register kal_uint16 BuildCode;
   register kal_int32 i;
   
   HwCode    = DRV_Reg(CONFIG_base+0x0008);
   BuildCode = DRV_Reg(CONFIG_base+0x0000);
   
   // MT6217AT/AN
   if ((HwCode == 0x6218) && (BuildCode == 0x8B03))
   {
      HwCode = 0x6217;
   }
   // MT6223P
   else if ((HwCode == 0x6223) && (DRV_Reg(CONFIG_base+0xf010) & 0x8000))
   {
      HExtra = 'P';
   }
   // MT6226M
   else if ((HwCode == 0x6219) && ((BuildCode & 0xFF00) == 0x8B00))
   {
      HwCode = 0x6226;
      HExtra = 'M';
   }
   // MT6226D
   else if ((HwCode == 0x6226) && ((BuildCode & 0xFF00) == 0x8D00))
   {
      HExtra = 'D';
   }
   // MT6227D
   else if ((HwCode == 0x6227) && ((BuildCode & 0xFF00) == 0x8D00))
   {
      HExtra = 'D';
   }

#if defined(MT6205B)
   BuildCode = 0x6205;
#elif defined(MT6217)
   BuildCode = 0x6217;
#elif defined(MT6219)
   BuildCode = 0x6219;
#elif defined(MT6223)
   BuildCode = 0x6223;
#elif defined (MT6223P)
   BuildCode = 0x6223;
   #define     ExtraVer 'P'
#elif defined(MT6225)
   BuildCode = 0x6225;
#elif defined(MT6226)
   BuildCode = 0x6226;
#elif defined(MT6226D)
   BuildCode = 0x6226;
   #define     ExtraVer 'D'
#elif defined(MT6226M)
   BuildCode = 0x6226;
   #define     ExtraVer 'M'
#elif defined(MT6227)
   BuildCode = 0x6227;
#elif defined(MT6227D)
   BuildCode = 0x6227;
   #define     ExtraVer 'D'
#elif defined(MT6228)
   BuildCode = 0x6228;
#elif defined(MT6229)
   BuildCode = 0x6229;
#elif defined(MT6230)
   BuildCode = 0x6230;
#else
   BuildCode = 0;
#endif

#ifndef ExtraVer
   #define     ExtraVer ' '
#endif

   if ((HwCode != BuildCode) || (HExtra != ExtraVer))
   {
      INT_Version_Check_PutUARTByte('@');
      while(1)
      {
         INT_Version_Check_PutUARTByte(' ');
         INT_Version_Check_PutUARTByte('H');
         INT_Version_Check_PutUARTByte('W');
         INT_Version_Check_PutUARTByte('=');
         INT_Version_Check_PutUARTByte('M');
         INT_Version_Check_PutUARTByte('T');
         for(i = 12; i >= 0; i -= 4)
         {
            INT_Version_Check_PutUARTByte('0' + ((HwCode >> i) & 0x0F));
         }
         INT_Version_Check_PutUARTByte(HExtra);
         INT_Version_Check_PutUARTByte(',');
         INT_Version_Check_PutUARTByte(' ');
         INT_Version_Check_PutUARTByte('S');
         INT_Version_Check_PutUARTByte('W');
         INT_Version_Check_PutUARTByte('=');
         INT_Version_Check_PutUARTByte('M');
         INT_Version_Check_PutUARTByte('T');
         for(i = 12; i >= 0; i -= 4)
         {
            INT_Version_Check_PutUARTByte('0' + ((BuildCode >> i) & 0x0F));
         }
         INT_Version_Check_PutUARTByte(ExtraVer);
         INT_Version_Check_PutUARTByte(' ');
         INT_Version_Check_PutUARTByte('\r');
         INT_Version_Check_PutUARTByte('\n');
         
         for(i = 0xFFFFF; i > 0; i--) ;
         INT_Version_Check_PutUARTByte('#');
      }
   }
}

/**********************************************************
Description : Major Procedure for USB Download
Input       : None
Output      : None
***********************************************************/
#if defined(__USB_DOWNLOAD__)
void USBDL_Main(void)
{
   /* MAIN 1 : Check USB DL KEY Pressed */
   if (USBDL_Update_USB_Download_Mode() == KAL_FALSE)
   {
      /* go to boot maui */
      return;
   }
   else
   {
      /* MAIN 2 : Setup USB Virtual COM */
      USBDL_UART_Init();
   }

   /* MAIN 3 : Confirm USB DL KEY Pressed */
   if (USBDL_Is_USB_Download_Mode() == KAL_FALSE)
   {
      /* User Abort the USB Download , Reset */
      WatchDogResetAll();
   }
   else
   {
      /* MAIN 4 : Check Start Cmd */
      if (USBDL_CheckStartCmd() == KAL_FALSE)
      {
         /* User Run Unknown Program on PC side */
         WatchDogResetAll();
      }
   }

   /* MAIN 5 : BOOTROM-like procedure start */
   Connect_FactoryTool();

   /* if it reach here, boot maui directly */
}
#endif /* __USB_DOWNLOAD__ */


/**********************************************************
Description : Major Procedure for Factory Purpose
Input       : None
Output      : None
***********************************************************/
void FactoryProcedure(void)
{
   /* setlocale(LC_CTYPE,"C"); */
   __rt_lib_init(0, 0);   /* passing 0 since we don't use the heap */

#if defined(__USB_DOWNLOAD__)
   uart_init();
   USBDL_Main();
#endif /* __USB_DOWNLOAD__ */
}

#pragma arm section code = "INTERNCODE"
/**********************************************************
Description : C entry of the project.
Input       : None
Output      : None
***********************************************************/
void jump_cmd(kal_uint32 baseAddr)
{
   CheckUARTSendEnd();
   JumpCmd(baseAddr);
}

/**********************************************************
Description : Procedure for boot and handover to next ROM
Input       : None
Output      : None
***********************************************************/
#define FLASH_SRAM_REMAP       3 
#if defined(MT6228) || defined(MT6229) || defined(MT6230) || defined(MT6225)
#define EMI_REMAP              (EMI_base + 0x60)
#else /* MT6228 || MT6229 || MT6230 || MT6225 */
#define EMI_REMAP              (EMI_base + 0x40)
#endif /* MT6228 || MT6229 || MT6230 || MT6225 */

void BootAndHandOver(void)
{
#if defined(_NAND_FLASH_BOOTING_)

   DriverInit();

   WacthDogRestart();
   
   startLoading();  
   
   WacthDogDisable();

#else /* _NAND_FLASH_BOOTING_ */

#ifdef __SECURE_USB_DOWNLOAD__
   kal_int32 ret;
   kal_uint32 secinfo_addr;

   secinfo_addr = SST_Get_Secinfo(custom_ROM_baseaddr() & 0x07FFFFFF, KAL_FALSE);
   ret = SST_VerifyImageContent(secinfo_addr, 0) ;
   dbg_print("SST_VerifyImageContent: %d...\n\r", ret);
   if (ret < 0)
   {
      return;
   }
#endif /* __SECURE_USB_DOWNLOAD__ */

   DRV_WriteReg(EMI_REMAP , FLASH_SRAM_REMAP);

   jump_cmd(custom_ROM_baseaddr());
#endif /* _NAND_FLASH_BOOTING_ */
}

#pragma arm section code

⌨️ 快捷键说明

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