/* Copyright (c) Kuba SzczodrzyƄski 2023-02-27. */ #include #include // can't include as it collides with on Windows -_- #define REG_FLASH_BASE 0x00803000 #define REG_FLASH_OPERATE_SW (REG_FLASH_BASE + 0 * 4) #define REG_FLASH_RDID (REG_FLASH_BASE + 4 * 4) #define FLASH_BUSY_SW (0x01UL << 31) #define FLASH_WP_VALUE (0x01UL << 30) #define FLASH_OP_SW (0x01UL << 29) #define FLASH_OP_TYPE_POS 24 #define FLASH_OP_RDID 20 void lt_init_family() { // set default UART output port uart_print_port = LT_UART_DEFAULT_PORT - 1; } /* _____ _____ _ _ / ____| __ \| | | | | | | |__) | | | | | | | ___/| | | | | |____| | | |__| | \_____|_| \____*/ lt_cpu_model_t lt_cpu_get_model() { uint8_t chipId = *(uint8_t *)(SCTRL_CHIP_ID); return CPU_MODEL_ENUM(FAMILY, chipId); } const char *lt_cpu_get_core_type() { return "ARM968E-S (ARMv5TE)"; } /*_____ _ | __ \ (_) | | | | _____ ___ ___ ___ | | | |/ _ \ \ / / |/ __/ _ \ | |__| | __/\ V /| | (_| __/ |_____/ \___| \_/ |_|\___\__*/ void lt_get_device_mac(uint8_t *mac) { cfg_load_mac(mac); } void lt_reboot() { bk_reboot(); } bool lt_reboot_download_mode() { bk_reboot(); return true; } lt_reboot_reason_t lt_get_reboot_reason() { switch (bk_misc_get_start_type()) { case RESET_SOURCE_POWERON: return REBOOT_REASON_POWER; case RESET_SOURCE_REBOOT: return REBOOT_REASON_SOFTWARE; case RESET_SOURCE_WATCHDOG: return REBOOT_REASON_WATCHDOG; case RESET_SOURCE_CRASH_XAT0: case RESET_SOURCE_CRASH_UNDEFINED: case RESET_SOURCE_CRASH_PREFETCH_ABORT: case RESET_SOURCE_CRASH_DATA_ABORT: case RESET_SOURCE_CRASH_UNUSED: case RESET_SOURCE_CRASH_PER_XAT0: return REBOOT_REASON_CRASH; case RESET_SOURCE_DEEPPS_GPIO: case RESET_SOURCE_DEEPPS_RTC: case RESET_SOURCE_DEEPPS_USB: return REBOOT_REASON_SLEEP; default: return REBOOT_REASON_UNKNOWN; } } /*______ _ _ | ____| | | | | |__ | | __ _ ___| |__ | __| | |/ _` / __| '_ \ | | | | (_| \__ \ | | | |_| |_|\__,_|___/_| |*/ lt_flash_id_t lt_flash_get_id() { uint32_t data = (FLASH_OP_RDID << FLASH_OP_TYPE_POS) | FLASH_OP_SW | FLASH_WP_VALUE; REG_WRITE(REG_FLASH_OPERATE_SW, data); while (REG_READ(REG_FLASH_OPERATE_SW) & FLASH_BUSY_SW) {} lt_flash_id_t id = { .manufacturer_id = REG_RD8(REG_FLASH_RDID, 2), .chip_id = REG_RD8(REG_FLASH_RDID, 1), .chip_size_id = REG_RD8(REG_FLASH_RDID, 0), }; return id; } /*__ __ | \/ | | \ / | ___ _ __ ___ ___ _ __ _ _ | |\/| |/ _ \ '_ ` _ \ / _ \| '__| | | | | | | | __/ | | | | | (_) | | | |_| | |_| |_|\___|_| |_| |_|\___/|_| \__, | __/ | |__*/ uint32_t lt_ram_get_size() { return 256 * 1024; } uint32_t lt_heap_get_size() { #if configDYNAMIC_HEAP_SIZE extern unsigned char _empty_ram; #if CFG_SOC_NAME == SOC_BK7231N return (0x00400000 + 192 * 1024) - (uint32_t)(&_empty_ram); #else return (0x00400000 + 256 * 1024) - (uint32_t)(&_empty_ram); #endif #else return configTOTAL_HEAP_SIZE; #endif } /* ____ _______ / __ \__ __|/\ | | | | | | / \ | | | | | | / /\ \ | |__| | | |/ ____ \ \____/ |_/_/ \*/ lt_ota_type_t lt_ota_get_type() { return OTA_TYPE_SINGLE; } bool lt_ota_is_valid(uint8_t index) { if (index != 0) return false; // check download RBL // TODO: maybe check header CRC or even binary hashes uint32_t magic; lt_flash_read(FLASH_DOWNLOAD_OFFSET, (uint8_t *)&magic, 4); return magic == 0x004C4252; // "RBL\0", little-endian } uint8_t lt_ota_dual_get_current() { return 0; } uint8_t lt_ota_dual_get_stored() { return 0; } bool lt_ota_switch(bool revert) { if (!lt_ota_is_valid(0)) // no valid "download" image // - return false when trying to activate // - return true when trying to revert return revert; if (revert) { // there's a valid "download" image, which has to be removed return lt_flash_erase_block(FLASH_DOWNLOAD_OFFSET); } return true; } /*_ __ _ _ _ \ \ / / | | | | | | \ \ /\ / /_ _| |_ ___| |__ __| | ___ __ _ \ \/ \/ / _` | __/ __| '_ \ / _` |/ _ \ / _` | \ /\ / (_| | || (__| | | | (_| | (_) | (_| | \/ \/ \__,_|\__\___|_| |_|\__,_|\___/ \__, | __/ | |___*/ bool lt_wdt_enable(uint32_t timeout) { wdt_ctrl(WCMD_SET_PERIOD, &timeout); wdt_ctrl(WCMD_POWER_UP, NULL); return true; } void lt_wdt_disable() { wdt_ctrl(WCMD_POWER_DOWN, NULL); } void lt_wdt_feed() { wdt_ctrl(WCMD_RELOAD_PERIOD, NULL); }