10 Commits

Author SHA1 Message Date
8508482bc4 Merge branch 'hotfix/opimization_FTP_client' 2015-04-15 17:29:54 +09:00
c2b6716e43 optimization FTP client 2015-04-15 17:29:42 +09:00
580241080d Merge branch 'hotfix/fix_compile_error' 2015-04-15 16:40:19 +09:00
c29dc21040 fix compile error 2015-04-15 16:39:46 +09:00
b840aa13a2 Merge pull request #6 from Wiznet/feature/FTP_Client_optimization
FTP Client optimization
2015-04-14 16:55:41 +09:00
b6b808b306 FTP Client optimization 2015-04-14 15:26:20 +09:00
924ceea741 Merge pull request #5 from Wiznet/develop
FTP Client optimization
2015-04-14 11:21:19 +09:00
86726229f0 FTP Client optimization 2015-04-14 11:05:02 +09:00
2857b805d9 Sync the code & doxygen document! 2015-04-13 09:42:44 +09:00
065b096c92 Modify setIMR() & getIMR() and setSIMR() & getSIMR()
In order to integrate W5200 with ioLibrary
setIMR() & getIMR(): Set/Get a value to IMR2 intead of _IMR_.
setIMR2() & getIMR2() (setSIMR() & getSIMR()) : Set/Get a value to _IMR_
instead of IMR2
2015-04-13 09:28:29 +09:00
5 changed files with 239 additions and 221 deletions

Binary file not shown.

View File

@ -252,7 +252,9 @@
* @brief Socket Interrupt Mask Register(R/W) * @brief Socket Interrupt Mask Register(R/W)
* @details Each bit of \ref _IMR_ corresponds to each bit of \ref IR2. * @details Each bit of \ref _IMR_ corresponds to each bit of \ref IR2.
* When a bit of \ref _IMR_ is and the corresponding bit of \ref IR2 is Interrupt will be issued. * When a bit of \ref _IMR_ is and the corresponding bit of \ref IR2 is Interrupt will be issued.
* In other words, if a bit of \ref SIMR is an interrupt will be not issued even if the corresponding bit of \ref IR is * In other words, if a bit of \ref _IMR_, an interrupt will be not issued even if the corresponding bit of \ref IR2 is set
* @note This Register is same operated as <b>SMIR<b> of W5100, W5300 and W5550.\n
* So, \ref setSIMR() set a value to _IMR_ for integrating with ioLibrary
*/ */
#define _IMR_ (_W5200_IO_BASE_ + (0x0016)) // Socket Interrupt Mask #define _IMR_ (_W5200_IO_BASE_ + (0x0016)) // Socket Interrupt Mask
@ -375,6 +377,8 @@
* </table> * </table>
* - \ref IM_IR7 : IP Conflict Interrupt Mask * - \ref IM_IR7 : IP Conflict Interrupt Mask
* - \ref IM_IR5 : PPPoE Close Interrupt Mask * - \ref IM_IR5 : PPPoE Close Interrupt Mask
* @note This Register is same operated as <b>_IMR_<b> of W5100, W5300 and W5550.\n
* So, \ref setIMR() set a value to IMR2 for integrating with ioLibrary
*/ */
#define IMR2 (_W5200_IO_BASE_ + (0x0036)) // Interrupt Mask #define IMR2 (_W5200_IO_BASE_ + (0x0036)) // Interrupt Mask
@ -1328,21 +1332,31 @@ void WIZCHIP_WRITE_BUF(uint32_t AddrSel, uint8_t* pBuf, uint16_t len);
/** /**
* @ingroup Common_register_access_function_W5200 * @ingroup Common_register_access_function_W5200
* @brief Set \ref _IMR_ register * @brief Set \ref IMR2 register
* @param (uint8_t)imr Value to set @ref _IMR_ register. * @param (uint8_t)imr Value to set @ref IMR2 register.
* @sa getIMR() * @sa getIMR()
*/ */
//M20150410 : Replace _IMR_ with IMR2 for integrating with ioLibrary
/*
#define setIMR(imr) \ #define setIMR(imr) \
WIZCHIP_WRITE(_IMR_, imr) WIZCHIP_WRITE(_IMR_, imr)
*/
#define setIMR(imr) \
WIZCHIP_WRITE(IMR2, imr)
/** /**
* @ingroup Common_register_access_function_W5200 * @ingroup Common_register_access_function_W5200
* @brief Get \ref _IMR_ register * @brief Get \ref IMR2 register
* @return uint8_t. Value of @ref _IMR_ register. * @return uint8_t. Value of @ref IMR2 register.
* @sa setIMR() * @sa setIMR()
*/ */
//M20150410 : Replace _IMR_ with IMR2 for integrating with ioLibrary
/*
#define getIMR() \ #define getIMR() \
WIZCHIP_READ(_IMR_) WIZCHIP_READ(_IMR_)
*/
#define getIMR() \
WIZCHIP_READ(IMR2)
/** /**
* @ingroup Common_register_access_function_W5200 * @ingroup Common_register_access_function_W5200
@ -1492,23 +1506,34 @@ void WIZCHIP_WRITE_BUF(uint32_t AddrSel, uint8_t* pBuf, uint16_t len);
/** /**
* @ingroup Common_register_access_function_W5200 * @ingroup Common_register_access_function_W5200
* @brief Set \ref IMR2 register * @brief Set \ref _IMR_ register
* @param (uint8_t)imr2 Value to set \ref IMR2 register. * @param (uint8_t)imr2 Value to set \ref IMR2 register.
* @sa getIMR2() * @sa getIMR2()
* @note If possible, Don't use this function. Instead, Use setSIMR() for compatible with ioLibrary.
*/ */
//M20150410 : Replace IMR2 with _IMR_ for integrating with ioLibrary
/*
#define setIMR2(imr2) \ #define setIMR2(imr2) \
WIZCHIP_WRITE(IMR2, (imr2 & 0xA0)) WIZCHIP_WRITE(IMR2, (imr2 & 0xA0))
*/
#define setIMR2(imr2) \
WIZCHIP_WRITE(_IMR_, (imr2 & 0xA0))
#define setSIMR(imr2) setIMR2(imr2) #define setSIMR(imr2) setIMR2(imr2)
/** /**
* @ingroup Common_register_access_function_W5200 * @ingroup Common_register_access_function_W5200
* @brief Get \ref IMR2 register * @brief Get \ref _IMR_ register
* @return uint8_t. Value of \ref IMR2 register. * @return uint8_t. Value of \ref IMR2 register.
* @sa setIMR2() * @sa setIMR2()
*/ */
//M20150410 : Replace IMR2 with _IMR_ for integrating with ioLibrary
/*
#define getIMR2() \ #define getIMR2() \
(WIZCHIP_READ(IMR2) & 0xA0) (WIZCHIP_READ(IMR2) & 0xA0)
#define getSIMR() getIMR2() */
#define getIMR2() \
(WIZCHIP_READ(_IMR_) & 0xA0)
#define getSIMR() getIMR2()
/////////////////////////////////// ///////////////////////////////////
// Socket N register I/O function // // Socket N register I/O function //
/////////////////////////////////// ///////////////////////////////////

