📄 w5300.c
字号:
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)
{
uint16 ret = 0;
ret = IINCHIP_READ(Sn_MSSR0(s)) << 8;
ret |= IINCHIP_READ(Sn_MSSR1(s));
return ret;
}
void setSn_MSSR(SOCKET s, uint16 mss)
{
IINCHIP_WRITE(Sn_MSSR0(s), mss >> 8);
IINCHIP_WRITE(Sn_MSSR1(s), mss);
}
/* SOCKET communication */
uint8 getSn_KPALVTR(SOCKET s)
{
return (uint8)(IINCHIP_READ(Sn_KPALVTR(s)) >> 8);
}
void setSn_KPALVTR(SOCKET s, uint8 time)
{
uint16 keepalive=0;
keepalive = (IINCHIP_READ(Sn_KPALVTR(s)) & 0x00FF) + ((uint16)time<<8);
IINCHIP_WRITE(Sn_KPALVTR(s),keepalive);
}
uint32 getSn_TX_WRSR(SOCKET s)
{
union {
uint32 s32;
uint8 s8[4];
} u32;
u32.s8[3] = IINCHIP_READ(Sn_TX_WRSR(s));
u32.s8[2] = IINCHIP_READ(Sn_TX_WRSR1(s));
u32.s8[1] = IINCHIP_READ(Sn_TX_WRSR2(s));
u32.s8[0] = IINCHIP_READ(Sn_TX_WRSR3(s));
return u32.s32;
}
void setSn_TX_WRSR(SOCKET s, uint32 size)
{
union {
uint32 s32;
uint8 s8[4];
} u32;
u32.s32 = size;
IINCHIP_WRITE(Sn_TX_WRSR(s), u32.s8[3]);
IINCHIP_WRITE(Sn_TX_WRSR1(s), u32.s8[2]);
IINCHIP_WRITE(Sn_TX_WRSR2(s), u32.s8[1]);
IINCHIP_WRITE(Sn_TX_WRSR3(s), u32.s8[0]);
}
uint32 getSn_TX_FSR(SOCKET s)
{
uint32 free_tx_size=0;
uint32 free_tx_size1=0;
while(1)
{
free_tx_size = IINCHIP_READ(Sn_TX_FSR(s)); // read
free_tx_size = (free_tx_size << 8) + IINCHIP_READ(Sn_TX_FSR1(s));
free_tx_size = (free_tx_size << 8) + IINCHIP_READ(Sn_TX_FSR2(s));
free_tx_size = (free_tx_size << 8) + IINCHIP_READ(Sn_TX_FSR3(s));
if(free_tx_size == free_tx_size1) break; // if first == sencond, Sn_TX_FSR value is valid.
free_tx_size1 = free_tx_size; // save second value into firs
}
return free_tx_size;
}
uint32 getSn_RX_RSR(SOCKET s)
{
uint32 received_rx_size=0;
uint32 received_rx_size1=1;
while(1)
{
received_rx_size = IINCHIP_READ(Sn_RX_RSR(s));
received_rx_size = (received_rx_size << 8) + IINCHIP_READ(Sn_RX_RSR1(s)); // read
received_rx_size = (received_rx_size << 8) + IINCHIP_READ(Sn_RX_RSR2(s));
received_rx_size = (received_rx_size << 8) + IINCHIP_READ(Sn_RX_RSR3(s));
if(received_rx_size == received_rx_size1) break;
received_rx_size1 = received_rx_size; // if first == sencond, Sn_RX_RSR value is valid.
} // save second value into firs
return received_rx_size;
}
void setSn_TX_FIFOR(SOCKET s, uint16 data)
{
IINCHIP_WRITE(Sn_TX_FIFOR(s), data >> 8);
IINCHIP_WRITE(Sn_TX_FIFOR1(s), data);
}
uint16 getSn_RX_FIFOR(SOCKET s)
{
uint16 ret = 0;
ret = IINCHIP_READ(Sn_RX_FIFOR(s)) << 8;
ret |= IINCHIP_READ(Sn_RX_FIFOR1(s));
return ret;
}
/* IP header field */
uint8 getSn_PROTOR(SOCKET s)
{
return (uint8)IINCHIP_READ(Sn_PROTOR(s));
}
void setSn_PROTOR(SOCKET s, uint8 pronum)
{
uint16 protocolnum;
protocolnum = (IINCHIP_READ(Sn_PROTOR(s)) & 0xFF00) + pronum;
IINCHIP_WRITE(Sn_PROTOR(s),protocolnum);
}
uint8 getSn_TOSR(SOCKET s)
{
return (uint8)IINCHIP_READ(Sn_TOSR(s));
}
void setSn_TOSR(SOCKET s, uint8 tos)
{
IINCHIP_WRITE(Sn_TOSR(s),tos);
}
uint8 getSn_TTLR(SOCKET s)
{
return (uint8)IINCHIP_READ(Sn_TTLR(s));
}
void setSn_TTLR(SOCKET s, uint8 ttl)
{
IINCHIP_WRITE(Sn_TTLR(s),ttl);
}
uint8 getSn_FRAGR(SOCKET s)
{
return (uint8)IINCHIP_READ(Sn_FRAGR(s));
}
void setSn_FRAGR(SOCKET s, uint8 frag)
{
IINCHIP_WRITE(Sn_FRAGR(s),frag);
}
/*******
* ETC *
*******/
/* Initialization & Interrupt request routine */
void iinchip_init(void)
{
*((volatile uint8*)MR) = MR_RST;
wait_1ms(5); // wait PLL lock
#if (__DEF_IINCHIP_ADDRESS_MODE__ == __DEF_IINCHIP_INDIRECT_MODE__)
*((volatile uint8*)MR) = MR_IND;
#ifndef __DEF_IINCHIP_DBG__
printf("MR value is %04x\r\n",*((volatile uint8*)MR));
#endif
#endif
}
#ifdef __DEF_IINCHIP_INT__
/**
* \todo You should do implement your interrupt request routine instead of this function.
* If you want to use ISR, this function should be mapped in your ISR handler.
*/
ISR(INT5_vect)
{
uint16 int_val;
uint16 idx;
IINCHIP_CRITICAL_SECTION_ENTER();
//M_01052008 : replaced '==' with '='.
//while(int_val == IINCHIP_READ(IR)) // process all interrupt
printf("ISR routine enter\r\n");
while((int_val = (IINCHIP_READ(IR0) << 8 | IINCHIP_READ(IR1))))
{
for(idx = 0 ; idx < MAX_SOCK_NUM ; idx++)
{
if (int_val & IR_SnINT(idx)) // check the SOCKETn interrupt
{
SOCK_INT[idx] |= (uint8)IINCHIP_READ(Sn_IR(idx)); // Save the interrupt stauts to SOCK_INT[idx]
IINCHIP_WRITE(Sn_IR(idx),(uint16)SOCK_INT[idx]); // Clear the interrupt status bit of SOCKETn
}
}
if (int_val & (IR_IPCF << 8)) // check the IP conflict interrupt
{
printf("IP conflict : %04x\r\n", int_val);
}
if (int_val & (IR_DPUR << 8)) // check the unreachable destination interrupt
{
printf("INT Port Unreachable : %04x\r\n", int_val);
printf("UIPR : %d.%d.%d.%d\r\n", (uint8)(IINCHIP_READ(UIPR)>>8),
(uint8)IINCHIP_READ(UIPR),
(uint8)(IINCHIP_READ(UIPR2)>>8),
(uint8)IINCHIP_READ(UIPR2));
printf("UPORTR : %04x\r\n", IINCHIP_READ(UPORTR));
}
IINCHIP_WRITE(IR, int_val & 0xFF00);
}
IINCHIP_CRITICAL_SECTION_EXIT();
}
#endif
/* Internal memory operation */
uint8 sysinit(uint8* tx_size, uint8* rx_size)
{
uint8 k;
uint16 i;
uint16 ssum=0,rsum=0;
uint mem_cfg = 0;
for(i=0; i < MAX_SOCK_NUM; i++)
{
if(tx_size[i] > 64)
{
#ifdef __DEF_IINCHIP_DBG__
printf("Illegal Channel(%d) TX Memory Size.\r\n",i);
#endif
return 0;
}
if(rx_size[i] > 64)
{
#ifdef __DEF_IINCHIP_DBG__
printf("Illegal Channel(%d) RX Memory Size.\r\n",i);
#endif
return 0;
}
ssum += (uint16)tx_size[i];
rsum += (uint16)rx_size[i];
TXMEM_SIZE[i] = ((uint32)tx_size[i]) << 10;
RXMEM_SIZE[i] = ((uint32)rx_size[i]) << 10;
}
if( (ssum % 8) || ((ssum + rsum) != 128) )
{
#ifdef __DEF_IINCHIP_DBG__
printf("Illegal Memory Allocation\r\n");
#endif
return 0;
}
k = 0;
for(i = TMSR0; i <= TMSR7; i++) {
IINCHIP_WRITE(i, tx_size[k]);
k++;
}
k = 0;
for(i = RMSR0; i <= RMSR7; i++) {
IINCHIP_WRITE(i, rx_size[k]);
k++;
}
for(i=0; i <ssum/8 ; i++)
{
mem_cfg <<= 1;
mem_cfg |= 1;
}
IINCHIP_WRITE(MTYPER, mem_cfg >> 8);
IINCHIP_WRITE(MTYPER1, mem_cfg & 0xff);
#ifdef __DEF_IINCHIP_DBG__
printf("Total TX Memory Size = %dKB\r\n",ssum);
printf("Total RX Memory Size = %dKB\r\n",rsum);
printf("Ch : TX SIZE : RECV SIZE\r\n");
printf("%02d : %07dKB : %07dKB \r\n", 0, (uint8)(IINCHIP_READ(TMSR0)),(uint8)(IINCHIP_READ(RMSR0)));
printf("%02d : %07dKB : %07dKB \r\n", 1, (uint8)(IINCHIP_READ(TMSR1)),(uint8)(IINCHIP_READ(RMSR1)));
printf("%02d : %07dKB : %07dKB \r\n", 2, (uint8)(IINCHIP_READ(TMSR2)),(uint8)(IINCHIP_READ(RMSR2)));
printf("%02d : %07dKB : %07dKB \r\n", 3, (uint8)(IINCHIP_READ(TMSR3)),(uint8)(IINCHIP_READ(RMSR3)));
printf("%02d : %07dKB : %07dKB \r\n", 4, (uint8)(IINCHIP_READ(TMSR4)),(uint8)(IINCHIP_READ(RMSR4)));
printf("%02d : %07dKB : %07dKB \r\n", 5, (uint8)(IINCHIP_READ(TMSR5)),(uint8)(IINCHIP_READ(RMSR5)));
printf("%02d : %07dKB : %07dKB \r\n", 6, (uint8)(IINCHIP_READ(TMSR6)),(uint8)(IINCHIP_READ(RMSR6)));
printf("%02d : %07dKB : %07dKB \r\n", 7, (uint8)(IINCHIP_READ(TMSR7)),(uint8)(IINCHIP_READ(RMSR7)));
printf("\r\nMTYPER=%04x\r\n",IINCHIP_READ(MTYPER));
#endif
return 1;
}
uint32 wiz_write_buf(SOCKET s,uint8* buf,uint32 len)
{
#if (__DEF_IINCHIP_ADDRESS_MODE__ == __DEF_IINCHIP_DIRECT_MODE__)
#if (__DEF_IINCHIP_BUF_OP__ == __DEF_C__)
uint32 z;
for(z=0; z<len; z+=2) {
*((vuint8*)Sn_TX_FIFOR(s)) = *(buf+z);
*((vuint8*)Sn_TX_FIFOR1(s)) = *(buf+z+1);
}
#endif
#elif (__DEF_IINCHIP_ADDRESS_MODE__ == __DEF_IINCHIP_INDIRECT_MODE__)
#if (__DEF_IINCHIP_BUF_OP__ == __DEF_C__)
uint32 idx=0;
*((vuint8*)IDM_AR) = Sn_TX_FIFOR(s) >> 8;
*((vuint8*)IDM_AR1) = Sn_TX_FIFOR(s);
for (idx = 0; idx < len; idx+=2) {
*((vuint8*)IDM_DR) = *(buf+idx);
*((vuint8*)IDM_DR1) = *(buf+idx+1);
}
#else
#error "Undefined __DEF_IINCHIP_BUF_OP__"
#endif
#else
#error "Undefined __DEF_IINCHIP_ADDRESS_MODE__"
#endif
return len;
}
uint32 wiz_read_buf(SOCKET s, uint8* buf,uint32 len)
{
#if (__DEF_IINCHIP_ADDRESS_MODE__ == __DEF_IINCHIP_DIRECT_MODE__)
#if (__DEF_IINCHIP_BUF_OP__ == __DEF_C__)
uint32 z;
for(z=0; z<len; z+=2) {
*(buf+z) = *((vuint8*)Sn_RX_FIFOR(s));
*(buf+z+1) = *((vuint8*)Sn_RX_FIFOR1(s));
}
#else
#error "Undefined __DEF_IINCHIP_BUF_OP__"
#endif
#elif (__DEF_IINCHIP_ADDRESS_MODE__ == __DEF_IINCHIP_INDIRECT_MODE__)
#if (__DEF_IINCHIP_BUF_OP__ == __DEF_C__)
uint32 idx=0;
*((vuint8*)IDM_AR) = Sn_RX_FIFOR(s) >> 8;
*((vuint8*)IDM_AR1) = Sn_RX_FIFOR(s);
for (idx = 0; idx < len; idx+=2) {
*(buf+idx) = *((vuint8*)IDM_DR);
*(buf+idx+1) = *((vuint8*)IDM_DR1);
}
#else
#error "Undefined __DEF_IINCHIP_BUF_OP__"
#endif
#else
#error "Undefined __DEF_IINCHIP_ADDRESS_MODE__"
#endif
return len;
}
uint32 getIINCHIP_TxMAX(SOCKET s)
{
return TXMEM_SIZE[s];
}
uint32 getIINCHIP_RxMAX(SOCKET s)
{
return RXMEM_SIZE[s];
}
#ifdef __DEF_IINCHIP_PPP__
/**
* Max lenght of PPPoE message
*/
#define PPP_OPTION_BUF_LEN 64
/**
* \fn uint8 pppinit_in(uint8 * id, uint8 idlen, uint8 * passwd, uint8 passwdlen)
* Internal function.
* \details It is called in pppinit().\n
* It processes 4 phases as following.
* - PPPoE Discovery
* - LCP process
* - PPPoE authentication
* - IPCP process
*
* \param id User ID for connecting to a PPPoE server
* \param idlen Length of \em id
* \param passwd User password for connecting to a PPPoE server
* \param passwdlen Length of \em passwd
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -