📄 w5300.c
字号:
/**
* \file w5300.c
* Implementation of W5300 I/O fucntions
*
* This file implements the basic I/O fucntions that access a register of W5300( IINCHIP_REG).
*
* Revision History :
* ---------- ------- ----------- ----------------------------
* Date Version Author Description
* ---------- ------- ----------- ----------------------------
* 24/03/2008 1.0.0 MidnightCow Release with W5300 launching
* ---------- ------- ----------- ----------------------------
* 01/05/2008 1.0.1 MidnightCow Modify a logical error in iinchip_irq(). Refer to M_01052008
* ---------- ------- ----------- ----------------------------
* 15/05/2008 1.1.0 MidnightCow Refer to M_15052008
* Delete getSn_DPORTR() because \ref Sn_DPORTR is write-only.
* Replace 'Sn_DHAR2' with 'Sn_DIPR' in \ref getSn_DIPR().
* ---------- ------- ----------- ----------------------------
* 08/08/2008 1.2.0 MidnightCow Refer to M_08082008
* Add IINCHIP_CRITICAL_SECTION_ENTER() & IINCHIP_CRITICAL_SECTION_EXIT() to wiz_read_buf() and wiz_write_buf().
* Modify the description of \ref Sn_SSR and \ref close().</td>
* ---------- ------- ----------- ----------------------------
*/
#include "w5300.h"
#include "lstring.h"
#include <string.h>
#include "md5.h"
/**
* TX memory size variables
*/
uint32 TXMEM_SIZE[MAX_SOCK_NUM];
/**
* RX memory size variables
*/
uint32 RXMEM_SIZE[MAX_SOCK_NUM];
/**
* The variables for SOCKETn interrupt
*/
uint8 SOCK_INT[MAX_SOCK_NUM];
/***********************
* Basic I/O Function *
***********************/
uint16 IINCHIP_READ(uint32 addr)
{
#if (__DEF_IINCHIP_ADDRESS_MODE__ == __DEF_IINCHIP_DIRECT_MODE__)
return (*((vuint16*)addr));
#else
vuint16 data;
IINCHIP_CRITICAL_SECTION_ENTER();
*((vuint16*)IDM_AR) = (uint16)addr;
data = *((vuint16*)IDM_DR);
IINCHIP_CRITICAL_SECTION_EXIT();
return data;
#endif
}
void IINCHIP_WRITE(uint32 addr,uint16 data)
{
#if (__DEF_IINCHIP_ADDRESS_MODE__ == __DEF_IINCHIP_DIRECT_MODE__)
(*((vuint16*)addr)) = data;
#else
IINCHIP_CRITICAL_SECTION_ENTER();
*((vuint16*)IDM_AR) = addr;
*((vuint16*)IDM_DR) = data;
IINCHIP_CRITICAL_SECTION_EXIT();
#endif
}
uint16 getMR(void)
{
return *((vint16*)MR);
}
void setMR(uint16 val)
{
*((vint16*)MR) = val;
}
/***********************************
* COMMON Register Access Function *
***********************************/
/* Interrupt */
uint16 getIR(void)
{
return IINCHIP_READ(IR);
}
void setIR(uint16 val)
{
IINCHIP_WRITE(IR, val);
}
uint16 getIMR(void)
{
return IINCHIP_READ(IMR);
}
void setIMR(uint16 mask)
{
IINCHIP_WRITE(IMR, mask);
}
/* Network Information */
void getSHAR(uint8 * addr)
{
addr[0] = (uint8)(IINCHIP_READ(SHAR)>>8);
addr[1] = (uint8)IINCHIP_READ(SHAR);
addr[2] = (uint8)(IINCHIP_READ(SHAR2)>>8);
addr[3] = (uint8)IINCHIP_READ(SHAR2);
addr[4] = (uint8)(IINCHIP_READ(SHAR4)>>8);
addr[5] = (uint8)IINCHIP_READ(SHAR4);
}
void setSHAR(uint8 * addr)
{
IINCHIP_WRITE(SHAR,(((uint16)addr[0])<<8)+addr[1]);
IINCHIP_WRITE(SHAR2,((uint16)addr[2]<<8)+addr[3]);
IINCHIP_WRITE(SHAR4,((uint16)addr[4]<<8)+addr[5]);
}
void getGAR(uint8 * addr)
{
addr[0] = (uint8)(IINCHIP_READ(GAR)>>8);
addr[1] = (uint8)IINCHIP_READ(GAR);
addr[2] = (uint8)(IINCHIP_READ(GAR2)>>8);
addr[3] = (uint8)IINCHIP_READ(GAR2);
}
void setGAR(uint8 * addr)
{
IINCHIP_WRITE(GAR, ((uint16)addr[0]<<8)+(uint16)addr[1]);
IINCHIP_WRITE(GAR2,((uint16)addr[2]<<8)+(uint16)addr[3]);
}
void getSUBR(uint8 * addr)
{
addr[0] = (uint8)(IINCHIP_READ(SUBR)>>8);
addr[1] = (uint8)IINCHIP_READ(SUBR);
addr[2] = (uint8)(IINCHIP_READ(SUBR2)>>8);
addr[3] = (uint8)IINCHIP_READ(SUBR2);
}
void setSUBR(uint8 * addr)
{
IINCHIP_WRITE(SUBR, ((uint16)addr[0]<<8)+(uint16)addr[1]);
IINCHIP_WRITE(SUBR2,((uint16)addr[2]<<8)+(uint16)addr[3]);
}
void getSIPR(uint8 * addr)
{
addr[0] = (uint8)(IINCHIP_READ(SIPR)>>8);
addr[1] = (uint8)IINCHIP_READ(SIPR);
addr[2] = (uint8)(IINCHIP_READ(SIPR2)>>8);
addr[3] = (uint8)IINCHIP_READ(SIPR2);
}
void setSIPR(uint8 * addr)
{
IINCHIP_WRITE(SIPR,((uint16)addr[0]<<8)+(uint16)addr[1]);
IINCHIP_WRITE(SIPR2,((uint16)addr[2]<<8)+(uint16)addr[3]);
}
/* Retransmittion */
uint16 getRTR(void)
{
return IINCHIP_READ(RTR);
}
void setRTR(uint16 timeout)
{
IINCHIP_WRITE(RTR,timeout);
}
uint8 getRCR(void)
{
return (uint8)IINCHIP_READ(RCR);
}
void setRCR(uint8 retry)
{
IINCHIP_WRITE(RCR,retry);
}
/* PPPoE */
uint16 getPATR(void)
{
return IINCHIP_READ(PATR);
}
uint8 getPTIMER(void)
{
return (uint8)IINCHIP_READ(PTIMER);
}
void setPTIMER(uint8 time)
{
IINCHIP_WRITE(PTIMER,time);
}
uint8 getPMAGICR(void)
{
return (uint8)IINCHIP_READ(PMAGICR);
}
void setPMAGICR(uint8 magic)
{
IINCHIP_WRITE(PMAGICR,magic);
}
uint16 getPSIDR(void)
{
return IINCHIP_READ(PSIDR);
}
void getPDHAR(uint8* addr)
{
addr[0] = (uint8)(IINCHIP_READ(PDHAR) >> 8);
addr[1] = (uint8)IINCHIP_READ(PDHAR);
addr[2] = (uint8)(IINCHIP_READ(PDHAR2) >> 8);
addr[3] = (uint8)IINCHIP_READ(PDHAR2);
addr[4] = (uint8)(IINCHIP_READ(PDHAR4) >> 8);
addr[5] = (uint8)IINCHIP_READ(PDHAR4);
}
/* ICMP packets */
void getUIPR(uint8* addr)
{
addr[0] = (uint8)(IINCHIP_READ(UIPR) >> 8);
addr[1] = (uint8)IINCHIP_READ(UIPR);
addr[2] = (uint8)(IINCHIP_READ(UIPR2) >> 8);
addr[3] = (uint8)IINCHIP_READ(UIPR2);
}
uint16 getUPORTR(void)
{
return IINCHIP_READ(UPORTR);
}
uint16 getFMTUR(void)
{
return IINCHIP_READ(FMTUR);
}
/* PIN "BRYDn" */
uint8 getPn_BRDYR(uint8 p)
{
return (uint8)IINCHIP_READ(Pn_BRDYR(p));
}
void setPn_BRDYR(uint8 p, uint8 cfg)
{
IINCHIP_WRITE(Pn_BRDYR(p),cfg);
}
uint16 getPn_BDPTHR(uint8 p)
{
return IINCHIP_READ(Pn_BDPTHR(p));
}
void setPn_BDPTHR(uint8 p, uint16 depth)
{
IINCHIP_WRITE(Pn_BDPTHR(p),depth);
}
/* IINCHIP ID */
uint16 getIDR(void)
{
return IINCHIP_READ(IDR);
}
/***********************************
* SOCKET Register Access Function *
***********************************/
/* SOCKET control */
uint16 getSn_MR(SOCKET s)
{
return IINCHIP_READ(Sn_MR(s));
}
void setSn_MR(SOCKET s, uint16 mode)
{
IINCHIP_WRITE(Sn_MR(s),mode);
}
uint8 getSn_CR(SOCKET s)
{
return IINCHIP_READ(Sn_CR(s));
}
void setSn_CR(SOCKET s, uint16 com)
{
IINCHIP_WRITE(Sn_CR(s),com);
while(IINCHIP_READ(Sn_CR(s))); // wait until Sn_CR is cleared.
}
uint8 getSn_IMR(SOCKET s)
{
return (uint8)IINCHIP_READ(Sn_IMR(s));
}
void setSn_IMR(SOCKET s, uint8 mask)
{
IINCHIP_WRITE(Sn_IMR(s),mask);
}
uint8 getSn_IR(SOCKET s)
{
#ifdef __DEF_IINCHIP_INT__ // In case of using ISR routine of iinchip
return SOCK_INT[s];
#else // In case of processing directly
return (uint8)IINCHIP_READ(Sn_IR(s));
#endif
}
void setSn_IR(SOCKET s, uint8 ir)
{
#ifdef __DEF_IINCHIP_INT__ // In case of using ISR routine of iinchip
SOCK_INT[s] = SOCK_INT[s] & ~(ir);
#else // In case of processing directly
IINCHIP_WRITE(Sn_IR(s),ir);
#endif
}
/* SOCKET information */
uint8 getSn_SSR(SOCKET s)
{
uint8 ssr, ssr1;
ssr = (uint8)IINCHIP_READ(Sn_SSR(s)); // first read
while(1)
{
ssr1 = (uint8)IINCHIP_READ(Sn_SSR(s)); // second read
if(ssr == ssr1) break; // if first == sencond, Sn_SSR value is valid.
ssr = ssr1; // if first <> second, save second value into first.
}
return ssr;
}
void getSn_DHAR(SOCKET s, uint8* addr)
{
addr[0] = (uint8)(IINCHIP_READ(Sn_DHAR(s))>>8);
addr[1] = (uint8)IINCHIP_READ(Sn_DHAR(s));
addr[2] = (uint8)(IINCHIP_READ(Sn_DHAR2(s))>>8);
addr[3] = (uint8)IINCHIP_READ(Sn_DHAR2(s));
addr[4] = (uint8)(IINCHIP_READ(Sn_DHAR4(s))>>8);
addr[5] = (uint8)IINCHIP_READ(Sn_DHAR4(s));
}
void setSn_DHAR(SOCKET s, uint8* addr)
{
IINCHIP_WRITE(Sn_DHAR(s), ((uint16)(addr[0]<<8)) + addr[1]);
IINCHIP_WRITE(Sn_DHAR2(s), ((uint16)(addr[2]<<8)) + addr[3]);
IINCHIP_WRITE(Sn_DHAR4(s), ((uint16)(addr[4]<<8)) + addr[5]);
}
// M_15052008 : Delete this function
//uint16 getSn_DPORTR(SOCKET s)
//{
// return IINCHIP_READ(Sn_DPORTR(s));
//}
void setSn_DPORTR(SOCKET s, uint16 port)
{
IINCHIP_WRITE(Sn_DPORTR(s),port);
}
void getSn_DIPR(SOCKET s, uint8* addr)
{
addr[0] = (uint8)(IINCHIP_READ(Sn_DIPR(s))>>8);
addr[1] = (uint8)IINCHIP_READ(Sn_DIPR(s));
addr[2] = (uint8)(IINCHIP_READ(Sn_DIPR2(s))>>8);
// M_15052008 : Replace Sn_DHAR2 with Sn_DIPR.
// addr[3] = (uint8)IINCHIP_READ(Sn_DHAR2(s));
addr[3] = (uint8)IINCHIP_READ(Sn_DIPR2(s));
}
void setSn_DIPR(SOCKET s, uint8* addr)
{
IINCHIP_WRITE(Sn_DIPR(s), ((uint16)(addr[0]<<8)) + addr[1]);
IINCHIP_WRITE(Sn_DIPR2(s), ((uint16)(addr[2]<<8)) + addr[3]);
}
uint16 getSn_MSSR(SOCKET s)
{
return IINCHIP_READ(Sn_MSSR(s));
}
void setSn_MSSR(SOCKET s, uint16 mss)
{
IINCHIP_WRITE(Sn_MSSR(s),mss);
}
/* SOCKET communication */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -