Revert "多串口 iap 实现"

This reverts commit d07e4fa745.
This commit is contained in:
2023-04-17 17:29:41 +08:00
parent b48f2d044c
commit c11eef0984
2 changed files with 43 additions and 156 deletions

191
iap/iap.c
View File

@@ -6,6 +6,7 @@
#define IAP_FLASH_APP_SEC "app"
#define IAP_FLASH_BOOT_SEC "boot"
static rt_device_t console_dev;
struct rt_completion _wait;
#define IS_AF(c) ((c >= 'A') && (c <= 'F'))
@@ -316,56 +317,44 @@ static const rt_uint8_t *_pack_cmd(enum iap_v5_cmd cmd)
return _cmd_line;
}
#define _response_cmd(console_dev, cmd) \
#define _response_cmd(cmd) \
rt_device_write(console_dev, 0, _pack_cmd(cmd), IAP_V5_CMD_SIZE)
static void jump_to_app(void);
extern const uint32_t IapAppAddr;
#define PORTS_NUM (10) // uart1 - uart10
static rt_device_t _read_ports(rt_device_t ports[], rt_uint8_t *pch)
static rt_bool_t iap_v5_req_char(rt_device_t console_dev,
struct rt_completion *_wait,
rt_uint8_t want,
rt_tick_t wait)
{
for (int i = 0; i < PORTS_NUM; i++)
rt_uint8_t ch;
rt_tick_t start = rt_tick_get();
rt_bool_t rt = RT_FALSE;
while (rt_tick_get() - start < wait)
{
while (ports[i])
if (rt_device_read(console_dev, 0, &ch, 1) == 1)
{
if (rt_device_read(ports[i], 0, pch, 1) != 1)
if (ch == want)
{
rt = RT_TRUE;
break;
}
if (*pch == '1' || *pch == 'q')
{
return ports[i];
}
continue;
}
}
return 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)
if (rt_completion_wait(_wait, wait - (rt_tick_get() - start))
!= RT_EOK)
{
break;
}
rt_device_write(ports[i], 0, line_buf, real);
}
return rt;
}
static void jump_to_app(void);
extern const uint32_t IapAppAddr;
static int _iap_entry(rt_bool_t is_boot);
int iap_main_entry(void)
@@ -387,123 +376,31 @@ static int _iap_entry(rt_bool_t is_boot)
finsh_set_prompt("msh (IAP)");
}
rt_err_t (*odev_rx_ind)(rt_device_t dev, rt_size_t size);
rt_err_t err = RT_EOK;
struct custom_ctx *ctx = RT_NULL;
rt_device_t console = rt_console_get_device();
RT_ASSERT(console);
rt_device_t ports[10] = {0};
char name[RT_NAME_MAX] = {0};
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);
rt_bool_t _wait_mode = RT_FALSE;
rt_bool_t _continue_run = RT_FALSE;
rt_err_t (*odev_rx_ind)(rt_device_t dev, rt_size_t size);
for (int i = 0; i < 10 && is_boot; i++)
if (!iap_v5_req_char(console_dev, &_wait, '1', is_boot? 1000: 100000))
{
rt_snprintf(name, RT_NAME_MAX, "uart%d", i+1);
ports[i] = rt_device_find(name);
RT_ASSERT(ports[i]);
struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
config.baud_rate = BAUD_RATE_460800;
rt_device_control(ports[i], RT_DEVICE_CTRL_CONFIG, &config);
rt_device_set_rx_indicate(ports[i], port_rx_ind);
rt_device_open(ports[i], RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX);
goto _exit;
}
_response_cmd(IAP_V5_CMD_ONE_REPLY);
if (!is_boot)
rt_thread_mdelay(200);
if (!iap_v5_req_char(console_dev, &_wait, 'c', 1000))
{
ports[0] = rt_console_get_device();
RT_ASSERT(ports[0]);
odev_rx_ind = ports[0]->rx_indicate;
rt_device_set_rx_indicate(ports[0], port_rx_ind);
struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
config.baud_rate = BAUD_RATE_460800;
rt_device_control(ports[0], RT_DEVICE_CTRL_CONFIG, &config);
rt_device_open(ports[0], RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX);
}
rt_device_t get_port = RT_NULL;
rt_uint8_t wait_cnt = 3;
rt_uint8_t ch;
_print_ports(ports, "iap loop ...");
while (wait_cnt > 0 || !is_boot)
{
get_port = _read_ports(ports, &ch);
if (get_port != RT_NULL)
{
if (ch == 'q')
{
_continue_run = RT_TRUE;
break;
}
if (ch == '1')
{
_wait_mode = RT_TRUE;
_response_cmd(get_port, IAP_V5_CMD_ONE_REPLY);
break;
}
}
else
{
wait_cnt--;
}
rt_completion_wait(&_wait, rt_tick_from_millisecond(100));
}
if (get_port == RT_NULL)
{
get_port = console;
}
for (int i = 0; i < PORTS_NUM && is_boot; i++)
{
if (ports[i] == get_port)
{
continue;
}
rt_device_set_rx_indicate(ports[i], RT_NULL);
rt_device_close(ports[i]);
}
if (get_port != console)
{
rt_console_set_device(get_port->parent.name);
}
if (_continue_run)
{
rt_device_close(get_port);
if (!is_boot)
{
rt_device_set_rx_indicate(ports[0], odev_rx_ind);
}
return 0;
}
if (!_wait_mode)
{
err = RT_EOK;
err = RT_ENOSYS;
goto _exit;
}
rt_device_set_rx_indicate(get_port, port_rx_ind);
rt_thread_mdelay(200);
_response_cmd(get_port, IAP_V5_CMD_C_REPLY);
_response_cmd(IAP_V5_CMD_C_REPLY);
ctx = rt_calloc(1, sizeof(*ctx));
if (!ctx)
@@ -522,7 +419,7 @@ static int _iap_entry(rt_bool_t is_boot)
goto _exit;
}
err = rym_recv_on_device(&ctx->parent, get_port, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
err = rym_recv_on_device(&ctx->parent, console_dev, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
_rym_recv_begin, _rym_recv_data, _rym_recv_end, 1000);
rt_free(ctx);
@@ -530,22 +427,11 @@ static int _iap_entry(rt_bool_t is_boot)
if (err == RT_EOK)
{
rt_device_close(get_port);
_response_cmd(get_port, IAP_V5_CMD_UPDATE_SUCCEED);
if (!is_boot)
{
rt_device_set_rx_indicate(ports[0], odev_rx_ind);
}
_response_cmd(IAP_V5_CMD_UPDATE_SUCCEED);
return 0;
}
_exit:
rt_device_close(get_port);
if (!is_boot)
{
rt_device_set_rx_indicate(ports[0], odev_rx_ind);
}
if (err == RT_EOK && is_boot)
{
rt_kprintf("jump to app ...\n");
@@ -553,9 +439,10 @@ _exit:
return 0;
}
_response_cmd(get_port, IAP_V5_CMD_UPDATE_FAILED);
_response_cmd(get_port, IAP_V5_CMD_POWER_ON_AGAIN);
_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);
return 0;
}

View File

@@ -604,7 +604,7 @@
<Group>
<GroupName>Drivers</GroupName>
<tvExp>0</tvExp>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
@@ -744,7 +744,7 @@
<Group>
<GroupName>Fal</GroupName>
<tvExp>1</tvExp>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
@@ -856,7 +856,7 @@
<Group>
<GroupName>IAP</GroupName>
<tvExp>1</tvExp>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
@@ -1404,7 +1404,7 @@
<Group>
<GroupName>Utilities</GroupName>
<tvExp>0</tvExp>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>