423 lines
9.7 KiB
C
Executable File
423 lines
9.7 KiB
C
Executable File
/*
|
||
* Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2021-2021. All rights reserved.
|
||
* Description: main
|
||
*
|
||
* Create: 2021-03-09
|
||
*/
|
||
|
||
#include "boot_cmd_loop.h"
|
||
#include "boot_serial.h"
|
||
#include "boot_flash.h"
|
||
#include "sfc.h"
|
||
#include "chip_io.h"
|
||
#include "pinctrl.h"
|
||
#include "boot_delay.h"
|
||
#include "tcxo.h"
|
||
#include "watchdog.h"
|
||
#include "soc_porting.h"
|
||
#include "efuse.h"
|
||
#include "efuse_porting.h"
|
||
#include "boot_malloc.h"
|
||
#include "boot_erase.h"
|
||
#include "sfc_protect.h"
|
||
|
||
#define DELAY_100MS 100
|
||
|
||
__attribute__((section("BOOT_UART"))) uart_param_stru g_uart_prag;
|
||
|
||
const sfc_flash_config_t sfc_cfg = {
|
||
.read_type = FAST_READ_QUAD_OUTPUT,
|
||
.write_type = PAGE_PROGRAM,
|
||
.mapping_addr = 0x200000,
|
||
.mapping_size = 0x800000,
|
||
};
|
||
#if 1 //ADD LYL 2024 1122 --------
|
||
|
||
#define USERPAGE 0x003F2000 //AT参数存储区
|
||
#define BLE_CONKEYLEN 16
|
||
|
||
#pragma pack(push)
|
||
#pragma pack(1)
|
||
typedef struct
|
||
{
|
||
int8_t updateflag; //update flag
|
||
int8_t validflag; //valid flag
|
||
int8_t tmode_mode;
|
||
int8_t wmode_mode;
|
||
|
||
//STA, 140 bytes
|
||
uint8_t sta_ssid[33];
|
||
uint8_t sta_key[65];
|
||
int8_t wsauth;
|
||
int8_t wsencry;
|
||
uint8_t wslko;
|
||
uint8_t pmk_av;
|
||
uint8_t sta_padding[6];
|
||
uint8_t pmk[32];
|
||
|
||
//AP, 144 bytes
|
||
int8_t wap_mode;
|
||
int8_t wap_channel;
|
||
int8_t waauth;
|
||
int8_t waencry;
|
||
uint8_t walk_led;
|
||
uint8_t max_sta_num;
|
||
uint8_t ap_enable_hide;
|
||
uint8_t ap_ssid[33];
|
||
uint8_t ap_key[65];
|
||
uint8_t ap_pmk_av;
|
||
uint8_t ap_pmk[32];
|
||
uint8_t ap_padding[6];
|
||
|
||
//UART, 20 bytes
|
||
int8_t baudrate;
|
||
int8_t data_bits;
|
||
int8_t stop_bits;
|
||
int8_t parity;
|
||
int8_t ctsrts;
|
||
|
||
int8_t uart1_baudrate;
|
||
int8_t uart1_data_bits;
|
||
int8_t uart1_stop_bits;
|
||
int8_t uart1_parity;
|
||
int8_t uart1_debug;
|
||
int8_t uartfable;
|
||
int8_t fuartte_mode;
|
||
uint16_t uarttm;
|
||
uint16_t uartbuf;
|
||
uint8_t uart_padding[4];
|
||
|
||
//NETP, 108 bytes
|
||
int8_t protocol;
|
||
int8_t app_mode;
|
||
uint8_t maxsocket;
|
||
char cipadd[101];
|
||
uint16_t pro_port;
|
||
uint16_t tcpto;
|
||
|
||
//SOCKB, 112 bytes
|
||
uint16_t sockb_port;
|
||
uint16_t sockb_tcpto;
|
||
int8_t sockb_pro;
|
||
char sockb_cipadd[101];
|
||
int8_t tcpdis;
|
||
int8_t tcpdisb;
|
||
|
||
uint16_t udp_localporta;
|
||
uint16_t udp_localportb;
|
||
|
||
//NETWORK, 108 bytes
|
||
char wann_ipaddr[16];
|
||
char wann_mask[16];
|
||
char wann_gateway[16];
|
||
char lann_ipaddr[16];
|
||
char lann_mask[16];
|
||
uint8_t wann_mode;
|
||
uint8_t network_padding[2];
|
||
uint8_t domain_name[21];
|
||
uint32_t dns_addr;
|
||
|
||
//UTILS, 124 bytes
|
||
int8_t echo;
|
||
int8_t rlden;
|
||
uint8_t debug_level;
|
||
char wel_msg[11];
|
||
uint8_t event_onoff;
|
||
uint8_t noise_filter;
|
||
uint8_t wifi_switch;
|
||
uint8_t sta_dtim;
|
||
uint8_t utils_padding[40];
|
||
uint8_t dis_power_saving;
|
||
int8_t modechange;
|
||
uint8_t ps_interval;
|
||
uint8_t mid[21];
|
||
uint8_t aswd[21];
|
||
uint8_t cmdpw[21];
|
||
|
||
//HTTPD, 36 bytes
|
||
char user_name[16];
|
||
char user_password[16];
|
||
int8_t web_switch;
|
||
uint8_t web_language;
|
||
uint8_t web_encode_format;
|
||
uint8_t httpd_padding;
|
||
|
||
//DHCPD, 4 bytes
|
||
int8_t dhcpsw;
|
||
uint8_t dhcpd_addr_start;
|
||
uint8_t dhcpd_addr_end;
|
||
uint8_t dhcpd_padding;
|
||
|
||
//UPDATE, 124 bytes
|
||
char update_url[101];
|
||
char update_file[21];
|
||
uint8_t update_padding[2];
|
||
|
||
//NTP, 8 bytes
|
||
uint8_t ntp_time;
|
||
uint8_t ntp_enable;
|
||
uint8_t ntp_padding;
|
||
int8_t time_zone;
|
||
uint32_t ntpserver;
|
||
|
||
//SMTLK, 16 bytes
|
||
uint32_t smtlk_sign;
|
||
uint8_t smtlk_mode;
|
||
uint8_t smtlk_protocol;
|
||
uint8_t smtlk_rtype;
|
||
uint8_t smtlk_ak_random;
|
||
uint8_t connect_flag;
|
||
uint8_t sta_channel;
|
||
uint8_t sta_bssid[6];
|
||
|
||
//SMARTAPLINK, 44 bytes
|
||
uint8_t smartaplink_enable;
|
||
uint8_t smartaplink_padding;
|
||
uint8_t smartaplink_prefix[21];
|
||
uint8_t smartaplink_key[21];
|
||
|
||
//NETPID, 24 bytes
|
||
uint8_t netpa_iden;
|
||
char netpa_id[11];
|
||
uint8_t netpb_iden;
|
||
char netpb_id[11];
|
||
|
||
//NETPREG, 264 bytes
|
||
uint8_t netpa_regen;
|
||
uint8_t netpa_regtype;
|
||
uint8_t netpa_reg_padding;
|
||
char netpa_regdata[129];
|
||
uint8_t netpb_regen;
|
||
uint8_t netpb_regtype;
|
||
uint8_t netpb_reg_padding;
|
||
char netpb_regdata[129];
|
||
|
||
//HEART, 124 bytes
|
||
uint16_t heart_netp_time;
|
||
uint16_t heart_sockb_time;
|
||
uint16_t heart_uart_time;
|
||
char heart_netp_data[39];
|
||
char heart_sockb_data[39];
|
||
char heart_uart_data[39];
|
||
uint8_t heart_padding;
|
||
|
||
//HTTP, 236 bytes
|
||
uint8_t http_type;
|
||
uint8_t http_version;
|
||
uint8_t http_connect_type;
|
||
uint8_t http_recv_time;
|
||
char http_url[51];
|
||
char http_header[181];
|
||
|
||
//MQTT, 224 bytes
|
||
char mqtt_username[33];
|
||
char mqtt_password[33];
|
||
char mqtt_clientid[33];
|
||
char mqtt_pub_topic[61];
|
||
char mqtt_sub_topic[61];
|
||
uint8_t mqtt_qos;
|
||
uint16_t mqtt_heart_time;
|
||
|
||
//BLE, 188 bytes
|
||
uint16_t conn_min;
|
||
uint16_t conn_max;
|
||
uint16_t conn_latency;
|
||
uint16_t supervisionTO;
|
||
|
||
uint16_t adver_min;
|
||
uint16_t adver_max;
|
||
|
||
uint8_t ble_name[27]; //BLE广播名
|
||
uint8_t ble_dms_name[27]; //BLE配网名
|
||
uint8_t ble_adver_data[27];
|
||
|
||
uint8_t ble_adver_data_len;
|
||
uint8_t ble_switch;
|
||
uint8_t ble_uuid_server;
|
||
uint8_t dms_type;
|
||
uint8_t ble_padding;
|
||
|
||
uint8_t uuid_ntf_server[17];
|
||
uint8_t uuid_ntf_read[17];
|
||
uint8_t uuid_ntf_write[17];
|
||
uint8_t uuid_ind_server[17];
|
||
uint8_t uuid_ind_read[17];
|
||
uint8_t uuid_ind_write[17];
|
||
|
||
uint8_t adver_type;
|
||
uint8_t adver_channel;
|
||
uint8_t ble_ind;
|
||
uint8_t smartconfiglink;
|
||
|
||
uint8_t ble_conenable;
|
||
uint8_t ble_conkey[BLE_CONKEYLEN];
|
||
uint8_t ble_contimeout;
|
||
uint8_t netpc_iden;
|
||
char netpc_id[11];
|
||
uint8_t netpc_idflag;
|
||
|
||
uint8_t ble_padding2[17];
|
||
|
||
uint8_t mqtt_tls;
|
||
uint8_t mqtt_padding[3];
|
||
|
||
char iot_productkey[12];
|
||
char iot_devicename[48];
|
||
char iot_devicesecret[48];
|
||
char iot_pubtopic[96];
|
||
char iot_subtopic[96];
|
||
char iot_mode;
|
||
char iot_padding[3];
|
||
|
||
uint8_t product_mode;
|
||
|
||
int8_t ctsrts_pin;
|
||
|
||
char instance_flag;
|
||
char instance_id[32];
|
||
|
||
char ntp_domain_server[33];
|
||
int8_t smk_find;
|
||
|
||
uint32_t mcu_ota_size;
|
||
uint8_t scan_ch14;
|
||
|
||
|
||
uint32_t module_reset_reason;
|
||
uint8_t reserved1[60+512-4];
|
||
|
||
uint8_t validflag_magic;
|
||
int8_t validflag_end; //valid flag
|
||
}HF_CONFIG_FILE;
|
||
#pragma pack(pop)
|
||
|
||
HF_CONFIG_FILE g_hf_config_file_boot = {0};
|
||
|
||
int hfdbg_get_sw(void)
|
||
{
|
||
if(g_hf_config_file_boot.debug_level > 0 && g_hf_config_file_boot.debug_level<=20) //1~20允许打印
|
||
return 0;
|
||
|
||
if(g_hf_config_file_boot.uart1_debug == 1) //1允许打印
|
||
return 1;
|
||
|
||
return 0;
|
||
}
|
||
|
||
|
||
#endif
|
||
static uint32_t sfc_flash_init(void)
|
||
{
|
||
return uapi_sfc_init((sfc_flash_config_t *)&sfc_cfg);
|
||
}
|
||
|
||
static uint32_t sfc_flash_read(uint32_t flash_addr, uint32_t read_size, uint8_t *read_buffer)
|
||
{
|
||
return uapi_sfc_reg_read(flash_addr, read_buffer, read_size);
|
||
}
|
||
|
||
// addr 不是总线地址,没有 FLASH_START 偏移
|
||
static bool is_flash_addr(uint32_t addr, uint32_t size)
|
||
{
|
||
return ((addr >= 0) && (addr + size < FLASH_LEN));
|
||
}
|
||
|
||
static uint32_t sfc_flash_write(uint32_t flash_addr, uint32_t flash_write_size, const uint8_t *p_flash_write_data,
|
||
bool do_erase)
|
||
{
|
||
unused(do_erase);
|
||
|
||
if (is_flash_addr(flash_addr, flash_write_size)) {
|
||
return uapi_sfc_reg_write(flash_addr, (uint8_t *)p_flash_write_data, flash_write_size);
|
||
}
|
||
|
||
// 使用memcpy_s时,操作的是总线地址,需要加回偏移FLASH_START
|
||
uintptr_t store_addr = (uintptr_t)((int)flash_addr + (int)FLASH_START);
|
||
if (memcpy_s((void *)store_addr, flash_write_size, p_flash_write_data, flash_write_size) != EOK) {
|
||
return ERRCODE_FAIL;
|
||
}
|
||
return ERRCODE_SUCC;
|
||
}
|
||
|
||
static uint32_t sfc_flash_erase(uint32_t flash_addr, uint32_t flash_erase_size)
|
||
{
|
||
if (flash_erase_size == FLASH_CHIP_ERASE_SIZE) {
|
||
return uapi_sfc_reg_erase_chip();
|
||
}
|
||
|
||
return uapi_sfc_reg_erase(flash_addr - sfc_cfg.mapping_addr, flash_erase_size);
|
||
}
|
||
|
||
static void boot_flash_init(void)
|
||
{
|
||
flash_cmd_func flash_funcs = {0};
|
||
flash_funcs.init = sfc_flash_init;
|
||
flash_funcs.read = sfc_flash_read;
|
||
flash_funcs.write = sfc_flash_write;
|
||
flash_funcs.erase = sfc_flash_erase;
|
||
boot_regist_flash_cmd(&flash_funcs);
|
||
#define REG_PMU_CMU_CTL_PMU_SIG 0x40003154
|
||
#define PMU_FLASH_SW_EN_BIT 24
|
||
#define DELAY_5MS 5
|
||
reg32_setbit(REG_PMU_CMU_CTL_PMU_SIG, PMU_FLASH_SW_EN_BIT);
|
||
mdelay(DELAY_5MS);
|
||
|
||
uint32_t ret = sfc_flash_init();
|
||
if (ret != ERRCODE_SUCC) {
|
||
boot_msg1("Flash Init Fail! ret = ", ret);
|
||
} else {
|
||
boot_msg0("Flash Init Succ!");
|
||
}
|
||
switch_flash_clock_to_pll();
|
||
config_sfc_ctrl_ds();
|
||
}
|
||
|
||
static uint32_t ws63_loaderboot_init(void)
|
||
{
|
||
errcode_t err;
|
||
uapi_tcxo_init();
|
||
hiburn_uart_init(g_uart_prag, HIBURN_CODELOADER_UART);
|
||
boot_msg0("Loadboot Uart Init Succ!");
|
||
boot_flash_init();
|
||
err = sfc_port_fix_sr();
|
||
if (err != ERRCODE_SUCC) {
|
||
boot_msg1("SFC fix SR ret =", err);
|
||
}
|
||
set_efuse_period();
|
||
uapi_efuse_init(); // efuse函数初始化
|
||
boot_malloc_init();
|
||
return 0;
|
||
}
|
||
|
||
#define BOOT_WATCH_DOG_TIMOUT 15 // 15s
|
||
/* the entry of C. */
|
||
void start_loaderboot(void)
|
||
{
|
||
uart_ctx cmd_ctx = { 0 };
|
||
boot_clock_adapt();
|
||
uapi_watchdog_init(BOOT_WATCH_DOG_TIMOUT);
|
||
uapi_watchdog_enable(WDT_MODE_RESET);
|
||
ws63_loaderboot_init();
|
||
/* Enter the waiting command cycle. */
|
||
loader_ack(ACK_SUCCESS);
|
||
boot_msg0("================ Load Cmd Loop ================\r\n");
|
||
cmd_loop(&cmd_ctx);
|
||
while (1) {}
|
||
}
|
||
|
||
#ifdef CONFIG_LOADERBOOT_SUPPORT_SET_BUADRATE
|
||
uint32_t serial_port_set_baudrate(const uart_param_stru *uart)
|
||
{
|
||
#define CLDO_CRG_CLK_SEL 0x44001134
|
||
#define CLDO_SUB_CRG_CKEN_CTL1 0x44001104
|
||
#define UART_PLL_CLOCK 160000000
|
||
hiburn_uart_deinit();
|
||
// 切uart时钟
|
||
reg_clrbit(CLDO_SUB_CRG_CKEN_CTL1, 0, POS_18); // close uart clock
|
||
reg_setbit(CLDO_CRG_CLK_SEL, 0, POS_1); // switch uart clock to pll
|
||
reg_setbit(CLDO_SUB_CRG_CKEN_CTL1, 0, POS_18); // open uart clock
|
||
uart_port_set_clock_value(UART_BUS_0, UART_PLL_CLOCK);
|
||
hiburn_uart_init(*uart, HIBURN_CODELOADER_UART);
|
||
return ERRCODE_SUCC;
|
||
}
|
||
#endif |