diff --git a/21_m1284p_WIZNET_TFTP_client_FATFS/.cproject b/21_m1284p_WIZNET_TFTP_client_FATFS/.cproject
index fac9f0c..fd362d2 100644
--- a/21_m1284p_WIZNET_TFTP_client_FATFS/.cproject
+++ b/21_m1284p_WIZNET_TFTP_client_FATFS/.cproject
@@ -35,6 +35,7 @@
+
@@ -76,5 +77,9 @@
-
+
+
+
+
+
diff --git a/21_m1284p_WIZNET_TFTP_client_FATFS/Internet/TFTP/tftp.c b/21_m1284p_WIZNET_TFTP_client_FATFS/Internet/TFTP/tftp.c
index 34c0937..dd03e1b 100644
--- a/21_m1284p_WIZNET_TFTP_client_FATFS/Internet/TFTP/tftp.c
+++ b/21_m1284p_WIZNET_TFTP_client_FATFS/Internet/TFTP/tftp.c
@@ -19,7 +19,7 @@
/* Extern Functions ---------------------------------------------*/
#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;
@@ -32,17 +32,53 @@ void clear_tftp_received_size(void)
{
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..
//TODO: Add your own handler here
- //Print out data as string
+ //Print out received data as string
uint8_t * str;
str = data;
str += data_len;
*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);
+#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
@@ -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)
{
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)
@@ -444,7 +487,10 @@ static void recv_tftp_data(uint8_t *msg, uint32_t msg_len)
set_tftp_state(STATE_DATA);
set_block_number(data->block_num);
#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
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)) {
set_block_number(data->block_num);
#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
tftp_cancel_timeout();
}
@@ -671,11 +721,26 @@ int TFTP_run(void)
#ifdef __TFTP_DEBUG__
DBG_PRINT(ERROR_DBG, "[%s] recv_udp_packet error\r\n", __func__);
#endif
+#ifdef F_STORAGE
+ if(g_progress_state != TFTP_PROGRESS)
+ {
+ //Close TFTP file if transfer complete
+ close_tftp_file();
+ }
+#endif
return g_progress_state;
}
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;
}
diff --git a/21_m1284p_WIZNET_TFTP_client_FATFS/Internet/TFTP/tftp.h b/21_m1284p_WIZNET_TFTP_client_FATFS/Internet/TFTP/tftp.h
index 1d4fc6e..51b6ca8 100644
--- a/21_m1284p_WIZNET_TFTP_client_FATFS/Internet/TFTP/tftp.h
+++ b/21_m1284p_WIZNET_TFTP_client_FATFS/Internet/TFTP/tftp.h
@@ -17,13 +17,14 @@ extern "C" {
#define F_APP_TFTP
#define __TFTP_DEBUG__
+//define TFTP_RCV_DBG /* To print-out received TFTP packet as string data */
#define F_STORAGE // If your target support a storage, you have to activate this feature and implement.
#if defined(F_STORAGE)
-#include "ff.h"
-FIL fil; // FatFs File objects
-FRESULT fr; // FatFs function common result code
+#include "../../ff/ff.h"
+static FIL tftp_fil; // FatFs File objects
+static FRESULT tftp_fr; // FatFs function common result code
#endif
diff --git a/21_m1284p_WIZNET_TFTP_client_FATFS/ff/ffconf.h b/21_m1284p_WIZNET_TFTP_client_FATFS/ff/ffconf.h
index bcaba72..e9f71d2 100644
--- a/21_m1284p_WIZNET_TFTP_client_FATFS/ff/ffconf.h
+++ b/21_m1284p_WIZNET_TFTP_client_FATFS/ff/ffconf.h
@@ -16,7 +16,7 @@
/ data transfer. */
-#define _FS_READONLY 1
+#define _FS_READONLY 0
/* This option switches read-only configuration. (0:Read/Write or 1:Read-only)
/ Read-only configuration removes writing API functions, f_write(), f_sync(),
/ f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), f_getfree()
diff --git a/21_m1284p_WIZNET_TFTP_client_FATFS/main.c b/21_m1284p_WIZNET_TFTP_client_FATFS/main.c
index c0a84cf..d6343c4 100644
--- a/21_m1284p_WIZNET_TFTP_client_FATFS/main.c
+++ b/21_m1284p_WIZNET_TFTP_client_FATFS/main.c
@@ -11,8 +11,10 @@
* TODO:
* OK(v1.1) 1. Print-out received file from TFTP to serial console (small file < 512 bytes OK).
* OK(v1.2) 2. Print-out received file from TFTP to serial console (multi-packet files > 512 bytes).
- * 3. Write-in data to SD-card file "readme_txt".
- * 4. Add handlers for CHK_RAM_LEAKAGE && CHK_UPTIME.
+ * OK(v1.3) 3. Write-in data to SD-card file "readme_txt" and another patterns.
+ * 4. Print out "readme.txt" contents head (from SD-Card ) in a serial terminal.
+ * 5. Add handlers for CHK_RAM_LEAKAGE && CHK_UPTIME.
+ * 6. Clear the code from the loopback sockets
*
* Remark:
* Checked with PC tftp-server (WIN7) - tftpd64.exe
@@ -61,7 +63,7 @@ volatile unsigned long _millis; // for millis tick !! Overflow every ~49.7 days
//*********Program metrics
const char compile_date[] PROGMEM = __DATE__; // Mmm dd yyyy - Дата компиляции
const char compile_time[] PROGMEM = __TIME__; // hh:mm:ss - Время компиляции
-const char str_prog_name[] PROGMEM = "\r\nAtMega1284p v1.2 Static IP TFTP Client && FATFS SDCARD WIZNET_5500 ETHERNET 27/03/2019\r\n"; // Program name
+const char str_prog_name[] PROGMEM = "\r\nAtMega1284p v1.3 Static IP TFTP Client && FATFS SDCARD WIZNET_5500 ETHERNET 27/03/2019\r\n"; // Program name
#if defined(__AVR_ATmega128__)
const char PROGMEM str_mcu[] = "ATmega128"; //CPU is m128
@@ -536,18 +538,6 @@ int main()
//Here at least every 1sec
wdt_reset(); // WDT reset at least every sec
- //Use Hercules Terminal to check loopback tcp:5000 and udp:3000
- /*
- * https://www.hw-group.com/software/hercules-setup-utility
- * */
- /*
- loopback_tcps(SOCK_TCPS,ethBuf0,PORT_TCPS);
- loopback_udps(SOCK_UDPS,ethBuf0,PORT_UDPS);
- */
-
- //loopback_ret = loopback_tcpc(SOCK_TCPS, gDATABUF, destip, destport);
- //if(loopback_ret < 0) printf("loopback ret: %ld\r\n", loopback_ret); // TCP Socket Error code
-
if((millis()-timer_link_1sec)> 1000)
{
//here every 1 sec
@@ -565,11 +555,12 @@ int main()
printf("\r\n########## SW1 was pressed.\r\n");
- memset(tftp_filename, 0x0, 20);
- strncpy(tftp_filename, "test.txt", TFTP_FILE_NAME_SIZE);
- //strncpy(tftp_filename, "README.md", TFTP_FILE_NAME_SIZE);
+ memset(tftp_filename, 0x0, TFTP_FILE_NAME_SIZE);
+ //!!Don't forget about 8.3 file name rule!!
+ //strncpy(tftp_filename, "test.txt", TFTP_FILE_NAME_SIZE);
+ strncpy(tftp_filename, "README.md", TFTP_FILE_NAME_SIZE);
//strncpy(tftp_filename, "tftpd32.ini", TFTP_FILE_NAME_SIZE);
- //strncpy(tftp_filename, "ff_lfn_required.c", TFTP_FILE_NAME_SIZE);
+ //strncpy(tftp_filename, "ff_lfn.c", TFTP_FILE_NAME_SIZE);
tftp_server = ((uint32_t)tftp_destip[0] << 24) | ((uint32_t)tftp_destip[1] << 16) | ((uint32_t)tftp_destip[2] << 8) | ((uint32_t)tftp_destip[3]);