|
|
|
@ -19,7 +19,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
/* Extern Functions ---------------------------------------------*/
|
|
|
|
/* Extern Functions ---------------------------------------------*/
|
|
|
|
#ifdef F_STORAGE
|
|
|
|
#ifdef F_STORAGE
|
|
|
|
extern void save_data(uint8_t *data, uint32_t data_len, uint16_t block_number);
|
|
|
|
extern uint8_t save_data(uint8_t *data, uint32_t data_len, uint16_t block_number);
|
|
|
|
|
|
|
|
|
|
|
|
static uint32_t g_tftp_save_data = 0;
|
|
|
|
static uint32_t g_tftp_save_data = 0;
|
|
|
|
|
|
|
|
|
|
|
|
@ -32,17 +32,53 @@ void clear_tftp_received_size(void)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
g_tftp_save_data = 0;
|
|
|
|
g_tftp_save_data = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
void save_data(uint8_t *data, uint32_t data_len, uint16_t block_number)
|
|
|
|
|
|
|
|
|
|
|
|
void close_tftp_file(void)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if(tftp_fr == FR_OK)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
tftp_fr = f_close(&tftp_fil);
|
|
|
|
|
|
|
|
if(tftp_fr != FR_OK){
|
|
|
|
|
|
|
|
PRINTF("--f_close failed\r\n");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
uint8_t save_data(uint8_t *data, uint32_t data_len, uint16_t block_number)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
uint8_t save_data_result = 0;
|
|
|
|
|
|
|
|
#ifdef TFTP_RCV_DBG
|
|
|
|
//Nothing to do with received data yet..
|
|
|
|
//Nothing to do with received data yet..
|
|
|
|
//TODO: Add your own handler here
|
|
|
|
//TODO: Add your own handler here
|
|
|
|
//Print out data as string
|
|
|
|
//Print out received data as string
|
|
|
|
uint8_t * str;
|
|
|
|
uint8_t * str;
|
|
|
|
str = data;
|
|
|
|
str = data;
|
|
|
|
str += data_len;
|
|
|
|
str += data_len;
|
|
|
|
*str = 0x0;
|
|
|
|
*str = 0x0;
|
|
|
|
g_tftp_save_data += data_len; //Store received data size
|
|
|
|
|
|
|
|
PRINTF("\r\n++Data #%d-%lu:\r\n%s\r\n", block_number, data_len, data);
|
|
|
|
PRINTF("\r\n++Data #%d-%lu:\r\n%s\r\n", block_number, data_len, data);
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
//Calculate received data size
|
|
|
|
|
|
|
|
g_tftp_save_data += data_len;
|
|
|
|
|
|
|
|
//Save TFTP block to file
|
|
|
|
|
|
|
|
if(tftp_fr == FR_OK)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
uint16_t _blocklen;
|
|
|
|
|
|
|
|
tftp_fr = f_write(&tftp_fil, data, (UINT)data_len, &_blocklen);
|
|
|
|
|
|
|
|
if(tftp_fr != FR_OK){
|
|
|
|
|
|
|
|
PRINTF("--f_write failed #2\r\n");
|
|
|
|
|
|
|
|
save_data_result = 2;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
f_sync(&tftp_fil); //Flush data to SDCARD from cache
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
PRINTF("--f_write failed #1\r\n");
|
|
|
|
|
|
|
|
save_data_result = 1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return save_data_result;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
@ -80,6 +116,13 @@ int dbg_level = (INFO_DBG | ERROR_DBG | IPC_DBG | DEBUG_DBG);
|
|
|
|
static void set_filename(uint8_t *file, uint32_t file_size)
|
|
|
|
static void set_filename(uint8_t *file, uint32_t file_size)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
memcpy(g_filename, file, file_size);
|
|
|
|
memcpy(g_filename, file, file_size);
|
|
|
|
|
|
|
|
#if defined(F_STORAGE)
|
|
|
|
|
|
|
|
//Rewrite file onto SD-card
|
|
|
|
|
|
|
|
tftp_fr = f_open(&tftp_fil, (const char *)g_filename, FA_CREATE_ALWAYS | FA_WRITE);
|
|
|
|
|
|
|
|
if(tftp_fr != FR_OK){
|
|
|
|
|
|
|
|
PRINTF("--f_open failed\r\n");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static inline void set_server_ip(uint32_t ipaddr)
|
|
|
|
static inline void set_server_ip(uint32_t ipaddr)
|
|
|
|
@ -444,7 +487,10 @@ static void recv_tftp_data(uint8_t *msg, uint32_t msg_len)
|
|
|
|
set_tftp_state(STATE_DATA);
|
|
|
|
set_tftp_state(STATE_DATA);
|
|
|
|
set_block_number(data->block_num);
|
|
|
|
set_block_number(data->block_num);
|
|
|
|
#ifdef F_STORAGE
|
|
|
|
#ifdef F_STORAGE
|
|
|
|
save_data(data->data, msg_len - 4, data->block_num);
|
|
|
|
if (save_data(data->data, msg_len - 4, data->block_num))
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
g_progress_state = TFTP_FAIL;
|
|
|
|
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
tftp_cancel_timeout();
|
|
|
|
tftp_cancel_timeout();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -461,7 +507,11 @@ static void recv_tftp_data(uint8_t *msg, uint32_t msg_len)
|
|
|
|
if(data->block_num == (get_block_number() + 1)) {
|
|
|
|
if(data->block_num == (get_block_number() + 1)) {
|
|
|
|
set_block_number(data->block_num);
|
|
|
|
set_block_number(data->block_num);
|
|
|
|
#ifdef F_STORAGE
|
|
|
|
#ifdef F_STORAGE
|
|
|
|
save_data(data->data, msg_len - 4, data->block_num);
|
|
|
|
if(save_data(data->data, msg_len - 4, data->block_num))
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
g_progress_state = TFTP_FAIL;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
tftp_cancel_timeout();
|
|
|
|
tftp_cancel_timeout();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -671,11 +721,26 @@ int TFTP_run(void)
|
|
|
|
#ifdef __TFTP_DEBUG__
|
|
|
|
#ifdef __TFTP_DEBUG__
|
|
|
|
DBG_PRINT(ERROR_DBG, "[%s] recv_udp_packet error\r\n", __func__);
|
|
|
|
DBG_PRINT(ERROR_DBG, "[%s] recv_udp_packet error\r\n", __func__);
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef F_STORAGE
|
|
|
|
|
|
|
|
if(g_progress_state != TFTP_PROGRESS)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
//Close TFTP file if transfer complete
|
|
|
|
|
|
|
|
close_tftp_file();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
return g_progress_state;
|
|
|
|
return g_progress_state;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
recv_tftp_packet(g_tftp_rcv_buf, len, from_ip, from_port);
|
|
|
|
recv_tftp_packet(g_tftp_rcv_buf, len, from_ip, from_port);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef F_STORAGE
|
|
|
|
|
|
|
|
if(g_progress_state != TFTP_PROGRESS)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
//Close TFTP file if transfer complete
|
|
|
|
|
|
|
|
close_tftp_file();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
return g_progress_state;
|
|
|
|
return g_progress_state;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|