初始提交
This commit is contained in:
401
startup/misc/cus/cus_main.c
Normal file
401
startup/misc/cus/cus_main.c
Normal file
@@ -0,0 +1,401 @@
|
||||
/****************************************************************************
|
||||
|
||||
Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
|
||||
|
||||
This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
|
||||
be copied by any method or incorporated into another program without
|
||||
the express written consent of Aerospace C.Power. This Information or any portion
|
||||
thereof remains the property of Aerospace C.Power. The Information contained herein
|
||||
is believed to be accurate and Aerospace C.Power assumes no responsibility or
|
||||
liability for its use in any way and conveys no license or title under
|
||||
any patent or copyright and makes no representation or warranty that this
|
||||
Information is free from patent or copyright infringement.
|
||||
|
||||
****************************************************************************/
|
||||
/* os shim includes */
|
||||
#include "os_types.h"
|
||||
#include "os_task.h"
|
||||
#include "os_utils.h"
|
||||
|
||||
/* common includes */
|
||||
#include "iot_io.h"
|
||||
#include "iot_bitops.h"
|
||||
#include "iot_pkt.h"
|
||||
#include "iot_ipc.h"
|
||||
#include "iot_dbglog_api.h"
|
||||
#include "iot_config.h"
|
||||
#include "iot_version.h"
|
||||
#include "iot_app.h"
|
||||
#include "iot_share_task.h"
|
||||
#include "iot_socket.h"
|
||||
#include "iot_img_hdr.h"
|
||||
|
||||
/* pib includes */
|
||||
#include "iot_pib.h"
|
||||
#include "iot_oem.h"
|
||||
|
||||
/* driver includes */
|
||||
#include "apb.h"
|
||||
#include "ahb.h"
|
||||
#include "efuse.h"
|
||||
#include "cpu.h"
|
||||
#include "wdt_hw.h"
|
||||
#include "flash.h"
|
||||
#include "decomp.h"
|
||||
#include "iot_mem_org.h"
|
||||
#include "iot_system.h"
|
||||
#include "iot_clock.h"
|
||||
#include "iot_uart.h"
|
||||
#include "iot_wdg.h"
|
||||
#include "iot_mtd.h"
|
||||
#include "iot_crypto.h"
|
||||
#include "iot_board.h"
|
||||
#include "iot_led.h"
|
||||
#include "iot_log_api.h"
|
||||
#include "upgrade.h"
|
||||
#include "snapshot.h"
|
||||
#include "iot_gptmr.h"
|
||||
#include "iot_power_mgmt.h"
|
||||
#include "iot_energe_meter.h"
|
||||
#include "iot_rtc.h"
|
||||
#include "iot_dma.h"
|
||||
#include "iot_eth.h"
|
||||
#include "iot_uart_h.h"
|
||||
|
||||
/* debug includes*/
|
||||
#include "dbg_io.h"
|
||||
#include "iot_dbglog.h"
|
||||
|
||||
#include "iot_cal_data.h"
|
||||
#include "platform.h"
|
||||
#include "iot_lwip.h"
|
||||
#include "iot_upgrade_api.h"
|
||||
#include "iot_busmon.h"
|
||||
#include "iot_gpio_api.h"
|
||||
#include "spi_flash.h"
|
||||
#include "iot_oem_api.h"
|
||||
#include "iot_plc_led.h"
|
||||
#include "iot_plc_pm.h"
|
||||
|
||||
uint8_t g_app_reg_done = 0;
|
||||
extern void iot_board_info_init();
|
||||
|
||||
#if RUN_IN_PSRAM
|
||||
/* Just use bt pkt config, TODO. */
|
||||
#define CUS_SMALL_BUF_SIZE 256
|
||||
#define CUS_SMALL_BUF_COUNT 32
|
||||
|
||||
#define CUS_SHORT_BUF_SIZE 512
|
||||
#define CUS_SHORT_BUF_COUNT 16
|
||||
|
||||
#define CUS_LONG_BUF_SIZE (1024 + 46)
|
||||
#define CUS_LONG_BUF_COUNT 8
|
||||
|
||||
#define CUS_LARGE_BUF_SIZE (2048 + 92)
|
||||
#define CUS_LARGE_BUF_COUNT 8
|
||||
|
||||
#else
|
||||
|
||||
#define CUS_SMALL_BUF_SIZE 256
|
||||
#define CUS_SMALL_BUF_COUNT 16
|
||||
|
||||
#define CUS_SHORT_BUF_SIZE 512
|
||||
#define CUS_SHORT_BUF_COUNT 18
|
||||
|
||||
#define CUS_LONG_BUF_SIZE (1024 + 46)
|
||||
#define CUS_LONG_BUF_COUNT 4
|
||||
|
||||
#define CUS_LARGE_BUF_SIZE (2048 + 92)
|
||||
#define CUS_LARGE_BUF_COUNT 1
|
||||
#endif
|
||||
|
||||
const iot_pkt_config_t g_pkt_config =
|
||||
{
|
||||
{
|
||||
{
|
||||
CUS_SMALL_BUF_SIZE,
|
||||
CUS_SMALL_BUF_COUNT,
|
||||
PKT_OWNER_ALL,
|
||||
},
|
||||
/* reserve IOT_SG_UPGRADE_BLOCK block for upgrading */
|
||||
{
|
||||
CUS_SHORT_BUF_SIZE,
|
||||
(CUS_SHORT_BUF_COUNT + IOT_SG_UPGRADE_BLOCK_CNT),
|
||||
PKT_OWNER_ALL,
|
||||
},
|
||||
{
|
||||
CUS_LONG_BUF_SIZE,
|
||||
CUS_LONG_BUF_COUNT,
|
||||
PKT_OWNER_ALL,
|
||||
},
|
||||
{
|
||||
CUS_LARGE_BUF_SIZE,
|
||||
CUS_LARGE_BUF_COUNT + DBGLOG_MAX_BUFFER_CNT,
|
||||
PKT_OWNER_ALL,
|
||||
},
|
||||
{
|
||||
0,
|
||||
0,
|
||||
PKT_OWNER_ALL,
|
||||
},
|
||||
{
|
||||
0,
|
||||
0,
|
||||
PKT_OWNER_ALL,
|
||||
},
|
||||
{
|
||||
0,
|
||||
0,
|
||||
PKT_OWNER_NONE,
|
||||
},
|
||||
{
|
||||
0,
|
||||
0,
|
||||
PKT_OWNER_NONE,
|
||||
},
|
||||
}
|
||||
};
|
||||
|
||||
/* plc mission mode initialization second half */
|
||||
static void plc_mm_init2(iot_msg_entry_t *entry)
|
||||
{
|
||||
uint8_t ret;
|
||||
(void)entry;
|
||||
(void)ret;
|
||||
|
||||
extern os_task_h _init_handle;
|
||||
os_delete_task(_init_handle);
|
||||
os_delay(100);
|
||||
|
||||
/* launch applications */
|
||||
ret = iot_app_start();
|
||||
|
||||
g_app_reg_done = 1;
|
||||
}
|
||||
|
||||
static void plc_mm_init2_cancel(iot_msg_entry_t *entry)
|
||||
{
|
||||
IOT_ASSERT(0);
|
||||
}
|
||||
|
||||
void iot_mode_set(int fw_mode)
|
||||
{
|
||||
(void)fw_mode;
|
||||
}
|
||||
|
||||
void iot_hw_init()
|
||||
{
|
||||
iot_board_info_init();
|
||||
|
||||
iot_crypto_init();
|
||||
|
||||
/*resource initializations;*/
|
||||
mtd_device_init(0);
|
||||
|
||||
/* call efuse_init() to enable efuse clk, but rom is done that */
|
||||
|
||||
/* init oem module load oem cfg from file */
|
||||
#if (PLC_SUPPORT_CCO_ROLE)
|
||||
iot_oem_init(1);
|
||||
#else
|
||||
iot_oem_init(0);
|
||||
#endif
|
||||
|
||||
#if (IOT_FLASH_BUILD == 1)
|
||||
/* board info config*/
|
||||
iot_board_cfg_init();
|
||||
#endif
|
||||
|
||||
system_clock_init();
|
||||
system_uart_init();
|
||||
|
||||
#if (!defined(DISABLE_PRINT)) || (HW_PLATFORM == HW_PLATFORM_FPGA)
|
||||
dbg_uart_init_port(iot_board_get_uart(UART_PRINT), 1);
|
||||
dbg_uart_stage1_init();
|
||||
#endif
|
||||
|
||||
#if (IOT_FLASH_BUILD == 1)
|
||||
iot_board_cfg_dump();
|
||||
#endif
|
||||
|
||||
/*platform intialization*/
|
||||
platform_init();
|
||||
|
||||
iot_wdg_enable();
|
||||
}
|
||||
|
||||
void iot_sub_system_init()
|
||||
{
|
||||
/* init common modules */
|
||||
iot_bitops_init();
|
||||
|
||||
/* init os related modules and utilities */
|
||||
os_utils_init();
|
||||
|
||||
/* rtc init */
|
||||
iot_rtc_init();
|
||||
|
||||
/* init pkt module */
|
||||
iot_pkt_init(&g_pkt_config);
|
||||
|
||||
/* init shared background task. It shall be ahead of pib init. */
|
||||
iot_share_task_init();
|
||||
|
||||
/* init dbglog module */
|
||||
iot_dbglog_init();
|
||||
|
||||
/* init dma module */
|
||||
iot_dma_init();
|
||||
|
||||
/* init gpio module */
|
||||
iot_gpio_module_init();
|
||||
|
||||
/* init uart module */
|
||||
iot_uart_init(0);
|
||||
|
||||
/* init ipc module */
|
||||
iot_ipc_init();
|
||||
}
|
||||
|
||||
/* plc mission mode initialization first half */
|
||||
void proto_mm_init()
|
||||
{
|
||||
|
||||
#if IOT_ETH_ENABLE
|
||||
iot_eth_init();
|
||||
#endif
|
||||
|
||||
/* init tcpip stack */
|
||||
iot_lwip_init();
|
||||
|
||||
/* init plc led module */
|
||||
iot_plc_led_init(0);
|
||||
|
||||
/* init power management module */
|
||||
iot_plc_pm_init();
|
||||
|
||||
/* create task for socket to receive data. */
|
||||
iot_socket_task_init();
|
||||
|
||||
/* gp timer callback to share task. */
|
||||
iot_gp_timer_task_register();
|
||||
|
||||
/* start bottom half init in shared task context to free current task
|
||||
* to save memory.
|
||||
*/
|
||||
iot_share_task_msg_register(IOT_SHARE_TASK_MT_BH_INIT,
|
||||
plc_mm_init2, plc_mm_init2_cancel);
|
||||
iot_share_task_post_msg(IOT_SHARE_TASK_QUEUE_HP, IOT_SHARE_TASK_MT_BH_INIT,
|
||||
0, 0, NULL);
|
||||
/* delay enough time to allow bottom half init to delete init task
|
||||
* to free memory quickly
|
||||
*/
|
||||
os_delay(10000);
|
||||
}
|
||||
|
||||
/* plc factory test mode initialization */
|
||||
void proto_ftm_init()
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
uint32_t plc_core_start(void)
|
||||
{
|
||||
uint32_t cpu, ret = 0;
|
||||
uint32_t start_part = 0, last_part = 0, boot_part = 0, part_offset = 0;
|
||||
uint32_t fw_addr, run_addr, run_offset, need_compress = 0;
|
||||
uint8_t *dst, *src, i = 10;
|
||||
imgHdr hdr = {0};
|
||||
char hdr_buf[HEADER_TOLTAL_SIZE];
|
||||
|
||||
dev_param_get_start_flag(&start_part);
|
||||
dev_param_get_last_flag(&last_part);
|
||||
dev_param_get_boot_flag(&boot_part);
|
||||
|
||||
#if RUN_IN_PSRAM
|
||||
run_offset = MEM_CFG_RAM_CORE1_RUN_OFFSET;
|
||||
run_addr = run_offset + HEADER_TOLTAL_SIZE + PSRAM_CORE1_BASE_ADDRESS;
|
||||
/* plc fw always need decompress to psram */
|
||||
need_compress = 1;
|
||||
#else
|
||||
iot_layout_get_part_offset(PART_NUM_RUN, &run_offset);
|
||||
run_addr = run_offset + HEADER_TOLTAL_SIZE + FLASH_BASE_ADDRESS;
|
||||
/* plc fw need decompress to flash when boot_part is 1 */
|
||||
need_compress = boot_part;
|
||||
#endif
|
||||
|
||||
ahb_core2_reset_hold();
|
||||
/* need to compress fw. */
|
||||
if (need_compress == 1) {
|
||||
if (last_part) {
|
||||
iot_layout_get_part_offset(PART_NUM_FW2, &part_offset);
|
||||
} else {
|
||||
iot_layout_get_part_offset(PART_NUM_FW1, &part_offset);
|
||||
}
|
||||
if (part_offset == 0) {
|
||||
IOT_ASSERT(0);
|
||||
}
|
||||
|
||||
/* check image header information */
|
||||
fw_addr = flash_get_dev_base() + part_offset;
|
||||
os_mem_cpy(hdr_buf, (void*)fw_addr, HEADER_TOLTAL_SIZE);
|
||||
img_header_construct(&hdr, hdr_buf);
|
||||
if (hdr.v1.guard != IMAGE_GUARD || hdr.v1.devType != devV1Kunlun3 ||
|
||||
hdr.v1.hdrVer != hdrVer_10) {
|
||||
/* image header invalid */
|
||||
ret = 1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* decompressed */
|
||||
if (hdr.v1.zipType != zipType_defult) {
|
||||
/* cus+plc fw is compressed firmware */
|
||||
ret = 2;
|
||||
goto out;
|
||||
}
|
||||
/* extend wdg0 timeout */
|
||||
cpu = cpu_get_mhartid();
|
||||
wdg_set_timeout_cmp(cpu, SET_WDG_TIMEOUT_CMP * 10);
|
||||
wdg_feed_dog(cpu);
|
||||
|
||||
dst = (uint8_t*)(run_addr - HEADER_TOLTAL_SIZE);
|
||||
src = (uint8_t*)(fw_addr + HEADER_TOLTAL_SIZE);
|
||||
/* adding Prompt Information. */
|
||||
iot_printf("starting to dcompress fw, [%p ->> %p] ...\n", src, dst);
|
||||
if (lzma_fw_image_decompress(src, dst, hdr.v1.imgSize,
|
||||
(uint8_t *)MEM_CFG_DECOMPRESS_RAM)) {
|
||||
ret = 3;
|
||||
goto recovery_wdg0;
|
||||
}
|
||||
}
|
||||
|
||||
/* enable wdg1 to monitor plc app running state */
|
||||
cpu = 1;
|
||||
apb_enable(APB_WDG1);
|
||||
wdg_set_cmp(cpu, SET_WDG_INTC_CMP * 10);
|
||||
wdg_set_timeout_cmp(cpu, SET_WDG_TIMEOUT_CMP);
|
||||
wdg_set_cpurst_cmp(cpu, SET_WDG_CPURST_CMP);
|
||||
wdg_set_fullrst_cmp(cpu, 2);
|
||||
wdg_cnt_enable(cpu);
|
||||
wdg_enable(cpu);
|
||||
|
||||
/* enable core1 */
|
||||
ahb_core1_set_start(run_addr);
|
||||
ahb_core1_enable();
|
||||
|
||||
do {
|
||||
__asm volatile ("nop");
|
||||
} while (i--);
|
||||
ahb_core1_reset_release();
|
||||
|
||||
iot_printf("plc core running address:0x%08x, start:%d, last:%d, boot:%d\n",
|
||||
run_addr, start_part, last_part, boot_part);
|
||||
|
||||
recovery_wdg0:
|
||||
cpu = cpu_get_mhartid();
|
||||
wdg_feed_dog(cpu);
|
||||
wdg_set_timeout_cmp(cpu, SET_WDG_TIMEOUT_CMP);
|
||||
|
||||
out:
|
||||
return ret;
|
||||
}
|
Reference in New Issue
Block a user