mcu_hi3321_watch/middleware/utils/dfx/diag_transmit/transmit_api.c
2025-05-26 20:15:20 +08:00

97 lines
3.3 KiB
C

/*
* Copyright (c) @CompanyNameMagicTag 2021-2021. All rights reserved.
* Description: transmit data
* This file should be changed only infrequently and with great care.
*/
#include "transmit_api.h"
#include "transmit_item.h"
#include "transmit_write_read.h"
#include "diag_common.h"
#include "transmit_debug.h"
#include "zdiag_adapt_layer.h"
#include "dfx_feature_config.h"
#if (CONFIG_DFX_SUPPORT_FILE_SYSTEM == DFX_YES)
#include "dfx_file_operation.h"
STATIC errcode_t soc_dfx_save_file_emmc_async_local(char *file_name, uint8_t *buf, uint32_t size,
save_file_result_hook handler, uintptr_t usr_data)
{
dfx_assert(file_name);
dfx_assert(buf);
int32_t len = dfx_file_write(file_name, 0, buf, size);
handler(len, usr_data);
return ERRCODE_SUCC;
}
#endif /* CONFIG_DFX_SUPPORT_FILE_SYSTEM */
#if defined CONFIG_FEATURE_SUPPORT_REMOTE_EMMC
STATIC errcode_t soc_dfx_save_file_async_remote(char *file_name, uint8_t *buf, uint32_t size,
save_file_result_hook handler, uintptr_t usr_data)
{
dfx_assert(file_name);
dfx_assert(buf);
diag_addr dst = diag_adapt_get_emmc_dst();
diag_option_t option = DIAG_OPTION_INIT_VAL;
option.peer_addr = dst;
transmit_item_t *item = transmit_item_init(0);
if (item == NULL) {
return ERRCODE_FAIL;
}
unused(handler);
unused(usr_data);
transmit_item_init_permanent(item, false);
transmit_item_init_local_start(item, true);
transmit_item_init_local_src(item, true);
transmit_item_init_remote_type(item, TRANSMIT_TYPE_SAVE_FILE);
transmit_item_init_local_type(item, TRANSMIT_LOCAL_TYPE_READ_DATA);
transmit_item_init_read_handler(item, bus_read_data, (uintptr_t)item);
transmit_item_init_file_name(item, file_name);
transmit_item_init_local_bus_addr(item, (uint32_t)(uintptr_t)buf);
transmit_item_init_option(item, &option);
transmit_item_init_down_machine(item, true);
transmit_item_init_total_size(item, size);
if (transmit_item_init_is_success(item) == false) {
transmit_item_deinit(item);
return ERRCODE_FAIL;
}
transmit_printf_item("save file", item);
transmit_item_enable(item);
return ERRCODE_SUCC;
}
#endif
#if (CONFIG_DFX_SUPPORT_FILE_SYSTEM == DFX_YES) || defined(CONFIG_FEATURE_SUPPORT_REMOTE_EMMC)
STATIC errcode_t soc_dfx_save_file_emmc_async(char *file_name, uint8_t *buf, uint32_t size,
save_file_result_hook handler, uintptr_t usr_data)
{
#if (CONFIG_DFX_SUPPORT_FILE_SYSTEM == DFX_YES)
return soc_dfx_save_file_emmc_async_local(file_name, buf, size, handler, usr_data);
#elif defined(CONFIG_FEATURE_SUPPORT_REMOTE_EMMC)
return soc_dfx_save_file_async_remote(file_name, buf, size, handler, usr_data);
#endif
}
#endif
errcode_t soc_dfx_save_file_async(char *file_name, uint8_t *buf, uint32_t size, save_file_result_hook handler,
uintptr_t usr_data)
{
dfx_assert(file_name);
dfx_assert(buf);
#if (CONFIG_DFX_SUPPORT_FILE_SYSTEM == DFX_YES) || defined(CONFIG_FEATURE_SUPPORT_REMOTE_EMMC)
return soc_dfx_save_file_emmc_async(file_name, buf, size, handler, usr_data);
#else
unused(file_name);
unused(buf);
unused(size);
unused(handler);
unused(usr_data);
return ERRCODE_SUCC;
#endif
}