324 lines
8.3 KiB
C
Executable File
324 lines
8.3 KiB
C
Executable File
/*
|
|
Project layer Main control function
|
|
|
|
This file is implement by user mode
|
|
|
|
@file prj_main.c
|
|
|
|
Copyright Novatek Microelectronics Corp. 2015. All rights reserved.
|
|
*/
|
|
|
|
#include "fuart.h"
|
|
#include "fat.h"
|
|
#include "rtc.h"
|
|
#include "timer.h"
|
|
#include "StorageDef.h"
|
|
#include "global.h"
|
|
#include "Clock.h"
|
|
#include "string.h"
|
|
#include "prj_main.h"
|
|
#include "debug.h"
|
|
#include "pad.h"
|
|
|
|
#define _THUMB2 __attribute__((target("thumb2")))
|
|
|
|
/* 68CS */
|
|
#if (MODEL == MODEL_68CS)
|
|
#define GPIO_KEY_OK C_GPIO_19
|
|
#define GPIO_KEY_ISP C_GPIO_18
|
|
#define GPIO_KEY_LEFT GPIO_KEY_ISP
|
|
#define GPIO_KEY_DOWN C_GPIO_20
|
|
#define GPIO_KEY_MENU C_GPIO_21
|
|
#define GPIO_KEY_UP C_GPIO_22
|
|
#define GPIO_KEY_RIGHT C_GPIO_4
|
|
#define GPIO_FASTBOOT_KEY GPIO_KEY_RIGHT
|
|
#define GPIO_SPECIAL_KEY GPIO_KEY_RIGHT
|
|
/* S530*/
|
|
#elif (MODEL == MODEL_S530)
|
|
#define GPIO_KEY_TEST S_GPIO_6
|
|
#define GPIO_ISP_KEY_DET C_GPIO_4
|
|
#define GPIO_FASTBOOT_KEY GPIO_KEY_TEST
|
|
#define GPIO_SPECIAL_KEY GPIO_KEY_TEST
|
|
#define GPIO_SPECIAL_KEY2 GPIO_ISP_KEY_DET
|
|
#define GPIO_SPECIAL_USB D_GPIO_7
|
|
|
|
#elif (MODEL == MODEL_S550)
|
|
#define GPIO_KEY_TEST P_GPIO_22
|
|
#define GPIO_ISP_KEY_DET C_GPIO_4
|
|
#define GPIO_FASTBOOT_KEY GPIO_KEY_TEST
|
|
#define GPIO_SPECIAL_KEY GPIO_KEY_TEST
|
|
#define GPIO_SPECIAL_KEY2 GPIO_ISP_KEY_DET
|
|
#define GPIO_SPECIAL_USB D_GPIO_7
|
|
/* Unknown */
|
|
#else
|
|
#error "Unknown Model"
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#if defined(_STORAGEINT_EMMC_NAND_COMBO_)
|
|
#if (CHECK_CARD_EXIST == ENABLE)
|
|
#undef CHECK_CARD_EXIST
|
|
#define CHECK_CARD_EXIST DISABLE
|
|
#endif
|
|
|
|
#endif
|
|
|
|
extern UINT32 LoaderInternalInfo[];
|
|
|
|
#if (DEBUG_MSG == DISABLE)
|
|
//weak function mechanism for debug msg output
|
|
extern void debug_disable_msg(void);
|
|
void debug_disable_msg(void) {}
|
|
#endif
|
|
|
|
#if (SPECIAL_KEY_UPDATE == ENABLE)
|
|
/**
|
|
Check special key1(s) is(are) pressed.
|
|
|
|
Check special key1(s) is(are) pressed or not.
|
|
|
|
@return Key pressed status
|
|
- @b TRUE: Special key(s) is(are) pressed
|
|
- @b FALSE: Otherwise
|
|
*/
|
|
|
|
static BOOL prj_is_WDT_OTA(void)
|
|
{
|
|
static UINT32 ota_sts = WDT_OTA_MAKEFOURCC(WDT_OTA_STS_INVALID);
|
|
|
|
/* only update once */
|
|
if(ota_sts == WDT_OTA_MAKEFOURCC(WDT_OTA_STS_INVALID))
|
|
ota_sts = WDT_OTA_READ_STS();
|
|
|
|
debug_msg_var("ota_sts = ", ota_sts);
|
|
|
|
if(ota_sts == WDT_OTA_MAKEFOURCC(WDT_OTA_STS_LINUX_TRIGGER)){
|
|
WDT_OTA_SET_STS(WDT_OTA_STS_LOADER_DETECTING_FW);
|
|
return TRUE;
|
|
}
|
|
else{
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
/* Read ota flag in the flash */
|
|
static BOOL prj_is_Flash_OTA(UINT32 ota_flag)
|
|
{
|
|
if(ota_flag == WDT_OTA_MAKEFOURCC(WDT_OTA_STS_LINUX_TRIGGER)){
|
|
WDT_OTA_SET_STS(WDT_OTA_STS_LOADER_DETECTING_FW);
|
|
return TRUE;
|
|
}
|
|
else{
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
static BOOL prj_isSpecialKeyPressed(UINT32 ota_flag)
|
|
{
|
|
// Detect key example, must press shutter2 and playback mode keys
|
|
// OUT_0: DGPIO 0
|
|
// OUT_1: DGPIO 14
|
|
// OUT_2: DGPIO 2
|
|
// OUT_3: DGPIO 3
|
|
// OUT_4: DGPIO 4
|
|
// IN_0 : DGPIO 5
|
|
// IN_1 : DGPIO 6
|
|
// IN_2 : DGPIO 7
|
|
// IN_3 : DGPIO 8
|
|
// KEY_IN_0 KEY_IN_1 KEY_IN_2 KEY_IN_3
|
|
// KEY_OUT_0 MENU SET PLAYBACK DISPLAY
|
|
// KEY_OUT_1 WIDE LEFT MOVIE
|
|
// KEY_OUT_2 TELE DOWN TRASH
|
|
// KEY_OUT_3 SHUTTER2 RIGHT CAPTURE
|
|
// KEY_OUT_4 SHUTTER1 UP
|
|
// Add the necessary code..
|
|
// if (gpio_getPin(P_GPIO_8) && gpio_getPin(P_GPIO_9)) {
|
|
|
|
/*if (!gpio_getPin(GPIO_SPECIAL_KEY)) {
|
|
debug_msg("GPIO_SPECIAL_KEY 0\r\n");
|
|
}else{
|
|
debug_msg("GPIO_SPECIAL_KEY 1\r\n");
|
|
}
|
|
if((gpio_getPin(GPIO_SPECIAL_KEY2))){
|
|
debug_msg("GPIO_SPECIAL_KEY2 1\r\n");
|
|
}else{
|
|
debug_msg("GPIO_SPECIAL_KEY2 0\r\n");
|
|
}*/
|
|
|
|
#if (MODEL == MODEL_S530)
|
|
if ((!gpio_getPin(GPIO_SPECIAL_KEY)) && (gpio_getPin(GPIO_SPECIAL_USB)))
|
|
#elif (MODEL == MODEL_S550)
|
|
if ((gpio_getPin(GPIO_SPECIAL_KEY)) && (gpio_getPin(GPIO_SPECIAL_USB)))
|
|
#endif
|
|
{
|
|
return TRUE;
|
|
}
|
|
else if((!(gpio_getPin(GPIO_SPECIAL_KEY2)) && (gpio_getPin(GPIO_SPECIAL_USB))) || prj_is_WDT_OTA() || prj_is_Flash_OTA(ota_flag))
|
|
{
|
|
return TRUE;
|
|
}else {
|
|
return FALSE;
|
|
}
|
|
//return TRUE;
|
|
}
|
|
#endif
|
|
|
|
#if (FASTBOOT_KEY == ENABLE)
|
|
static BOOL prj_isFastbootKeyPressed(void)
|
|
{
|
|
return TRUE;
|
|
/*if (gpio_getPin(GPIO_KEY_UP)) {
|
|
return FALSE;
|
|
} else {
|
|
return TRUE;
|
|
}*/
|
|
}
|
|
#endif
|
|
|
|
#if (CHECK_CARD_EXIST == ENABLE)
|
|
// MC16 default is config as input and pull up
|
|
_THUMB2 static BOOL prj_checkCardExist(void)
|
|
{
|
|
#if (STORAGE_EXT_TYPE == STORAGE_EXT_ETH)
|
|
return TRUE; // force ethernet probe DHCP server
|
|
#else
|
|
return (gpio_getPin(DGPIO_CARD_DETECT) == 0 ? TRUE : FALSE);
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
#if 0
|
|
static BOOL bl_spiIdentify(UINT32 uiMfgID, UINT32 uiTypeID, UINT32 uiCapacityID, PSPI_IDENTIFY pIdentify)
|
|
{
|
|
// Sample to support SST25VF032
|
|
if ((uiMfgID == 0xBF) &&
|
|
(uiCapacityID == 0x4A)) {
|
|
pIdentify->bDualRead = FALSE;
|
|
pIdentify->bSupportAAI = TRUE;
|
|
pIdentify->bSupportEWSR = TRUE;
|
|
pIdentify->uiFlashSize = 4 * 1024 * 1024;
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static void bl_flashLED(void)
|
|
{
|
|
// use GPIO to control LED
|
|
}
|
|
#endif
|
|
|
|
// main entry of project layer code
|
|
_THUMB2 void prj_main(void)
|
|
{
|
|
PSTORAGE_OBJ strg_obj = NULL;
|
|
loader_setVersion(_LDR_VER_);
|
|
|
|
debug_msg("\r\n");
|
|
debug_msg("LD_VER ");
|
|
debug_msg(Dec2HexStr2Bytes((LoaderInternalInfo[1] >> 28) & 0xF));
|
|
debug_msg(".");
|
|
debug_msg(Dec2HexStr2Bytes((LoaderInternalInfo[1] >> 24) & 0xF));
|
|
debug_msg(".");
|
|
debug_msg(Dec2HexStr2Bytes((LoaderInternalInfo[1] >> 16) & 0xFF));
|
|
debug_msg("\r\n");
|
|
// Print project layer info
|
|
if((LoaderInternalInfo[6] & 0x100000) == 0x100000) {
|
|
if(gpio_getPin((((LoaderInternalInfo[6]>>12)&0x7)*32) + ((LoaderInternalInfo[6]>>15)&0x1f))) {
|
|
debug_msg(_LOADER_VERSION_STR2_);
|
|
} else {
|
|
debug_msg(_LOADER_VERSION_STR_);
|
|
}
|
|
} else {
|
|
debug_msg(_LOADER_VERSION_STR_);
|
|
}
|
|
|
|
// Setup loader/fw file names
|
|
loader_setUpdateFwName(_UPDATE_FW_NAME_);
|
|
loader_setUpdateLdrName(_UPDATE_LOADER_NAME_);
|
|
loader_setRunFwName(_RUN_FW_NAME_);
|
|
// Setup FW_MAC_CODE_SIZE (i.e. FWResvSize in RTOS)
|
|
|
|
#if 0
|
|
// Sample to hook spi flash extending function
|
|
flash_installIdentifyCB(bl_spiIdentify);
|
|
#endif
|
|
|
|
#if 0
|
|
// Sample to hook flash programming LED callback
|
|
flash_installAccessCB(bl_flashLED);
|
|
#endif
|
|
|
|
#if (SPECIAL_KEY_UPDATE == ENABLE)
|
|
loader_installSpecialKeyCB(prj_isSpecialKeyPressed);
|
|
#endif
|
|
|
|
#if (CHECK_CARD_EXIST == ENABLE)
|
|
loader_installCardDetectCB(prj_checkCardExist);
|
|
#endif
|
|
|
|
#if (FASTBOOT_KEY == ENABLE)
|
|
loader_installFastbootKeyCB(prj_isFastbootKeyPressed);
|
|
#endif
|
|
|
|
#if defined(_STORAGEINT_NandSpi_)
|
|
strg_obj = nand_get_storage_object();
|
|
#if (SPI_PINMUX_SETTING == SPI_PINMUX_4BITS)
|
|
strg_obj->flash_setConfig(FLASH_CFG_ID_SPI_SUPPORT_4BITS, TRUE);
|
|
#endif
|
|
loader_setStorageIntType(STORAGEINT_SPI_NAND, strg_obj);
|
|
|
|
// set Nand Flash speed to 96MHz
|
|
strg_obj->flash_setFrequency(96);
|
|
|
|
#elif defined(_STORAGEINT_SpiFlash_)
|
|
strg_obj = nor_get_storage_object();
|
|
debug_msg("set nor clk 120M\r\n");
|
|
strg_obj->flash_setFrequency(120);
|
|
#if (SPI_PINMUX_SETTING == SPI_PINMUX_4BITS)
|
|
strg_obj->flash_setConfig(FLASH_CFG_ID_SPI_SUPPORT_4BITS, TRUE);
|
|
#endif
|
|
loader_setStorageIntType(STORAGEINT_SPI_NOR, strg_obj);
|
|
|
|
// debug_msg("flash_setFrequency 120MHz");
|
|
strg_obj->flash_setFrequency(120);
|
|
debug_msg("SF 120\r\n");
|
|
|
|
#elif defined(_STORAGEINT_EMMC_)
|
|
strg_obj = emmc_get_storage_object();
|
|
loader_setStorageIntType(STORAGEINT_EMMC, strg_obj);
|
|
#elif defined(_STORAGEINT_EMMC_NAND_COMBO_)
|
|
if (top_get_bs() == BOOT_SOURCE_SPI_NAND_2K || top_get_bs() == BOOT_SOURCE_SPI_NAND_4K) {
|
|
debug_msg_var("NAND,BS=", top_get_bs());
|
|
strg_obj = nand_get_storage_object();
|
|
#if (SPI_PINMUX_SETTING == SPI_PINMUX_4BITS)
|
|
strg_obj->flash_setConfig(FLASH_CFG_ID_SPI_SUPPORT_4BITS, TRUE);
|
|
#endif
|
|
loader_setStorageIntType(STORAGEINT_SPI_NAND, strg_obj);
|
|
} else if (top_get_bs() == BOOT_SOURCE_EMMC_4BIT || top_get_bs() == BOOT_SOURCE_EMMC_8BIT) {
|
|
debug_msg("eMMC");
|
|
strg_obj = emmc_get_storage_object();
|
|
if (top_get_bs() == BOOT_SOURCE_EMMC_8BIT) {
|
|
strg_obj->flash_setConfig(FLASH_CFG_ID_EMMC_SUPPORT_8BITS, TRUE);
|
|
debug_msg("[8bit]\r\n");
|
|
} else {
|
|
debug_msg("[4bit]\r\n");
|
|
}
|
|
loader_setStorageIntType(STORAGEINT_EMMC, strg_obj);
|
|
} else if (top_get_bs() == BOOT_SOURCE_SPI) {
|
|
debug_msg("NOR\r\n");
|
|
strg_obj = nor_get_storage_object();
|
|
#if (SPI_PINMUX_SETTING == SPI_PINMUX_4BITS)
|
|
strg_obj->flash_setConfig(FLASH_CFG_ID_SPI_SUPPORT_4BITS, TRUE);
|
|
#endif
|
|
loader_setStorageIntType(STORAGEINT_SPI_NOR, strg_obj);
|
|
} else {
|
|
debug_msg_var("unknow BS=", top_get_bs());
|
|
}
|
|
#endif
|
|
}
|
|
|