435 lines
11 KiB
C
Executable File
435 lines
11 KiB
C
Executable File
/****************************************************************************
|
|
|
|
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 "dbg_io.h"
|
|
#include "iot_diag.h"
|
|
#include "iot_io.h"
|
|
|
|
#include "ahb.h"
|
|
#include "pmu_hw.h"
|
|
#include "ana.h"
|
|
#include "clk.h"
|
|
#include "ddrc.h"
|
|
#include "ff.h"
|
|
#include "integer.h"
|
|
|
|
int uart_e_try_putc(int port, char c);
|
|
int uart_e_getc(int port);
|
|
|
|
#define COMMAND_MAX_SZ (4096)
|
|
#define RECV_MAX_SZ (8 * 1024 * 1024)
|
|
#define RECV_START_ADDR (0x10000000)
|
|
|
|
typedef enum _command {
|
|
ECDH = 1,
|
|
ECDSA = 2,
|
|
AES = 3,
|
|
FLASH = 4,
|
|
} command_t;
|
|
|
|
typedef enum _field_type {
|
|
FIELD_FATFS = 1,
|
|
} field_type_t;
|
|
|
|
typedef enum _flash_fmt_type {
|
|
FMT_DIRECTORY = 0,
|
|
FMT_FILENAME = 1,
|
|
FMT_FILEDATA = 2,
|
|
} flash_fmt_type_t;
|
|
|
|
typedef enum _field_val_def {
|
|
FIELD_FLASH_BURN = 1,
|
|
} field_val_def_t;
|
|
|
|
#pragma pack(push) /* save the pack status */
|
|
#pragma pack(1) /* 1 byte align */
|
|
|
|
typedef struct _field_header {
|
|
uint8_t field_type;
|
|
uint16_t field_len;
|
|
uint8_t field_value;
|
|
} field_header_t;
|
|
|
|
typedef struct {
|
|
uint32_t packet_sz;
|
|
uint8_t command;
|
|
uint8_t result;
|
|
field_header_t header;
|
|
uint8_t data[];
|
|
} test_packet_t;
|
|
|
|
typedef struct _flash_fmt {
|
|
uint8_t type;
|
|
uint32_t len;
|
|
uint8_t *data;
|
|
} flash_fmt_t;
|
|
|
|
typedef struct _flash_burn_info {
|
|
flash_fmt_t dir;
|
|
flash_fmt_t name;
|
|
flash_fmt_t bin;
|
|
} flash_burn_into_t;
|
|
|
|
#pragma pack(pop)
|
|
|
|
|
|
//static uint8_t command_buf[COMMAND_MAX_SZ];
|
|
uint8_t *command_buf = (uint8_t *) RECV_START_ADDR;
|
|
uint8_t *check_buf = (uint8_t *) (RECV_START_ADDR + RECV_MAX_SZ);
|
|
static size_t pos = 0;
|
|
flash_burn_into_t flash_burn = {0};
|
|
uint8_t response_buf[512];
|
|
|
|
static FILINFO fno;
|
|
static FATFS fs;
|
|
static FIL fp;
|
|
static uint8_t work[FF_MAX_SS];
|
|
|
|
TCHAR file_name[128] = {0};
|
|
|
|
void _process_test_file()
|
|
{
|
|
FRESULT res;
|
|
uint32_t i = 0;
|
|
// get file name
|
|
flash_fmt_t *name = &flash_burn.name;
|
|
uint8_t *tmp = (uint8_t *) file_name;
|
|
|
|
for(i = 0; i < name->len; i++) {
|
|
*(tmp+i) = *(name->data + i);
|
|
}
|
|
*(tmp + i) = '\0';
|
|
iot_printf("[_process_test_file]: %s\n", file_name);
|
|
|
|
// open file
|
|
res = f_open(&fp, file_name, FA_OPEN_EXISTING | FA_READ);
|
|
if (res) {
|
|
iot_printf("[error] f_open failed, res: %d\n", res);
|
|
} else {
|
|
iot_printf("f_open result: %d\n", res);
|
|
}
|
|
|
|
UINT br;
|
|
FSIZE_t size;
|
|
flash_fmt_t *bin = &flash_burn.bin;
|
|
// get file size
|
|
size = f_size(&fp);
|
|
iot_printf("size: %d\n", size);
|
|
res = f_read(&fp, check_buf, size, &br);
|
|
if (res) {
|
|
iot_printf("[error] f_read failed, res: %d\n", res);
|
|
} else {
|
|
iot_printf("f_read result: %d\n", res);
|
|
iot_printf("f_read len: %d\n", br);
|
|
// compare size
|
|
if (size != bin->len) {
|
|
iot_printf("[error] size not match[%d - %d].\n", bin->len, size);
|
|
} else {
|
|
iot_printf("file %s size match\n", file_name);
|
|
// compare data
|
|
for(i = 0; i < size; i++) {
|
|
if (*(check_buf+i) != *(bin->data + i)) {
|
|
iot_printf("[error] data not macth: %d[%02x - %02x]\n",
|
|
i, *(check_buf+i), *(bin->data + i));
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
f_close(&fp);
|
|
}
|
|
|
|
int _process_write_file()
|
|
{
|
|
int ret = 0;
|
|
FRESULT res;
|
|
uint32_t i = 0;
|
|
// get file name
|
|
flash_fmt_t *name = &flash_burn.name;
|
|
uint8_t *tmp = (uint8_t *) file_name;
|
|
|
|
for(i = 0; i < name->len; i++) {
|
|
*(tmp+i) = *(name->data + i);
|
|
}
|
|
*(tmp + i) = '\0';
|
|
iot_printf("[_process_write_file]: %s\n", file_name);
|
|
|
|
// open file
|
|
res = f_open(&fp, file_name, FA_OPEN_ALWAYS | FA_WRITE);
|
|
if (res) {
|
|
iot_printf("[error] f_open failed, res: %d\n", res);
|
|
return -1;
|
|
} else {
|
|
iot_printf("f_open result: %d\n", res);
|
|
}
|
|
|
|
// write file
|
|
UINT bw;
|
|
flash_fmt_t *bin = &flash_burn.bin;
|
|
res = f_write(&fp, bin->data, bin->len, &bw);
|
|
if (res) {
|
|
iot_printf("[error] f_write failed, res: %d, %d\n", res, bw);
|
|
return -1;
|
|
} else {
|
|
iot_printf("f_write result: %d, %d\n", res, bw);
|
|
if (bin->len != bw) {
|
|
iot_printf("f_write size not match....\n");
|
|
ret = 0;
|
|
}
|
|
}
|
|
|
|
// close file
|
|
f_close(&fp);
|
|
|
|
_process_test_file();
|
|
|
|
return ret;
|
|
}
|
|
|
|
int _process_flash_burn
|
|
(test_packet_t *packet, test_packet_t *response, size_t buf_sz)
|
|
{
|
|
uint8_t *buffer = NULL;
|
|
flash_fmt_t *fmt = NULL;
|
|
|
|
if (packet->header.field_len != 1) {
|
|
// unknown format
|
|
return -1;
|
|
}
|
|
|
|
if (FIELD_FATFS == packet->header.field_type) {
|
|
// check FATFS field
|
|
if (FIELD_FLASH_BURN == packet->header.field_value) {
|
|
// handle FIELD_FLASH_BURN fied value
|
|
|
|
// get directory info
|
|
buffer = (uint8_t *) (packet->data);
|
|
fmt = (flash_fmt_t *) buffer;
|
|
if (FMT_DIRECTORY == fmt->type) {
|
|
// directory
|
|
flash_burn.dir.type = fmt->type;
|
|
flash_burn.dir.len = fmt->len;
|
|
flash_burn.dir.data = (uint8_t *)(&fmt->data);
|
|
} else {
|
|
// unknown format
|
|
return -1;
|
|
}
|
|
|
|
// get file name info
|
|
buffer = buffer + flash_burn.dir.len + \
|
|
sizeof(flash_burn.dir.type) + sizeof(flash_burn.dir.len);
|
|
fmt = (flash_fmt_t *) buffer;
|
|
if (FMT_FILENAME == fmt->type) {
|
|
// file name
|
|
flash_burn.name.type = fmt->type;
|
|
flash_burn.name.len = fmt->len;
|
|
flash_burn.name.data = (uint8_t *)(&fmt->data);
|
|
} else {
|
|
// unknown format
|
|
return -1;
|
|
}
|
|
|
|
// get file bin info
|
|
buffer = buffer + flash_burn.name.len + \
|
|
sizeof(flash_burn.name.type) + sizeof(flash_burn.name.len);
|
|
fmt = (flash_fmt_t *) buffer;
|
|
if (FMT_FILEDATA == fmt->type) {
|
|
// file bin
|
|
flash_burn.bin.type = fmt->type;
|
|
flash_burn.bin.len = fmt->len;
|
|
flash_burn.bin.data = (uint8_t *)(&fmt->data);
|
|
return _process_write_file();
|
|
} else {
|
|
// unknown format
|
|
return -1;
|
|
}
|
|
} else {
|
|
// unsupport filed value
|
|
}
|
|
|
|
|
|
} else {
|
|
// unsupport field
|
|
return -2;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
_process_packet(test_packet_t *packet, test_packet_t *response, size_t buf_sz)
|
|
{
|
|
int ret = -1;
|
|
|
|
if (ECDH == packet->command) {
|
|
ret = -1;
|
|
} else if (ECDSA == packet->command) {
|
|
ret = -1;
|
|
} else if (AES == packet->command) {
|
|
ret = -1;
|
|
} else if (FLASH == packet->command) {
|
|
ret = _process_flash_burn(packet, response, buf_sz);
|
|
} else {
|
|
ret = -1;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
int
|
|
process_test_data(uint8_t byte, uint8_t *buf, size_t buf_sz, size_t * data_sz)
|
|
{
|
|
int ret = -1;
|
|
command_buf[pos] = byte;
|
|
++pos;
|
|
|
|
if (pos >= RECV_MAX_SZ) {
|
|
pos = 0;
|
|
return -1;
|
|
}
|
|
|
|
if (pos > sizeof(uint32_t)) {
|
|
test_packet_t *response = (test_packet_t *)buf;
|
|
test_packet_t *packet;
|
|
packet = (test_packet_t*)command_buf;
|
|
|
|
if ((pos % (10*1024)) == 0) {
|
|
iot_printf("recv pos: %d\n", pos);
|
|
}
|
|
|
|
if (pos >= packet->packet_sz) {
|
|
iot_printf("recving size: %d\n", pos);
|
|
ret = _process_packet(packet, response, buf_sz);
|
|
*data_sz = response->packet_sz;
|
|
pos = 0;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
uint8_t
|
|
uart_send_data(const unsigned char *seq, unsigned int len)
|
|
{
|
|
char c;
|
|
int i = 0;
|
|
while(i < len) {
|
|
c = *(seq+i);
|
|
uart_e_try_putc(0, c);
|
|
i++;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void init_fatfs()
|
|
{
|
|
FRESULT res;
|
|
res = f_mount(&fs, "0:", 1);
|
|
if (res) {
|
|
iot_printf("[error] f_mount failed, res: %d\n", res);
|
|
|
|
// create fat volume, and format partitions
|
|
iot_printf("{fatfs create fat volume}\n");
|
|
#if 1
|
|
iot_printf("\n-- test make fs --\n");
|
|
res = f_mkfs("0:", FM_ANY, 0, work, sizeof(work));
|
|
if (res) {
|
|
iot_printf("[error] f_mkfs failed, res: %d\n", res);
|
|
} else {
|
|
iot_printf("f_mkfs result: %d\n", res);
|
|
}
|
|
#endif
|
|
} else {
|
|
iot_printf("f_mount result: %d\n", res);
|
|
}
|
|
|
|
}
|
|
|
|
void download_hw_init()
|
|
{
|
|
//change CPU core to 150M.
|
|
clk_core_freq_set(CPU_FREQ_150M);
|
|
|
|
/* init uart */
|
|
dbg_uart_init();
|
|
|
|
ahb_cache_disable();
|
|
/* init cache */
|
|
ddr_cache_init();
|
|
// enable ahb cache
|
|
ahb_cache_enable();
|
|
//enable dmc cache;
|
|
ahb_dmc_cache_enable();
|
|
//cache space init;
|
|
ahb_cache_fill_valid_space();
|
|
|
|
// init fatfs
|
|
init_fatfs();
|
|
}
|
|
|
|
void fatfs_dir_access()
|
|
{
|
|
FRESULT res;
|
|
DIR dp;
|
|
|
|
// test directory function
|
|
iot_printf("\n{fatfs directory access test}\n");
|
|
iot_printf("-- test get filename by directory --\n");
|
|
res = f_opendir(&dp, "0:/");
|
|
if (res) {
|
|
iot_printf("[error] f_opendir failed, res: %d\n", res);
|
|
} else {
|
|
iot_printf("f_opendir result: %d\n", res);
|
|
}
|
|
|
|
while(1) {
|
|
res = f_readdir(&dp, &fno);
|
|
|
|
if (res != FR_OK || fno.fname[0] == 0) {
|
|
break;
|
|
} else {
|
|
iot_printf("get file name: %s\n", fno.fname);
|
|
}
|
|
}
|
|
f_closedir(&dp);
|
|
iot_printf("= fatfs directory access test =\n");
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
|
|
download_hw_init();
|
|
|
|
fatfs_dir_access();
|
|
|
|
size_t data_sz = 0;
|
|
|
|
int c;
|
|
while(true) {
|
|
c = uart_e_getc(0);
|
|
if (c >= 0) {
|
|
if (0 == process_test_data
|
|
(c & 0xFF, response_buf,sizeof(response_buf), &data_sz)) {
|
|
iot_printf("Transform successfully...\n");
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
}
|