179 lines
5.8 KiB
C
179 lines
5.8 KiB
C
|
/****************************************************************************
|
||
|
|
||
|
Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
|
||
|
|
||
|
This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
|
||
|
be copied by any method or incorporated into another program without
|
||
|
the express written consent of Aerospace C.Power. This Information or any portion
|
||
|
thereof remains the property of Aerospace C.Power. The Information contained herein
|
||
|
is believed to be accurate and Aerospace C.Power assumes no responsibility or
|
||
|
liability for its use in any way and conveys no license or title under
|
||
|
any patent or copyright and makes no representation or warranty that this
|
||
|
Information is free from patent or copyright infringement.
|
||
|
|
||
|
****************************************************************************/
|
||
|
#include "os_types.h"
|
||
|
#include "os_mem.h"
|
||
|
|
||
|
#include "iot_io_api.h"
|
||
|
#include "iot_cli.h"
|
||
|
#include "cli_ic_tool_def.h"
|
||
|
#include "cli_ic_tool.h"
|
||
|
#include "iot_ftm_msg.h"
|
||
|
#include "iot_ftm_internal.h"
|
||
|
#include "iot_cli_msg_id_definition.h"
|
||
|
#include "iot_config.h"
|
||
|
|
||
|
#if IOT_CLI_IC_TOOL_EN
|
||
|
|
||
|
#define CLI_DATA_OPERATION_MAX_SIZE 256
|
||
|
|
||
|
void cli_common_memory_read_data(iot_pkt_t *buffer, uint32_t length)
|
||
|
{
|
||
|
cli_cmd_read_data_t *cmd = (cli_cmd_read_data_t *)iot_pkt_data(buffer);
|
||
|
(void)length;
|
||
|
|
||
|
if (cmd->length > CLI_DATA_OPERATION_MAX_SIZE) {
|
||
|
cmd->length = CLI_DATA_OPERATION_MAX_SIZE;
|
||
|
}
|
||
|
|
||
|
if (cmd->operation_type == CLI_DATA_OPERATION_TYPE_REG) {
|
||
|
cli_reg_info reg_info;
|
||
|
reg_info.addr = cmd->addr;
|
||
|
reg_info.operation_type = cmd->operation_type;
|
||
|
|
||
|
if (cmd->addr & 0x3) {
|
||
|
return;
|
||
|
}
|
||
|
reg_info.value = *(volatile uint32_t *)cmd->addr;
|
||
|
|
||
|
cli_send_module_msg(CLI_MODULEID_MANUFACTURE_OP, CLI_MSGID_DATA_INFO,
|
||
|
(uint8_t *)®_info, sizeof(cli_reg_info));
|
||
|
} else if (cmd->operation_type == CLI_DATA_OPERATION_TYPE_RAM) {
|
||
|
cli_data_info *data_info =
|
||
|
os_mem_malloc(IOT_CLI_MID, sizeof(cli_data_info) + cmd->length);
|
||
|
|
||
|
if (data_info == NULL) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
data_info->addr = cmd->addr;
|
||
|
data_info->len = cmd->length;
|
||
|
data_info->operation_type = cmd->operation_type;
|
||
|
os_mem_cpy(&data_info->data, (void *)cmd->addr, cmd->length);
|
||
|
|
||
|
cli_send_module_msg(CLI_MODULEID_MANUFACTURE_OP, CLI_MSGID_DATA_INFO,
|
||
|
(uint8_t *)data_info, sizeof(cli_reg_info) + cmd->length);
|
||
|
os_mem_free(data_info);
|
||
|
} else if (cmd->operation_type == CLI_DATA_OPERATION_TYPE_REG_GROUP) {
|
||
|
if (cmd->length == 0 || cmd->length % 4 != 0 || cmd->addr % 4 != 0) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
cli_data_info *data_info =
|
||
|
os_mem_malloc(IOT_CLI_MID, sizeof(cli_data_info) + cmd->length);
|
||
|
|
||
|
if (data_info == NULL) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
data_info->addr = cmd->addr;
|
||
|
data_info->len = cmd->length;
|
||
|
data_info->operation_type = cmd->operation_type;
|
||
|
|
||
|
for (uint16_t i = 0; i < data_info->len; i += 4) {
|
||
|
uint32_t v = *(volatile uint32_t *)(data_info->addr + i);
|
||
|
data_info->data[i + 0] = v & 0xFF;
|
||
|
data_info->data[i + 1] = (v >> 8) & 0xFF;
|
||
|
data_info->data[i + 2] = (v >> 16) & 0xFF;
|
||
|
data_info->data[i + 3] = (v >> 24) & 0xFF;
|
||
|
}
|
||
|
|
||
|
os_mem_cpy(&data_info->data, (void *)cmd->addr, cmd->length);
|
||
|
|
||
|
cli_send_module_msg(CLI_MODULEID_MANUFACTURE_OP, CLI_MSGID_DATA_INFO,
|
||
|
(uint8_t *)data_info, sizeof(cli_reg_info) + cmd->length);
|
||
|
|
||
|
os_mem_free(data_info);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void cli_common_memory_write_data(iot_pkt_t *buffer, uint32_t bufferlen)
|
||
|
{
|
||
|
cli_data_info *data_info = NULL;
|
||
|
cli_set_data_ack ack = {0};
|
||
|
|
||
|
if ((!buffer) || (bufferlen < sizeof(cli_reg_info))) {
|
||
|
iot_printf("cli_common_memory_write_data buffer:0x%08x bufferlen:%d\n",
|
||
|
buffer,bufferlen);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
data_info = (cli_data_info *)iot_pkt_data(buffer);
|
||
|
iot_printf("cli set data 0x%08x %x\n", data_info->addr,
|
||
|
data_info->operation_type);
|
||
|
|
||
|
if (data_info->operation_type == CLI_DATA_OPERATION_TYPE_RAM) {
|
||
|
ack.addr = data_info->addr;
|
||
|
ack.len = data_info->len;
|
||
|
|
||
|
if (bufferlen < sizeof(cli_data_info)) {
|
||
|
ack.result = 0;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
os_mem_cpy((void *)data_info->addr, data_info->data, data_info->len);
|
||
|
ack.result = 0;
|
||
|
} else if (data_info->operation_type == CLI_DATA_OPERATION_TYPE_REG) {
|
||
|
cli_reg_info *reg = (cli_reg_info *)data_info;
|
||
|
ack.addr = reg->addr;
|
||
|
ack.len = 4;
|
||
|
|
||
|
if (reg->addr % 4 != 0) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
*(volatile uint32_t *)reg->addr = reg->value;
|
||
|
ack.result = 0;
|
||
|
} else if (data_info->operation_type == CLI_DATA_OPERATION_TYPE_REG_GROUP) {
|
||
|
ack.addr = data_info->addr;
|
||
|
ack.len = 4;
|
||
|
|
||
|
if (data_info->addr % 4 != 0 || data_info->len == 0
|
||
|
|| data_info->len % 4 != 0) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
for (uint16_t i = 0; i < data_info->len; i += 4) {
|
||
|
*(volatile uint32_t *)(data_info->addr + i) =
|
||
|
data_info->data[i + 3] << 24 | data_info->data[i + 2] << 16
|
||
|
| data_info->data[i + 1] << 8 | data_info->data[i];
|
||
|
}
|
||
|
|
||
|
ack.result = 0;
|
||
|
}
|
||
|
|
||
|
cli_send_module_msg(CLI_MODULEID_MANUFACTURE_OP, CLI_MSGID_DATA_ACK,
|
||
|
(uint8_t *)&ack, sizeof(ack));
|
||
|
|
||
|
}
|
||
|
|
||
|
void iot_ic_tool_op(int msgid, iot_pkt_t* buffer, uint32_t len)
|
||
|
{
|
||
|
iot_printf("common msgid:%d len:%d\n", msgid, len);
|
||
|
|
||
|
switch (msgid)
|
||
|
{
|
||
|
case CLI_MSGID_READ_DATA:
|
||
|
cli_common_memory_read_data(buffer, len);
|
||
|
break;
|
||
|
case CLI_MSGID_SET_DATA:
|
||
|
cli_common_memory_write_data(buffer, len);
|
||
|
break;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#endif /* IOT_CLI_IC_TOOL_EN */
|