Files
AC707N/SDK/apps/common/config/cfg_tool_cdc.c
T
2025-12-03 11:12:34 +08:00

90 lines
2.6 KiB
C

#ifdef SUPPORT_MS_EXTENSIONS
#pragma bss_seg(".cfg_tool_cdc.data.bss")
#pragma data_seg(".cfg_tool_cdc.data")
#pragma const_seg(".cfg_tool_cdc.text.const")
#pragma code_seg(".cfg_tool_cdc.text")
#endif
#include "cfg_tool_cdc.h"
#include "app_config.h"
#include "cfg_tool.h"
#if TCFG_USB_SLAVE_CDC_ENABLE
#include "usb/device/cdc.h"
#endif
#if TCFG_CFG_TOOL_ENABLE && (TCFG_COMM_TYPE == TCFG_USB_COMM)
#define CFG_TOOL_PROTOCOL_HEAD_SIZE 7
static u16 rx_len_count = 0;
static u16 tool_buf_total_len = 0;
static u8 *buf_rx = NULL;
/**
* @brief 获取工具cdc最大支持的协议包大小
*/
u16 cfg_tool_cdc_rx_max_mtu()
{
return 1024 * 4 + 22;
}
static void reset_rx_resource()
{
if (buf_rx) {
free(buf_rx);
buf_rx = NULL;
}
rx_len_count = 0;
tool_buf_total_len = 0;
}
/**
* @brief 获取cdc的配置/调音工具相关数据
*/
void cfg_tool_data_from_cdc(u8 *buf, u32 rlen) // in irq
{
/* printf("cfg_tool cdc rx:\n"); */
/* put_buf(buf, rlen); */
if ((buf[0] == 0x5A) && (buf[1] == 0xAA) && (buf[2] == 0xA5)) {
reset_rx_resource();
tool_buf_total_len = CFG_TOOL_READ_LIT_U16(buf + 5);
buf_rx = zalloc(CFG_TOOL_PROTOCOL_HEAD_SIZE + tool_buf_total_len);
ASSERT(buf_rx);
memcpy(buf_rx, buf, rlen);
/* printf("cfg_tool cdc need total len1 = %d\n", tool_buf_total_len); */
/* printf("cfg_tool cdc rx len1 = %d\n", rlen); */
if ((CFG_TOOL_PROTOCOL_HEAD_SIZE + tool_buf_total_len) == rlen) {
/* printf("cfg_tool cdc rx1:\n"); */
/* put_buf(buf_rx, rlen); */
online_cfg_tool_data_deal(buf_rx, rlen);
reset_rx_resource();
} else {
rx_len_count += rlen;
}
} else {
if (!buf_rx) {
printf("%s, buf_rx null!\n", __FUNCTION__);
reset_rx_resource();
return;
}
if ((rx_len_count + rlen) > (CFG_TOOL_PROTOCOL_HEAD_SIZE + tool_buf_total_len)) {
reset_rx_resource();
return;
}
memcpy(buf_rx + rx_len_count, buf, rlen);
/* printf("cfg_tool cdc need total len2 = %d\n", tool_buf_total_len); */
/* printf("cfg_tool cdc rx len2 = %d\n", rlen + rx_len_count); */
if ((tool_buf_total_len + CFG_TOOL_PROTOCOL_HEAD_SIZE) == (rx_len_count + rlen)) {
/* printf("cfg_tool cdc rx2:\n"); */
/* put_buf(buf_rx, rx_len_count + rlen); */
online_cfg_tool_data_deal(buf_rx, rx_len_count + rlen);
reset_rx_resource();
} else {
rx_len_count += rlen;
}
}
}
#endif