View File

@ -341,7 +341,9 @@ typedef enum
SIK_RECEIVED = (1 << 2), ///< data received SIK_RECEIVED = (1 << 2), ///< data received
SIK_TIMEOUT = (1 << 3), ///< timeout occurred SIK_TIMEOUT = (1 << 3), ///< timeout occurred
SIK_SENT = (1 << 4), ///< send ok SIK_SENT = (1 << 4), ///< send ok
SIK_ALL = 0x1F, ///< all interrupt //M20150410 : Remove the comma of last member
//SIK_ALL = 0x1F, ///< all interrupt
SIK_ALL = 0x1F ///< all interrupt
}sockint_kind; }sockint_kind;
/** /**

View File

@ -1,103 +1,37 @@
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <limits.h>
#include <stdarg.h>
#include "stdio_private.h"
#include "socket.h"
#include "ftpc.h" #include "ftpc.h"
#include "mmcHandler.h"
/* FTP Responses */
#define R_150 150 /* File status ok; opening data conn */
#define R_200 200 /* 'Generic' command ok */
#define R_220 220 /* Service ready for new user. */
#define R_226 226 /* Closing data connection. File transfer/abort successful */
#define R_227 227 /* Entering passive mode (h1,h2,h3,h4,p1,p2) */
#define R_230 230 /* User logged in, proceed */
#define R_331 331 /* User name okay, need password. */
#define TransferAscii 0x41
#define TransferBinary 0x49
#define ConnectActive 1
#define ConnectPassive 0
un_l2cval remote_ip; un_l2cval remote_ip;
uint16_t remote_port; uint16_t remote_port;
un_l2cval local_ip; un_l2cval local_ip;
uint16_t local_port; uint16_t local_port;
uint8_t connect_state_controlc = 0; uint8_t connect_state_control_ftpc = 0;
uint8_t connect_state_datac = 0; uint8_t connect_state_data_ftpc = 0;
uint8_t gModeActivePassiveflag = 0; uint8_t gModeActivePassiveflag = 0;
struct ftpd ftp; uint8_t FTP_destip[4] = {192, 168, 10, 230}; // For FTP client examples; destination network info
uint16_t FTP_destport = 21; // For FTP client examples; destination network info
enum CommandFirst {
f_nocmd,
f_dir,
f_put,
f_get,
};
enum CommandSecond {
s_nocmd,
s_dir,
s_put,
s_get,
};
struct Command {
enum CommandFirst First;
enum CommandSecond Second;
};
struct Command Command;
int current_yearc = 2014;
int current_monthc = 12;
int current_dayc = 31;
int current_hourc = 10;
int current_minc = 10;
int current_secc = 30;
uint8_t gMenuStart = 0; uint8_t gMenuStart = 0;
uint8_t gDataSockReady = 0; uint8_t gDataSockReady = 0;
uint8_t gDataPutGetStart = 0; uint8_t gDataPutGetStart = 0;
uint8_t gModeAsciiBinary = 0;
uint8_t gModeActivePassive = ConnectPassive;
static uint8_t gMsgBuf[20]={0,}; static uint8_t gMsgBuf[20]={0,};
// For FTP client examples; destination network info struct ftpc ftpc;
uint8_t FTP_destip[4] = {192, 168, 0, 230}; struct Command Command;
uint16_t FTP_destport = 21;
extern int Board_UARTGetCharBlocking(void);
uint8_t* User_Keyboard_MSG()
{
uint8_t i=0;
do{
gMsgBuf[i] = Board_UARTGetCharBlocking();
i++;
}while(gMsgBuf[i-1]!=0x0d);
gMsgBuf[i-1]=0;
return gMsgBuf;
}
void ftpc_init(uint8_t * src_ip) void ftpc_init(uint8_t * src_ip)
{ {
ftp.state = FTPS_NOT_LOGIN; ftpc.dsock_mode = ACTIVE_MODE;
ftp.dsock_mode = ACTIVE_MODE;
local_ip.cVal[0] = src_ip[0]; local_ip.cVal[0] = src_ip[0];
local_ip.cVal[1] = src_ip[1]; local_ip.cVal[1] = src_ip[1];
local_ip.cVal[2] = src_ip[2]; local_ip.cVal[2] = src_ip[2];
local_ip.cVal[3] = src_ip[3]; local_ip.cVal[3] = src_ip[3];
local_port = 35000; local_port = 35000;
strcpy(ftp.workingdir, "/"); strcpy(ftpc.workingdir, "/");
socket(CTRL_SOCK, Sn_MR_TCP, IPPORT_FTP, 0x0); socket(CTRL_SOCK, Sn_MR_TCP, FTP_destport, 0x0);
} }
uint8_t ftpc_run(uint8_t * dbuf) uint8_t ftpc_run(uint8_t * dbuf)
{ {
#ifndef Need_UARTGetCharBlocking_func
uint16_t size = 0; uint16_t size = 0;
long ret = 0; long ret = 0;
uint32_t send_byte, recv_byte; uint32_t send_byte, recv_byte;
@ -111,10 +45,10 @@ uint8_t ftpc_run(uint8_t * dbuf)
switch(getSn_SR(CTRL_SOCK)) switch(getSn_SR(CTRL_SOCK))
{ {
case SOCK_ESTABLISHED : case SOCK_ESTABLISHED :
if(!connect_state_controlc){ if(!connect_state_control_ftpc){
printf("%d:FTP Connected\r\n", CTRL_SOCK); printf("%d:FTP Connected\r\n", CTRL_SOCK);
strcpy(ftp.workingdir, "/"); strcpy(ftpc.workingdir, "/");
connect_state_controlc = 1; connect_state_control_ftpc = 1;
} }
if(gMenuStart){ if(gMenuStart){
gMenuStart = 0; gMenuStart = 0;
@ -123,16 +57,18 @@ uint8_t ftpc_run(uint8_t * dbuf)
printf("----------------------------------------\r\n"); printf("----------------------------------------\r\n");
printf("1> View FTP Server Directory\r\n"); printf("1> View FTP Server Directory\r\n");
printf("2> View My Directory\r\n"); printf("2> View My Directory\r\n");
printf("3> Sets the type of file to be transferred. Current state : %s\r\n", (gModeAsciiBinary==TransferAscii)?"Ascii":"Binary"); printf("3> Sets the type of file to be transferred. Current state : %s\r\n", (ftpc.type==ASCII_TYPE)?"Ascii":"Binary");
printf("4> Sets Data Connection. Current state : %s\r\n", (gModeActivePassive==ConnectActive)?"Active":"Passive"); printf("4> Sets Data Connection. Current state : %s\r\n", (ftpc.dsock_mode==ACTIVE_MODE)?"Active":"Passive");
printf("5> Put File to Server\r\n"); printf("5> Put File to Server\r\n");
printf("6> Get File from Server\r\n"); printf("6> Get File from Server\r\n");
#if defined(F_FILESYSTEM)
printf("7> Delete My File\r\n"); printf("7> Delete My File\r\n");
#endif
printf("----------------------------------------\r\n"); printf("----------------------------------------\r\n");
while(1){ while(1){
msg_c=Board_UARTGetCharBlocking(); msg_c=ftp_getc();
if(msg_c=='1'){ if(msg_c=='1'){
if(gModeActivePassive==ConnectPassive){ if(ftpc.dsock_mode==PASSIVE_MODE){
sprintf(dat,"PASV\r\n"); sprintf(dat,"PASV\r\n");
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat)); send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
Command.First = f_dir; Command.First = f_dir;
@ -151,7 +87,7 @@ uint8_t ftpc_run(uint8_t * dbuf)
break; break;
} }
else if(msg_c=='5'){ else if(msg_c=='5'){
if(gModeActivePassive==ConnectPassive){ if(ftpc.dsock_mode==PASSIVE_MODE){
sprintf(dat,"PASV\r\n"); sprintf(dat,"PASV\r\n");
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat)); send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
Command.First = f_put; Command.First = f_put;
@ -169,7 +105,7 @@ uint8_t ftpc_run(uint8_t * dbuf)
} }
} }
else if(msg_c=='6'){ else if(msg_c=='6'){
if(gModeActivePassive==ConnectPassive){ if(ftpc.dsock_mode==PASSIVE_MODE){
sprintf(dat,"PASV\r\n"); sprintf(dat,"PASV\r\n");
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat)); send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
Command.First = f_get; Command.First = f_get;
@ -187,10 +123,14 @@ uint8_t ftpc_run(uint8_t * dbuf)
} }
} }
else if(msg_c=='2'){ else if(msg_c=='2'){
scan_files(ftp.workingdir, dbuf, (int *)&size); #if defined(F_FILESYSTEM)
scan_files(ftpc.workingdir, dbuf, (int *)&size);
printf("\r\n%s\r\n", dbuf); printf("\r\n%s\r\n", dbuf);
getMountedMemorySize(SPI_FLASHM, &totalSize, &availableSize); #else
printf(" - Available Memory Size : %ld kB / %ld kB ( %ld kB is used )\r\n", availableSize, totalSize, (totalSize - availableSize)); if (strncmp(ftpc.workingdir, "/$Recycle.Bin", sizeof("/$Recycle.Bin")) != 0)
size = sprintf(dbuf, "drwxr-xr-x 1 ftp ftp 0 Dec 31 2014 $Recycle.Bin\r\n-rwxr-xr-x 1 ftp ftp 512 Dec 31 2014 test.txt\r\n");
printf("\r\n%s\r\n", dbuf);
#endif
gMenuStart = 1; gMenuStart = 1;
break; break;
} }
@ -198,16 +138,16 @@ uint8_t ftpc_run(uint8_t * dbuf)
printf("1> ASCII\r\n"); printf("1> ASCII\r\n");
printf("2> BINARY\r\n"); printf("2> BINARY\r\n");
while(1){ while(1){
msg_c=Board_UARTGetCharBlocking(); msg_c=ftp_getc();
if(msg_c=='1'){ if(msg_c=='1'){
sprintf(dat,"TYPE %c\r\n", TransferAscii); sprintf(dat,"TYPE %c\r\n", TransferAscii);
gModeAsciiBinary = TransferAscii; ftpc.type = ASCII_TYPE;
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat)); send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
break; break;
} }
else if(msg_c=='2'){ else if(msg_c=='2'){
sprintf(dat,"TYPE %c\r\n", TransferBinary); sprintf(dat,"TYPE %c\r\n", TransferBinary);
gModeAsciiBinary = TransferBinary; ftpc.type = IMAGE_TYPE;
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat)); send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
break; break;
} }
@ -221,13 +161,13 @@ uint8_t ftpc_run(uint8_t * dbuf)
printf("1> ACTIVE\r\n"); printf("1> ACTIVE\r\n");
printf("2> PASSIVE\r\n"); printf("2> PASSIVE\r\n");
while(1){ while(1){
msg_c=Board_UARTGetCharBlocking(); msg_c=ftp_getc();
if(msg_c=='1'){ if(msg_c=='1'){
gModeActivePassive = ConnectActive; ftpc.dsock_mode=ACTIVE_MODE;
break; break;
} }
else if(msg_c=='2'){ else if(msg_c=='2'){
gModeActivePassive = ConnectPassive; ftpc.dsock_mode=PASSIVE_MODE;
break; break;
} }
else{ else{
@ -237,10 +177,11 @@ uint8_t ftpc_run(uint8_t * dbuf)
gMenuStart = 1; gMenuStart = 1;
break; break;
} }
#if defined(F_FILESYSTEM)
else if(msg_c=='7'){ else if(msg_c=='7'){
printf(">del filename?"); printf(">del filename?");
sprintf(ftp.filename, "/%s\r\n", User_Keyboard_MSG()); sprintf(ftpc.filename, "/%s\r\n", User_Keyboard_MSG());
if (f_unlink((const char *)ftp.filename) != 0){ if (f_unlink((const char *)ftpc.filename) != 0){
printf("\r\nCould not delete.\r\n"); printf("\r\nCould not delete.\r\n");
} }
else{ else{
@ -249,6 +190,7 @@ uint8_t ftpc_run(uint8_t * dbuf)
gMenuStart = 1; gMenuStart = 1;
break; break;
} }
#endif
else{ else{
printf("\r\nRetry...\r\n"); printf("\r\nRetry...\r\n");
} }
@ -262,17 +204,17 @@ uint8_t ftpc_run(uint8_t * dbuf)
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat)); send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
break; break;
case f_put: case f_put:
printf(">put filename?"); printf(">put file name?");
sprintf(dat,"STOR %s\r\n", User_Keyboard_MSG()); sprintf(dat,"STOR %s\r\n", User_Keyboard_MSG());
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat)); send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
break; break;
case f_get: case f_get:
printf(">get filename?"); printf(">get file name?");
sprintf(dat,"RETR %s\r\n", User_Keyboard_MSG()); sprintf(dat,"RETR %s\r\n", User_Keyboard_MSG());
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat)); send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
break; break;
default: default:
printf("shit!!!! Command.First = default\r\n"); printf("Command.First = default\r\n");
break; break;
} }
} }
@ -301,7 +243,7 @@ uint8_t ftpc_run(uint8_t * dbuf)
break; break;
case SOCK_CLOSED : case SOCK_CLOSED :
printf("%d:FTPStart\r\n",CTRL_SOCK); printf("%d:FTPStart\r\n",CTRL_SOCK);
if((ret=socket(CTRL_SOCK, Sn_MR_TCP, IPPORT_FTP, 0x0)) != CTRL_SOCK){ if((ret=socket(CTRL_SOCK, Sn_MR_TCP, FTP_destport, 0x0)) != CTRL_SOCK){
printf("%d:socket() error:%ld\r\n", CTRL_SOCK, ret); printf("%d:socket() error:%ld\r\n", CTRL_SOCK, ret);
close(CTRL_SOCK); close(CTRL_SOCK);
return ret; return ret;
@ -313,7 +255,7 @@ uint8_t ftpc_run(uint8_t * dbuf)
printf("%d:Connect error\r\n",CTRL_SOCK); printf("%d:Connect error\r\n",CTRL_SOCK);
return ret; return ret;
} }
connect_state_controlc = 0; connect_state_control_ftpc = 0;
printf("%d:Connectting...\r\n",CTRL_SOCK); printf("%d:Connectting...\r\n",CTRL_SOCK);
break; break;
default : default :
@ -322,15 +264,14 @@ uint8_t ftpc_run(uint8_t * dbuf)
switch(getSn_SR(DATA_SOCK)){ switch(getSn_SR(DATA_SOCK)){
case SOCK_ESTABLISHED : case SOCK_ESTABLISHED :
if(!connect_state_datac){ if(!connect_state_data_ftpc){
printf("%d:FTP Data socket Connected\r\n", DATA_SOCK); printf("%d:FTP Data socket Connected\r\n", DATA_SOCK);
connect_state_datac = 1; connect_state_data_ftpc = 1;
//gDataSockReady = 1;
} }
if(gDataPutGetStart){ if(gDataPutGetStart){
switch(Command.Second){ switch(Command.Second){
case s_dir: case s_dir:
printf("waitng...\r\n"); printf("dir waiting...\r\n");
if((size = getSn_RX_RSR(DATA_SOCK)) > 0){ // Don't need to check SOCKERR_BUSY because it doesn't not occur. if((size = getSn_RX_RSR(DATA_SOCK)) > 0){ // Don't need to check SOCKERR_BUSY because it doesn't not occur.
printf("ok\r\n"); printf("ok\r\n");
memset(dbuf, 0, _MAX_SS); memset(dbuf, 0, _MAX_SS);
@ -347,17 +288,19 @@ uint8_t ftpc_run(uint8_t * dbuf)
} }
printf("Rcvd Data:\n\r%s\n\r", dbuf); printf("Rcvd Data:\n\r%s\n\r", dbuf);
gDataPutGetStart = 0; gDataPutGetStart = 0;
Command.Second = s_nocmd;
} }
break; break;
case s_put: case s_put:
printf("waitng...\r\n"); printf("put waiting...\r\n");
if(strlen(ftp.workingdir) == 1) if(strlen(ftpc.workingdir) == 1)
sprintf(ftp.filename, "/%s", (uint8_t *)gMsgBuf); sprintf(ftpc.filename, "/%s", (uint8_t *)gMsgBuf);
else else
sprintf(ftp.filename, "%s/%s", ftp.workingdir, (uint8_t *)gMsgBuf); sprintf(ftpc.filename, "%s/%s", ftpc.workingdir, (uint8_t *)gMsgBuf);
ftp.fr = f_open(&(ftp.fil), (const char *)ftp.filename, FA_READ); #if defined(F_FILESYSTEM)
if(ftp.fr == FR_OK){ ftpc.fr = f_open(&(ftpc.fil), (const char *)ftpc.filename, FA_READ);
remain_filesize = ftp.fil.fsize; if(ftpc.fr == FR_OK){
remain_filesize = ftpc.fil.fsize;
printf("f_open return FR_OK\r\n"); printf("f_open return FR_OK\r\n");
do{ do{
memset(dbuf, 0, _MAX_SS); memset(dbuf, 0, _MAX_SS);
@ -365,8 +308,8 @@ uint8_t ftpc_run(uint8_t * dbuf)
send_byte = _MAX_SS; send_byte = _MAX_SS;
else else
send_byte = remain_filesize; send_byte = remain_filesize;
ftp.fr = f_read(&(ftp.fil), (void *)dbuf, send_byte , (UINT *)&blocklen); ftpc.fr = f_read(&(ftpc.fil), (void *)dbuf, send_byte , (UINT *)&blocklen);
if(ftp.fr != FR_OK){ if(ftpc.fr != FR_OK){
break; break;
} }
printf("#"); printf("#");
@ -374,25 +317,35 @@ uint8_t ftpc_run(uint8_t * dbuf)
remain_filesize -= blocklen; remain_filesize -= blocklen;
}while(remain_filesize != 0); }while(remain_filesize != 0);
printf("\r\nFile read finished\r\n"); printf("\r\nFile read finished\r\n");
ftp.fr = f_close(&(ftp.fil)); ftpc.fr = f_close(&(ftpc.fil));
gDataPutGetStart = 0;
disconnect(DATA_SOCK);
} }
else{ else{
printf("File Open Error: %d\r\n", ftp.fr); printf("File Open Error: %d\r\n", ftpc.fr);
ftp.fr = f_close(&(ftp.fil)); ftpc.fr = f_close(&(ftpc.fil));
gDataPutGetStart = 0;
disconnect(DATA_SOCK);
} }
#else
remain_filesize = strlen(ftpc.filename);
do{
memset(dbuf, 0, _MAX_SS);
blocklen = sprintf(dbuf, "%s", ftpc.filename);
printf("########## dbuf:%s\r\n", dbuf);
send(DATA_SOCK, dbuf, blocklen);
remain_filesize -= blocklen;
}while(remain_filesize != 0);
#endif
gDataPutGetStart = 0;
Command.Second = s_nocmd;
disconnect(DATA_SOCK);
break; break;
case s_get: case s_get:
printf("waitng...\r\n"); printf("get waiting...\r\n");
if(strlen(ftp.workingdir) == 1) if(strlen(ftpc.workingdir) == 1)
sprintf(ftp.filename, "/%s", (uint8_t *)gMsgBuf); sprintf(ftpc.filename, "/%s", (uint8_t *)gMsgBuf);
else else
sprintf(ftp.filename, "%s/%s", ftp.workingdir, (uint8_t *)gMsgBuf); sprintf(ftpc.filename, "%s/%s", ftpc.workingdir, (uint8_t *)gMsgBuf);
ftp.fr = f_open(&(ftp.fil), (const char *)ftp.filename, FA_CREATE_ALWAYS | FA_WRITE); #if defined(F_FILESYSTEM)
if(ftp.fr == FR_OK){ ftpc.fr = f_open(&(ftpc.fil), (const char *)ftpc.filename, FA_CREATE_ALWAYS | FA_WRITE);
if(ftpc.fr == FR_OK){
printf("f_open return FR_OK\r\n"); printf("f_open return FR_OK\r\n");
while(1){ while(1){
if((remain_datasize = getSn_RX_RSR(DATA_SOCK)) > 0){ if((remain_datasize = getSn_RX_RSR(DATA_SOCK)) > 0){
@ -401,15 +354,15 @@ uint8_t ftpc_run(uint8_t * dbuf)
if(remain_datasize > _MAX_SS) recv_byte = _MAX_SS; if(remain_datasize > _MAX_SS) recv_byte = _MAX_SS;
else recv_byte = remain_datasize; else recv_byte = remain_datasize;
ret = recv(DATA_SOCK, dbuf, recv_byte); ret = recv(DATA_SOCK, dbuf, recv_byte);
ftp.fr = f_write(&(ftp.fil), (const void *)dbuf, (UINT)ret, (UINT *)&blocklen); ftpc.fr = f_write(&(ftpc.fil), (const void *)dbuf, (UINT)ret, (UINT *)&blocklen);
remain_datasize -= blocklen; remain_datasize -= blocklen;
if(ftp.fr != FR_OK){ if(ftpc.fr != FR_OK){
printf("f_write failed\r\n"); printf("f_write failed\r\n");
break; break;
} }
if(remain_datasize <= 0) break; if(remain_datasize <= 0) break;
} }
if(ftp.fr != FR_OK){ if(ftpc.fr != FR_OK){
printf("f_write failed\r\n"); printf("f_write failed\r\n");
break; break;
} }
@ -420,26 +373,49 @@ uint8_t ftpc_run(uint8_t * dbuf)
} }
} }
printf("\r\nFile write finished\r\n"); printf("\r\nFile write finished\r\n");
ftp.fr = f_close(&(ftp.fil)); ftpc.fr = f_close(&(ftpc.fil));
gDataPutGetStart = 0; gDataPutGetStart = 0;
}else{ }else{
printf("File Open Error: %d\r\n", ftp.fr); printf("File Open Error: %d\r\n", ftpc.fr);
} }
#else
while(1){
if((remain_datasize = getSn_RX_RSR(DATA_SOCK)) > 0){
while(1){
memset(dbuf, 0, _MAX_SS);
if(remain_datasize > _MAX_SS)
recv_byte = _MAX_SS;
else
recv_byte = remain_datasize;
ret = recv(DATA_SOCK, dbuf, recv_byte);
printf("########## dbuf:%s\r\n", dbuf);
remain_datasize -= ret;
if(remain_datasize <= 0)
break;
}
}else{
if(getSn_SR(DATA_SOCK) != SOCK_ESTABLISHED)
break;
}
}
gDataPutGetStart = 0;
Command.Second = s_nocmd;
#endif
break; break;
default: default:
printf("shit!!!! Command.Second = default\r\n"); printf("Command.Second = default\r\n");
break; break;
} }
} }
break; break;
case SOCK_CLOSE_WAIT : case SOCK_CLOSE_WAIT :
printf("%d:CloseWait\r\n",DATA_SOCK); printf("%d:CloseWait\r\n",DATA_SOCK);
if((ret=disconnect(DATA_SOCK)) != SOCK_OK) return ret; if((ret=disconnect(DATA_SOCK)) != SOCK_OK) return ret;
printf("%d:Closed\r\n",DATA_SOCK); printf("%d:Closed\r\n",DATA_SOCK);
break; break;
case SOCK_CLOSED : case SOCK_CLOSED :
if(ftp.dsock_state == DATASOCK_READY){ if(ftpc.dsock_state == DATASOCK_READY){
if(ftp.dsock_mode == PASSIVE_MODE){ if(ftpc.dsock_mode == PASSIVE_MODE){
printf("%d:FTPDataStart, port : %d\r\n",DATA_SOCK, local_port); printf("%d:FTPDataStart, port : %d\r\n",DATA_SOCK, local_port);
if((ret=socket(DATA_SOCK, Sn_MR_TCP, local_port, 0x0)) != DATA_SOCK){ if((ret=socket(DATA_SOCK, Sn_MR_TCP, local_port, 0x0)) != DATA_SOCK){
printf("%d:socket() error:%ld\r\n", DATA_SOCK, ret); printf("%d:socket() error:%ld\r\n", DATA_SOCK, ret);
@ -460,13 +436,13 @@ uint8_t ftpc_run(uint8_t * dbuf)
if(local_port > 50000) if(local_port > 50000)
local_port = 35000; local_port = 35000;
} }
ftp.dsock_state = DATASOCK_START; ftpc.dsock_state = DATASOCK_START;
} }
break; break;
case SOCK_INIT : case SOCK_INIT :
printf("%d:Opened\r\n",DATA_SOCK); printf("%d:Opened\r\n",DATA_SOCK);
if(ftp.dsock_mode == ACTIVE_MODE){ if(ftpc.dsock_mode == ACTIVE_MODE){
if( (ret = listen(DATA_SOCK)) != SOCK_OK){ if( (ret = listen(DATA_SOCK)) != SOCK_OK){
printf("%d:Listen error\r\n",DATA_SOCK); printf("%d:Listen error\r\n",DATA_SOCK);
return ret; return ret;
@ -480,11 +456,12 @@ uint8_t ftpc_run(uint8_t * dbuf)
} }
gDataSockReady = 1; gDataSockReady = 1;
} }
connect_state_datac = 0; connect_state_data_ftpc = 0;
break; break;
default : default :
break; break;
} }
#endif
return 0; return 0;
} }
@ -496,55 +473,58 @@ char proc_ftpc(char * buf)
Responses =(buf[0]-'0')*100+(buf[1]-'0')*10+(buf[2]-'0'); Responses =(buf[0]-'0')*100+(buf[1]-'0')*10+(buf[2]-'0');
switch(Responses){ switch(Responses){
case R_220: case R_220: /* Service ready for new user. */
printf("\r\nInput your User ID > "); printf("\r\nInput your User ID > ");
sprintf(dat,"USER %s\r\n", User_Keyboard_MSG()); sprintf(dat,"USER %s\r\n", User_Keyboard_MSG());
printf("\r\n"); printf("\r\n");
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat)); send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
break; break;
case R_331:
case R_331: /* User name okay, need password. */
printf("\r\nInput your Password > "); printf("\r\nInput your Password > ");
sprintf(dat,"PASS %s\r\n", User_Keyboard_MSG()); sprintf(dat,"PASS %s\r\n", User_Keyboard_MSG());
printf("\r\n"); printf("\r\n");
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat)); send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
break; break;
case R_230: case R_230: /* User logged in, proceed */
printf("\r\nUser logged in, proceed\r\n"); printf("\r\nUser logged in, proceed\r\n");
sprintf(dat,"TYPE %c\r\n", TransferAscii); sprintf(dat,"TYPE %c\r\n", TransferAscii);
gModeAsciiBinary = TransferAscii; ftpc.type = ASCII_TYPE;
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat)); send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
break; break;
case R_200: case R_200:
if((gModeActivePassive==ConnectActive)&&gModeActivePassiveflag){ if((ftpc.dsock_mode==ACTIVE_MODE)&&gModeActivePassiveflag){
ftp.dsock_mode = ACTIVE_MODE; ftpc.dsock_state = DATASOCK_READY;
ftp.dsock_state = DATASOCK_READY;
gModeActivePassiveflag = 0; gModeActivePassiveflag = 0;
} }
else{ else{
gMenuStart = 1; gMenuStart = 1;
} }
break; break;
case R_150: case R_150:
switch(Command.First){ switch(Command.First){
case f_dir: case f_dir:
Command.First = f_nocmd;
Command.Second = s_dir; Command.Second = s_dir;
gDataPutGetStart = 1; gDataPutGetStart = 1;
break; break;
case f_get: case f_get:
Command.First = f_nocmd;
Command.Second = s_get; Command.Second = s_get;
gDataPutGetStart = 1; gDataPutGetStart = 1;
break; break;
case f_put: case f_put:
Command.First = f_nocmd;
Command.Second = s_put; Command.Second = s_put;
gDataPutGetStart = 1; gDataPutGetStart = 1;
break; break;
default : default :
printf("shit!!!! Command.First = default\r\n"); printf("Command.First = default\r\n");
break; break;
} }
break; break;
case R_226: /* Closing data connection. File transfer/abort successful */ case R_226:
gMenuStart = 1; gMenuStart = 1;
break; break;
case R_227: case R_227:
@ -553,8 +533,8 @@ char proc_ftpc(char * buf)
} }
else{ else{
printf("Go Open Data Sock...\r\n "); printf("Go Open Data Sock...\r\n ");
ftp.dsock_mode = PASSIVE_MODE; ftpc.dsock_mode = PASSIVE_MODE;
ftp.dsock_state = DATASOCK_READY; ftpc.dsock_state = DATASOCK_READY;
} }
break; break;
default: default:
@ -592,22 +572,13 @@ int pportc(char * arg)
printf("ip : %d.%d.%d.%d, port : %d\r\n", remote_ip.cVal[0], remote_ip.cVal[1], remote_ip.cVal[2], remote_ip.cVal[3], remote_port); printf("ip : %d.%d.%d.%d, port : %d\r\n", remote_ip.cVal[0], remote_ip.cVal[1], remote_ip.cVal[2], remote_ip.cVal[3], remote_port);
return 0; return 0;
} }
uint8_t* User_Keyboard_MSG()
#if defined(F_FILESYSTEM)
void print_filedsc(FIL *fil)
{ {
#if defined(_FTP_DEBUG_) uint8_t i=0;
printf("File System pointer : %08X\r\n", fil->fs); do{
printf("File System mount ID : %d\r\n", fil->id); gMsgBuf[i] = ftp_getc();
printf("File status flag : %08X\r\n", fil->flag); i++;
printf("File System pads : %08X\r\n", fil->err); }while(gMsgBuf[i-1]!=0x0d);
printf("File read write pointer : %08X\r\n", fil->fptr); gMsgBuf[i-1]=0;
printf("File size : %08X\r\n", fil->fsize); return gMsgBuf;
printf("File start cluster : %08X\r\n", fil->sclust);
printf("current cluster : %08X\r\n", fil->clust);
printf("current data sector : %08X\r\n", fil->dsect);
printf("dir entry sector : %08X\r\n", fil->dir_sect);
printf("dir entry pointer : %08X\r\n", fil->dir_ptr);
#endif
} }
#endif

