Files
kunlun/startup/misc/cus/cus_main.c
2024-09-28 14:24:04 +08:00

401 lines
9.5 KiB
C

/****************************************************************************
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;
}