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 */
							 |