inwudriver-weibo/bsp/drivers/drv_dfx/drv_dfx_mem.c

162 lines
5.2 KiB
C
Raw Normal View History

/*
* Copyright (c) CompanyNameMagicTag 2012-2019. All rights reserved.
* Description: Restore OSM/OSSMdrv_dfx_mem.c code
* Author: CompanyName
* Create: 2012-06-27
*/
#include "drv_dfx_mem.h"
#include "drv_dfx_cmn_inc.h"
#include "los_task.h"
#include "soc_mdm_hrtimer.h"
#include "soc_stdlib.h"
#ifdef PRODUCT_CFG_MEM_OPERATE
#define MEM_READ_MAX_NUM 0x32
EXT_PRV td_u32 mem_read_make_ind(td_u32 address, td_u32 word_num, td_char *report_buf, td_u32 reoprt_buf_len)
{
td_char temp_str[20] = { 0 }; /* Temp String Length 20 */
td_u32 line_len;
td_u32 val;
td_u32 i;
if ((report_buf == NULL) || (reoprt_buf_len == 0)) {
return EXT_ERR_INVALID_PARAMETER;
}
while (word_num > 0) {
int ret = sprintf_s(temp_str, sizeof(temp_str), "0x%08x ", address);
if (ret == -1) {
return EXT_ERR_MEMCPY_FAIL;
}
if (strcat_s(report_buf, reoprt_buf_len, temp_str) != EOK) {
return EXT_ERR_MEMCPY_FAIL;
}
line_len = (word_num >= 4) ? 4 : word_num; /* Length of Line Less Than 4 */
for (i = 0; i < line_len; i++) {
if (strcat_s(report_buf, reoprt_buf_len, "0x") != EOK) {
return EXT_ERR_MEMCPY_FAIL;
}
val = *(td_u32 *)(uintptr_t)address;
ret = sprintf_s(temp_str, sizeof(temp_str), "%08x ", val);
if (ret == -1) {
return EXT_ERR_MEMCPY_FAIL;
}
if (strcat_s(report_buf, reoprt_buf_len, temp_str) != EOK) {
return EXT_ERR_MEMCPY_FAIL;
}
address += 0x4;
}
word_num -= line_len;
if (strcat_s(report_buf, reoprt_buf_len, "\r\n") != EOK) {
return EXT_ERR_MEMCPY_FAIL;
}
}
return EXT_ERR_SUCCESS;
}
td_u32 mem_read(td_u16 id, EXT_IN td_pvoid cmd_param, td_u16 cmd_param_size, td_u8 option)
{
td_u32 address;
td_u32 word_num;
ext_shell_cmd_pre_do_handle *handle = TD_NULL;
td_u32 argc;
td_char **argv;
td_char *report_buf = TD_NULL;
const td_u32 reoprt_buf_len = 1024;
if ((cmd_param == NULL) || (cmd_param_size == 0)) {
return EXT_ERR_INVALID_PARAMETER;
}
handle = diag_shell_cmd_prepare(cmd_param, cmd_param_size, reoprt_buf_len);
if (handle == TD_NULL) {
uapi_diag_report_packet(id, (td_u8)option, (td_pbyte)g_str_ind_not_enough_memory,
(td_u16)strlen(g_str_ind_not_enough_memory) + 1, TD_TRUE);
return EXT_ERR_SUCCESS;
}
argc = handle->argc;
argv = handle->argv;
report_buf = handle->out_line_buf;
if (argc != 2) {
if (sprintf_s(report_buf, reoprt_buf_len, "%s", g_str_ind_param_wrong) == -1) {
goto END;
}
goto END;
}
address = strtoul(argv[0], (char **)NULL, 16);
word_num = strtoul(argv[1], (char **)NULL, 16);
if (word_num > MEM_READ_MAX_NUM || word_num == 0 || 0 != (address & 0x3)) {
errno_t ret = sprintf_s(report_buf, reoprt_buf_len,
"len can't >0x32,len can't = 0;len can't = 0;addr should 4 bytes align\n");
if (ret == -1) {
goto END;
}
goto END;
}
errno_t ret = memcpy_s(report_buf, reoprt_buf_len, "\r\n", sizeof("\r\n"));
if (ret != EOK) {
goto END;
}
mem_read_make_ind(address, word_num, report_buf, reoprt_buf_len);
END:
report_buf[reoprt_buf_len - 1] = 0;
uapi_diag_report_packet(id, (td_u8)option, (td_pbyte)report_buf, (td_u16)strlen(report_buf) + 1, TD_TRUE);
diag_shell_cmd_restore(handle);
return EXT_ERR_SUCCESS;
}
td_u32 mem_write(td_u16 id, EXT_IN td_pvoid cmd_param, td_u16 cmd_param_size, td_u8 option)
{
uintptr_t address;
td_u32 VALUE;
ext_shell_cmd_pre_do_handle *handle = TD_NULL;
td_u32 argc;
td_char **argv;
if ((cmd_param == NULL) || (cmd_param_size == 0)) {
return EXT_ERR_INVALID_PARAMETER;
}
handle = diag_shell_cmd_prepare(cmd_param, cmd_param_size, 0);
if (handle == TD_NULL) {
uapi_diag_report_packet(id, (td_u8)option, (td_pbyte)g_str_ind_not_enough_memory,
(td_u16)(strlen(g_str_ind_not_enough_memory) + 1), TD_TRUE);
return EXT_ERR_SUCCESS;
}
argc = handle->argc;
argv = handle->argv;
if (argc != 2) {
uapi_diag_report_packet(id, (td_u8)option, (td_pbyte)g_str_ind_param_wrong,
(td_u16)(strlen(g_str_ind_param_wrong) + 1), TD_TRUE);
return EXT_ERR_SUCCESS;
}
address = strtoul(argv[0], (char **)NULL, 16);
VALUE = strtoul(argv[1], (char **)NULL, 16);
if (0 != (address & 0x3)) {
uapi_diag_report_packet(id, (td_u8)option, (td_pbyte) "inval addr.\n", (td_u16)(strlen("inval addr.\n") + 1),
TD_TRUE);
diag_shell_cmd_restore(handle);
return EXT_ERR_SUCCESS;
}
*(volatile td_u32 *)(uintptr_t)(address) = (td_u32)VALUE;
uapi_diag_report_packet(id, (td_u8)option, (td_pbyte)g_str_ind_success, (td_u16)(strlen(g_str_ind_success) + 1),
TD_TRUE);
diag_shell_cmd_restore(handle);
return EXT_ERR_SUCCESS;
}
#endif