Data Sheet

© Copyright 2013 WIZnet Co.,Ltd. All rights reserved.
51
iEthernet
W5200
{
/* first, get the free TX memory size */
FREESIZE:
freesize = Sn_TX_FSR;
if (freesize<len) goto FREESIZE; // len is send size
/* calculate offset address */
dst_mask= Sn_TX_WR0 &gSn_TX_MASK; // dst_mask is offset address
/* calculate start address(physical address) */
dst_ptr = gSn_TX_BASE + dst_mask; // destination_address is physical start address
/* if overflow SOCKETTX memory */
if ( (dst_mask + len) > (gSn_TX_MASK + 1) )
{
/* copy upper_size bytes of source_addr to destination_address */
upper_size = (gSn_TX_MASK + 1) – dst_mask;
memcpy(src_addr, dst_ptr, upper_size);
/* update source_addr*/
source_addr += upper_size;
/* copy left_size bytes of source_addr to gSn_TX_BASE */
left_size = len – upper_size;
memecpy(source_addr, gSn_TX_BASE, left_size);
}
else
{
/* copy len bytes of source_addr to destination_address */
memcpy(source_addr, dst_ptr, len);
}
/* increase Sn_TX_WR as length of len */
Sn_TX_WR0 += send_size;
/* set SEND command */
Sn_CR = SEND;
/* return real packet size */
return ( read_ptr_after_send - read_ptr_befor_send )
/* if return value is not equal len (len is send size),
retry send left data without copying data*/
}