diff --git a/MDK_405_iap/.config b/MDK_405_iap/.config index bfdea85..1cee8e0 100644 --- a/MDK_405_iap/.config +++ b/MDK_405_iap/.config @@ -195,7 +195,8 @@ CONFIG_RT_LIBC_DEFAULT_TIMEZONE=8 # # Utilities # -# CONFIG_RT_USING_RYM is not set +CONFIG_RT_USING_RYM=y +# CONFIG_YMODEM_USING_CRC_TABLE is not set # CONFIG_RT_USING_ULOG is not set # CONFIG_RT_USING_UTEST is not set # CONFIG_RT_USING_VAR_EXPORT is not set diff --git a/MDK_405_iap/SConstruct b/MDK_405_iap/SConstruct index 3d31f99..e21c682 100644 --- a/MDK_405_iap/SConstruct +++ b/MDK_405_iap/SConstruct @@ -60,7 +60,7 @@ objs.extend(SConscript(os.path.join(libraries_path_prefix, stm32_library, 'SCons # include drivers objs.extend(SConscript(os.path.join(libraries_path_prefix, 'HAL_Drivers', 'SConscript'))) -# objs.extend(SConscript(os.path.join(SDK_ROOT, 'iap', 'SConscript'))) +objs.extend(SConscript(os.path.join(SDK_ROOT, 'iap', 'SConscript'))) objs.extend(SConscript(os.path.join(SDK_ROOT, 'packages', 'SConscript'))) diff --git a/MDK_405_iap/board/board.c b/MDK_405_iap/board/board.c index 63898ab..26df2fd 100644 --- a/MDK_405_iap/board/board.c +++ b/MDK_405_iap/board/board.c @@ -59,8 +59,17 @@ void SystemClock_Config(void) HAL_RCC_EnableCSS(); } -//extern int iap_main_entry(void); -//INIT_ENV_EXPORT(iap_main_entry); +extern int iap_main_entry(void); +INIT_ENV_EXPORT(iap_main_entry); + +#include "shell.h" +INIT_APP_EXPORT(finsh_system_init); + +extern void fal(uint8_t argc, char **argv); +MSH_CMD_EXPORT(fal, FAL (Flash Abstraction Layer) operate.); + +extern int fal_init(void); +INIT_COMPONENT_EXPORT(fal_init); #include static void reset_fc(int argc, char **argv) diff --git a/MDK_405_iap/board/fal_cfg.h b/MDK_405_iap/board/fal_cfg.h index 25cb53b..3103f47 100644 --- a/MDK_405_iap/board/fal_cfg.h +++ b/MDK_405_iap/board/fal_cfg.h @@ -22,12 +22,10 @@ #define STM32_FLASH_START_ADRESS_64K (STM32_FLASH_START_ADRESS_16K + FLASH_SIZE_GRANULARITY_16K) #define STM32_FLASH_START_ADRESS_128K (STM32_FLASH_START_ADRESS_64K + FLASH_SIZE_GRANULARITY_64K) -#define FLASH_SIZE_APP (4 * 128 * 1024) +#define FLASH_SIZE_APP (6 * 128 * 1024) #define FLASH_SIZE_PARAM (128 * 1024) -#define FLASH_SIZE_LOG (2 * 128 * 1024) #define FLASH_OFFSET_PARAM (FLASH_SIZE_APP) -#define FLASH_OFFSET_LOG (FLASH_SIZE_APP + FLASH_SIZE_PARAM) extern const struct fal_flash_dev stm32_onchip_flash_16k; extern const struct fal_flash_dev stm32_onchip_flash_64k; @@ -45,12 +43,11 @@ extern const struct fal_flash_dev stm32_onchip_flash_128k; /* partition table */ /** - * @brief flash ??: + * @brief flash: * section addr size * 0 - 4 0x08000000 128kb bootloader - * 5 - 8 0x08020000 512KB app - * 9 0x080A0000 128KB param - * 10 - 11 0x080C0000 256kb ulog + * 5 - 10 0x08020000 768KB app + * 11 0x080E0000 128KB param * */ #define FAL_PART_TABLE \ @@ -58,7 +55,6 @@ extern const struct fal_flash_dev stm32_onchip_flash_128k; {FAL_PART_MAGIC_WROD, "boot", "onchip_flash_64k", 0 , FLASH_SIZE_GRANULARITY_16K + FLASH_SIZE_GRANULARITY_64K , 0}, \ {FAL_PART_MAGIC_WROD, "app", "onchip_flash_128k", 0 , FLASH_SIZE_APP, 0}, \ {FAL_PART_MAGIC_WROD, "param", "onchip_flash_128k", FLASH_OFFSET_PARAM , FLASH_SIZE_PARAM, 0}, \ - {FAL_PART_MAGIC_WROD, "ulog", "onchip_flash_128k", FLASH_OFFSET_LOG , FLASH_SIZE_LOG, 0}, \ } #endif /* FAL_PART_HAS_TABLE_CFG */ diff --git a/MDK_405_iap/project.uvprojx b/MDK_405_iap/project.uvprojx index 03c7c1c..286a6dc 100644 --- a/MDK_405_iap/project.uvprojx +++ b/MDK_405_iap/project.uvprojx @@ -14,33 +14,33 @@ 0 - STM32F405RGTx + STM32F405RG STMicroelectronics Keil.STM32F4xx_DFP.2.17.0 https://www.keil.com/pack/ - IRAM(0x20000000,0x00020000) IRAM2(0x10000000,0x00010000) IROM(0x08000000,0x00100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE + IRAM(0x20000000-0x2001FFFF) IRAM2(0x10000000-0x1000FFFF) IROM(0x8000000-0x80FFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F405RGTx$CMSIS\Flash\STM32F4xx_1024.FLM)) - 0 - $$Device:STM32F405RGTx$Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h + "Startup\ST\STM32F4xx\startup_stm32f40_41xxx.s" ("STM32F40/41xxx Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000) + 6100 + stm32f4xx.h - + -DSTM32F40_41xxx - $$Device:STM32F405RGTx$CMSIS\SVD\STM32F405.svd + SFD\ST\STM32F4xx\STM32F40x.sfr 0 0 - - + ST\STM32F4xx\ + ST\STM32F4xx\ 0 0 @@ -49,10 +49,10 @@ 1 .\build\ - F405_RTT_iap + F405_RTT_IAP 0 1 - 0 + 1 1 1 .\build\keil\List\ @@ -110,11 +110,11 @@ SARMCM3.DLL - -REMAP -MPU + -MPU -REMAP DCM.DLL -pCM4 SARMCM3.DLL - -MPU + -MPU TCM.DLL -pCM4 @@ -138,7 +138,7 @@ 1 BIN\UL2CM3.DLL - + "" () @@ -183,7 +183,7 @@ 1 0 0 - 2 + 1 0 0 1 @@ -194,7 +194,7 @@ 0 0 3 - 4 + 3 0 0 0 @@ -339,7 +339,7 @@ __STDC_LIMIT_MACROS, USE_HAL_DRIVER, RT_USING_LIBC, __CLK_TCK=RT_TICK_PER_SECOND, __RTTHREAD__, STM32F405xx, RT_USING_ARM_LIBC - ..\rt-thread\components\libc\compilers\common\extension;..\rt-thread\components\libc\posix\io\stdio;..\libraries\HAL_Drivers\CMSIS\Include;..\rt-thread\include;board;..\rt-thread\components\libc\posix\io\poll;..\rt-thread\components\drivers\include;..\rt-thread\components\drivers\include;..\libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Include;board\CubeMX_Config\Inc;..\rt-thread\components\drivers\include;..\libraries\HAL_Drivers\drv_flash;..\rt-thread\components\fal\inc;..\rt-thread\libcpu\arm\cortex-m4;..\libraries\HAL_Drivers\config;..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Inc;..\rt-thread\components\libc\posix\ipc;..\rt-thread\components\libc\compilers\common\include;..\rt-thread\components\libc\compilers\common\extension\fcntl\octal;..\rt-thread\components\finsh;..\rt-thread\libcpu\arm\common;..\libraries\HAL_Drivers;. + ..\rt-thread\components\utilities\ymodem;..\rt-thread\components\libc\compilers\common\extension;..\rt-thread\components\libc\posix\io\stdio;..\libraries\HAL_Drivers\CMSIS\Include;..\rt-thread\include;board;..\iap;..\rt-thread\components\libc\posix\io\poll;..\rt-thread\components\drivers\include;..\rt-thread\components\drivers\include;..\libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Include;board\CubeMX_Config\Inc;..\rt-thread\components\drivers\include;..\libraries\HAL_Drivers\drv_flash;..\rt-thread\components\fal\inc;..\rt-thread\libcpu\arm\cortex-m4;..\libraries\HAL_Drivers\config;..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Inc;..\rt-thread\components\libc\posix\ipc;..\rt-thread\components\libc\compilers\common\include;..\rt-thread\components\libc\compilers\common\extension\fcntl\octal;..\rt-thread\components\finsh;..\rt-thread\libcpu\arm\common;..\libraries\HAL_Drivers;. @@ -352,7 +352,7 @@ 0 0 0 - 4 + 1 @@ -549,25 +549,25 @@ Fal - fal.c + fal_rtt.c 1 - ..\rt-thread\components\fal\src\fal.c + ..\rt-thread\components\fal\src\fal_rtt.c fal_partition.c 1 ..\rt-thread\components\fal\src\fal_partition.c - - fal_rtt.c - 1 - ..\rt-thread\components\fal\src\fal_rtt.c - fal_flash.c 1 ..\rt-thread\components\fal\src\fal_flash.c + + fal.c + 1 + ..\rt-thread\components\fal\src\fal.c + @@ -595,6 +595,16 @@ + + IAP + + + iap.c + 1 + ..\iap\iap.c + + + Kernel @@ -780,6 +790,16 @@ + + Utilities + + + ymodem.c + 1 + ..\rt-thread\components\utilities\ymodem\ymodem.c + + + @@ -790,14 +810,4 @@ - - - - <Project Info> - 0 - 1 - - - - diff --git a/MDK_405_iap/rtconfig.h b/MDK_405_iap/rtconfig.h index 0ecf211..b4a4709 100644 --- a/MDK_405_iap/rtconfig.h +++ b/MDK_405_iap/rtconfig.h @@ -104,6 +104,7 @@ /* Utilities */ +#define RT_USING_RYM /* RT-Thread online packages */ diff --git a/MDK_405_iap/template.uvprojx b/MDK_405_iap/template.uvprojx index 67ad030..e5c765f 100644 --- a/MDK_405_iap/template.uvprojx +++ b/MDK_405_iap/template.uvprojx @@ -10,37 +10,36 @@ rt-thread 0x4 ARM-ADS - 5060750::V5.06 update 6 (build 750)::ARMCC 0 - STM32F405RGTx + STM32F405RG STMicroelectronics Keil.STM32F4xx_DFP.2.17.0 https://www.keil.com/pack/ - IRAM(0x20000000,0x00020000) IRAM2(0x10000000,0x00010000) IROM(0x08000000,0x00100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE + IRAM(0x20000000-0x2001FFFF) IRAM2(0x10000000-0x1000FFFF) IROM(0x8000000-0x80FFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2 - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F405RGTx$CMSIS\Flash\STM32F4xx_1024.FLM)) - 0 - $$Device:STM32F405RGTx$Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h + "Startup\ST\STM32F4xx\startup_stm32f40_41xxx.s" ("STM32F40/41xxx Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000) + 6100 + stm32f4xx.h - + -DSTM32F40_41xxx - $$Device:STM32F405RGTx$CMSIS\SVD\STM32F405.svd + SFD\ST\STM32F4xx\STM32F40x.sfr 0 0 - - + ST\STM32F4xx\ + ST\STM32F4xx\ 0 0 @@ -49,10 +48,10 @@ 1 .\build\ - F405_RTT_iap + F405_RTT_IAP 0 1 - 0 + 1 1 1 .\build\keil\List\ @@ -110,11 +109,11 @@ SARMCM3.DLL - -REMAP -MPU + -MPU -REMAP DCM.DLL -pCM4 SARMCM3.DLL - -MPU + -MPU TCM.DLL -pCM4 @@ -138,7 +137,7 @@ 1 BIN\UL2CM3.DLL - + "" () @@ -183,7 +182,7 @@ 1 0 0 - 2 + 1 0 0 1 @@ -194,7 +193,7 @@ 0 0 3 - 4 + 3 0 0 0 @@ -337,9 +336,9 @@ 0 - + STM32F405xx, USE_HAL_DRIVER - + .;..\..\..\include;applications;.;board;board\CubeMX_Config\Inc;..\libraries\HAL_Drivers;..\libraries\HAL_Drivers\config;packages\led;..\..\..\libcpu\arm\common;..\..\..\libcpu\arm\cortex-m4;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\finsh;..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Inc;..\libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Include;..\libraries\STM32F4xx_HAL\CMSIS\Include @@ -352,7 +351,7 @@ 0 0 0 - 4 + 1 @@ -373,17 +372,12 @@ .\board\linker_scripts\link.sct - + --keep *.o(.rti_fn.*) --keep *.o(FSymTab) - - - Source Group 1 - - @@ -393,14 +387,4 @@ - - - - <Project Info> - 0 - 1 - - - - diff --git a/iap/iap.c b/iap/iap.c index f97a517..350f275 100644 --- a/iap/iap.c +++ b/iap/iap.c @@ -1,13 +1,46 @@ #include "rtthread.h" #include "ipc/completion.h" #include "ymodem.h" +#include +#include #include "fal.h" #define IAP_FLASH_APP_SEC "app" #define IAP_FLASH_BOOT_SEC "boot" -static rt_device_t console_dev; -struct rt_completion _wait; +#define IFLASH_PAGE_SIZE (128 * 1024) + +// #define IAP_DBG + +#include "rthw.h" + +#ifdef IAP_DBG +char iap_dbg_log[4096] = ""; +int iap_dbg_index = 0; +#endif + +void iap_dbg(const char *fmt, ...) +{ +#ifdef IAP_DBG + va_list args; + + rt_base_t level = rt_hw_interrupt_disable(); + + va_start(args, fmt); + iap_dbg_index += rt_vsnprintf(&iap_dbg_log[iap_dbg_index], sizeof(iap_dbg_log) - iap_dbg_index, fmt, args); + va_end(args); + + rt_hw_interrupt_enable(level); +#endif +} + +static struct rt_completion _wait; + +rt_err_t port_rx_ind(rt_device_t dev, rt_size_t size) +{ + rt_completion_done(&_wait); + return RT_EOK; +} #define IS_AF(c) ((c >= 'A') && (c <= 'F')) #define IS_af(c) ((c >= 'a') && (c <= 'f')) @@ -109,64 +142,122 @@ rt_inline rt_uint32_t Str2Int(uint8_t *inputstr, int32_t *intnum) return res; } -rt_err_t port_rx_ind(rt_device_t dev, rt_size_t size) +static const char *port_list[] = { + "uart1", + "uart2", +}; + +#define PORTS_NUM (sizeof(port_list)/sizeof(port_list[0])) + +void rt_hw_shell_relink(const char *name, rt_uint32_t baud) { - rt_completion_done(&_wait); - return RT_EOK; + struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; + config.baud_rate = baud; + rt_device_t dev = rt_device_find(name); + RT_ASSERT(dev); + rt_device_control(dev, RT_DEVICE_CTRL_CONFIG, &config); + + rt_console_set_device(name); + + rt_thread_t tid = rt_thread_find(FINSH_THREAD_NAME); + if (tid) + { + rt_thread_resume(tid); + rt_schedule(); + } +} + +static rt_device_t _read_ports(rt_device_t ports[], rt_uint8_t want) +{ + rt_uint8_t tmp; + + for (int i = 0; i < PORTS_NUM; i++) + { + if (ports[i] == RT_NULL) + continue; + + if (rt_device_read(ports[i], 0, &tmp, 1) != 1) + continue; + + if (tmp == want) + return ports[i]; + } + + return RT_NULL; +} + +static void _init_all_ports(rt_device_t ports[]) +{ + struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; + config.baud_rate = BAUD_RATE_460800; + + for (int i = 0; i < PORTS_NUM; i++) + { + ports[i] = rt_device_find(port_list[i]); + if (ports[i] == RT_NULL) + continue; + + rt_enter_critical(); + ports[i]->rx_indicate = port_rx_ind; + rt_exit_critical(); + rt_device_control(ports[i], RT_DEVICE_CTRL_CONFIG, &config); + rt_device_open(ports[i], RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX); + } +} + +static void _close_other_ports(rt_device_t ports[], rt_device_t console_dev) +{ + for (int i = 0; i < PORTS_NUM; i++) + { + if (ports[i] == RT_NULL) + continue; + + if (ports[i] == console_dev) + continue; + + rt_device_close(ports[i]); + ports[i] = RT_NULL; + } +} + +static void _print_ports(rt_device_t ports[], const char *fmt, ...) +{ + va_list args; + char line_buf[128] = { 0 }; + rt_size_t real; + + va_start(args, fmt); + real = rt_vsnprintf(line_buf, sizeof(line_buf), fmt, args); + va_end(args); + + for (int i = 0; i < PORTS_NUM; i++) + { + if (ports[i] == RT_NULL) + continue; + + rt_device_write(ports[i], 0, line_buf, real); + } +} + +static const char version_header[] = {0xB5,0x5B,0xff,'\0'}; +static const char Firmware_Version[] = "\r\nXY_F405_IAP_460800_FV2.0_R20240724"; +static const char version_end[] = {0xBB,'\0'}; + +static void iap_show_version_string(rt_device_t ports[]) +{ + char iap_version[100]= {'\0'}; + + strcat(iap_version,version_header); + strcat(iap_version,Firmware_Version); + strcat(iap_version,version_end); + + iap_version[2] = strlen(iap_version); + + _print_ports(ports, "%s\n", iap_version); } #define RT_BUF_SIZE (1024) -/* - * 固件格式: - * - * 作用 & 说明 - * - 记录固件对应硬件 & 版本信息 - * - 简便起见,不包含校验信息 - * - 允许 iap 升级不含 header 的普通固件 - * - * index len desc - * 0 4 'XYFC' - * 4 4 固件信息长度 - * 8 N 固件信息 ('类型'-'版本') - * 8+N M 固件数据 - */ -static const char FIXED_HEAD[] = {'X', 'Y', 'F', 'C'}; -extern const char IAP_BIN_PREFIX[]; - -static int _check_head(const rt_uint8_t *buf, rt_size_t len) -{ - if (len < 8) - { - return 0; - } - - for (int i = 0; i < sizeof(FIXED_HEAD); i++) - { - if (FIXED_HEAD[i] != buf[i]) - { - return 0; - } - } - - rt_uint32_t real = *((const rt_uint32_t *)&buf[4]); - rt_uint32_t want = rt_strlen(IAP_BIN_PREFIX); - if (real <= want || len - 8 < real) - { - return -3; - } - - for(int i = 0; i < want; i++) - { - if (IAP_BIN_PREFIX[i] != buf[8 + i]) - { - return -4; - } - } - - return real + 8; -} - struct custom_ctx { struct rym_ctx parent; int32_t file_size; @@ -181,8 +272,6 @@ static enum rym_code _rym_recv_begin( rt_uint8_t *buf, rt_size_t len) { - // return RYM_ERR_ACK; - // return RYM_CODE_CAN; struct custom_ctx *cctx = (struct custom_ctx *) ctx; RT_ASSERT(cctx); @@ -234,15 +323,8 @@ static enum rym_code _rym_recv_data( RT_ASSERT(cctx); RT_ASSERT(len <= RT_BUF_SIZE); - int offset = 0; if (cctx->recevied_head == 0) { - offset = _check_head(buf, len); - if (offset < 0) - { - return RYM_ERR_FILE; - } - if (fal_partition_erase(cctx->flash, 0, cctx->file_size) < 0) { return RYM_CODE_CAN; @@ -261,22 +343,22 @@ static enum rym_code _rym_recv_data( len = cctx->file_size - cctx->w_index; } - if (fal_partition_write(cctx->flash, cctx->w_index, &buf[offset], len - offset) <= 0) + if (fal_partition_write(cctx->flash, cctx->w_index, buf, len) <= 0) { return RYM_CODE_CAN; } - if (fal_partition_read(cctx->flash, cctx->w_index, cctx->ck_buffer, len - offset) <= 0) + if (fal_partition_read(cctx->flash, cctx->w_index, cctx->ck_buffer, len) <= 0) { return RYM_CODE_CAN; } - for (int i = 0; i < len - offset; i++) + for (int i = 0; i < len; i++) { - if (cctx->ck_buffer[i] != buf[i + offset]) + if (cctx->ck_buffer[i] != buf[i]) return RYM_CODE_CAN; } - cctx->w_index += len - offset; + cctx->w_index += len; return RYM_CODE_ACK; } @@ -321,26 +403,20 @@ static const rt_uint8_t *_pack_cmd(enum iap_v5_cmd cmd) #define _response_cmd(cmd) \ rt_device_write(console_dev, 0, _pack_cmd(cmd), IAP_V5_CMD_SIZE) -static rt_bool_t iap_v5_req_char(rt_device_t console_dev, +static rt_device_t iap_v5_req_char(rt_device_t ports[], struct rt_completion *_wait, rt_uint8_t want, rt_tick_t wait) { - rt_uint8_t ch; rt_tick_t start = rt_tick_get(); - rt_bool_t rt = RT_FALSE; + rt_device_t get = RT_NULL; while (rt_tick_get() - start < wait) { - if (rt_device_read(console_dev, 0, &ch, 1) == 1) + get = _read_ports(ports, want); + if (get != RT_NULL) { - if (ch == want) - { - rt = RT_TRUE; - break; - } - - continue; + break; } if (rt_completion_wait(_wait, wait - (rt_tick_get() - start)) @@ -350,7 +426,7 @@ static rt_bool_t iap_v5_req_char(rt_device_t console_dev, } } - return rt; + return get; } static void jump_to_app(void); @@ -362,9 +438,57 @@ int iap_main_entry(void) { return _iap_entry(RT_TRUE); } +// INIT_APP_EXPORT(iap_main_entry); #include "shell.h" +static void _jump_to_app_entry(void *p) +{ + rt_thread_delay(500); + + rt_kprintf("jump to app ...\n"); + jump_to_app(); +} + +void _on_iap_end(rt_device_t console_dev) +{ + rt_device_close(console_dev); + rt_hw_shell_relink(console_dev->parent.name, BAUD_RATE_460800); +} + +static rt_bool_t _handle_connect(rt_device_t console_dev, rt_tick_t timeout) +{ + rt_int32_t cnt_c = 0; + rt_uint8_t tmp; + rt_tick_t start = rt_tick_get(); + + while (rt_tick_get() - start < timeout) + { + if (rt_device_read(console_dev, 0, &tmp, 1) != 1) + { + if (rt_completion_wait(&_wait, timeout - (rt_tick_get() - start)) != RT_EOK) + break; + + continue; + } + + if (tmp == '1') + { + _response_cmd(IAP_V5_CMD_ONE_REPLY); + continue; + } + + if (tmp == 'c') + { + cnt_c ++; + _response_cmd(IAP_V5_CMD_C_REPLY); + break; + } + } + + return cnt_c > 0; +} + static int _iap_entry(rt_bool_t is_boot) { if (IapAppAddr && is_boot) @@ -372,42 +496,50 @@ static int _iap_entry(rt_bool_t is_boot) return 0; } - if ((!IapAppAddr) && is_boot) - { - finsh_set_prompt("msh (IAP)"); - } - - rt_err_t (*odev_rx_ind)(rt_device_t dev, rt_size_t size); + rt_device_t _ports[PORTS_NUM] = {0}; rt_err_t err = RT_EOK; struct custom_ctx *ctx = RT_NULL; - console_dev = rt_console_get_device(); + rt_device_t console_dev = rt_console_get_device(); RT_ASSERT(console_dev); rt_completion_init(&_wait); - odev_rx_ind = console_dev->rx_indicate; - rt_device_set_rx_indicate(console_dev, port_rx_ind); - if (!iap_v5_req_char(console_dev, &_wait, '1', is_boot? 1000: 100000)) + // 使用特殊设备暂时替代 console 口, 避免逻辑出错 + rt_hw_shell_relink("block_r", BAUD_RATE_460800); + rt_thread_delay(200); + + _init_all_ports(_ports); + + iap_show_version_string(_ports); + + rt_device_t get_port = iap_v5_req_char(_ports, &_wait, '1', is_boot? 1000: 100000); + if (get_port == RT_NULL) { + _close_other_ports(_ports, console_dev); goto _exit; } + if (get_port != console_dev) + { + console_dev = get_port; + } + + _close_other_ports(_ports, console_dev); + _response_cmd(IAP_V5_CMD_ONE_REPLY); - rt_thread_mdelay(200); -// if (!iap_v5_req_char(console_dev, &_wait, 'c', 1000)) -// { -// err = RT_ENOSYS; -// goto _exit; -// } - - _response_cmd(IAP_V5_CMD_C_REPLY); + if (!_handle_connect(console_dev, 1000)) + { + err = RT_ERROR; + iap_dbg("_handle_connect failed\n"); + goto _exit; + } ctx = rt_calloc(1, sizeof(*ctx)); if (!ctx) { err = RT_ENOMEM; - rt_kprintf("rt_malloc failed\n"); + iap_dbg("rt_malloc failed\n"); goto _exit; } ctx->parent.v5_iap_adapt = RT_TRUE; @@ -416,7 +548,7 @@ static int _iap_entry(rt_bool_t is_boot) if (ctx->flash == RT_NULL) { err = RT_ENOSYS; - rt_kprintf("fal_partition_find %s failed: %d\n", IapAppAddr? IAP_FLASH_BOOT_SEC: IAP_FLASH_APP_SEC, rt_get_errno()); + iap_dbg("fal_partition_find %s failed: %d\n", IapAppAddr? IAP_FLASH_BOOT_SEC: IAP_FLASH_APP_SEC, rt_get_errno()); rt_free(ctx); goto _exit; } @@ -430,25 +562,25 @@ static int _iap_entry(rt_bool_t is_boot) if (err == RT_EOK) { _response_cmd(IAP_V5_CMD_UPDATE_SUCCEED); + _on_iap_end(console_dev); return 0; } _exit: if (err == RT_EOK && is_boot) { - rt_kprintf("jump to app ...\n"); - jump_to_app(); + rt_thread_startup(rt_thread_create("iap_boot", _jump_to_app_entry, RT_NULL, 2048, 10, 10)); + _on_iap_end(console_dev); return 0; } _response_cmd(IAP_V5_CMD_UPDATE_FAILED); _response_cmd(IAP_V5_CMD_POWER_ON_AGAIN); - rt_device_set_rx_indicate(console_dev, odev_rx_ind); + _on_iap_end(console_dev); return 0; } -#include #include #define FLASH_RUN_BASEADDR 0x08020000 @@ -458,13 +590,13 @@ typedef void (*pFunction)(void); static pFunction JumpToApplication; static uint32_t JumpAddress; -static void jump_to_app(void) +void jump_to_app(void) { - SysTick->CTRL = 0; //关键代码 + SysTick->CTRL = 0; //关键代码 - HAL_DeInit(); //可选 - HAL_NVIC_DisableIRQ(SysTick_IRQn); //可选 - HAL_NVIC_ClearPendingIRQ(SysTick_IRQn); //可选 + HAL_DeInit(); + HAL_NVIC_DisableIRQ(SysTick_IRQn); + HAL_NVIC_ClearPendingIRQ(SysTick_IRQn); /* Jump to user application */ __disable_irq(); @@ -475,6 +607,10 @@ static void jump_to_app(void) /* Initialize user application's Stack Pointer */ __set_MSP(*(__IO uint32_t*) FLASH_RUN_BASEADDR); + __set_CONTROL(0); + + __enable_irq(); + JumpToApplication(); } MSH_CMD_EXPORT(jump_to_app, jump_to_app); @@ -484,3 +620,49 @@ static void _cmd_iap(void) _iap_entry(RT_FALSE); } MSH_CMD_EXPORT_ALIAS(_cmd_iap, iap, iap bootloader / app start); + +static void shell_relink(int argc, char **argv) +{ + if (argc < 2) + { + rt_kprintf("%s prt_name\n", argv[0]); + return; + } + + rt_hw_shell_relink(argv[1], BAUD_RATE_460800); +} +MSH_CMD_EXPORT(shell_relink, relink msh to other port); + +#ifdef IAP_DBG +void iap_log() +{ + int index = 0; + + for (int i = 0; i < iap_dbg_index; i++) + { + if (iap_dbg_log[i] == '\n' || iap_dbg_log[i] == '\0') + { + iap_dbg_log[i] = '\0'; + rt_kprintf("log: %s\n", &iap_dbg_log[index]); + index = i+1; + } + } +} +MSH_CMD_EXPORT(iap_log, iap log); +#endif + +static struct rt_device blocked_reader_ = {0}; + +static rt_size_t _blocked_reader_read (rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size) +{ + return 0; +} + +int init_block_reader() +{ + blocked_reader_.read = _blocked_reader_read; + rt_device_register(&blocked_reader_, "block_r", RT_DEVICE_FLAG_RDWR); + + return 0; +} +INIT_BOARD_EXPORT(init_block_reader);