初版
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
#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
|
||||
|
||||
Reference in New Issue
Block a user