[Feature]Upload Modem source code

Change-Id: Id4294f30faced84d3e6fd6d5e61e1111bf287a37
diff --git a/mcu/custom/driver/common/combo_flash_init.c b/mcu/custom/driver/common/combo_flash_init.c
new file mode 100644
index 0000000..6641097
--- /dev/null
+++ b/mcu/custom/driver/common/combo_flash_init.c
@@ -0,0 +1,460 @@
+/*****************************************************************************
+*  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:
+ * ---------
+ *   combo_flash_init.c
+ *
+ * Project:
+ * --------
+ *   Maui_Software
+ *
+ * Description:
+ * ------------
+ *   This Module defines the ComboMCP Init function
+ *
+ * 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!
+ * 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!
+ * 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 "custom_MemoryDevice.h"
+#include "flash_opt.h"
+
+#if defined(__SERIAL_FLASH__) || (defined(_NAND_FLASH_BOOTING_) && defined(__NAND_MDL_APPEND__))
+#include "combo_flash_init.h"
+#include "combo_flash_defs.h"
+  #if (!defined(_NAND_FLASH_BOOTING_))
+  #include "flash_cfi.h"
+  #include "flash_cfi_internal.h"
+  #include "flash_mtd.h"
+  #endif
+  #if defined(NAND_SUPPORT)
+  #ifdef __UBL__
+    extern void NFI_ReadID(kal_uint32 id_num, kal_uint8* id_data);
+  #else
+    extern kal_bool DAL_is_initialized;
+  	extern kal_int32 DAL_init (void);
+    extern void MTD_ReadID(kal_uint32 id_num,kal_uint8* id_data);
+  #endif
+  #endif
+#if defined(__SERIAL_FLASH__)
+#include "flash_sf.h"
+#endif
+
+#if defined(__SV5_ENABLED__) || defined(__SV5X_ENABLED__)
+#include "br_GFH_cmem_id_info.h"
+#endif /* __SV5_ENABLED__ */
+
+//-----------------------------------------------------------------------------
+// MCP ID Table
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// [Section] RVCT and GCC
+//-----------------------------------------------------------------------------
+#if defined(__MTK_TARGET__)
+#if defined(__SV5_ENABLED__)|| defined(__SV5X_ENABLED__)
+  #if defined(__UBL__)
+	#if defined (__MINI_BOOTLOADER__)
+    #define __sf_section_RODATA_GFH             __attribute__ ((section ("BOOTLOADER_GFH_EXT")))
+	#elif defined (	__EXT_BOOTLOADER__)
+	#define __sf_section_RODATA_GFH             __attribute__ ((section ("EXT_BOOTLOADER_GFH_EXT")))
+	#endif
+  #else
+    #define __sf_section_RODATA_GFH             __attribute__ ((section ("MAUI_GFH_EXT")))
+  #endif
+#else // SV3
+    // Method1
+    // #define __sf_section_RODATA_GFH             __attribute__ ((section ("SECOND_PART_RODATA")))
+    // Method2
+    #define __sf_section_RODATA_GFH
+#endif
+#else //defined(__MTK_TARGET__)
+    /* Reserve for MoDIS */
+    #define __sf_section_RODATA_GFH
+#endif  // defined(__MTK_TARGET__)
+
+#if defined(__MTK_TARGET__)
+    #define __sf_section_RWDATA_EMI             __attribute__ ((section ("EMIINITRW")))
+    #define __sf_section_SECOND_PART            /* Second part region is removed */
+    #define __sf_section_EMI                    __attribute__ ((section ("EMIINITCODE")))
+#else
+/* Reserve for MoDIS */
+    #define __sf_section_RWDATA_EMI
+    #define __sf_section_SECOND_PART
+    #define __sf_section_EMI
+#endif  // __MTK_TARGET__
+
+
+
+#define  COMBO_MEM_TYPE_MODIFIER  __sf_section_RODATA_GFH const
+#define  COMBO_MEM_INST_NAME    combo_mem_id_list
+
+#if defined(__SV5_ENABLED__) || defined(__SV5X_ENABLED__)
+  #define  COMBO_MEM_TYPE_NAME  GFH_CMEM_ID_INFO_v1
+#else
+  #define  COMBO_MEM_TYPE_NAME  CMEMEntryIDList
+#endif
+
+#if defined(__SV5_ENABLED__) || defined(__SV5X_ENABLED__)
+#define COMBO_MEM_STRUCT_HEAD  COMBO_MEM_ID_GFH_HEADER, { COMBO_MEM_ID_VER, COMBO_MEM_DEVICE_COUNT, {
+#define COMBO_MEM_STRUCT_FOOT  } }
+#else
+#define COMBO_MEM_STRUCT_HEAD  COMBO_MEM_IDENTITY_ID, COMBO_MEM_ID_VER, COMBO_MEM_DEVICE_COUNT, {
+#define COMBO_MEM_STRUCT_FOOT  }
+#endif
+
+
+#include "combo_flash_id.h"       // ==== Instantiate ID table
+
+
+
+//-----------------------------------------------------------------------------
+// External Functions
+//-----------------------------------------------------------------------------
+extern kal_uint32 custom_get_fat_addr(void);
+
+//-----------------------------------------------------------------------------
+// Internal Functions
+//-----------------------------------------------------------------------------
+// ===[EMI/SFI Initialization]===
+kal_int32 CMEM_EMIINIT_Index(void);
+void CMEM_EMIINIT_ReadID(void *BaseAddr, kal_uint16 *flashid);
+
+//-----------------------------------------------------------------------------
+// Internal Variables
+//-----------------------------------------------------------------------------
+#define CMEM_INVALID_INDEX -1
+
+
+
+
+//-----------------------------------------------------------------------------
+/*!
+  @brief
+    Determine whether SF ID is valid.
+    Apply for MT6250 because after command issue(ex: Read ID), Data pins are in floating, may read trasient value instead of 0x00 or 0xFF.
+  @retval
+    KAL_TRUE: the device ID0 is valid.
+    KAL_FALSE: the device ID0 is not valid.  
+*/
+__sf_section_SECOND_PART kal_bool CMEM_CheckValidDeviceID(kal_uint8 *id)
+{
+		// Serial Flash
+#if defined(__SERIAL_FLASH__)
+    kal_int32 i, j;
+    const CMEMEntryID *id_list=NULL;
+	
+#if defined(__SV5_ENABLED__) || defined(__SV5X_ENABLED__)
+    id_list=combo_mem_id_list.m_data.List;
+#else
+    id_list=combo_mem_id_list.List;
+#endif	
+    // seach CMEM list for specific Flash ID
+    for (i=0; i<COMBO_MEM_DEVICE_COUNT; i++)	{
+        // Check 1: Compare ID
+        for (j=0; j<id_list[i].IDLength; j++) {
+            if (id_list[i].ID[j]!=id[j]) break;
+        }
+        // Check 2: Compare RegionInfo
+        if (j==id_list[i].IDLength)   {
+            // TBD: Compare RegionInfo
+            return KAL_TRUE;
+        }
+    }  
+#endif //defined(__SERIAL_FLASH__)
+    return KAL_FALSE;
+}
+
+//-----------------------------------------------------------------------------
+/*!
+  @brief
+  Seach device in the combo MCP list by Flash ID.
+    1. Read NOR/NAND flash ID
+    2. Lookup ID table and return the index to the found entry.
+
+  @retval
+    The index to the found entry.
+    -1 : ID not found
+  @remars
+    If combo MCP was not turned on, the returned index is always 0.
+*/
+
+__sf_section_SECOND_PART kal_int32 CMEM_Index(void)
+{
+    return 0;
+}
+
+
+__sf_section_SECOND_PART const CMEMEntryID *CMEM_GetIDEntry(kal_uint32 index)
+{
+#if defined(__SV5_ENABLED__) || defined(__SV5X_ENABLED__)
+        return &combo_mem_id_list.m_data.List[index];
+#else
+        return &combo_mem_id_list.List[index];
+#endif
+}
+
+
+//-----------------------------------------------------------------------------
+/*!
+  @brief
+    Read Flash ID
+  @param[in] BaseAddr Base address to the Flash
+  @param[out] flashid Flash ID
+  @remarks
+    This function is only allowed in EMI/SFI init stage.
+*/
+__sf_section_EMI void CMEM_EMIINIT_ReadID(void *BaseAddr, kal_uint16 *flashid)
+{
+    // Serial Flash
+    return;
+}
+
+
+//-----------------------------------------------------------------------------
+/*!
+  @brief
+    Determine whether SF ID is valid.
+    Apply for MT6250 because after command issue(ex: Read ID), Data pins are in floating, may read trasient value instead of 0x00 or 0xFF.
+  @retval
+    KAL_TRUE: the device ID0 is valid.
+    KAL_FALSE: the device ID0 is not valid.  
+*/
+__sf_section_EMI kal_bool CMEM_EMIINIT_CheckValidDeviceID(kal_uint8 *id)
+{
+		// Serial Flash
+#if defined(__SERIAL_FLASH__)
+    kal_int32 i, j;
+    const CMEMEntryID *id_list=NULL;
+	// seach CMEM list for specific Flash ID
+#if defined(__SV5_ENABLED__) || defined(__SV5X_ENABLED__)
+    id_list=combo_mem_id_list.m_data.List;
+#else
+    id_list=combo_mem_id_list.List;
+#endif
+
+    for (i=0; i<COMBO_MEM_DEVICE_COUNT; i++)    {
+        // Check 1: Compare ID
+        for (j=0; j<id_list[i].IDLength; j++) {
+            if (id_list[i].ID[j]!=id[j]) break;            
+        }
+        // Check 2: Compare RegionInfo
+        if (j==id_list[i].IDLength)   {
+            // TBD: Compare RegionInfo
+           return KAL_TRUE;
+        }
+    }
+  
+#endif //defined(__SERIAL_FLASH__)
+    return KAL_FALSE;
+}
+
+
+
+//-----------------------------------------------------------------------------
+/*!
+  @brief
+    Search device ID list
+  @retval
+    The index to the found device ID.
+    -1: device not found
+  @remarks
+    This function is only allowed in EMI/SFI init stage.
+*/
+
+__sf_section_EMI kal_int32 CMEM_EMIINIT_Index(void)
+{
+    return 0;
+}
+
+
+
+#if defined(_NAND_FLASH_BOOTING_) && defined(__NAND_MDL_APPEND__)
+kal_bool CMEM_GetflashInfo(kal_uint8* id, CMEMFlashInfo* st)
+{
+	const CMEMEntryID *flash_id_list=NULL;
+	kal_uint32 icount, l_index;
+
+	if((id == NULL) || (st == NULL))
+		return KAL_FALSE;
+	
+	#if defined(__SV5_ENABLED__) || defined(__SV5X_ENABLED__)
+        flash_id_list = combo_mem_id_list.m_data.List;
+	#else
+        flash_id_list = combo_mem_id_list.List;
+	#endif
+
+	for(l_index = 0; l_index < COMBO_MEM_DEVICE_COUNT; l_index++)
+	{
+		for(icount = 0; icount < flash_id_list[l_index].IDLength; icount++)
+		{
+			if (flash_id_list[l_index].ID[icount] != id[icount])
+				break;
+		}
+
+		if (icount == flash_id_list[l_index].IDLength)
+		{
+			break;
+		}
+	}
+
+	if(l_index == COMBO_MEM_DEVICE_COUNT)
+		return KAL_FALSE;
+
+	st->block_size = flash_id_list[l_index].FlashDevice_Info.block_size;
+	st->page_size = flash_id_list[l_index].FlashDevice_Info.page_size;
+	st->spare_size = flash_id_list[l_index].FlashDevice_Info.spare_size;
+    	
+	return KAL_TRUE;
+}
+#endif
+
+
+#endif //  defined(__COMBO_MEMORY_SUPPORT__) || defined(__SERIAL_FLASH__) || defined(__NAND_MDL_APPEND__)