162 lines
5.2 KiB
C
162 lines
5.2 KiB
C
/*
|
|
* 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
|