XFusion API v1.3.0
载入中...
搜索中...
未找到
ex_init_xf_ymodem.c
浏览该文件的文档.
1
12/* ==================== [Includes] ========================================== */
13
14#include "xf_utils.h"
15#include "xf_osal.h"
16#include "xf_hal.h"
17#include "xf_sys.h"
18#include "xf_ymodem.h"
19
20#include "ex_init.h"
21
22/* ==================== [Defines] =========================================== */
23
24/* ==================== [Typedefs] ========================================== */
25
26/* ==================== [Static Prototypes] ================================= */
27
28static void ex_ymodem_uart_setup(void);
29
30static int32_t port_xf_ymodem_write(const void *src, uint32_t size, uint32_t timeout_ms);
31static int32_t port_xf_ymodem_read(void *dst, uint32_t size, uint32_t timeout_ms);
32static void port_xf_ymodem_flush(void);
33static void port_xf_ymodem_delay_ms(uint32_t ms);
34
35/* ==================== [Static Variables] ================================== */
36
37static xf_ymodem_t s_ymodem = {0};
38static xf_ymodem_t *sp_ym = &s_ymodem;
39/* 不需要预留尾随 '\0' */
40static uint8_t s_ym_buf[XF_YMODEM_STX_PACKET_SIZE] = {0};
41
42static const xf_ymodem_ops_t port_xf_ymodem_ops = {
43 .read = port_xf_ymodem_read,
44 .write = port_xf_ymodem_write,
45 .flush = port_xf_ymodem_flush,
46 .delay_ms = port_xf_ymodem_delay_ms,
47 .user_parse = NULL,
48 .user_file_info = NULL,
49};
50
51/* ==================== [Macros] ============================================ */
52
53/* ==================== [Global Functions] ================================== */
54
56{
57 xf_err_t xf_ret = XF_OK;
58
60
61 sp_ym->p_buf = s_ym_buf;
62 sp_ym->buf_size = ARRAY_SIZE(s_ym_buf);
63 sp_ym->retry_num = 10;
64 sp_ym->timeout_ms = 50;
65 sp_ym->user_data = NULL;
67
68 xf_ret = xf_ymodem_check(sp_ym);
69 XF_ERROR_CHECK(xf_ret);
70}
71
72xf_ymodem_t *ex_get_xf_ymodem(void)
73{
74 return sp_ym;
75}
76
77/* ==================== [Static Functions] ================================== */
78
85
86static int32_t port_xf_ymodem_write(const void *src, uint32_t size, uint32_t timeout_ms)
87{
88 UNUSED(timeout_ms);
89 int32_t wlen;
90 wlen = xf_hal_uart_write(UART_NUM, src, size);
91 return wlen;
92}
93
94static int32_t port_xf_ymodem_read(void *dst, uint32_t size, uint32_t timeout_ms)
95{
96 int32_t rlen_real = 0;
97 int32_t rlen = 0;
98 uint32_t time_ms = 0;
99 uint32_t time_start_ms = (uint32_t)xf_sys_time_get_ms();
100 uint32_t time_end_ms = time_start_ms + timeout_ms;
101
102 do {
103 rlen = xf_hal_uart_read(
104 UART_NUM, (uint8_t *)dst + rlen_real, size - rlen_real);
105 if (rlen > 0) {
106 rlen_real += rlen;
107 }
108 if (rlen_real >= size) {
109 break;
110 }
111 /*
112 esp32 测试数据
113 1. `xf_osal_delay_ms(1);`
114 太慢(921600, 正常约 52 KBps, 此方式只有 40 KBps)。
115 2. `xf_sys_watchdog_kick(); xf_osal_thread_yield();`
116 没用
117 3. 每 20 ms 睡眠一次,速度约 47.6 KBps(20MB 数据量),看门狗不会叫。
118 4. 关闭看门狗。
119 */
120 time_ms = xf_sys_time_get_ms();
121 if ((time_ms - time_start_ms + 1) % 20 == 0) {
123 }
124 } while (time_ms < time_end_ms);
125
126 return rlen_real;
127}
128
129static void port_xf_ymodem_flush(void)
130{
131 int32_t rlen = 0;
132 uint8_t dummy_buf[32] = {0};
133 while (1) {
134 rlen = xf_hal_uart_read(UART_NUM, dummy_buf, ARRAY_SIZE(dummy_buf));
135 if (rlen <= 0) {
136 break;
137 }
138 }
139}
140
141static void port_xf_ymodem_delay_ms(uint32_t ms)
142{
144}
#define UART_TX_PIN
Definition ex_init.h:32
#define UART_RX_PIN
Definition ex_init.h:33
static int32_t port_xf_ymodem_read(void *dst, uint32_t size, uint32_t timeout_ms)
static void ex_ymodem_uart_setup(void)
static int32_t port_xf_ymodem_write(const void *src, uint32_t size, uint32_t timeout_ms)
static xf_ymodem_t s_ymodem
static void port_xf_ymodem_delay_ms(uint32_t ms)
void ex_init_xf_ymodem(void)
static xf_ymodem_t * sp_ym
xf_ymodem_t * ex_get_xf_ymodem(void)
static uint8_t s_ym_buf[XF_YMODEM_STX_PACKET_SIZE]
static const xf_ymodem_ops_t port_xf_ymodem_ops
static void port_xf_ymodem_flush(void)
xf_err_t xf_hal_uart_init(xf_uart_num_t uart_num, uint32_t baudrate)
uart 初始化。
Definition xf_hal_uart.c:50
int xf_hal_uart_read(xf_uart_num_t uart_num, uint8_t *data, uint32_t data_len)
uart 读取函数。
int xf_hal_uart_write(xf_uart_num_t uart_num, const uint8_t *data, uint32_t data_len)
uart 写入函数。
xf_err_t xf_hal_uart_set_gpio(xf_uart_num_t uart_num, xf_gpio_num_t tx_num, xf_gpio_num_t rx_num)
uart 设置 uart 的通讯 io。
xf_err_t xf_hal_uart_enable(xf_uart_num_t uart_num)
uart 启用函数。
Definition xf_hal_uart.c:91
xf_err_t xf_osal_delay_ms(uint32_t ms)
(睡眠)等待超时,以 ms 为单位。
xf_ms_t xf_sys_time_get_ms(void)
获取系统时间的时间戳,单位毫秒(ms)
Definition xf_sys_time.c:96
#define XF_ERROR_CHECK(expression)
xfusion 错误检查宏(表达式 不等于 XF_OK 时则调用 XF_CHECK_ERROR_HANDLER)。
Definition xf_check.h:182
int32_t xf_err_t
整形错误类型。 错误码具体值见 xf_err_code_t.
Definition xf_err.h:69
@ XF_OK
Definition xf_err.h:43
#define ARRAY_SIZE(arr)
ARRAY_SIZE - 获取数组 arr 中的元素数量。
Definition xf_predef.h:173
#define UART_BAUDRATE
Definition xf_main.c:25
#define UART_NUM
Definition xf_main.c:24
#define UNUSED(_x)