예제 #1
0
uint8_t SOCK_Listen(uint8_t sock) {
  uint8_t val;
  uint16_t sockaddr;
  
  if (sock>=W5100_NUM_SOCKETS) {
    return ERR_VALUE;
  }
  sockaddr = W5100_SKT_BASE(sock);
  W5100_MemReadByte(sockaddr+W5100_SR_OFFSET, &val);
  if (val==W5100_SOCK_INIT) {
    /* Send the LISTEN Command */
    W5100_MemWriteByte(sockaddr+W5100_CR_OFFSET, W5100_CR_LISTEN);
    /* Wait for Listening Process */
    do {
      W5100_MemReadByte(sockaddr+W5100_CR_OFFSET, &val);
    } while(val!=0);
    /* Check for Listen Status */
    W5100_MemReadByte(sockaddr+W5100_SR_OFFSET, &val);
    if (val==W5100_SOCK_LISTEN) {
      return ERR_OK;
    } else {
      SOCK_CloseSocket(sock);
    }
  }
  return ERR_FAILED;
}
예제 #2
0
uint8_t SOCK_Socket(uint8_t sock, uint8_t eth_protocol, uint16_t tcp_port) {
  uint8_t val, retval = 0;

  if (sock!=0) {
    return retval;
  }
  /* Make sure we close the socket first */
  if (W5100_MemReadByte(W5100_S0_SR, &val)!=ERR_OK) {
    return 0; /* failure */
  }
  if (val==W5100_SOCK_CLOSED) {
    SOCK_Close(sock);
  }
  /* Assigned Socket 0 Mode Register */
  W5100_MemWriteByte(W5100_S0_MR, eth_protocol);
  /* Now open the Socket 0 */
  W5100_MemWriteWord(W5100_S0_PORT, tcp_port);
  W5100_MemWriteByte(W5100_S0_CR, W5100_CR_OPEN);  /* Open Socket */
  /* Wait for Opening Process */
  do {
    W5100_MemReadByte(W5100_S0_CR, &val);
  } while(val!=0);
  /* Check for Init Status */
  W5100_MemReadByte(W5100_S0_SR, &val);
  if (val==W5100_SOCK_INIT) {
    retval = 1;
  } else {
    SOCK_Close(sock);
  }
  return retval;
}
예제 #3
0
uint8_t SOCK_OpenSocket(uint8_t sock, uint8_t eth_protocol, uint16_t tcp_port) {
  uint8_t val;
  uint16_t sockaddr;

  if (sock>=W5100_NUM_SOCKETS) {
    return ERR_VALUE; /* out of range */
  }
  sockaddr =  W5100_SKT_BASE(sock);
  /* Make sure we close the socket first */
  if (W5100_MemReadByte(sockaddr+W5100_SR_OFFSET, &val)!=ERR_OK) {
    return ERR_FAILED; /* failure */
  }
  if (val==W5100_SOCK_CLOSED) {
    /* make sure we close the socket */
    SOCK_CloseSocket(sock);
  }
  /* Assigned Socket 0 Mode Register */
  W5100_MemWriteByte(sockaddr+W5100_MR_OFFSET, eth_protocol);
  /* Now open the Socket 0 */
  W5100_MemWriteWord(sockaddr+W5100_PORT_OFFSET, tcp_port);
  W5100_MemWriteByte(sockaddr+W5100_CR_OFFSET, W5100_CR_OPEN);  /* Open Socket */
  /* Wait for Opening Process */
  do {
    W5100_MemReadByte(sockaddr+W5100_CR_OFFSET, &val);
  } while(val!=0);
  /* Check for Init Status */
  W5100_MemReadByte(sockaddr+W5100_SR_OFFSET, &val);
  if (val==W5100_SOCK_INIT) {
    return ERR_OK;
  } else {
    SOCK_CloseSocket(sock);
  }
  return ERR_FAILED;
}
예제 #4
0
uint8_t SOCK_Receive(uint8_t sock, uint8_t *buf, size_t bufSize, size_t readSize) {
  uint16_t offaddr, realaddr;
  uint16_t sockaddr;

  if (readSize<=0 || sock>=W5100_NUM_SOCKETS) {
    return ERR_VALUE; /* failure */
  }
  if (readSize>bufSize) { /* If the requested size > MAX_BUF, just truncate it */
    readSize = bufSize-2;
  }
  sockaddr = W5100_SKT_BASE(sock);
  /* Read the Rx Read Pointer */
  W5100_MemReadWord(sockaddr+W5100_RX_RD_OFFSET, &offaddr);
  while (readSize) {
    readSize--;
    realaddr = (W5100_RXBUFADDR + (0x0800*sock))+(offaddr&W5100_RX_BUF_MASK);
    W5100_MemReadByte(realaddr, buf);
    offaddr++;
    buf++;
  }
  *buf='\0';  /* string terminated character */
  /* Increase the S0_RX_RD value, so it point to the next receive */
  W5100_MemWriteWord(sockaddr+W5100_RX_RD_OFFSET, offaddr);
  /* Now Send the RECV command */
  W5100_MemWriteByte(sockaddr+W5100_CR_OFFSET, W5100_CR_RECV);
  WAIT1_Waitus(5);    /* Wait for Receive Process */
  return ERR_OK;
}
예제 #5
0
uint8_t W5100_MemReadBlock(uint16_t addr, void *data, size_t dataSize) {
  while(dataSize>0) {
    if (W5100_MemReadByte(addr, (uint8_t*)data)!=ERR_OK) {
      return ERR_FAILED;
    }
    data++; addr++; dataSize--;
  }
  return ERR_OK;
}
예제 #6
0
uint8_t SOCK_GetStatus(uint8_t sock, uint8_t *status) {
  uint16_t sockaddr;
  
  if (sock>=W5100_NUM_SOCKETS)  {
    return ERR_VALUE;
  }
  sockaddr = W5100_SKT_BASE(sock);
  return W5100_MemReadByte(sockaddr+W5100_SR_OFFSET, status);
}
예제 #7
0
uint16_t SOCK_Send(uint8_t sock, const uint8_t *buf, uint16_t buflen) {
  uint16_t offaddr, realaddr, txsize, timeout;
  uint8_t val;

  if (buflen<=0 || sock!=0) {
    return 0;
  }
#if _DEBUG_MODE
  printf("Send Size: %d\n",buflen);
#endif
  /* Make sure the TX Free Size Register is available */
  W5100_MemReadWord(W5100_SO_TX_FSR, &txsize);
#if _DEBUG_MODE
  printf("TX Free Size: %d\n",txsize);
#endif
  timeout=0;
  while (txsize<buflen) {
    WAIT1_WaitOSms(1);
    
    W5100_MemReadWord(W5100_SO_TX_FSR, &txsize);
   /* Timeout for approximately 1000 ms */
   if (timeout++ > 1000) {
#if _DEBUG_MODE
     printf("TX Free Size Error!\n");
#endif
     /* Disconnect the connection */
     SOCK_Disconnect(sock);
     return 0;
   }
 }  
 /* Read the Tx Write Pointer */
 W5100_MemReadWord(W5100_S0_TX_WR, &offaddr);
#if _DEBUG_MODE
  printf("TX Buffer: %x\n", offaddr);
#endif  
  while(buflen) {
    buflen--;
    /* Calculate the real W5100 physical Tx Buffer Address */
    realaddr = W5100_TXBUFADDR+(offaddr&W5100_TX_BUF_MASK);
    /* Copy the application data to the W5100 Tx Buffer */
    W5100_MemWriteByte(realaddr, *buf);
    offaddr++;
    buf++;
  }
  /* Increase the S0_TX_WR value, so it point to the next transmit */
  W5100_MemWriteWord(W5100_S0_TX_WR, offaddr);
  /* Now Send the SEND command */
  W5100_MemWriteByte(W5100_S0_CR, W5100_CR_SEND);
  /* Wait for Sending Process */
  do {
    W5100_MemReadByte(W5100_S0_CR, &val);
  } while(val!=0);
  return 1;
}
예제 #8
0
void SOCK_Disconnect(uint8_t sock) {
  uint8_t val;

  if (sock!=0) {
    return;
  }
  /* Send Disconnect Command */
  W5100_MemWriteByte(W5100_S0_CR, W5100_CR_DISCON);
  do { /* Wait for Disconnecting Process */
    W5100_MemReadByte(W5100_S0_CR, &val);
  } while(val!=0);
}
예제 #9
0
void SOCK_Close(uint8_t sock) {
  uint8_t val;
  
  if (sock!=0) {
    return;
  }
  /* Send Close Command */
  W5100_MemWriteByte(W5100_S0_CR, W5100_CR_CLOSE);
  do { /* Waiting until the S0_CR is clear */
    W5100_MemReadByte(W5100_S0_CR, &val);
  } while(val!=0);
}
예제 #10
0
uint8_t SOCK_Disconnect(uint8_t sock) {
  uint8_t val;
  uint16_t sockaddr;

  if (sock>=W5100_NUM_SOCKETS) {
    return ERR_VALUE;
  }
  sockaddr = W5100_SKT_BASE(sock);
  /* Send Disconnect Command */
  W5100_MemWriteByte(sockaddr+W5100_CR_OFFSET, W5100_CR_DISCON);
  do { /* Wait for Disconnecting Process */
    W5100_MemReadByte(sockaddr+W5100_CR_OFFSET, &val);
  } while(val!=0);
  return ERR_OK;
}
예제 #11
0
uint8_t SOCK_CloseSocket(uint8_t sock) {
  uint8_t val;
  uint16_t sockaddr;
  
  if (sock>=W5100_NUM_SOCKETS) {
    return ERR_VALUE;
  }
  sockaddr = W5100_SKT_BASE(sock);
  /* Send Close Command */
  W5100_MemWriteByte(sockaddr+W5100_CR_OFFSET, W5100_CR_CLOSE);
  do { /* Waiting until the S0_CR is clear */
    W5100_MemReadByte(sockaddr+W5100_CR_OFFSET, &val);
  } while(val!=0);
  return ERR_OK;
}
예제 #12
0
uint8_t SOCK_Listen(uint8_t sock) {
  uint8_t val, retval = 0;
  
  if (sock!=0) {
    return retval;
  }
  W5100_MemReadByte(W5100_S0_SR, &val);
  if (val==W5100_SOCK_INIT) {
    /* Send the LISTEN Command */
    W5100_MemWriteByte(W5100_S0_CR, W5100_CR_LISTEN);
    /* Wait for Listening Process */
    do {
      W5100_MemReadByte(W5100_S0_CR, &val);
    } while(val!=0);
    /* Check for Listen Status */
    W5100_MemReadByte(W5100_S0_SR, &val);
    if (val==W5100_SOCK_LISTEN) {
      retval = 1;
    } else {
      SOCK_Close(sock);
    }
  }
  return retval;
}
예제 #13
0
uint8_t SOCK_Send(uint8_t sock, const uint8_t *buf, size_t buflen) {
  uint16_t offaddr, realaddr, txsize, timeout, sockaddr;
  uint8_t val;

  if (buflen<=0 || sock>=W5100_NUM_SOCKETS) {
    return ERR_VALUE;
  }
  sockaddr = W5100_SKT_BASE(sock);
  /* Make sure the TX Free Size Register is available */
  W5100_MemReadWord(sockaddr+W5100_TX_FSR_OFFSET, &txsize);
  timeout=0;
  while (txsize<buflen) {
    WAIT1_WaitOSms(1);
    W5100_MemReadWord(sockaddr+W5100_TX_FSR_OFFSET, &txsize);
   /* Timeout for approximately 1000 ms */
   if (timeout++ > 1000) {
     /* Disconnect the connection */
     SOCK_Disconnect(sock);
     return ERR_FAILED;
    }
  }  
  /* Read the Tx Write Pointer */
  W5100_MemReadWord(sockaddr+W5100_TX_WR_OFFSET, &offaddr);
  while(buflen) {
    buflen--;
    /* Calculate the real W5100 physical Tx Buffer Address */
    realaddr = (W5100_TXBUFADDR+(0x0800*sock)) + (offaddr&W5100_TX_BUF_MASK);
    /* Copy the application data to the W5100 Tx Buffer */
    W5100_MemWriteByte(realaddr, *buf);
    offaddr++;
    buf++;
  }
  /* Increase the S0_TX_WR value, so it point to the next transmit */
  W5100_MemWriteWord(sockaddr+W5100_TX_WR_OFFSET, offaddr);
  /* Now Send the SEND command */
  W5100_MemWriteByte(sockaddr+W5100_CR_OFFSET, W5100_CR_SEND);
  /* Wait for Sending Process */
  do {
    W5100_MemReadByte(sockaddr+W5100_CR_OFFSET, &val);
  } while(val!=0);
  return ERR_OK;
}