예제 #1
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;
}
예제 #2
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;
}
예제 #3
0
uint16_t SOCK_Recv(uint8_t sock, uint8_t *buf, uint16_t buflen) {
  uint16_t offaddr, realaddr;    

  if (buflen<=0 || sock!=0) {
    return 1;   
  }
  /* If the request size > MAX_BUF,just truncate it */
  if (buflen>W5100_MAX_BUF) {
    buflen = W5100_MAX_BUF-2;
  }
  /* Read the Rx Read Pointer */
  W5100_MemReadWord(W5100_S0_RX_RD, &offaddr);
#if _DEBUG_MODE
  printf("RX Buffer: %x\n",offaddr);
#endif  
  while (buflen) {
    buflen--;
    realaddr = W5100_RXBUFADDR+(offaddr&W5100_RX_BUF_MASK);
    W5100_MemWriteByte(realaddr, *buf);
    offaddr++;
    buf++;
  }
  *buf='\0';  /* String terminated character */
  /* Increase the S0_RX_RD value, so it point to the next receive */
  W5100_MemWriteWord(W5100_S0_RX_RD, offaddr);
  /* Now Send the RECV command */
  W5100_MemWriteByte(W5100_S0_CR, W5100_CR_RECV);
  WAIT1_Waitus(5);    // Wait for Receive Process
  return 1;
}
예제 #4
0
uint8_t SOCK_ReceivedSize(uint8_t sock, uint16_t *rxSize) {
  uint16_t sockaddr;
  
  *rxSize = 0;
  if (sock>=W5100_NUM_SOCKETS)  {
    return ERR_VALUE;
  }
  sockaddr = W5100_SKT_BASE(sock); // calc base addr for this socket
  return W5100_MemReadWord(sockaddr+W5100_RX_RSR_OFFSET, rxSize);
}
예제 #5
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;
}
예제 #6
0
uint16_t SOCK_Recv_size(void) {
  uint16_t val;
  
  W5100_MemReadWord(W5100_S0_RX_RSR, &val);
  return val;
}