Compare commits
13 Commits
v1.7.2
...
fix_compil
Author | SHA1 | Date | |
---|---|---|---|
580241080d | |||
c29dc21040 | |||
b840aa13a2 | |||
b6b808b306 | |||
924ceea741 | |||
86726229f0 | |||
2857b805d9 | |||
065b096c92 | |||
f36dd4352a | |||
19ae79ee07 | |||
fc3430b71a | |||
3508acad10 | |||
413ad6fc84 |
BIN
Ethernet/SOCKET_APIs_V2.0.chm
Normal file
BIN
Ethernet/SOCKET_APIs_V2.0.chm
Normal file
Binary file not shown.
339
Ethernet/W5100/w5100.c
Normal file
339
Ethernet/W5100/w5100.c
Normal file
@ -0,0 +1,339 @@
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! \file w5200.c
|
||||
//! \brief W5200 HAL Interface.
|
||||
//! \version 1.0.0
|
||||
//! \date 2013/10/21
|
||||
//! \par Revision history
|
||||
//! <2013/10/21> 1st Release
|
||||
//! \author MidnightCow
|
||||
//!
|
||||
//! Copyright (c) 2013, WIZnet Co., LTD.
|
||||
//! All rights reserved.
|
||||
//!
|
||||
//! Redistribution and use in source and binary forms, with or without
|
||||
//! modification, are permitted provided that the following conditions
|
||||
//! are met:
|
||||
//!
|
||||
//! * Redistributions of source code must retain the above copyright
|
||||
//! notice, this list of conditions and the following disclaimer.
|
||||
//! * Redistributions in binary form must reproduce the above copyright
|
||||
//! notice, this list of conditions and the following disclaimer in the
|
||||
//! documentation and/or other materials provided with the distribution.
|
||||
//! * Neither the name of the <ORGANIZATION> nor the names of its
|
||||
//! contributors may be used to endorse or promote products derived
|
||||
//! from this software without specific prior written permission.
|
||||
//!
|
||||
//! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
//! AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
//! IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
//! ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
//! LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
//! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
//! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
//! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
//! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
//! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
//! THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
#include "w5100.h"
|
||||
|
||||
#if (_WIZCHIP_ == 5100)
|
||||
/**
|
||||
@brief This function writes the data into W5200 registers.
|
||||
*/
|
||||
void WIZCHIP_WRITE(uint16_t AddrSel, uint8_t wb )
|
||||
{
|
||||
WIZCHIP_CRITICAL_ENTER();
|
||||
WIZCHIP.CS._select();
|
||||
|
||||
#if( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SPI_))
|
||||
WIZCHIP.IF.SPI._write_byte(0xF0);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0xFF00) >> 8);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF) >> 0);
|
||||
WIZCHIP.IF.SPI._write_byte(wb); // Data write (write 1byte data)
|
||||
#elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_DIR_) )
|
||||
WIZCHIP.IF.BUS._write_byte(AddrSel,wb);
|
||||
#elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_INDIR_) )
|
||||
|
||||
//add indirect bus
|
||||
WIZCHIP.IF.BUS._write_byte(IDM_AR0,(AddrSel & 0xFF00) >> 8);
|
||||
WIZCHIP.IF.BUS._write_byte(IDM_AR1,(AddrSel & 0x00FF));
|
||||
WIZCHIP.IF.BUS._write_byte(IDM_DR,wb);
|
||||
#else
|
||||
#error "Unknown _WIZCHIP_IO_MODE_ in W5100. !!!"
|
||||
#endif
|
||||
|
||||
WIZCHIP.CS._deselect();
|
||||
WIZCHIP_CRITICAL_EXIT();
|
||||
}
|
||||
/**
|
||||
@brief This function reads the value from W5200 registers.
|
||||
*/
|
||||
uint8_t WIZCHIP_READ(uint16_t AddrSel)
|
||||
{
|
||||
uint8_t ret;
|
||||
|
||||
WIZCHIP_CRITICAL_ENTER();
|
||||
WIZCHIP.CS._select();
|
||||
|
||||
#if( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SPI_))
|
||||
WIZCHIP.IF.SPI._write_byte(0x0F);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0xFF00) >> 8);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF) >> 0);
|
||||
ret = WIZCHIP.IF.SPI._read_byte();
|
||||
#elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_DIR_) )
|
||||
ret = WIZCHIP.IF.BUS._read_byte(AddrSel);
|
||||
#elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_INDIR_) )
|
||||
|
||||
//add indirect bus
|
||||
WIZCHIP.IF.BUS._write_byte(IDM_AR0,(AddrSel & 0xFF00) >> 8);
|
||||
WIZCHIP.IF.BUS._write_byte(IDM_AR1,(AddrSel & 0x00FF));
|
||||
ret = WIZCHIP.IF.BUS._read_byte(IDM_DR);
|
||||
#else
|
||||
#error "Unknown _WIZCHIP_IO_MODE_ in W5100. !!!"
|
||||
#endif
|
||||
|
||||
WIZCHIP.CS._deselect();
|
||||
WIZCHIP_CRITICAL_EXIT();
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@brief This function writes into W5200 memory(Buffer)
|
||||
*/
|
||||
void WIZCHIP_WRITE_BUF(uint16_t AddrSel, uint8_t* pBuf, uint16_t len)
|
||||
{
|
||||
uint16_t i = 0;
|
||||
|
||||
WIZCHIP_CRITICAL_ENTER();
|
||||
|
||||
#if( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SPI_))
|
||||
for(i = 0; i < len; i++)
|
||||
{
|
||||
WIZCHIP.CS._select();
|
||||
WIZCHIP.IF.SPI._write_byte(0xF0);
|
||||
WIZCHIP.IF.SPI._write_byte((((uint16_t)(AddrSel+i)) & 0xFF00) >> 8);
|
||||
WIZCHIP.IF.SPI._write_byte((((uint16_t)(AddrSel+i)) & 0x00FF) >> 0);
|
||||
WIZCHIP.IF.SPI._write_byte(pBuf[i]); // Data write (write 1byte data)
|
||||
WIZCHIP.CS._deselect();
|
||||
}
|
||||
#elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_DIR_) )
|
||||
for(i = 0; i < len; i++)
|
||||
WIZCHIP.IF.BUS._write_byte(AddrSel+i,pBuf[i]);
|
||||
#elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_INDIR_) )
|
||||
WIZCHIP_WRITE(MR,WIZCHIP_READ(MR) | MR_AI);
|
||||
WIZCHIP.IF.BUS._write_byte(IDM_AR0,(AddrSel & 0xFF00) >> 8);
|
||||
WIZCHIP.IF.BUS._write_byte(IDM_AR1,(AddrSel & 0x00FF));
|
||||
for(i = 0 ; i < len; i++)
|
||||
WIZCHIP.IF.BUS._write_byte(IDM_DR,pBuf[i]);
|
||||
WIZCHIP_WRITE(MR, WIZCHIP_READ(MR) & ~MR_AI);
|
||||
#else
|
||||
#error "Unknown _WIZCHIP_IO_MODE_ in W5100. !!!!"
|
||||
#endif
|
||||
|
||||
WIZCHIP_CRITICAL_EXIT();
|
||||
}
|
||||
|
||||
/**
|
||||
@brief This function reads into W5200 memory(Buffer)
|
||||
*/
|
||||
|
||||
void WIZCHIP_READ_BUF (uint16_t AddrSel, uint8_t* pBuf, uint16_t len)
|
||||
{
|
||||
uint16_t i = 0;
|
||||
WIZCHIP_CRITICAL_ENTER();
|
||||
|
||||
#if( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SPI_))
|
||||
for(i = 0; i < len; i++)
|
||||
{
|
||||
WIZCHIP.CS._select();
|
||||
WIZCHIP.IF.SPI._write_byte(0x0F);
|
||||
WIZCHIP.IF.SPI._write_byte((uint16_t)((AddrSel+i) & 0xFF00) >> 8);
|
||||
WIZCHIP.IF.SPI._write_byte((uint16_t)((AddrSel+i) & 0x00FF) >> 0);
|
||||
pBuf[i] = WIZCHIP.IF.SPI._read_byte();
|
||||
WIZCHIP.CS._deselect();
|
||||
}
|
||||
#elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_DIR_) )
|
||||
for(i = 0 ; i < len; i++)
|
||||
pBuf[i] = WIZCHIP.IF.BUS._read_byte(AddrSel+i);
|
||||
#elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_INDIR_) )
|
||||
WIZCHIP_WRITE(MR, WIZCHIP_READ(MR) | MR_AI);
|
||||
WIZCHIP.IF.BUS._write_byte(IDM_AR0,(AddrSel & 0xFF00) >> 8);
|
||||
WIZCHIP.IF.BUS._write_byte(IDM_AR1,(AddrSel & 0x00FF));
|
||||
for(i = 0 ; i < len; i++)
|
||||
pBuf[i] = WIZCHIP.IF.BUS._read_byte(IDM_DR);
|
||||
WIZCHIP_WRITE(MR, WIZCHIP_READ(MR) & ~MR_AI);
|
||||
#else
|
||||
#error "Unknown _WIZCHIP_IO_MODE_ in W5100. !!!!"
|
||||
#endif
|
||||
|
||||
WIZCHIP_CRITICAL_EXIT();
|
||||
}
|
||||
|
||||
///////////////////////////////////
|
||||
// Socket N regsiter IO function //
|
||||
///////////////////////////////////
|
||||
|
||||
uint16_t getSn_TX_FSR(uint8_t sn)
|
||||
{
|
||||
uint16_t val=0,val1=0;
|
||||
do
|
||||
{
|
||||
val1 = WIZCHIP_READ(Sn_TX_FSR(sn));
|
||||
val1 = (val1 << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn),1));
|
||||
if (val1 != 0)
|
||||
{
|
||||
val = WIZCHIP_READ(Sn_TX_FSR(sn));
|
||||
val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn),1));
|
||||
}
|
||||
}while (val != val1);
|
||||
return val;
|
||||
}
|
||||
|
||||
|
||||
uint16_t getSn_RX_RSR(uint8_t sn)
|
||||
{
|
||||
uint16_t val=0,val1=0;
|
||||
do
|
||||
{
|
||||
val1 = WIZCHIP_READ(Sn_RX_RSR(sn));
|
||||
val1 = (val1 << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn),1));
|
||||
if (val1 != 0)
|
||||
{
|
||||
val = WIZCHIP_READ(Sn_RX_RSR(sn));
|
||||
val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn),1));
|
||||
}
|
||||
}while (val != val1);
|
||||
return val;
|
||||
}
|
||||
|
||||
/////////////////////////////////////
|
||||
// Sn_TXBUF & Sn_RXBUF IO function //
|
||||
/////////////////////////////////////
|
||||
uint32_t getSn_RxBASE(uint8_t sn)
|
||||
{
|
||||
int8_t i;
|
||||
#if ( _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_DIR_)
|
||||
uint32_t rxbase = _W5100_IO_BASE_ + _WIZCHIP_IO_RXBUF_;
|
||||
#else
|
||||
uint32_t rxbase = _WIZCHIP_IO_RXBUF_;
|
||||
#endif
|
||||
for(i = 0; i < sn; i++)
|
||||
rxbase += getSn_RxMAX(i);
|
||||
|
||||
return rxbase;
|
||||
}
|
||||
|
||||
uint32_t getSn_TxBASE(uint8_t sn)
|
||||
{
|
||||
int8_t i;
|
||||
#if ( _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_DIR_)
|
||||
uint32_t txbase = _W5100_IO_BASE_ + _WIZCHIP_IO_TXBUF_;
|
||||
#else
|
||||
uint32_t txbase = _WIZCHIP_IO_TXBUF_;
|
||||
#endif
|
||||
for(i = 0; i < sn; i++)
|
||||
txbase += getSn_TxMAX(i);
|
||||
return txbase;
|
||||
}
|
||||
|
||||
/**
|
||||
@brief This function is being called by send() and sendto() function also. for copy the data form application buffer to Transmite buffer of the chip.
|
||||
|
||||
This function read the Tx write pointer register and after copy the data in buffer update the Tx write pointer
|
||||
register. User should read upper byte first and lower byte later to get proper value.
|
||||
And this function is being used for copy the data form application buffer to Transmite
|
||||
buffer of the chip. It calculate the actual physical address where one has to write
|
||||
the data in transmite buffer. Here also take care of the condition while it exceed
|
||||
the Tx memory uper-bound of socket.
|
||||
|
||||
*/
|
||||
void wiz_send_data(uint8_t sn, uint8_t *wizdata, uint16_t len)
|
||||
{
|
||||
uint16_t ptr;
|
||||
uint16_t size;
|
||||
uint16_t dst_mask;
|
||||
uint16_t dst_ptr;
|
||||
|
||||
ptr = getSn_TX_WR(sn);
|
||||
|
||||
dst_mask = ptr & getSn_TxMASK(sn);
|
||||
dst_ptr = getSn_TxBASE(sn) + dst_mask;
|
||||
|
||||
if (dst_mask + len > getSn_TxMAX(sn))
|
||||
{
|
||||
size = getSn_TxMAX(sn) - dst_mask;
|
||||
WIZCHIP_WRITE_BUF(dst_ptr, wizdata, size);
|
||||
wizdata += size;
|
||||
size = len - size;
|
||||
dst_ptr = getSn_TxBASE(sn);
|
||||
WIZCHIP_WRITE_BUF(dst_ptr, wizdata, size);
|
||||
}
|
||||
else
|
||||
{
|
||||
WIZCHIP_WRITE_BUF(dst_ptr, wizdata, len);
|
||||
}
|
||||
|
||||
ptr += len;
|
||||
|
||||
setSn_TX_WR(sn, ptr);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@brief This function is being called by recv() also. This function is being used for copy the data form Receive buffer of the chip to application buffer.
|
||||
|
||||
This function read the Rx read pointer register
|
||||
and after copy the data from receive buffer update the Rx write pointer register.
|
||||
User should read upper byte first and lower byte later to get proper value.
|
||||
It calculate the actual physical address where one has to read
|
||||
the data from Receive buffer. Here also take care of the condition while it exceed
|
||||
the Rx memory uper-bound of socket.
|
||||
*/
|
||||
void wiz_recv_data(uint8_t sn, uint8_t *wizdata, uint16_t len)
|
||||
{
|
||||
uint16_t ptr;
|
||||
uint16_t size;
|
||||
uint16_t src_mask;
|
||||
uint16_t src_ptr;
|
||||
|
||||
ptr = getSn_RX_RD(sn);
|
||||
|
||||
src_mask = (uint32_t)ptr & getSn_RxMASK(sn);
|
||||
src_ptr = (getSn_RxBASE(sn) + src_mask);
|
||||
|
||||
|
||||
if( (src_mask + len) > getSn_RxMAX(sn) )
|
||||
{
|
||||
size = getSn_RxMAX(sn) - src_mask;
|
||||
WIZCHIP_READ_BUF((uint32_t)src_ptr, (uint8_t*)wizdata, size);
|
||||
wizdata += size;
|
||||
size = len - size;
|
||||
src_ptr = getSn_RxBASE(sn);
|
||||
WIZCHIP_READ_BUF(src_ptr, (uint8_t*)wizdata, size);
|
||||
}
|
||||
else
|
||||
{
|
||||
WIZCHIP_READ_BUF(src_ptr, (uint8_t*)wizdata, len);
|
||||
}
|
||||
|
||||
ptr += len;
|
||||
|
||||
setSn_RX_RD(sn, ptr);
|
||||
}
|
||||
|
||||
void wiz_recv_ignore(uint8_t sn, uint16_t len)
|
||||
{
|
||||
uint16_t ptr;
|
||||
|
||||
ptr = getSn_RX_RD(sn);
|
||||
|
||||
ptr += len;
|
||||
setSn_RX_RD(sn,ptr);
|
||||
}
|
||||
|
||||
#endif
|
1847
Ethernet/W5100/w5100.h
Normal file
1847
Ethernet/W5100/w5100.h
Normal file
File diff suppressed because it is too large
Load Diff
327
Ethernet/W5200/w5200.c
Normal file
327
Ethernet/W5200/w5200.c
Normal file
@ -0,0 +1,327 @@
|
||||
//*****************************************************************************
|
||||
//
|
||||
//! \file w5200.c
|
||||
//! \brief W5200 HAL Interface.
|
||||
//! \version 1.0.0
|
||||
//! \date 2013/10/21
|
||||
//! \par Revision history
|
||||
//! <2013/10/21> 1st Release
|
||||
//! \author MidnightCow
|
||||
//!
|
||||
//! Copyright (c) 2013, WIZnet Co., LTD.
|
||||
//! All rights reserved.
|
||||
//!
|
||||
//! Redistribution and use in source and binary forms, with or without
|
||||
//! modification, are permitted provided that the following conditions
|
||||
//! are met:
|
||||
//!
|
||||
//! * Redistributions of source code must retain the above copyright
|
||||
//! notice, this list of conditions and the following disclaimer.
|
||||
//! * Redistributions in binary form must reproduce the above copyright
|
||||
//! notice, this list of conditions and the following disclaimer in the
|
||||
//! documentation and/or other materials provided with the distribution.
|
||||
//! * Neither the name of the <ORGANIZATION> nor the names of its
|
||||
//! contributors may be used to endorse or promote products derived
|
||||
//! from this software without specific prior written permission.
|
||||
//!
|
||||
//! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
//! AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
//! IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
//! ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
//! LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
//! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
//! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
//! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
//! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
//! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
//! THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
#include "w5200.h"
|
||||
|
||||
#if (_WIZCHIP_ == 5200)
|
||||
/**
|
||||
@brief This function writes the data into W5200 registers.
|
||||
*/
|
||||
void WIZCHIP_WRITE(uint32_t AddrSel, uint8_t wb )
|
||||
{
|
||||
WIZCHIP_CRITICAL_ENTER();
|
||||
WIZCHIP.CS._select();
|
||||
|
||||
#if( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SPI_))
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
|
||||
WIZCHIP.IF.SPI._write_byte(_W5200_SPI_WRITE_); // Data write command and Write data length upper
|
||||
WIZCHIP.IF.SPI._write_byte(0x01); // Write data length lower
|
||||
WIZCHIP.IF.SPI._write_byte(wb); // Data write (write 1byte data)
|
||||
|
||||
#elif ( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_BUS_) )
|
||||
|
||||
//add indirect bus
|
||||
WIZCHIP.IF.BUS._write_byte(IDM_AR0,(AddrSel & 0x0000FF00) >> 8);
|
||||
WIZCHIP.IF.BUS._write_byte(IDM_AR1,(AddrSel & 0x000000FF));
|
||||
WIZCHIP.IF.BUS._write_byte(IDM_DR,wb);
|
||||
#else
|
||||
#error "Unknown _WIZCHIP_IO_MODE_ in W5200. !!!"
|
||||
#endif
|
||||
|
||||
WIZCHIP.CS._deselect();
|
||||
WIZCHIP_CRITICAL_EXIT();
|
||||
}
|
||||
/**
|
||||
@brief This function reads the value from W5200 registers.
|
||||
*/
|
||||
uint8_t WIZCHIP_READ(uint32_t AddrSel)
|
||||
{
|
||||
uint8_t ret;
|
||||
|
||||
WIZCHIP_CRITICAL_ENTER();
|
||||
WIZCHIP.CS._select();
|
||||
|
||||
#if( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SPI_))
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
|
||||
WIZCHIP.IF.SPI._write_byte(_W5200_SPI_READ_); // Read data length upper
|
||||
WIZCHIP.IF.SPI._write_byte(0x01); // Data length lower
|
||||
ret = WIZCHIP.IF.SPI._read_byte();
|
||||
|
||||
#elif ( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_BUS_) )
|
||||
|
||||
//add indirect bus
|
||||
WIZCHIP.IF.BUS._write_byte(IDM_AR0,(AddrSel & 0x0000FF00) >> 8);
|
||||
WIZCHIP.IF.BUS._write_byte(IDM_AR1,(AddrSel & 0x000000FF));
|
||||
ret = WIZCHIP.IF.BUS._read_byte(IDM_DR);
|
||||
|
||||
#else
|
||||
#error "Unknown _WIZCHIP_IO_MODE_ in W5200. !!!"
|
||||
#endif
|
||||
|
||||
WIZCHIP.CS._deselect();
|
||||
WIZCHIP_CRITICAL_EXIT();
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@brief This function writes into W5200 memory(Buffer)
|
||||
*/
|
||||
void WIZCHIP_WRITE_BUF(uint32_t AddrSel, uint8_t* pBuf, uint16_t len)
|
||||
{
|
||||
uint16_t i = 0;
|
||||
WIZCHIP_CRITICAL_ENTER();
|
||||
WIZCHIP.CS._select();
|
||||
|
||||
#if( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SPI_))
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
|
||||
WIZCHIP.IF.SPI._write_byte(_W5200_SPI_WRITE_ | ((len & 0x7F00) >> 8)); // Write data op code and length upper
|
||||
WIZCHIP.IF.SPI._write_byte((len & 0x00FF) >> 0); // length lower
|
||||
for(i = 0; i < len; i++)
|
||||
WIZCHIP.IF.SPI._write_byte(pBuf[i]);
|
||||
|
||||
#elif ( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_BUS_) )
|
||||
WIZCHIP_WRITE(MR,WIZCHIP_READ(MR) | MR_AI);
|
||||
WIZCHIP.IF.BUS._write_byte(IDM_AR0,(AddrSel & 0x0000FF00) >> 8);
|
||||
WIZCHIP.IF.BUS._write_byte(IDM_AR1,(AddrSel & 0x000000FF));
|
||||
for(i = 0 ; i < len; i++)
|
||||
WIZCHIP.IF.BUS._write_byte(IDM_DR,pBuf[i]);
|
||||
WIZCHIP_WRITE(MR, WIZCHIP_READ(MR) & ~MR_AI);
|
||||
#else
|
||||
#error "Unknown _WIZCHIP_IO_MODE_ in W5200. !!!!"
|
||||
#endif
|
||||
|
||||
WIZCHIP.CS._deselect();
|
||||
WIZCHIP_CRITICAL_EXIT();
|
||||
}
|
||||
|
||||
/**
|
||||
@brief This function reads into W5200 memory(Buffer)
|
||||
*/
|
||||
|
||||
void WIZCHIP_READ_BUF (uint32_t AddrSel, uint8_t* pBuf, uint16_t len)
|
||||
{
|
||||
uint16_t i = 0;
|
||||
WIZCHIP_CRITICAL_ENTER();
|
||||
WIZCHIP.CS._select();
|
||||
|
||||
#if( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SPI_))
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
|
||||
WIZCHIP.IF.SPI._write_byte( _W5200_SPI_READ_ | ((len & 0x7F00) >> 8)); // Write data op code and length upper
|
||||
WIZCHIP.IF.SPI._write_byte((len & 0x00FF) >> 0); // length lower
|
||||
for(i = 0; i < len; i++)
|
||||
pBuf[i] = WIZCHIP.IF.SPI._read_byte();
|
||||
|
||||
#elif ( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_BUS_) )
|
||||
WIZCHIP_WRITE(MR, WIZCHIP_READ(MR) | MR_AI);
|
||||
WIZCHIP.IF.BUS._write_byte(IDM_AR0,(AddrSel & 0x0000FF00) >> 8);
|
||||
WIZCHIP.IF.BUS._write_byte(IDM_AR1,(AddrSel & 0x000000FF));
|
||||
for(i = 0 ; i < len; i++)
|
||||
pBuf[i] = WIZCHIP.IF.BUS._read_byte(IDM_DR);
|
||||
WIZCHIP_WRITE(MR, WIZCHIP_READ(MR) & ~MR_AI);
|
||||
#else
|
||||
#error "Unknown _WIZCHIP_IO_MODE_ in W5200. !!!!"
|
||||
#endif
|
||||
|
||||
WIZCHIP.CS._deselect();
|
||||
WIZCHIP_CRITICAL_EXIT();
|
||||
}
|
||||
|
||||
///////////////////////////////////
|
||||
// Socket N regsiter IO function //
|
||||
///////////////////////////////////
|
||||
|
||||
uint16_t getSn_TX_FSR(uint8_t sn)
|
||||
{
|
||||
uint16_t val=0,val1=0;
|
||||
do
|
||||
{
|
||||
val1 = WIZCHIP_READ(Sn_TX_FSR(sn));
|
||||
val1 = (val1 << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn),1));
|
||||
if (val1 != 0)
|
||||
{
|
||||
val = WIZCHIP_READ(Sn_TX_FSR(sn));
|
||||
val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn),1));
|
||||
}
|
||||
}while (val != val1);
|
||||
return val;
|
||||
}
|
||||
|
||||
|
||||
uint16_t getSn_RX_RSR(uint8_t sn)
|
||||
{
|
||||
uint16_t val=0,val1=0;
|
||||
do
|
||||
{
|
||||
val1 = WIZCHIP_READ(Sn_RX_RSR(sn));
|
||||
val1 = (val1 << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn),1));
|
||||
if (val1 != 0)
|
||||
{
|
||||
val = WIZCHIP_READ(Sn_RX_RSR(sn));
|
||||
val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn),1));
|
||||
}
|
||||
}while (val != val1);
|
||||
return val;
|
||||
}
|
||||
|
||||
/////////////////////////////////////
|
||||
// Sn_TXBUF & Sn_RXBUF IO function //
|
||||
/////////////////////////////////////
|
||||
|
||||
uint16_t getSn_RxBASE(uint8_t sn)
|
||||
{
|
||||
int8_t i;
|
||||
uint16_t rxbase = _WIZCHIP_IO_RXBUF_;
|
||||
for(i = 0; i < sn; i++)
|
||||
rxbase += getSn_RxMAX(i);
|
||||
return rxbase;
|
||||
}
|
||||
|
||||
uint16_t getSn_TxBASE(uint8_t sn)
|
||||
{
|
||||
int8_t i;
|
||||
uint16_t txbase = _WIZCHIP_IO_TXBUF_;
|
||||
for(i = 0; i < sn; i++)
|
||||
txbase += getSn_TxMAX(i);
|
||||
return txbase;
|
||||
}
|
||||
|
||||
/**
|
||||
@brief This function is being called by send() and sendto() function also. for copy the data form application buffer to Transmite buffer of the chip.
|
||||
|
||||
This function read the Tx write pointer register and after copy the data in buffer update the Tx write pointer
|
||||
register. User should read upper byte first and lower byte later to get proper value.
|
||||
And this function is being used for copy the data form application buffer to Transmite
|
||||
buffer of the chip. It calculate the actual physical address where one has to write
|
||||
the data in transmite buffer. Here also take care of the condition while it exceed
|
||||
the Tx memory uper-bound of socket.
|
||||
|
||||
*/
|
||||
|
||||
void wiz_send_data(uint8_t sn, uint8_t *wizdata, uint16_t len)
|
||||
{
|
||||
|
||||
uint16_t ptr;
|
||||
uint16_t size;
|
||||
uint16_t dst_mask;
|
||||
uint8_t * dst_ptr;
|
||||
|
||||
ptr = getSn_TX_WR(sn);
|
||||
|
||||
|
||||
dst_mask = (uint32_t)ptr & getSn_TxMASK(sn);
|
||||
dst_ptr = (uint8_t*)((uint32_t)getSn_TxBASE(sn) + dst_mask);
|
||||
|
||||
if (dst_mask + len > getSn_TxMAX(sn))
|
||||
{
|
||||
size = getSn_TxMAX(sn) - dst_mask;
|
||||
WIZCHIP_WRITE_BUF((uint32_t)dst_ptr, wizdata, size);
|
||||
wizdata += size;
|
||||
size = len - size;
|
||||
dst_ptr = (uint8_t*)((uint32_t)getSn_TxBASE(sn));
|
||||
WIZCHIP_WRITE_BUF((uint32_t)dst_ptr, wizdata, size);
|
||||
}
|
||||
else
|
||||
{
|
||||
WIZCHIP_WRITE_BUF((uint32_t)dst_ptr, wizdata, len);
|
||||
}
|
||||
|
||||
ptr += len;
|
||||
|
||||
setSn_TX_WR(sn, ptr);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@brief This function is being called by recv() also. This function is being used for copy the data form Receive buffer of the chip to application buffer.
|
||||
|
||||
This function read the Rx read pointer register
|
||||
and after copy the data from receive buffer update the Rx write pointer register.
|
||||
User should read upper byte first and lower byte later to get proper value.
|
||||
It calculate the actual physical address where one has to read
|
||||
the data from Receive buffer. Here also take care of the condition while it exceed
|
||||
the Rx memory uper-bound of socket.
|
||||
*/
|
||||
void wiz_recv_data(uint8_t sn, uint8_t *wizdata, uint16_t len)
|
||||
{
|
||||
uint16_t ptr;
|
||||
uint16_t size;
|
||||
uint16_t src_mask;
|
||||
uint8_t * src_ptr;
|
||||
|
||||
ptr = getSn_RX_RD(sn);
|
||||
|
||||
src_mask = (uint32_t)ptr & getSn_RxMASK(sn);
|
||||
src_ptr = (uint8_t *)((uint32_t)getSn_RxBASE(sn) + src_mask);
|
||||
|
||||
if( (src_mask + len) > getSn_RxMAX(sn) )
|
||||
{
|
||||
size = getSn_RxMAX(sn) - src_mask;
|
||||
WIZCHIP_READ_BUF((uint32_t)src_ptr, (uint8_t*)wizdata, size);
|
||||
wizdata += size;
|
||||
size = len - size;
|
||||
src_ptr = (uint8_t*)((uint32_t)getSn_RxBASE(sn));
|
||||
WIZCHIP_READ_BUF((uint32_t)src_ptr, (uint8_t*)wizdata, size);
|
||||
}
|
||||
else
|
||||
{
|
||||
WIZCHIP_READ_BUF((uint32_t)src_ptr, (uint8_t*)wizdata, len);
|
||||
}
|
||||
|
||||
ptr += len;
|
||||
|
||||
setSn_RX_RD(sn, ptr);
|
||||
}
|
||||
|
||||
void wiz_recv_ignore(uint8_t sn, uint16_t len)
|
||||
{
|
||||
uint16_t ptr;
|
||||
|
||||
ptr = getSn_RX_RD(sn);
|
||||
|
||||
ptr += len;
|
||||
setSn_RX_RD(sn,ptr);
|
||||
}
|
||||
|
||||
#endif
|
2079
Ethernet/W5200/w5200.h
Normal file
2079
Ethernet/W5200/w5200.h
Normal file
File diff suppressed because it is too large
Load Diff
@ -59,6 +59,7 @@
|
||||
#define _W5500_SPI_FDM_OP_LEN2_ 0x02
|
||||
#define _W5500_SPI_FDM_OP_LEN4_ 0x03
|
||||
|
||||
#if (_WIZCHIP_ == 5500)
|
||||
////////////////////////////////////////////////////
|
||||
|
||||
uint8_t WIZCHIP_READ(uint32_t AddrSel)
|
||||
@ -73,7 +74,7 @@ uint8_t WIZCHIP_READ(uint32_t AddrSel)
|
||||
|
||||
if(!WIZCHIP.IF.SPI._read_burst || !WIZCHIP.IF.SPI._write_burst) // byte operation
|
||||
{
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8);
|
||||
WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
|
||||
}
|
||||
@ -263,3 +264,4 @@ void wiz_recv_ignore(uint8_t sn, uint16_t len)
|
||||
setSn_RX_RD(sn,ptr);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -43,12 +43,16 @@
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
//
|
||||
|
||||
#ifndef _W5500_H_
|
||||
#define _W5500_H_
|
||||
|
||||
#include <stdint.h>
|
||||
#include "wizchip_conf.h"
|
||||
|
||||
#if (_WIZCHIP_ == 5500)
|
||||
|
||||
#define _W5500_IO_BASE_ 0x00000000
|
||||
|
||||
#define _W5500_SPI_READ_ (0x00 << 2) //< SPI interface Read operation in Control Phase
|
||||
@ -147,7 +151,7 @@
|
||||
* @sa MR : Mode register.
|
||||
* @sa GAR, SUBR, SHAR, SIPR
|
||||
* @sa INTLEVEL, IR, IMR, SIR, SIMR : Interrupt.
|
||||
* @sa RTR, RCR : Data retransmission.
|
||||
* @sa _RTR_, _RCR_ : Data retransmission.
|
||||
* @sa PTIMER, PMAGIC, PHAR, PSID, PMRU : PPPoE.
|
||||
* @sa UIPR, UPORTR : ICMP message.
|
||||
* @sa PHYCFGR, VERSIONR : etc.
|
||||
@ -200,9 +204,9 @@
|
||||
* <tr> <td>RST</td> <td>Reserved</td> <td>WOL</td> <td>PB</td> <td>PPPoE</td> <td>Reserved</td> <td>FARP</td> <td>Reserved</td> </tr>
|
||||
* </table>
|
||||
* - \ref MR_RST : Reset
|
||||
* - \ref MR_WOL : Wake on LAN
|
||||
* - \ref MR_PB : Ping block
|
||||
* - \ref MR_PPPOE : PPPoE mode
|
||||
* - \ref MR_WOL : Wake on LAN
|
||||
* - \ref MR_PB : Ping block
|
||||
* - \ref MR_PPPOE : PPPoE mode
|
||||
* - \ref MR_FARP : Force ARP mode
|
||||
*/
|
||||
#define MR (_W5500_IO_BASE_ + (0x0000 << 8) + (WIZCHIP_CREG_BLOCK << 3))
|
||||
@ -275,7 +279,9 @@
|
||||
* - \ref IM_IR5 : PPPoE Close Interrupt Mask
|
||||
* - \ref IM_IR4 : Magic Packet Interrupt Mask
|
||||
*/
|
||||
#define IMR (_W5500_IO_BASE_ + (0x0016 << 8) + (WIZCHIP_CREG_BLOCK << 3))
|
||||
//M20150401 : Rename SYMBOE ( Re-define error in a compile)
|
||||
//#define IMR (_W5500_IO_BASE_ + (0x0016 << 8) + (WIZCHIP_CREG_BLOCK << 3))
|
||||
#define _IMR_ (_W5500_IO_BASE_ + (0x0016 << 8) + (WIZCHIP_CREG_BLOCK << 3))
|
||||
|
||||
/**
|
||||
* @ingroup Common_register_group
|
||||
@ -297,20 +303,24 @@
|
||||
/**
|
||||
* @ingroup Common_register_group
|
||||
* @brief Timeout register address( 1 is 100us )(R/W)
|
||||
* @details @ref RTR configures the retransmission timeout period. The unit of timeout period is 100us and the default of @ref RTR is x07D0or 000
|
||||
* And so the default timeout period is 200ms(100us X 2000). During the time configured by @ref RTR, W5500 waits for the peer response
|
||||
* @details @ref _RTR_ configures the retransmission timeout period. The unit of timeout period is 100us and the default of @ref _RTR_ is x07D0or 000
|
||||
* And so the default timeout period is 200ms(100us X 2000). During the time configured by @ref _RTR_, W5500 waits for the peer response
|
||||
* to the packet that is transmitted by \ref Sn_CR (CONNECT, DISCON, CLOSE, SEND, SEND_MAC, SEND_KEEP command).
|
||||
* If the peer does not respond within the @ref RTR time, W5500 retransmits the packet or issues timeout.
|
||||
* If the peer does not respond within the @ref _RTR_ time, W5500 retransmits the packet or issues timeout.
|
||||
*/
|
||||
#define RTR (_W5500_IO_BASE_ + (0x0019 << 8) + (WIZCHIP_CREG_BLOCK << 3))
|
||||
//M20150401 : Rename SYMBOE ( Re-define error in a compile)
|
||||
//#define RTR (_W5500_IO_BASE_ + (0x0019 << 8) + (WIZCHIP_CREG_BLOCK << 3))
|
||||
#define _RTR_ (_W5500_IO_BASE_ + (0x0019 << 8) + (WIZCHIP_CREG_BLOCK << 3))
|
||||
|
||||
/**
|
||||
* @ingroup Common_register_group
|
||||
* @brief Retry count register(R/W)
|
||||
* @details @ref RCR configures the number of time of retransmission.
|
||||
* When retransmission occurs as many as ref RCR+1 Timeout interrupt is issued (@ref Sn_IR[TIMEOUT] = .
|
||||
* @details @ref _RCR_ configures the number of time of retransmission.
|
||||
* When retransmission occurs as many as ref _RCR_+1 Timeout interrupt is issued (@ref Sn_IR[TIMEOUT] = .
|
||||
*/
|
||||
#define RCR (_W5500_IO_BASE_ + (0x001B << 8) + (WIZCHIP_CREG_BLOCK << 3))
|
||||
//M20150401 : Rename SYMBOE ( Re-define error in a compile)
|
||||
//#define RCR (_W5500_IO_BASE_ + (0x001B << 8) + (WIZCHIP_CREG_BLOCK << 3))
|
||||
#define _RCR_ (_W5500_IO_BASE_ + (0x001B << 8) + (WIZCHIP_CREG_BLOCK << 3))
|
||||
|
||||
/**
|
||||
* @ingroup Common_register_group
|
||||
@ -819,7 +829,7 @@
|
||||
* 1 : Enable No Delayed ACK option\n
|
||||
* This bit is applied only during TCP mode (P[3:0] = 001.\n
|
||||
* When this bit is It sends the ACK packet without delay as soon as a Data packet is received from a peer.\n
|
||||
* When this bit is It sends the ACK packet after waiting for the timeout time configured by @ref RTR.
|
||||
* When this bit is It sends the ACK packet after waiting for the timeout time configured by @ref _RTR_.
|
||||
*/
|
||||
#define Sn_MR_ND 0x20
|
||||
|
||||
@ -1169,6 +1179,7 @@
|
||||
#ifdef _exit
|
||||
#undef _exit
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Exit a critical section
|
||||
*
|
||||
@ -1180,11 +1191,9 @@
|
||||
* @sa WIZCHIP_READ(), WIZCHIP_WRITE(), WIZCHIP_READ_BUF(), WIZCHIP_WRITE_BUF()
|
||||
* @sa WIZCHIP_CRITICAL_ENTER()
|
||||
*/
|
||||
|
||||
#define WIZCHIP_CRITICAL_EXIT() WIZCHIP.CRIS._exit()
|
||||
|
||||
|
||||
|
||||
////////////////////////
|
||||
// Basic I/O Function //
|
||||
////////////////////////
|
||||
@ -1337,8 +1346,13 @@ void WIZCHIP_WRITE_BUF(uint32_t AddrSel, uint8_t* pBuf, uint16_t len);
|
||||
* @return uint16_t. Value of @ref INTLEVEL register.
|
||||
* @sa setINTLEVEL()
|
||||
*/
|
||||
//M20150401 : Type explict declaration
|
||||
/*
|
||||
#define getINTLEVEL() \
|
||||
((WIZCHIP_READ(INTLEVEL) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(INTLEVEL,1)))
|
||||
*/
|
||||
#define getINTLEVEL() \
|
||||
(((uint16_t)WIZCHIP_READ(INTLEVEL) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(INTLEVEL,1)))
|
||||
|
||||
/**
|
||||
* @ingroup Common_register_access_function
|
||||
@ -1359,22 +1373,21 @@ void WIZCHIP_WRITE_BUF(uint32_t AddrSel, uint8_t* pBuf, uint16_t len);
|
||||
(WIZCHIP_READ(IR) & 0xF0)
|
||||
/**
|
||||
* @ingroup Common_register_access_function
|
||||
* @brief Set @ref IMR register
|
||||
* @param (uint8_t)imr Value to set @ref IMR register.
|
||||
* @brief Set @ref _IMR_ register
|
||||
* @param (uint8_t)imr Value to set @ref _IMR_ register.
|
||||
* @sa getIMR()
|
||||
*/
|
||||
#define setIMR(imr) \
|
||||
WIZCHIP_WRITE(IMR, imr)
|
||||
WIZCHIP_WRITE(_IMR_, imr)
|
||||
|
||||
/**
|
||||
* @ingroup Common_register_access_function
|
||||
* @brief Get @ref IMR register
|
||||
* @return uint8_t. Value of @ref IMR register.
|
||||
* @brief Get @ref _IMR_ register
|
||||
* @return uint8_t. Value of @ref _IMR_ register.
|
||||
* @sa setIMR()
|
||||
*/
|
||||
#define getIMR() \
|
||||
WIZCHIP_READ(IMR)
|
||||
|
||||
WIZCHIP_READ(_IMR_)
|
||||
|
||||
/**
|
||||
* @ingroup Common_register_access_function
|
||||
@ -1413,41 +1426,47 @@ void WIZCHIP_WRITE_BUF(uint32_t AddrSel, uint8_t* pBuf, uint16_t len);
|
||||
|
||||
/**
|
||||
* @ingroup Common_register_access_function
|
||||
* @brief Set @ref RTR register
|
||||
* @param (uint16_t)rtr Value to set @ref RTR register.
|
||||
* @brief Set @ref _RTR_ register
|
||||
* @param (uint16_t)rtr Value to set @ref _RTR_ register.
|
||||
* @sa getRTR()
|
||||
*/
|
||||
#define setRTR(rtr) {\
|
||||
WIZCHIP_WRITE(RTR, (uint8_t)(rtr >> 8)); \
|
||||
WIZCHIP_WRITE(WIZCHIP_OFFSET_INC(RTR,1), (uint8_t) rtr); \
|
||||
WIZCHIP_WRITE(_RTR_, (uint8_t)(rtr >> 8)); \
|
||||
WIZCHIP_WRITE(WIZCHIP_OFFSET_INC(_RTR_,1), (uint8_t) rtr); \
|
||||
}
|
||||
|
||||
/**
|
||||
* @ingroup Common_register_access_function
|
||||
* @brief Get @ref RTR register
|
||||
* @return uint16_t. Value of @ref RTR register.
|
||||
* @brief Get @ref _RTR_ register
|
||||
* @return uint16_t. Value of @ref _RTR_ register.
|
||||
* @sa setRTR()
|
||||
*/
|
||||
//M20150401 : Type explict declaration
|
||||
/*
|
||||
#define getRTR() \
|
||||
((WIZCHIP_READ(RTR) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(RTR,1)))
|
||||
((WIZCHIP_READ(_RTR_) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(_RTR_,1)))
|
||||
*/
|
||||
#define getRTR() \
|
||||
(((uint16_t)WIZCHIP_READ(_RTR_) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(_RTR_,1)))
|
||||
|
||||
|
||||
/**
|
||||
* @ingroup Common_register_access_function
|
||||
* @brief Set @ref RCR register
|
||||
* @param (uint8_t)rcr Value to set @ref RCR register.
|
||||
* @brief Set @ref _RCR_ register
|
||||
* @param (uint8_t)rcr Value to set @ref _RCR_ register.
|
||||
* @sa getRCR()
|
||||
*/
|
||||
#define setRCR(rcr) \
|
||||
WIZCHIP_WRITE(RCR, rcr)
|
||||
WIZCHIP_WRITE(_RCR_, rcr)
|
||||
|
||||
/**
|
||||
* @ingroup Common_register_access_function
|
||||
* @brief Get @ref RCR register
|
||||
* @return uint8_t. Value of @ref RCR register.
|
||||
* @brief Get @ref _RCR_ register
|
||||
* @return uint8_t. Value of @ref _RCR_ register.
|
||||
* @sa setRCR()
|
||||
*/
|
||||
#define getRCR() \
|
||||
WIZCHIP_READ(RCR)
|
||||
WIZCHIP_READ(_RCR_)
|
||||
|
||||
//================================================== test done ===========================================================
|
||||
|
||||
@ -1523,8 +1542,13 @@ void WIZCHIP_WRITE_BUF(uint32_t AddrSel, uint8_t* pBuf, uint16_t len);
|
||||
* @sa setPSID()
|
||||
*/
|
||||
//uint16_t getPSID(void);
|
||||
//M20150401 : Type explict declaration
|
||||
/*
|
||||
#define getPSID() \
|
||||
((WIZCHIP_READ(PSID) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(PSID,1)))
|
||||
*/
|
||||
#define getPSID() \
|
||||
(((uint16_t)WIZCHIP_READ(PSID) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(PSID,1)))
|
||||
|
||||
/**
|
||||
* @ingroup Common_register_access_function
|
||||
@ -1543,24 +1567,39 @@ void WIZCHIP_WRITE_BUF(uint32_t AddrSel, uint8_t* pBuf, uint16_t len);
|
||||
* @return uint16_t. Value of @ref PMRU register.
|
||||
* @sa setPMRU()
|
||||
*/
|
||||
//M20150401 : Type explict declaration
|
||||
/*
|
||||
#define getPMRU() \
|
||||
((WIZCHIP_READ(PMRU) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(PMRU,1)))
|
||||
*/
|
||||
#define getPMRU() \
|
||||
(((uint16_t)WIZCHIP_READ(PMRU) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(PMRU,1)))
|
||||
|
||||
/**
|
||||
* @ingroup Common_register_access_function
|
||||
* @brief Get unreachable IP address
|
||||
* @param (uint8_t*)uipr Pointer variable to get unreachable IP address. It should be allocated 4 bytes.
|
||||
*/
|
||||
//M20150401 : Size Error of UIPR (6 -> 4)
|
||||
/*
|
||||
#define getUIPR(uipr) \
|
||||
WIZCHIP_READ_BUF(UIPR,uipr,6)
|
||||
*/
|
||||
#define getUIPR(uipr) \
|
||||
WIZCHIP_READ_BUF(UIPR,uipr,4)
|
||||
|
||||
/**
|
||||
* @ingroup Common_register_access_function
|
||||
* @brief Get @ref UPORTR register
|
||||
* @return uint16_t. Value of @ref UPORTR register.
|
||||
*/
|
||||
//M20150401 : Type explict declaration
|
||||
/*
|
||||
#define getUPORTR() \
|
||||
((WIZCHIP_READ(UPORTR) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(UPORTR,1)))
|
||||
*/
|
||||
#define getUPORTR() \
|
||||
(((uint16_t)WIZCHIP_READ(UPORTR) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(UPORTR,1)))
|
||||
|
||||
/**
|
||||
* @ingroup Common_register_access_function
|
||||
@ -1701,8 +1740,13 @@ void WIZCHIP_WRITE_BUF(uint32_t AddrSel, uint8_t* pBuf, uint16_t len);
|
||||
* @return uint16_t. Value of @ref Sn_PORT.
|
||||
* @sa setSn_PORT()
|
||||
*/
|
||||
//M20150401 : Type explict declaration
|
||||
/*
|
||||
#define getSn_PORT(sn) \
|
||||
((WIZCHIP_READ(Sn_PORT(sn)) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_PORT(sn),1)))
|
||||
*/
|
||||
#define getSn_PORT(sn) \
|
||||
(((uint16_t)WIZCHIP_READ(Sn_PORT(sn)) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_PORT(sn),1)))
|
||||
|
||||
/**
|
||||
* @ingroup Socket_register_access_function
|
||||
@ -1763,8 +1807,13 @@ void WIZCHIP_WRITE_BUF(uint32_t AddrSel, uint8_t* pBuf, uint16_t len);
|
||||
* @return uint16_t. Value of @ref Sn_DPORT.
|
||||
* @sa setSn_DPORT()
|
||||
*/
|
||||
//M20150401 : Type explict declaration
|
||||
/*
|
||||
#define getSn_DPORT(sn) \
|
||||
((WIZCHIP_READ(Sn_DPORT(sn)) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_DPORT(sn),1)))
|
||||
*/
|
||||
#define getSn_DPORT(sn) \
|
||||
(((uint16_t)WIZCHIP_READ(Sn_DPORT(sn)) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_DPORT(sn),1)))
|
||||
|
||||
/**
|
||||
* @ingroup Socket_register_access_function
|
||||
@ -1785,8 +1834,13 @@ void WIZCHIP_WRITE_BUF(uint32_t AddrSel, uint8_t* pBuf, uint16_t len);
|
||||
* @return uint16_t. Value of @ref Sn_MSSR.
|
||||
* @sa setSn_MSSR()
|
||||
*/
|
||||
//M20150401 : Type explict declaration
|
||||
/*
|
||||
#define getSn_MSSR(sn) \
|
||||
((WIZCHIP_READ(Sn_MSSR(sn)) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_MSSR(sn),1)))
|
||||
*/
|
||||
#define getSn_MSSR(sn) \
|
||||
(((uint16_t)WIZCHIP_READ(Sn_MSSR(sn)) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_MSSR(sn),1)))
|
||||
|
||||
/**
|
||||
* @ingroup Socket_register_access_function
|
||||
@ -1885,8 +1939,13 @@ uint16_t getSn_TX_FSR(uint8_t sn);
|
||||
* @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
|
||||
* @return uint16_t. Value of @ref Sn_TX_RD.
|
||||
*/
|
||||
//M20150401 : Type explict declaration
|
||||
/*
|
||||
#define getSn_TX_RD(sn) \
|
||||
((WIZCHIP_READ(Sn_TX_RD(sn)) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_RD(sn),1)))
|
||||
*/
|
||||
#define getSn_TX_RD(sn) \
|
||||
(((uint16_t)WIZCHIP_READ(Sn_TX_RD(sn)) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_RD(sn),1)))
|
||||
|
||||
/**
|
||||
* @ingroup Socket_register_access_function
|
||||
@ -1907,8 +1966,13 @@ uint16_t getSn_TX_FSR(uint8_t sn);
|
||||
* @return uint16_t. Value of @ref Sn_TX_WR.
|
||||
* @sa setSn_TX_WR()
|
||||
*/
|
||||
//M20150401 : Type explict declaration
|
||||
/*
|
||||
#define getSn_TX_WR(sn) \
|
||||
((WIZCHIP_READ(Sn_TX_WR(sn)) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_WR(sn),1)))
|
||||
*/
|
||||
#define getSn_TX_WR(sn) \
|
||||
(((uint16_t)WIZCHIP_READ(Sn_TX_WR(sn)) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_WR(sn),1)))
|
||||
|
||||
|
||||
/**
|
||||
@ -1939,8 +2003,13 @@ uint16_t getSn_RX_RSR(uint8_t sn);
|
||||
* @regurn uint16_t. Value of @ref Sn_RX_RD.
|
||||
* @sa setSn_RX_RD()
|
||||
*/
|
||||
//M20150401 : Type explict declaration
|
||||
/*
|
||||
#define getSn_RX_RD(sn) \
|
||||
((WIZCHIP_READ(Sn_RX_RD(sn)) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RD(sn),1)))
|
||||
*/
|
||||
#define getSn_RX_RD(sn) \
|
||||
(((uint16_t)WIZCHIP_READ(Sn_RX_RD(sn)) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RD(sn),1)))
|
||||
|
||||
/**
|
||||
* @ingroup Socket_register_access_function
|
||||
@ -1948,9 +2017,13 @@ uint16_t getSn_RX_RSR(uint8_t sn);
|
||||
* @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
|
||||
* @return uint16_t. Value of @ref Sn_RX_WR.
|
||||
*/
|
||||
//M20150401 : Type explict declaration
|
||||
/*
|
||||
#define getSn_RX_WR(sn) \
|
||||
((WIZCHIP_READ(Sn_RX_WR(sn)) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_WR(sn),1)))
|
||||
|
||||
*/
|
||||
#define getSn_RX_WR(sn) \
|
||||
(((uint16_t)WIZCHIP_READ(Sn_RX_WR(sn)) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_WR(sn),1)))
|
||||
|
||||
/**
|
||||
* @ingroup Socket_register_access_function
|
||||
@ -1971,8 +2044,13 @@ uint16_t getSn_RX_RSR(uint8_t sn);
|
||||
* @return uint16_t. Value of @ref Sn_FRAG.
|
||||
* @sa setSn_FRAG()
|
||||
*/
|
||||
//M20150401 : Type explict declaration
|
||||
/*
|
||||
#define getSn_FRAG(sn) \
|
||||
((WIZCHIP_READ(Sn_FRAG(sn)) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_FRAG(sn),1)))
|
||||
*/
|
||||
#define getSn_FRAG(sn) \
|
||||
(((uint16_t)WIZCHIP_READ(Sn_FRAG(sn)) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_FRAG(sn),1)))
|
||||
|
||||
/**
|
||||
* @ingroup Socket_register_access_function
|
||||
@ -2004,17 +2082,26 @@ uint16_t getSn_RX_RSR(uint8_t sn);
|
||||
* @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
|
||||
* @return uint16_t. Value of Socket n RX max buffer size.
|
||||
*/
|
||||
//M20150401 : Type explict declaration
|
||||
/*
|
||||
#define getSn_RxMAX(sn) \
|
||||
(getSn_RXBUF_SIZE(sn) << 10)
|
||||
*/
|
||||
#define getSn_RxMAX(sn) \
|
||||
(((uint16_t)getSn_RXBUF_SIZE(sn)) << 10)
|
||||
|
||||
/**
|
||||
* @brief Gets the max buffer size of socket sn passed as parameters.
|
||||
* @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.
|
||||
* @return uint16_t. Value of Socket n TX max buffer size.
|
||||
*/
|
||||
//uint16_t getSn_TxMAX(uint8_t sn);
|
||||
//M20150401 : Type explict declaration
|
||||
/*
|
||||
#define getSn_TxMAX(sn) \
|
||||
(getSn_TXBUF_SIZE(sn) << 10)
|
||||
*/
|
||||
#define getSn_TxMAX(sn) \
|
||||
(((uint16_t)getSn_TXBUF_SIZE(sn)) << 10)
|
||||
|
||||
/**
|
||||
* @ingroup Basic_IO_function
|
||||
@ -2059,4 +2146,6 @@ void wiz_recv_data(uint8_t sn, uint8_t *wizdata, uint16_t len);
|
||||
*/
|
||||
void wiz_recv_ignore(uint8_t sn, uint16_t len);
|
||||
|
||||
#endif
|
||||
|
||||
#endif // _W5500_H_
|
||||
|
@ -55,7 +55,9 @@
|
||||
//*****************************************************************************
|
||||
#include "socket.h"
|
||||
|
||||
#define SOCK_ANY_PORT_NUM 0xC000;
|
||||
//M20150401 : Typing Error
|
||||
//#define SOCK_ANY_PORT_NUM 0xC000;
|
||||
#define SOCK_ANY_PORT_NUM 0xC000
|
||||
|
||||
static uint16_t sock_any_port = SOCK_ANY_PORT_NUM;
|
||||
static uint16_t sock_io_mode = 0;
|
||||
@ -95,6 +97,11 @@ int8_t socket(uint8_t sn, uint8_t protocol, uint16_t port, uint8_t flag)
|
||||
switch(protocol)
|
||||
{
|
||||
case Sn_MR_TCP :
|
||||
{
|
||||
uint8_t taddr[4];
|
||||
getSIPR(taddr);
|
||||
if(taddr == 0) return SOCKERR_SOCKINIT;
|
||||
}
|
||||
case Sn_MR_UDP :
|
||||
case Sn_MR_MACRAW :
|
||||
break;
|
||||
@ -144,6 +151,9 @@ int8_t socket(uint8_t sn, uint8_t protocol, uint16_t port, uint8_t flag)
|
||||
setSn_PORT(sn,port);
|
||||
setSn_CR(sn,Sn_CR_OPEN);
|
||||
while(getSn_CR(sn));
|
||||
//A20150401 : For release the previous sock_io_mode
|
||||
sock_io_mode &= ~(1 <<sn);
|
||||
//
|
||||
sock_io_mode |= ((flag & SF_IO_NONBLOCK) << sn);
|
||||
sock_is_sending &= ~(1<<sn);
|
||||
sock_remained_size[sn] = 0;
|
||||
@ -161,6 +171,9 @@ int8_t close(uint8_t sn)
|
||||
while( getSn_CR(sn) );
|
||||
/* clear all interrupt of the socket. */
|
||||
setSn_IR(sn, 0xFF);
|
||||
//A20150401 : Release the sock_io_mode of socket n.
|
||||
sock_io_mode &= ~(1<<sn);
|
||||
//
|
||||
sock_is_sending &= ~(1<<sn);
|
||||
sock_remained_size[sn] = 0;
|
||||
sock_pack_info[sn] = 0;
|
||||
@ -207,9 +220,6 @@ int8_t connect(uint8_t sn, uint8_t * addr, uint16_t port)
|
||||
if(port == 0) return SOCKERR_PORTZERO;
|
||||
setSn_DIPR(sn,addr);
|
||||
setSn_DPORT(sn,port);
|
||||
#if _WIZCHIP_ == 5200 // for W5200 ARP errata
|
||||
setSUBR(0);
|
||||
#endif
|
||||
setSn_CR(sn,Sn_CR_CONNECT);
|
||||
while(getSn_CR(sn));
|
||||
if(sock_io_mode & (1<<sn)) return SOCK_BUSY;
|
||||
@ -218,9 +228,6 @@ int8_t connect(uint8_t sn, uint8_t * addr, uint16_t port)
|
||||
if (getSn_IR(sn) & Sn_IR_TIMEOUT)
|
||||
{
|
||||
setSn_IR(sn, Sn_IR_TIMEOUT);
|
||||
#if _WIZCHIP_ == 5200 // for W5200 ARP errata
|
||||
setSUBR((uint8_t*)"\x00\x00\x00\x00");
|
||||
#endif
|
||||
return SOCKERR_TIMEOUT;
|
||||
}
|
||||
|
||||
@ -229,9 +236,6 @@ int8_t connect(uint8_t sn, uint8_t * addr, uint16_t port)
|
||||
return SOCKERR_SOCKCLOSED;
|
||||
}
|
||||
}
|
||||
#if _WIZCHIP_ == 5200 // for W5200 ARP errata
|
||||
setSUBR((uint8_t*)"\x00\x00\x00\x00");
|
||||
#endif
|
||||
|
||||
return SOCK_OK;
|
||||
}
|
||||
@ -272,12 +276,14 @@ int32_t send(uint8_t sn, uint8_t * buf, uint16_t len)
|
||||
if(tmp & Sn_IR_SENDOK)
|
||||
{
|
||||
setSn_IR(sn, Sn_IR_SENDOK);
|
||||
#if _WZICHIP_ == 5200
|
||||
//M20150401 : Typing Error
|
||||
//#if _WZICHIP_ == 5200
|
||||
#if _WIZCHIP_ == 5200
|
||||
if(getSn_TX_RD(sn) != sock_next_rd[sn])
|
||||
{
|
||||
setSn_CR(sn,Sn_CR_SEND);
|
||||
while(getSn_CR(sn));
|
||||
return SOCKERR_BUSY;
|
||||
return SOCK_BUSY;
|
||||
}
|
||||
#endif
|
||||
sock_is_sending &= ~(1<<sn);
|
||||
@ -311,7 +317,9 @@ int32_t send(uint8_t sn, uint8_t * buf, uint16_t len)
|
||||
/* wait to process the command... */
|
||||
while(getSn_CR(sn));
|
||||
sock_is_sending |= (1 << sn);
|
||||
return len;
|
||||
//M20150409 : Explicit Type Casting
|
||||
//return len;
|
||||
return (int32_t)len;
|
||||
}
|
||||
|
||||
|
||||
@ -353,7 +361,9 @@ int32_t recv(uint8_t sn, uint8_t * buf, uint16_t len)
|
||||
wiz_recv_data(sn, buf, len);
|
||||
setSn_CR(sn,Sn_CR_RECV);
|
||||
while(getSn_CR(sn));
|
||||
return len;
|
||||
//M20150409 : Explicit Type Casting
|
||||
//return len;
|
||||
return (int32_t)len;
|
||||
}
|
||||
|
||||
int32_t sendto(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t port)
|
||||
@ -384,7 +394,7 @@ int32_t sendto(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t
|
||||
//
|
||||
//if(*((uint32_t*)addr) == 0) return SOCKERR_IPINVALID;
|
||||
if(taddr == 0) return SOCKERR_IPINVALID;
|
||||
if(port == 0) return SOCKERR_PORTZERO;
|
||||
if(port == 0) return SOCKERR_PORTZERO;
|
||||
tmp = getSn_SR(sn);
|
||||
if(tmp != SOCK_MACRAW && tmp != SOCK_UDP) return SOCKERR_SOCKSTATUS;
|
||||
|
||||
@ -401,16 +411,19 @@ int32_t sendto(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t
|
||||
};
|
||||
wiz_send_data(sn, buf, len);
|
||||
|
||||
#if _WIZCHIP_ == 5200 // for W5200 ARP errata
|
||||
setSUBR(0);
|
||||
#if _WIZCHIP_ < 5500 //M20150401 : for WIZCHIP Errata #4, #5 (ARP errata)
|
||||
getSIPR((uint8_t*)&taddr);
|
||||
if(taddr == 0)
|
||||
{
|
||||
getSUBR((uint8_t*)&taddr);
|
||||
setSUBR((uint8_t*)"\x00\x00\x00\x00");
|
||||
}
|
||||
else taddr = 0;
|
||||
#endif
|
||||
|
||||
setSn_CR(sn,Sn_CR_SEND);
|
||||
/* wait to process the command... */
|
||||
while(getSn_CR(sn));
|
||||
#if _WIZCHIP_ == 5200 // for W5200 ARP errata
|
||||
setSUBR((uint8_t*)"\x00\x00\x00\x00");
|
||||
#endif
|
||||
while(1)
|
||||
{
|
||||
tmp = getSn_IR(sn);
|
||||
@ -424,11 +437,22 @@ int32_t sendto(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t
|
||||
else if(tmp & Sn_IR_TIMEOUT)
|
||||
{
|
||||
setSn_IR(sn, Sn_IR_TIMEOUT);
|
||||
//M20150409 : Fixed the lost of sign bits by type casting.
|
||||
//len = (uint16_t)SOCKERR_TIMEOUT;
|
||||
//break;
|
||||
#if _WIZCHIP_ < 5500 //M20150401 : for WIZCHIP Errata #4, #5 (ARP errata)
|
||||
if(taddr) setSUBR((uint8_t*)&taddr);
|
||||
#endif
|
||||
return SOCKERR_TIMEOUT;
|
||||
}
|
||||
////////////
|
||||
}
|
||||
return len;
|
||||
#if _WIZCHIP_ < 5500 //M20150401 : for WIZCHIP Errata #4, #5 (ARP errata)
|
||||
if(taddr) setSUBR((uint8_t*)&taddr);
|
||||
#endif
|
||||
//M20150409 : Explicit Type Casting
|
||||
//return len;
|
||||
return (int32_t)len;
|
||||
}
|
||||
|
||||
|
||||
@ -475,7 +499,7 @@ int32_t recvfrom(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16
|
||||
setSn_CR(sn,Sn_CR_RECV);
|
||||
while(getSn_CR(sn));
|
||||
// read peer's IP address, port number & packet length
|
||||
addr[0] = head[0];
|
||||
addr[0] = head[0];
|
||||
addr[1] = head[1];
|
||||
addr[2] = head[2];
|
||||
addr[3] = head[3];
|
||||
@ -524,7 +548,9 @@ int32_t recvfrom(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16
|
||||
addr[2] = head[2];
|
||||
addr[3] = head[3];
|
||||
sock_remained_size[sn] = head[4];
|
||||
sock_remaiend_size[sn] = (sock_remained_size[sn] << 8) + head[5];
|
||||
//M20150401 : For Typing Error
|
||||
//sock_remaiend_size[sn] = (sock_remained_size[sn] << 8) + head[5];
|
||||
sock_remained_size[sn] = (sock_remained_size[sn] << 8) + head[5];
|
||||
sock_pack_info[sn] = PACK_FIRST;
|
||||
}
|
||||
//
|
||||
@ -548,7 +574,9 @@ int32_t recvfrom(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16
|
||||
//if(sock_remained_size[sn] != 0) sock_pack_info[sn] |= 0x01;
|
||||
if(sock_remained_size[sn] != 0) sock_pack_info[sn] |= PACK_REMAINED;
|
||||
//
|
||||
return pack_len;
|
||||
//M20150409 : Explicit Type Casting
|
||||
//return pack_len;
|
||||
return (int32_t)pack_len;
|
||||
}
|
||||
|
||||
|
||||
@ -583,6 +611,7 @@ int8_t ctlsocket(uint8_t sn, ctlsock_type cstype, void* arg)
|
||||
case CS_GET_INTERRUPT:
|
||||
*((uint8_t*)arg) = getSn_IR(sn);
|
||||
break;
|
||||
#if _WIZCHIP_ != 5100
|
||||
case CS_SET_INTMASK:
|
||||
if( (*(uint8_t*)arg) > SIK_ALL) return SOCKERR_ARG;
|
||||
setSn_IMR(sn,*(uint8_t*)arg);
|
||||
@ -590,6 +619,7 @@ int8_t ctlsocket(uint8_t sn, ctlsock_type cstype, void* arg)
|
||||
case CS_GET_INTMASK:
|
||||
*((uint8_t*)arg) = getSn_IMR(sn);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
return SOCKERR_ARG;
|
||||
}
|
||||
|
@ -96,7 +96,7 @@
|
||||
#define SOCK_ERROR 0
|
||||
#define SOCKERR_SOCKNUM (SOCK_ERROR - 1) ///< Invalid socket number
|
||||
#define SOCKERR_SOCKOPT (SOCK_ERROR - 2) ///< Invalid socket option
|
||||
#define SOCKERR_SOCKINIT (SOCK_ERROR - 3) ///< Socket is not initialized
|
||||
#define SOCKERR_SOCKINIT (SOCK_ERROR - 3) ///< Socket is not initialized or SIPR is Zero IP address when Sn_MR_TCP
|
||||
#define SOCKERR_SOCKCLOSED (SOCK_ERROR - 4) ///< Socket unexpectedly closed.
|
||||
#define SOCKERR_SOCKMODE (SOCK_ERROR - 5) ///< Invalid socket mode for socket operation.
|
||||
#define SOCKERR_SOCKFLAG (SOCK_ERROR - 6) ///< Invalid socket flag
|
||||
@ -341,7 +341,9 @@ typedef enum
|
||||
SIK_RECEIVED = (1 << 2), ///< data received
|
||||
SIK_TIMEOUT = (1 << 3), ///< timeout occurred
|
||||
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;
|
||||
|
||||
/**
|
||||
@ -356,8 +358,10 @@ typedef enum
|
||||
CS_GET_MAXRXBUF, ///< get the size of socket buffer allocated in RX memory
|
||||
CS_CLR_INTERRUPT, ///< clear the interrupt of socket with @ref sockint_kind
|
||||
CS_GET_INTERRUPT, ///< get the socket interrupt. refer to @ref sockint_kind
|
||||
CS_SET_INTMASK, ///< set the interrupt mask of socket with @ref sockint_kind
|
||||
CS_GET_INTMASK ///< get the masked interrupt of socket. refer to @ref sockint_kind
|
||||
#if _WIZCHIP_ > 5100
|
||||
CS_SET_INTMASK, ///< set the interrupt mask of socket with @ref sockint_kind, Not supported in W5100
|
||||
CS_GET_INTMASK ///< get the masked interrupt of socket. refer to @ref sockint_kind, Not supported in W5100
|
||||
#endif
|
||||
}ctlsock_type;
|
||||
|
||||
|
||||
@ -374,9 +378,9 @@ typedef enum
|
||||
SO_DESTIP, ///< Set/Get the destination IP address. @ref Sn_DIPR ( @ref setSn_DIPR(), @ref getSn_DIPR() )
|
||||
SO_DESTPORT, ///< Set/Get the destination Port number. @ref Sn_DPORT ( @ref setSn_DPORT(), @ref getSn_DPORT() )
|
||||
#if _WIZCHIP_ != 5100
|
||||
SO_KEEPALIVESEND, ///< Valid only in setsockopt. Manually send keep-alive packet in TCP mode
|
||||
SO_KEEPALIVESEND, ///< Valid only in setsockopt. Manually send keep-alive packet in TCP mode, Not supported in W5100
|
||||
#if _WIZCHIP_ > 5200
|
||||
SO_KEEPALIVEAUTO, ///< Set/Get keep-alive auto transmission timer in TCP mode
|
||||
SO_KEEPALIVEAUTO, ///< Set/Get keep-alive auto transmission timer in TCP mode, Not supported in W5100, W5200
|
||||
#endif
|
||||
#endif
|
||||
SO_SENDBUF, ///< Valid only in getsockopt. Get the free data size of Socekt TX buffer. @ref Sn_TX_FSR, @ref getSn_TX_FSR()
|
||||
|
@ -53,30 +53,43 @@
|
||||
//
|
||||
|
||||
#include "wizchip_conf.h"
|
||||
|
||||
/////////////
|
||||
//M20150401 : Remove ; in the default callback function such as wizchip_cris_enter(), wizchip_cs_select() and etc.
|
||||
/////////////
|
||||
|
||||
/**
|
||||
* @brief Default function to enable interrupt.
|
||||
* @note This function help not to access wrong address. If you do not describe this function or register any functions,
|
||||
* null function is called.
|
||||
*/
|
||||
void wizchip_cris_enter(void) {};
|
||||
//void wizchip_cris_enter(void) {};
|
||||
void wizchip_cris_enter(void) {}
|
||||
|
||||
/**
|
||||
* @brief Default function to disable interrupt.
|
||||
* @note This function help not to access wrong address. If you do not describe this function or register any functions,
|
||||
* null function is called.
|
||||
*/
|
||||
void wizchip_cris_exit(void) {};
|
||||
//void wizchip_cris_exit(void) {};
|
||||
void wizchip_cris_exit(void) {}
|
||||
|
||||
/**
|
||||
* @brief Default function to select chip.
|
||||
* @note This function help not to access wrong address. If you do not describe this function or register any functions,
|
||||
* null function is called.
|
||||
*/
|
||||
void wizchip_cs_select(void) {};
|
||||
//void wizchip_cs_select(void) {};
|
||||
void wizchip_cs_select(void) {}
|
||||
|
||||
/**
|
||||
* @brief Default function to deselect chip.
|
||||
* @note This function help not to access wrong address. If you do not describe this function or register any functions,
|
||||
* null function is called.
|
||||
*/
|
||||
void wizchip_cs_deselect(void) {};
|
||||
//void wizchip_cs_deselect(void) {};
|
||||
void wizchip_cs_deselect(void) {}
|
||||
|
||||
/**
|
||||
* @brief Default function to read in direct or indirect interface.
|
||||
* @note This function help not to access wrong address. If you do not describe this function or register any functions,
|
||||
@ -84,7 +97,9 @@ void wizchip_cs_deselect(void) {};
|
||||
*/
|
||||
//M20140501 : Explict pointer type casting
|
||||
//uint8_t wizchip_bus_readbyte(uint32_t AddrSel) { return * ((volatile uint8_t *) AddrSel); };
|
||||
uint8_t wizchip_bus_readbyte(uint32_t AddrSel) { return * ((volatile uint8_t *)((ptrdiff_t) AddrSel)); };
|
||||
//uint8_t wizchip_bus_readbyte(uint32_t AddrSel) { return * ((volatile uint8_t *)((ptrdiff_t) AddrSel)); };
|
||||
uint8_t wizchip_bus_readbyte(uint32_t AddrSel) { return * ((volatile uint8_t *)((ptrdiff_t) AddrSel)); }
|
||||
|
||||
/**
|
||||
* @brief Default function to write in direct or indirect interface.
|
||||
* @note This function help not to access wrong address. If you do not describe this function or register any functions,
|
||||
@ -93,37 +108,49 @@ uint8_t wizchip_bus_readbyte(uint32_t AddrSel) { return * ((volatile uint8_t *)(
|
||||
|
||||
//M20140501 : Explict pointer type casting
|
||||
//void wizchip_bus_writebyte(uint32_t AddrSel, uint8_t wb) { *((volatile uint8_t*) AddrSel) = wb; };
|
||||
void wizchip_bus_writebyte(uint32_t AddrSel, uint8_t wb) { *((volatile uint8_t*)((ptrdiff_t)AddrSel)) = wb; };
|
||||
//void wizchip_bus_writebyte(uint32_t AddrSel, uint8_t wb) { *((volatile uint8_t*)((ptrdiff_t)AddrSel)) = wb; };
|
||||
void wizchip_bus_writebyte(uint32_t AddrSel, uint8_t wb) { *((volatile uint8_t*)((ptrdiff_t)AddrSel)) = wb; }
|
||||
|
||||
/**
|
||||
* @brief Default function to read in SPI interface.
|
||||
* @note This function help not to access wrong address. If you do not describe this function or register any functions,
|
||||
* null function is called.
|
||||
*/
|
||||
uint8_t wizchip_spi_readbyte(void) {return 0;};
|
||||
//uint8_t wizchip_spi_readbyte(void) {return 0;};
|
||||
uint8_t wizchip_spi_readbyte(void) {return 0;}
|
||||
|
||||
/**
|
||||
* @brief Default function to write in SPI interface.
|
||||
* @note This function help not to access wrong address. If you do not describe this function or register any functions,
|
||||
* null function is called.
|
||||
*/
|
||||
void wizchip_spi_writebyte(uint8_t wb) {};
|
||||
//void wizchip_spi_writebyte(uint8_t wb) {};
|
||||
void wizchip_spi_writebyte(uint8_t wb) {}
|
||||
|
||||
/**
|
||||
* @brief Default function to burst read in SPI interface.
|
||||
* @note This function help not to access wrong address. If you do not describe this function or register any functions,
|
||||
* null function is called.
|
||||
*/
|
||||
void wizchip_spi_readburst(uint8_t* pBuf, uint16_t len) {};
|
||||
//void wizchip_spi_readburst(uint8_t* pBuf, uint16_t len) {};
|
||||
void wizchip_spi_readburst(uint8_t* pBuf, uint16_t len) {}
|
||||
|
||||
/**
|
||||
* @brief Default function to burst write in SPI interface.
|
||||
* @note This function help not to access wrong address. If you do not describe this function or register any functions,
|
||||
* null function is called.
|
||||
*/
|
||||
void wizchip_spi_writeburst(uint8_t* pBuf, uint16_t len) {};
|
||||
//void wizchip_spi_writeburst(uint8_t* pBuf, uint16_t len) {};
|
||||
void wizchip_spi_writeburst(uint8_t* pBuf, uint16_t len) {}
|
||||
|
||||
/**
|
||||
* @\ref _WIZCHIP instance
|
||||
*/
|
||||
//
|
||||
//M20150401 : For a compiler didnot support a member of structure
|
||||
// Replace the assignment of struct members with the assingment of array
|
||||
//
|
||||
/*
|
||||
_WIZCHIP WIZCHIP =
|
||||
{
|
||||
.id = _WIZCHIP_ID_,
|
||||
@ -137,6 +164,21 @@ _WIZCHIP WIZCHIP =
|
||||
// .IF.SPI._read_byte = wizchip_spi_readbyte,
|
||||
// .IF.SPI._write_byte = wizchip_spi_writebyte
|
||||
};
|
||||
*/
|
||||
_WIZCHIP WIZCHIP =
|
||||
{
|
||||
_WIZCHIP_IO_MODE_,
|
||||
_WIZCHIP_ID_ ,
|
||||
wizchip_cris_enter,
|
||||
wizchip_cris_exit,
|
||||
wizchip_cs_select,
|
||||
wizchip_cs_deselect,
|
||||
wizchip_bus_readbyte,
|
||||
wizchip_bus_writebyte
|
||||
// wizchip_spi_readbyte,
|
||||
// wizchip_spi_writebyte
|
||||
};
|
||||
|
||||
|
||||
static uint8_t _DNS_[4]; // DNS server ip address
|
||||
static dhcp_mode _DHCP_; // DHCP mode
|
||||
@ -220,7 +262,9 @@ void reg_wizchip_spiburst_cbfunc(void (*spi_rb)(uint8_t* pBuf, uint16_t len), vo
|
||||
|
||||
int8_t ctlwizchip(ctlwizchip_type cwtype, void* arg)
|
||||
{
|
||||
#if _WIZCHIP_ == 5200 || _WIZCHIP_ == 5500
|
||||
uint8_t tmp = 0;
|
||||
#endif
|
||||
uint8_t* ptmp[2] = {0,0};
|
||||
switch(cwtype)
|
||||
{
|
||||
@ -277,6 +321,7 @@ int8_t ctlwizchip(ctlwizchip_type cwtype, void* arg)
|
||||
case CW_SET_PHYPOWMODE:
|
||||
return wizphy_setphypmode(*(uint8_t*)arg);
|
||||
#endif
|
||||
#if _WIZCHIP_ == 5200 || _WIZCHIP_ == 5500
|
||||
case CW_GET_PHYPOWMODE:
|
||||
tmp = wizphy_getphypmode();
|
||||
if((int8_t)tmp == -1) return -1;
|
||||
@ -287,6 +332,7 @@ int8_t ctlwizchip(ctlwizchip_type cwtype, void* arg)
|
||||
if((int8_t)tmp == -1) return -1;
|
||||
*(uint8_t*)arg = tmp;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
@ -393,7 +439,7 @@ intr_kind wizchip_getinterrupt(void)
|
||||
uint16_t ret = 0;
|
||||
#if _WIZCHIP_ == 5100
|
||||
ir = getIR();
|
||||
sir = ir 0x0F;
|
||||
sir = ir & 0x0F;
|
||||
#else
|
||||
ir = getIR();
|
||||
sir = getSIR();
|
||||
@ -421,11 +467,8 @@ void wizchip_setinterruptmask(intr_kind intr)
|
||||
imr &= ~(1 << 6);
|
||||
#endif
|
||||
|
||||
#if _WIZCHIP_ < 5200
|
||||
simr &= 0x0F;
|
||||
#endif
|
||||
|
||||
#if _WIZCHIP_ == 5100
|
||||
simr &= 0x0F;
|
||||
imr |= simr;
|
||||
setIMR(imr);
|
||||
#else
|
||||
@ -441,7 +484,7 @@ intr_kind wizchip_getinterruptmask(void)
|
||||
uint16_t ret = 0;
|
||||
#if _WIZCHIP_ == 5100
|
||||
imr = getIMR();
|
||||
simr = imr 0x0F;
|
||||
simr = imr & 0x0F;
|
||||
#else
|
||||
imr = getIMR();
|
||||
simr = getSIMR();
|
||||
|
@ -87,6 +87,8 @@
|
||||
// #define _WIZCHIP_IO_MODE_ _WIZCHIP_IO_MODE_BUS_DIR_
|
||||
// #define _WIZCHIP_IO_MODE_ _WIZCHIP_IO_MODE_BUS_INDIR_
|
||||
#define _WIZCHIP_IO_MODE_ _WIZCHIP_IO_MODE_SPI_
|
||||
//A20150401 : Indclude W5100.h file
|
||||
#include "W5100/w5100.h"
|
||||
|
||||
#elif (_WIZCHIP_ == 5200)
|
||||
#define _WIZCHIP_ID_ "W5200\0"
|
||||
@ -132,7 +134,9 @@
|
||||
*/
|
||||
#define _WIZCHIP_IO_BASE_ 0x00000000 //
|
||||
|
||||
#if _WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_BUS
|
||||
//M20150401 : Typing Error
|
||||
//#if _WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_BUS
|
||||
#if _WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_BUS_
|
||||
#ifndef _WIZCHIP_IO_BASE_
|
||||
#error "You should be define _WIZCHIP_IO_BASE to fit your system memory map."
|
||||
#endif
|
||||
@ -219,14 +223,16 @@ typedef enum
|
||||
CW_GET_ID, ///< Gets WIZCHIP name.
|
||||
|
||||
#if _WIZCHIP_ == 5500
|
||||
CW_RESET_PHY, ///< Resets internal PHY. Valid Only W5000
|
||||
CW_RESET_PHY, ///< Resets internal PHY. Valid Only W5500
|
||||
CW_SET_PHYCONF, ///< When PHY configured by internal register, PHY operation mode (Manual/Auto, 10/100, Half/Full). Valid Only W5000
|
||||
CW_GET_PHYCONF, ///< Get PHY operation mode in internal register. Valid Only W5000
|
||||
CW_GET_PHYSTATUS, ///< Get real PHY status on operating. Valid Only W5000
|
||||
CW_GET_PHYCONF, ///< Get PHY operation mode in internal register. Valid Only W5500
|
||||
CW_GET_PHYSTATUS, ///< Get real PHY status on operating. Valid Only W5500
|
||||
CW_SET_PHYPOWMODE, ///< Set PHY power mode as normal and down when PHYSTATUS.OPMD == 1. Valid Only W5500
|
||||
#endif
|
||||
CW_GET_PHYPOWMODE, ///< Get PHY Power mode as down or normal
|
||||
CW_GET_PHYLINK ///< Get PHY Link status
|
||||
#if _WIZCHIP_ == 5200 || _WIZCHIP_ == 5500
|
||||
CW_GET_PHYPOWMODE, ///< Get PHY Power mode as down or normal, Valid Only W5100, W5200
|
||||
CW_GET_PHYLINK ///< Get PHY Link status, Valid Only W5100, W5200
|
||||
#endif
|
||||
}ctlwizchip_type;
|
||||
|
||||
/**
|
||||
@ -251,8 +257,10 @@ typedef enum
|
||||
*/
|
||||
typedef enum
|
||||
{
|
||||
#if _WIZCHIP_ > 5200
|
||||
#if _WIZCHIP_ == 5500
|
||||
IK_WOL = (1 << 4), ///< Wake On Lan by receiving the magic packet. Valid in W500.
|
||||
#elif _WIZCHIP_ == 5300
|
||||
IK_FMTU = (1 << 4), ///< Received a ICMP message (Fragment MTU)
|
||||
#endif
|
||||
|
||||
IK_PPPOE_TERMINATED = (1 << 5), ///< PPPoE Disconnected
|
||||
|
580
Internet/FTPClient/ftpc.c
Normal file
580
Internet/FTPClient/ftpc.c
Normal file
@ -0,0 +1,580 @@
|
||||
#include "ftpc.h"
|
||||
|
||||
un_l2cval remote_ip;
|
||||
uint16_t remote_port;
|
||||
un_l2cval local_ip;
|
||||
uint16_t local_port;
|
||||
uint8_t connect_state_control_ftpc = 0;
|
||||
uint8_t connect_state_data_ftpc = 0;
|
||||
uint8_t gModeActivePassiveflag = 0;
|
||||
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
|
||||
uint8_t gMenuStart = 0;
|
||||
uint8_t gDataSockReady = 0;
|
||||
uint8_t gDataPutGetStart = 0;
|
||||
static uint8_t gMsgBuf[20]={0,};
|
||||
|
||||
struct ftpc ftpc;
|
||||
struct Command Command;
|
||||
|
||||
void ftpc_init(uint8_t * src_ip)
|
||||
{
|
||||
ftpc.dsock_mode = ACTIVE_MODE;
|
||||
|
||||
local_ip.cVal[0] = src_ip[0];
|
||||
local_ip.cVal[1] = src_ip[1];
|
||||
local_ip.cVal[2] = src_ip[2];
|
||||
local_ip.cVal[3] = src_ip[3];
|
||||
local_port = 35000;
|
||||
strcpy(ftpc.workingdir, "/");
|
||||
socket(CTRL_SOCK, Sn_MR_TCP, FTP_destport, 0x0);
|
||||
}
|
||||
uint8_t ftpc_run(uint8_t * dbuf)
|
||||
{
|
||||
#ifndef Need_UARTGetCharBlocking_func
|
||||
uint16_t size = 0;
|
||||
long ret = 0;
|
||||
uint32_t send_byte, recv_byte;
|
||||
uint32_t blocklen;
|
||||
uint32_t remain_filesize;
|
||||
uint32_t remain_datasize;
|
||||
uint8_t msg_c;
|
||||
uint8_t dat[50]={0,};
|
||||
uint32_t totalSize = 0, availableSize = 0;
|
||||
|
||||
switch(getSn_SR(CTRL_SOCK))
|
||||
{
|
||||
case SOCK_ESTABLISHED :
|
||||
if(!connect_state_control_ftpc){
|
||||
printf("%d:FTP Connected\r\n", CTRL_SOCK);
|
||||
strcpy(ftpc.workingdir, "/");
|
||||
connect_state_control_ftpc = 1;
|
||||
}
|
||||
if(gMenuStart){
|
||||
gMenuStart = 0;
|
||||
printf("\r\n----------------------------------------\r\n");
|
||||
printf("Press menu key\r\n");
|
||||
printf("----------------------------------------\r\n");
|
||||
printf("1> View FTP Server 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", (ftpc.type==ASCII_TYPE)?"Ascii":"Binary");
|
||||
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("6> Get File from Server\r\n");
|
||||
#if defined(F_FILESYSTEM)
|
||||
printf("7> Delete My File\r\n");
|
||||
#endif
|
||||
printf("----------------------------------------\r\n");
|
||||
while(1){
|
||||
msg_c=ftp_getc();
|
||||
if(msg_c=='1'){
|
||||
if(ftpc.dsock_mode==PASSIVE_MODE){
|
||||
sprintf(dat,"PASV\r\n");
|
||||
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
|
||||
Command.First = f_dir;
|
||||
break;
|
||||
}
|
||||
else{
|
||||
wiz_NetInfo gWIZNETINFO;
|
||||
ctlnetwork(CN_GET_NETINFO, (void*) &gWIZNETINFO);
|
||||
sprintf(dat,"PORT %d,%d,%d,%d,%d,%d\r\n", gWIZNETINFO.ip[0], gWIZNETINFO.ip[1], gWIZNETINFO.ip[2], gWIZNETINFO.ip[3], (uint8_t)(local_port>>8), (uint8_t)(local_port&0x00ff));
|
||||
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
|
||||
Command.First = f_dir;
|
||||
|
||||
gModeActivePassiveflag = 1;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
else if(msg_c=='5'){
|
||||
if(ftpc.dsock_mode==PASSIVE_MODE){
|
||||
sprintf(dat,"PASV\r\n");
|
||||
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
|
||||
Command.First = f_put;
|
||||
break;
|
||||
}
|
||||
else{
|
||||
wiz_NetInfo gWIZNETINFO;
|
||||
ctlnetwork(CN_GET_NETINFO, (void*) &gWIZNETINFO);
|
||||
sprintf(dat,"PORT %d,%d,%d,%d,%d,%d\r\n", gWIZNETINFO.ip[0], gWIZNETINFO.ip[1], gWIZNETINFO.ip[2], gWIZNETINFO.ip[3], (uint8_t)(local_port>>8), (uint8_t)(local_port&0x00ff));
|
||||
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
|
||||
Command.First = f_put;
|
||||
|
||||
gModeActivePassiveflag = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if(msg_c=='6'){
|
||||
if(ftpc.dsock_mode==PASSIVE_MODE){
|
||||
sprintf(dat,"PASV\r\n");
|
||||
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
|
||||
Command.First = f_get;
|
||||
break;
|
||||
}
|
||||
else{
|
||||
wiz_NetInfo gWIZNETINFO;
|
||||
ctlnetwork(CN_GET_NETINFO, (void*) &gWIZNETINFO);
|
||||
sprintf(dat,"PORT %d,%d,%d,%d,%d,%d\r\n", gWIZNETINFO.ip[0], gWIZNETINFO.ip[1], gWIZNETINFO.ip[2], gWIZNETINFO.ip[3], (uint8_t)(local_port>>8), (uint8_t)(local_port&0x00ff));
|
||||
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
|
||||
Command.First = f_get;
|
||||
|
||||
gModeActivePassiveflag = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if(msg_c=='2'){
|
||||
#if defined(F_FILESYSTEM)
|
||||
scan_files(ftpc.workingdir, dbuf, (int *)&size);
|
||||
printf("\r\n%s\r\n", dbuf);
|
||||
getMountedMemorySize(SPI_FLASHM, &totalSize, &availableSize);
|
||||
printf(" - Available Memory Size : %ld kB / %ld kB ( %ld kB is used )\r\n", availableSize, totalSize, (totalSize - availableSize));
|
||||
#else
|
||||
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;
|
||||
break;
|
||||
}
|
||||
else if(msg_c=='3'){
|
||||
printf("1> ASCII\r\n");
|
||||
printf("2> BINARY\r\n");
|
||||
while(1){
|
||||
msg_c=ftp_getc();
|
||||
if(msg_c=='1'){
|
||||
sprintf(dat,"TYPE %c\r\n", TransferAscii);
|
||||
ftpc.type = ASCII_TYPE;
|
||||
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
|
||||
break;
|
||||
}
|
||||
else if(msg_c=='2'){
|
||||
sprintf(dat,"TYPE %c\r\n", TransferBinary);
|
||||
ftpc.type = IMAGE_TYPE;
|
||||
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
|
||||
break;
|
||||
}
|
||||
else{
|
||||
printf("\r\nRetry...\r\n");
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
else if(msg_c=='4'){
|
||||
printf("1> ACTIVE\r\n");
|
||||
printf("2> PASSIVE\r\n");
|
||||
while(1){
|
||||
msg_c=ftp_getc();
|
||||
if(msg_c=='1'){
|
||||
ftpc.dsock_mode=ACTIVE_MODE;
|
||||
break;
|
||||
}
|
||||
else if(msg_c=='2'){
|
||||
ftpc.dsock_mode=PASSIVE_MODE;
|
||||
break;
|
||||
}
|
||||
else{
|
||||
printf("\r\nRetry...\r\n");
|
||||
}
|
||||
}
|
||||
gMenuStart = 1;
|
||||
break;
|
||||
}
|
||||
#if defined(F_FILESYSTEM)
|
||||
else if(msg_c=='7'){
|
||||
printf(">del filename?");
|
||||
sprintf(ftpc.filename, "/%s\r\n", User_Keyboard_MSG());
|
||||
if (f_unlink((const char *)ftpc.filename) != 0){
|
||||
printf("\r\nCould not delete.\r\n");
|
||||
}
|
||||
else{
|
||||
printf("\r\nDeleted.\r\n");
|
||||
}
|
||||
gMenuStart = 1;
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
else{
|
||||
printf("\r\nRetry...\r\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
if(gDataSockReady){
|
||||
gDataSockReady = 0;
|
||||
switch(Command.First){
|
||||
case f_dir:
|
||||
sprintf(dat,"LIST\r\n");
|
||||
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
|
||||
break;
|
||||
case f_put:
|
||||
printf(">put file name?");
|
||||
sprintf(dat,"STOR %s\r\n", User_Keyboard_MSG());
|
||||
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
|
||||
break;
|
||||
case f_get:
|
||||
printf(">get file name?");
|
||||
sprintf(dat,"RETR %s\r\n", User_Keyboard_MSG());
|
||||
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
|
||||
break;
|
||||
default:
|
||||
printf("Command.First = default\r\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
if((size = getSn_RX_RSR(CTRL_SOCK)) > 0){ // Don't need to check SOCKERR_BUSY because it doesn't not occur.
|
||||
memset(dbuf, 0, _MAX_SS);
|
||||
if(size > _MAX_SS) size = _MAX_SS - 1;
|
||||
ret = recv(CTRL_SOCK,dbuf,size);
|
||||
dbuf[ret] = '\0';
|
||||
if(ret != size)
|
||||
{
|
||||
if(ret==SOCK_BUSY) return 0;
|
||||
if(ret < 0){
|
||||
printf("%d:recv() error:%ld\r\n",CTRL_SOCK,ret);
|
||||
close(CTRL_SOCK);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
printf("Rcvd Command: %s\r\n", dbuf);
|
||||
proc_ftpc((char *)dbuf);
|
||||
}
|
||||
break;
|
||||
case SOCK_CLOSE_WAIT :
|
||||
printf("%d:CloseWait\r\n",CTRL_SOCK);
|
||||
if((ret=disconnect(CTRL_SOCK)) != SOCK_OK) return ret;
|
||||
printf("%d:Closed\r\n",CTRL_SOCK);
|
||||
break;
|
||||
case SOCK_CLOSED :
|
||||
printf("%d:FTPStart\r\n",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);
|
||||
close(CTRL_SOCK);
|
||||
return ret;
|
||||
}
|
||||
break;
|
||||
case SOCK_INIT :
|
||||
printf("%d:Opened\r\n",CTRL_SOCK);
|
||||
if((ret = connect(CTRL_SOCK, FTP_destip, FTP_destport)) != SOCK_OK){
|
||||
printf("%d:Connect error\r\n",CTRL_SOCK);
|
||||
return ret;
|
||||
}
|
||||
connect_state_control_ftpc = 0;
|
||||
printf("%d:Connectting...\r\n",CTRL_SOCK);
|
||||
break;
|
||||
default :
|
||||
break;
|
||||
}
|
||||
|
||||
switch(getSn_SR(DATA_SOCK)){
|
||||
case SOCK_ESTABLISHED :
|
||||
if(!connect_state_data_ftpc){
|
||||
printf("%d:FTP Data socket Connected\r\n", DATA_SOCK);
|
||||
connect_state_data_ftpc = 1;
|
||||
}
|
||||
if(gDataPutGetStart){
|
||||
switch(Command.Second){
|
||||
case s_dir:
|
||||
printf("dir waitng...\r\n");
|
||||
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");
|
||||
memset(dbuf, 0, _MAX_SS);
|
||||
if(size > _MAX_SS) size = _MAX_SS - 1;
|
||||
ret = recv(DATA_SOCK,dbuf,size);
|
||||
dbuf[ret] = '\0';
|
||||
if(ret != size){
|
||||
if(ret==SOCK_BUSY) return 0;
|
||||
if(ret < 0){
|
||||
printf("%d:recv() error:%ld\r\n",CTRL_SOCK,ret);
|
||||
close(DATA_SOCK);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
printf("Rcvd Data:\n\r%s\n\r", dbuf);
|
||||
gDataPutGetStart = 0;
|
||||
}
|
||||
break;
|
||||
case s_put:
|
||||
printf("put waitng...\r\n");
|
||||
if(strlen(ftpc.workingdir) == 1)
|
||||
sprintf(ftpc.filename, "/%s", (uint8_t *)gMsgBuf);
|
||||
else
|
||||
sprintf(ftpc.filename, "%s/%s", ftpc.workingdir, (uint8_t *)gMsgBuf);
|
||||
#if defined(F_FILESYSTEM)
|
||||
ftpc.fr = f_open(&(ftpc.fil), (const char *)ftpc.filename, FA_READ);
|
||||
if(ftpc.fr == FR_OK){
|
||||
remain_filesize = ftpc.fil.fsize;
|
||||
printf("f_open return FR_OK\r\n");
|
||||
do{
|
||||
memset(dbuf, 0, _MAX_SS);
|
||||
if(remain_filesize > _MAX_SS)
|
||||
send_byte = _MAX_SS;
|
||||
else
|
||||
send_byte = remain_filesize;
|
||||
ftpc.fr = f_read(&(ftpc.fil), (void *)dbuf, send_byte , (UINT *)&blocklen);
|
||||
if(ftpc.fr != FR_OK){
|
||||
break;
|
||||
}
|
||||
printf("#");
|
||||
send(DATA_SOCK, dbuf, blocklen);
|
||||
remain_filesize -= blocklen;
|
||||
}while(remain_filesize != 0);
|
||||
printf("\r\nFile read finished\r\n");
|
||||
ftpc.fr = f_close(&(ftpc.fil));
|
||||
}
|
||||
else{
|
||||
printf("File Open Error: %d\r\n", ftpc.fr);
|
||||
ftpc.fr = f_close(&(ftpc.fil));
|
||||
}
|
||||
#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;
|
||||
disconnect(DATA_SOCK);
|
||||
break;
|
||||
case s_get:
|
||||
printf("get waitng...\r\n");
|
||||
if(strlen(ftpc.workingdir) == 1)
|
||||
sprintf(ftpc.filename, "/%s", (uint8_t *)gMsgBuf);
|
||||
else
|
||||
sprintf(ftpc.filename, "%s/%s", ftpc.workingdir, (uint8_t *)gMsgBuf);
|
||||
#if defined(F_FILESYSTEM)
|
||||
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");
|
||||
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);
|
||||
ftpc.fr = f_write(&(ftpc.fil), (const void *)dbuf, (UINT)ret, (UINT *)&blocklen);
|
||||
remain_datasize -= blocklen;
|
||||
if(ftpc.fr != FR_OK){
|
||||
printf("f_write failed\r\n");
|
||||
break;
|
||||
}
|
||||
if(remain_datasize <= 0) break;
|
||||
}
|
||||
if(ftpc.fr != FR_OK){
|
||||
printf("f_write failed\r\n");
|
||||
break;
|
||||
}
|
||||
printf("#");
|
||||
}
|
||||
else{
|
||||
if(getSn_SR(DATA_SOCK) != SOCK_ESTABLISHED) break;
|
||||
}
|
||||
}
|
||||
printf("\r\nFile write finished\r\n");
|
||||
ftpc.fr = f_close(&(ftpc.fil));
|
||||
gDataPutGetStart = 0;
|
||||
}else{
|
||||
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;
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
printf("Command.Second = default\r\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SOCK_CLOSE_WAIT :
|
||||
printf("%d:CloseWait\r\n",DATA_SOCK);
|
||||
if((ret=disconnect(DATA_SOCK)) != SOCK_OK) return ret;
|
||||
printf("%d:Closed\r\n",DATA_SOCK);
|
||||
break;
|
||||
case SOCK_CLOSED :
|
||||
if(ftpc.dsock_state == DATASOCK_READY){
|
||||
if(ftpc.dsock_mode == PASSIVE_MODE){
|
||||
printf("%d:FTPDataStart, port : %d\r\n",DATA_SOCK, local_port);
|
||||
if((ret=socket(DATA_SOCK, Sn_MR_TCP, local_port, 0x0)) != DATA_SOCK){
|
||||
printf("%d:socket() error:%ld\r\n", DATA_SOCK, ret);
|
||||
close(DATA_SOCK);
|
||||
return ret;
|
||||
}
|
||||
local_port++;
|
||||
if(local_port > 50000)
|
||||
local_port = 35000;
|
||||
}else{
|
||||
printf("%d:FTPDataStart, port : %d\r\n",DATA_SOCK, local_port);
|
||||
if((ret=socket(DATA_SOCK, Sn_MR_TCP, local_port, 0x0)) != DATA_SOCK){
|
||||
printf("%d:socket() error:%ld\r\n", DATA_SOCK, ret);
|
||||
close(DATA_SOCK);
|
||||
return ret;
|
||||
}
|
||||
local_port++;
|
||||
if(local_port > 50000)
|
||||
local_port = 35000;
|
||||
}
|
||||
ftpc.dsock_state = DATASOCK_START;
|
||||
}
|
||||
break;
|
||||
|
||||
case SOCK_INIT :
|
||||
printf("%d:Opened\r\n",DATA_SOCK);
|
||||
if(ftpc.dsock_mode == ACTIVE_MODE){
|
||||
if( (ret = listen(DATA_SOCK)) != SOCK_OK){
|
||||
printf("%d:Listen error\r\n",DATA_SOCK);
|
||||
return ret;
|
||||
}
|
||||
gDataSockReady = 1;
|
||||
printf("%d:Listen ok\r\n",DATA_SOCK);
|
||||
}else{
|
||||
if((ret = connect(DATA_SOCK, remote_ip.cVal, remote_port)) != SOCK_OK){
|
||||
printf("%d:Connect error\r\n", DATA_SOCK);
|
||||
return ret;
|
||||
}
|
||||
gDataSockReady = 1;
|
||||
}
|
||||
connect_state_data_ftpc = 0;
|
||||
break;
|
||||
default :
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
char proc_ftpc(char * buf)
|
||||
{
|
||||
uint16_t Responses;
|
||||
uint8_t dat[30]={0,};
|
||||
|
||||
Responses =(buf[0]-'0')*100+(buf[1]-'0')*10+(buf[2]-'0');
|
||||
|
||||
switch(Responses){
|
||||
case R_220: /* Service ready for new user. */
|
||||
printf("\r\nInput your User ID > ");
|
||||
sprintf(dat,"USER %s\r\n", User_Keyboard_MSG());
|
||||
printf("\r\n");
|
||||
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
|
||||
break;
|
||||
|
||||
case R_331: /* User name okay, need password. */
|
||||
printf("\r\nInput your Password > ");
|
||||
sprintf(dat,"PASS %s\r\n", User_Keyboard_MSG());
|
||||
printf("\r\n");
|
||||
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
|
||||
break;
|
||||
case R_230: /* User logged in, proceed */
|
||||
printf("\r\nUser logged in, proceed\r\n");
|
||||
|
||||
sprintf(dat,"TYPE %c\r\n", TransferAscii);
|
||||
ftpc.type = ASCII_TYPE;
|
||||
send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
|
||||
break;
|
||||
case R_200:
|
||||
if((ftpc.dsock_mode==ACTIVE_MODE)&&gModeActivePassiveflag){
|
||||
ftpc.dsock_state = DATASOCK_READY;
|
||||
gModeActivePassiveflag = 0;
|
||||
}
|
||||
else{
|
||||
gMenuStart = 1;
|
||||
}
|
||||
break;
|
||||
case R_150:
|
||||
switch(Command.First){
|
||||
case f_dir:
|
||||
Command.Second = s_dir;
|
||||
gDataPutGetStart = 1;
|
||||
break;
|
||||
case f_get:
|
||||
Command.Second = s_get;
|
||||
gDataPutGetStart = 1;
|
||||
break;
|
||||
case f_put:
|
||||
Command.Second = s_put;
|
||||
gDataPutGetStart = 1;
|
||||
break;
|
||||
default :
|
||||
printf("Command.First = default\r\n");
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case R_226:
|
||||
gMenuStart = 1;
|
||||
break;
|
||||
case R_227:
|
||||
if (pportc(buf) == -1){
|
||||
printf("Bad port syntax\r\n");
|
||||
}
|
||||
else{
|
||||
printf("Go Open Data Sock...\r\n ");
|
||||
ftpc.dsock_mode = PASSIVE_MODE;
|
||||
ftpc.dsock_state = DATASOCK_READY;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
printf("\r\nDefault Status = %d\r\n",(uint16_t)Responses);
|
||||
gDataSockReady = 1;
|
||||
break;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
int pportc(char * arg)
|
||||
{
|
||||
int i;
|
||||
char* tok=0;
|
||||
strtok(arg,"(");
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
if(i==0) tok = strtok(NULL,",\r\n");
|
||||
else tok = strtok(NULL,",");
|
||||
remote_ip.cVal[i] = (uint8_t)atoi(tok, 10);
|
||||
if (!tok){
|
||||
printf("bad pport : %s\r\n", arg);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
remote_port = 0;
|
||||
for (i = 0; i < 2; i++){
|
||||
tok = strtok(NULL,",\r\n");
|
||||
remote_port <<= 8;
|
||||
remote_port += atoi(tok, 10);
|
||||
if (!tok){
|
||||
printf("bad pport : %s\r\n", arg);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
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;
|
||||
}
|
||||
uint8_t* User_Keyboard_MSG()
|
||||
{
|
||||
uint8_t i=0;
|
||||
do{
|
||||
gMsgBuf[i] = ftp_getc();
|
||||
i++;
|
||||
}while(gMsgBuf[i-1]!=0x0d);
|
||||
gMsgBuf[i-1]=0;
|
||||
return gMsgBuf;
|
||||
}
|
116
Internet/FTPClient/ftpc.h
Normal file
116
Internet/FTPClient/ftpc.h
Normal file
@ -0,0 +1,116 @@
|
||||
#ifndef _FTPC_H_
|
||||
#define _FTPC_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_APP_FTPC
|
||||
|
||||
/* 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.
|
||||
* Board_UARTGetCharBlocking()
|
||||
* Below is an example of a function of lpc_chip library. */
|
||||
//#define ftp_getc() Board_UARTGetCharBlocking()
|
||||
|
||||
#ifdef F_FILESYSTEM
|
||||
#include "ff.h"
|
||||
#endif
|
||||
|
||||
#ifndef ftp_getc()
|
||||
#define Need_UARTGetCharBlocking_func
|
||||
#else
|
||||
#include "board_api.h"
|
||||
#endif
|
||||
|
||||
|
||||
#define LINELEN 100
|
||||
#ifndef F_FILESYSTEM
|
||||
#define _MAX_SS 512
|
||||
#endif
|
||||
|
||||
#define CTRL_SOCK 2
|
||||
#define DATA_SOCK 3
|
||||
|
||||
/* 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 'A'
|
||||
#define TransferBinary 'I'
|
||||
|
||||
enum ftpc_type {
|
||||
ASCII_TYPE,
|
||||
IMAGE_TYPE,
|
||||
};
|
||||
|
||||
enum ftpc_datasock_state{
|
||||
DATASOCK_IDLE,
|
||||
DATASOCK_READY,
|
||||
DATASOCK_START
|
||||
};
|
||||
|
||||
enum ftpc_datasock_mode{
|
||||
PASSIVE_MODE,
|
||||
ACTIVE_MODE
|
||||
};
|
||||
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 ftpc {
|
||||
uint8_t control; /* Control stream */
|
||||
uint8_t data; /* Data stream */
|
||||
|
||||
enum ftpc_type type; /* Transfer type */
|
||||
|
||||
enum ftpc_datasock_state dsock_state;
|
||||
enum ftpc_datasock_mode dsock_mode;
|
||||
|
||||
char workingdir[LINELEN];
|
||||
char filename[LINELEN];
|
||||
|
||||
#ifdef F_FILESYSTEM
|
||||
FIL fil; // FatFs File objects
|
||||
FRESULT fr; // FatFs function common result code
|
||||
#endif
|
||||
};
|
||||
|
||||
#ifndef un_I2cval
|
||||
typedef union _un_l2cval {
|
||||
uint32_t lVal;
|
||||
uint8_t cVal[4];
|
||||
}un_l2cval;
|
||||
#endif
|
||||
|
||||
void ftpc_init(uint8_t * src_ip);
|
||||
uint8_t ftpc_run(uint8_t * dbuf);
|
||||
char proc_ftpc(char * buf);
|
||||
int pportc(char * arg);
|
||||
uint8_t* User_Keyboard_MSG();
|
||||
|
||||
#endif // _FTPC_H_
|
67
Internet/FTPClient/stdio_private.h
Normal file
67
Internet/FTPClient/stdio_private.h
Normal file
@ -0,0 +1,67 @@
|
||||
/* Copyright (c) 2002, Joerg Wunsch
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name of the copyright holders nor the names of
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/* $Id: stdio_private.h,v 1.6 2003/01/07 22:17:24 joerg_wunsch Exp $ */
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
|
||||
struct __file {
|
||||
char *buf; /* buffer pointer */
|
||||
unsigned char unget; /* ungetc() buffer */
|
||||
uint8_t flags; /* flags, see below */
|
||||
#define __SRD 0x0001 /* OK to read */
|
||||
#define __SWR 0x0002 /* OK to write */
|
||||
#define __SSTR 0x0004 /* this is an sprintf/snprintf string */
|
||||
#define __SPGM 0x0008 /* fmt string is in progmem */
|
||||
#define __SERR 0x0010 /* found error */
|
||||
#define __SEOF 0x0020 /* found EOF */
|
||||
#define __SUNGET 0x040 /* ungetc() happened */
|
||||
#if 0
|
||||
/* possible future extensions, will require uint16_t flags */
|
||||
#define __SRW 0x0080 /* open for reading & writing */
|
||||
#define __SLBF 0x0100 /* line buffered */
|
||||
#define __SNBF 0x0200 /* unbuffered */
|
||||
#define __SMBF 0x0400 /* buf is from malloc */
|
||||
#endif
|
||||
int size; /* size of buffer */
|
||||
int len; /* characters read or written so far */
|
||||
int (*put)(char); /* function to write one char to device */
|
||||
int (*get)(void); /* function to read one char from device */
|
||||
};
|
||||
|
||||
/* values for PRINTF_LEVEL */
|
||||
#define PRINTF_MIN 1
|
||||
#define PRINTF_STD 2
|
||||
#define PRINTF_FLT 3
|
||||
|
||||
/* values for SCANF_LEVEL */
|
||||
#define SCANF_MIN 1
|
||||
#define SCANF_STD 2
|
||||
#define SCANF_FLT 3
|
15
README.md
15
README.md
@ -1,6 +1,6 @@
|
||||
#ioLibrary Driver
|
||||
The ioLibrary means “Internet Offload Library” for WIZnet chip. It includes drivers and application protocols.
|
||||
The driver (ioLibrary) can be used for [W5500](http://wizwiki.net/wiki/doku.php?id=products:w5500:start) application designs. These will be updated continuously.
|
||||
The driver (ioLibrary) can be used for the application design of WIZnet TCP/IP chips as [W5500](http://wizwiki.net/wiki/doku.php?id=products:w5500:start), W5200, W5100 and etc.
|
||||
|
||||
##ioLibrary
|
||||
This driver provides the Berkeley Socket type APIs.
|
||||
@ -16,6 +16,17 @@ This driver provides the Berkeley Socket type APIs.
|
||||
|
||||
## How to add an ioLibrary in project through github site.
|
||||
- Example, refer to https://www.youtube.com/watch?v=mt815RBGdsA
|
||||
- [ioLibrary Doxygen doument](https://github.com/Wiznet/ioLibrary_Driver/blob/master/Ethernet/SOCKET_APIs_V2.0.chm) : Refer to **TODO** in this document
|
||||
- Define what chip is used in **wizchip_conf.h**
|
||||
- Define what Host I/F mode is used in **wizchip_conf.h**
|
||||
|
||||
## Revision History
|
||||
Last release : Nov. 2014
|
||||
* Type casting error Fixed : 09, April. 2015
|
||||
In socket.c, send() : Refer to M20150409
|
||||
* ioLibrary V2.0 released : April. 2015
|
||||
* Added to W5100, W5200
|
||||
* Correct to some typing error
|
||||
* Fixed the warning of type casting.
|
||||
|
||||
* Last release : Nov. 2014
|
||||
|
||||
|
Reference in New Issue
Block a user