📄 w5300.c
字号:
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)
{
uint32 tx_write_size=0;
tx_write_size = IINCHIP_READ(Sn_TX_WRSR(s));
tx_write_size = (tx_write_size << 16) + IINCHIP_READ(Sn_TX_WRSR2(s));
return tx_write_size;
}
void setSn_TX_WRSR(SOCKET s, uint32 size)
{
IINCHIP_WRITE(Sn_TX_WRSR(s), (uint16)(size >> 16));
IINCHIP_WRITE(Sn_TX_WRSR2(s), (uint16)size);
}
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 << 16) + IINCHIP_READ(Sn_TX_FSR2(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 << 16) + IINCHIP_READ(Sn_RX_RSR2(s)); // read
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);
}
uint16 getSn_RX_FIFOR(SOCKET s)
{
return IINCHIP_READ(Sn_RX_FIFOR(s));
}
/* 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)
{
*((uint16*)MR) = MR_RST;
wait_10ms(20); // wait PLL lock
#if (__DEF_IINCHIP_ADDRESS_MODE__ == __DEF_IINCHIP_INDIRECT_MODE__)
*((vint16*)MR) |= MR_IND;
#ifdef __DEF_IINCHIP_DBG__
printf("MR value is %04x\r\n",*((vuint16*)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.
*/
void iinchip_irq(void)
{
uint16 int_val;
uint16 idx;
IINCHIP_CRITICAL_SECTION_ENTER();
//M_01052008 : replaced '==' with '='.
//while(int_val == IINCHIP_READ(IR)) // process all interrupt
while((int_val = IINCHIP_READ(IR)))
{
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)
{
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;
}
IINCHIP_WRITE(TMS01R,((uint16)tx_size[0] << 8) + (uint16)tx_size[1]);
IINCHIP_WRITE(TMS23R,((uint16)tx_size[2] << 8) + (uint16)tx_size[3]);
IINCHIP_WRITE(TMS45R,((uint16)tx_size[4] << 8) + (uint16)tx_size[5]);
IINCHIP_WRITE(TMS67R,((uint16)tx_size[6] << 8) + (uint16)tx_size[7]);
IINCHIP_WRITE(RMS01R,((uint16)rx_size[0] << 8) + (uint16)rx_size[1]);
IINCHIP_WRITE(RMS23R,((uint16)rx_size[2] << 8) + (uint16)rx_size[3]);
IINCHIP_WRITE(RMS45R,((uint16)rx_size[4] << 8) + (uint16)rx_size[5]);
IINCHIP_WRITE(RMS67R,((uint16)rx_size[6] << 8) + (uint16)rx_size[7]);
for(i=0; i <ssum/8 ; i++)
{
mem_cfg <<= 1;
mem_cfg |= 1;
}
IINCHIP_WRITE(MTYPER,mem_cfg);
#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(TMS01R)>>8),(uint8)(IINCHIP_READ(RMS01R)>>8));
printf("%02d : %07dKB : %07dKB \r\n", 1, (uint8)IINCHIP_READ(TMS01R),(uint8)IINCHIP_READ(RMS01R));
printf("%02d : %07dKB : %07dKB \r\n", 2, (uint8)(IINCHIP_READ(TMS23R)>>8),(uint8)(IINCHIP_READ(RMS23R)>>8));
printf("%02d : %07dKB : %07dKB \r\n", 3, (uint8)IINCHIP_READ(TMS23R),(uint8)IINCHIP_READ(RMS23R));
printf("%02d : %07dKB : %07dKB \r\n", 4, (uint8)(IINCHIP_READ(TMS45R)>>8),(uint8)(IINCHIP_READ(RMS45R)>>8));
printf("%02d : %07dKB : %07dKB \r\n", 5, (uint8)IINCHIP_READ(TMS45R),(uint8)IINCHIP_READ(RMS45R));
printf("%02d : %07dKB : %07dKB \r\n", 6, (uint8)(IINCHIP_READ(TMS67R)>>8),(uint8)(IINCHIP_READ(RMS67R)>>8));
printf("%02d : %07dKB : %07dKB \r\n", 7, (uint8)IINCHIP_READ(TMS67R),(uint8)IINCHIP_READ(RMS67R));
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 idx=0;
// M_08082008
IINCHIP_CRITICAL_SECTION_ENTER();
for (idx = 0; idx < len; idx+=2)
IINCHIP_WRITE(Sn_TX_FIFOR(s),*((uint16*)(buf+idx)));
// M_08082008
IINCHIP_CRITICAL_SECTION_EXIT();
#elif (__DEF_IINCHIP_BUF_OP__ == __DEF_MCU_DEP_INLINE_ASM__)
register uint16 data;
register uint16 loop;
loop = len;
// M_08082008
IINCHIP_CRITICAL_SECTION_ENTER();
__asm
{
fifo_write_loop:
// ARM version
LDRH data, [buf], #2
STRH data, [Sn_TX_FIFOR(s)]
SUBS loop,loop, #2
BGT fifo_write_loop
}
// M_08082008
IINCHIP_CRITICAL_SECTION_EXIT();
#elif (__DEF_IINCHIP_BUF_OP__ == __DEF_MCU_DEP_DMA__)
#error "You should do implement this block."
#endif
#elif (__DEF_IINCHIP_ADDRESS_MODE__ == __DEF_IINCHIP_INDIRECT_MODE__)
#if (__DEF_IINCHIP_BUF_OP__ == __DEF_C__)
uint32 idx=0;
IINCHIP_CRITICAL_SECTION_ENTER();
*((vuint16*)IDM_AR) = Sn_TX_FIFOR(s);
for (idx = 0; idx < len; idx+=2)
*((vuint16*)IDM_DR) = *((uint16*)(buf+idx));
IINCHIP_CRITICAL_SECTION_EXIT();
#elif (__DEF_IINCHIP_BUF_OP__ == __DEF_MCU_DEP_INLINE_ASM__)
register uint16 data=0;
register uint16 loop;
loop = len;
IINCHIP_CRITICAL_SECTION_ENTER();
*((vuint16*)IDM_AR) = Sn_TX_FIFOR(s);
__asm
{
fifo_write_loop:
// ARM version
LDRH data, [buf], #2
STRH data, [IDM_DR]
SUBS loop,loop, #2
BGT fifo_write_loop
}
IINCHIP_CRITICAL_SECTION_EXIT();
#elif (__DEF_IINCHIP_BUF_OP__ == __DEF_MCU_DEP_DMA__)
#error "You should do implement this block."
#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 idx;
// M_08082008
IINCHIP_CRITICAL_SECTION_ENTER();
for (idx = 0; idx < len; idx+=2)
*((uint16*)(buf+idx)) = IINCHIP_READ(Sn_RX_FIFOR(s));
// M_08082008
IINCHIP_CRITICAL_SECTION_EXIT();
#elif (__DEF_IINCHIP_BUF_OP__ == __DEF_MCU_DEP_INLINE_ASM__)
register uint16 data=0;
register int16 loop;
loop = (int16) len;
// M_08082008
IINCHIP_CRITICAL_SECTION_ENTER();
__asm
{
fifo_read_loop:
// ARM version
LDRH data, [Sn_RX_FIFOR(s)]
STRH data, [buf], #2
SUBS loop,loop, #2
BGT fifo_read_loop
}
// M_08082008
IINCHIP_CRITICAL_SECTION_EXIT();
#elif (__DEF_IINCHIP_BUF_OP__ == __DEF_MCU_DEP_DMA__)
#error "You should do implement this block."
#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;
IINCHIP_CRITICAL_SECTION_ENTER();
*((vuint16*)IDM_AR) = Sn_RX_FIFOR(s);
for (idx = 0; idx < len; idx+=2)
*((uint16*)(buf+idx)) = *((vuint16*)IDM_DR);
IINCHIP_CRITICAL_SECTION_EXIT();
#elif (__DEF_IINCHIP_BUF_OP__ == __DEF_MCU_DEP_INLINE_ASM__)
register uint16 data=0;
register int16 loop;
loop = (int16)len;
IINCHIP_CRITICAL_SECTION_ENTER();
*((vuint16*)IDM_AR) = Sn_RX_FIFOR(s);
__asm
{
fifo_read_loop:
// ARM version
LDRH data, [IDM_DR]
STRH data, [buf], #2
SUBS loop,loop, #2
BGT fifo_read_loop
}
IINCHIP_CRITICAL_SECTION_EXIT();
#elif (__DEF_IINCHIP_BUF_OP__ == __DEF_MCU_DEP_DMA__)
#error "You should do implement this block."
#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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -