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 + -
显示快捷键?