View File

@ -1,77 +1,106 @@
#ifndef _FTPC_H_ #ifndef _FTPC_H_
#define _FTPC_H_ #define _FTPC_H_
#include <stdint.h> #include <stdint.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <limits.h>
#include <stdarg.h>
#include "stdio_private.h"
#include "socket.h"
#define F_FILESYSTEM // If your target support a file system, you have to activate this feature and implement. #define F_APP_FTPC
#if defined(F_FILESYSTEM) /* If your target support a file system, you have to activate this feature and implement. */
//#define F_FILESYSTEM
/* Change to your Chipset Uart function, you have to activate this feature and implement.
* Change!! -> Board_UARTGetCharBlocking()
* Below is an example of a function of lpc_chip library. */
//#define ftp_getc() Board_UARTGetCharBlocking()
#ifdef F_FILESYSTEM
#include "ff.h" #include "ff.h"
#endif #endif
#define F_APP_FTP #ifndef ftp_getc()
#define _FTP_DEBUG_ #define Need_UARTGetCharBlocking_func
#define F_APP_FTP_CLIENT #else
/* Change library
* Change!! -> board_api.h,
* Below is an example of a function of lpc_chip library. */
#include "board_api.h"
#endif
#define LINELEN 100 #define LINELEN 100
//#define DATA_BUF_SIZE 100 #ifndef F_FILESYSTEM
#if !defined(F_FILESYSTEM)
#define _MAX_SS 512 #define _MAX_SS 512
#endif #endif
#define CTRL_SOCK 2 #define CTRL_SOCK 2
#define DATA_SOCK 3 #define DATA_SOCK 3
#define IPPORT_FTPD 20 /* FTP Data port */ /* FTP Responses */
#define IPPORT_FTP 21 /* FTP Control port */ #define R_150 150 /* File status ok; opening data conn */
#define R_200 200 /* 'Generic' command ok */
#define R_220 220 /* Service ready for new user. */
#define R_226 226 /* Closing data connection. File transfer/abort successful */
#define R_227 227 /* Entering passive mode (h1,h2,h3,h4,p1,p2) */
#define R_230 230 /* User logged in, proceed */
#define R_331 331 /* User name okay, need password. */
#define HOSTNAME "iinChip" #define TransferAscii 'A'
#define VERSION "1.0" #define TransferBinary 'I'
#define FILENAME "a.txt" enum ftpc_type {
enum ftp_type {
ASCII_TYPE, ASCII_TYPE,
IMAGE_TYPE, IMAGE_TYPE,
LOGICAL_TYPE
}; };
enum ftp_state { enum ftpc_datasock_state{
FTPS_NOT_LOGIN,
FTPS_LOGIN
};
enum datasock_state{
DATASOCK_IDLE, DATASOCK_IDLE,
DATASOCK_READY, DATASOCK_READY,
DATASOCK_START DATASOCK_START
}; };
enum datasock_mode{ enum ftpc_datasock_mode{
PASSIVE_MODE, PASSIVE_MODE,
ACTIVE_MODE ACTIVE_MODE
}; };
enum CommandFirst {
struct ftpd { f_nocmd,
f_dir,
f_put,
f_get,
};
enum CommandSecond {
s_nocmd,
s_dir,
s_put,
s_get,
};
struct Command {
enum CommandFirst First;
enum CommandSecond Second;
};
struct ftpc {
uint8_t control; /* Control stream */ uint8_t control; /* Control stream */
uint8_t data; /* Data stream */ uint8_t data; /* Data stream */
enum ftp_type type; /* Transfer type */ enum ftpc_type type; /* Transfer type */
enum ftp_state state;
enum datasock_state dsock_state; enum ftpc_datasock_state dsock_state;
enum datasock_mode dsock_mode; enum ftpc_datasock_mode dsock_mode;
char username[LINELEN]; /* Arg to USER command */
char workingdir[LINELEN]; char workingdir[LINELEN];
char filename[LINELEN]; char filename[LINELEN];
#if defined(F_FILESYSTEM) #ifdef F_FILESYSTEM
FIL fil; // FatFs File objects FIL fil; // FatFs File objects
FRESULT fr; // FatFs function common result code FRESULT fr; // FatFs function common result code
#endif #endif
}; };
#ifndef un_I2cval #ifndef un_I2cval
@ -87,13 +116,4 @@ char proc_ftpc(char * buf);
int pportc(char * arg); int pportc(char * arg);
uint8_t* User_Keyboard_MSG(); uint8_t* User_Keyboard_MSG();
int sendit(char * command);
int recvit(char * command);
long sendfile(uint8_t s, char * command);
long recvfile(uint8_t s);
#if defined(F_FILESYSTEM)
void print_filedsc(FIL *fil);
#endif
#endif // _FTPC_H_ #endif // _FTPC_H_