Advertisement
Guest User

Untitled

a guest
Feb 18th, 2021
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.81 KB | None | 0 0
  1. int32_t recv(uint8_t sn, uint8_t * buf, uint16_t len)
  2. {
  3.    uint8_t  tmp = 0;
  4.    uint16_t recvsize = 0;
  5. //A20150601 : For integarating with W5300
  6. #if   _WIZCHIP_ == 5300
  7.    uint8_t head[2];
  8.    uint16_t mr;
  9. #endif
  10. //
  11.    CHECK_SOCKNUM();
  12.    CHECK_SOCKMODE(Sn_MR_TCP);
  13.    CHECK_SOCKDATA();
  14.    
  15.    recvsize = getSn_RxMAX(sn);
  16.    if(recvsize < len) len = recvsize;
  17.      
  18. //A20150601 : For Integrating with W5300
  19. #if _WIZCHIP_ == 5300
  20.    //sock_pack_info[sn] = PACK_COMPLETED;    // for clear      
  21.    if(sock_remained_size[sn] == 0)
  22.    {
  23. #endif
  24. //
  25.       while(1)
  26.       {
  27.          recvsize = getSn_RX_RSR(sn);
  28.          tmp = getSn_SR(sn);
  29.          if (tmp != SOCK_ESTABLISHED)
  30.          {
  31.             if(tmp == SOCK_CLOSE_WAIT)
  32.             {
  33.                if(recvsize != 0) break;
  34.                else if(getSn_TX_FSR(sn) == getSn_TxMAX(sn))
  35.                {
  36.                   close(sn);
  37.                   return SOCKERR_SOCKSTATUS;
  38.                }
  39.             }
  40.             else
  41.             {
  42.                close(sn);
  43.                return SOCKERR_SOCKSTATUS;
  44.             }
  45.          }
  46.          if((sock_io_mode & (1<<sn)) && (recvsize == 0)) return SOCK_BUSY;
  47.          if(recvsize != 0) break;
  48.       };
  49. #if _WIZCHIP_ == 5300
  50.    }
  51. #endif
  52.  
  53. //A20150601 : For integrating with W5300
  54. #if _WIZCHIP_ == 5300
  55.    if((sock_remained_size[sn] == 0) || (getSn_MR(sn) & Sn_MR_ALIGN))
  56.    {
  57.       mr = getMR();
  58.       if((getSn_MR(sn) & Sn_MR_ALIGN)==0)
  59.       {
  60.          wiz_recv_data(sn,head,2);
  61.          if(mr & MR_FS)
  62.             recvsize = (((uint16_t)head[1]) << 8) | ((uint16_t)head[0]);
  63.          else
  64.             recvsize = (((uint16_t)head[0]) << 8) | ((uint16_t)head[1]);
  65.          sock_pack_info[sn] = PACK_FIRST;
  66.       }
  67.       sock_remained_size[sn] = recvsize;
  68.    }
  69.    if(len > sock_remained_size[sn]) len = sock_remained_size[sn];
  70.    recvsize = len;  
  71.    if(sock_pack_info[sn] & PACK_FIFOBYTE)
  72.    {
  73.       *buf = sock_remained_byte[sn];
  74.       buf++;
  75.       sock_pack_info[sn] &= ~(PACK_FIFOBYTE);
  76.       recvsize -= 1;
  77.       sock_remained_size[sn] -= 1;
  78.    }
  79.    if(recvsize != 0)
  80.    {
  81.       wiz_recv_data(sn, buf, recvsize);
  82.       setSn_CR(sn,Sn_CR_RECV);
  83.       while(getSn_CR(sn))
  84.                    {DWT_Delay(2);} ;
  85.    }
  86.    sock_remained_size[sn] -= recvsize;
  87.    if(sock_remained_size[sn] != 0)
  88.    {
  89.       sock_pack_info[sn] |= PACK_REMAINED;
  90.       if(recvsize & 0x1) sock_pack_info[sn] |= PACK_FIFOBYTE;
  91.    }
  92.    else sock_pack_info[sn] = PACK_COMPLETED;
  93.    if(getSn_MR(sn) & Sn_MR_ALIGN) sock_remained_size[sn] = 0;
  94.    //len = recvsize;
  95. #else  
  96.    if(recvsize < len) len = recvsize;  
  97.    wiz_recv_data(sn, buf, len);
  98.    setSn_CR(sn,Sn_CR_RECV);
  99.    while(getSn_CR(sn))
  100.             {DWT_Delay(2);} ;
  101. #endif
  102.      
  103.    //M20150409 : Explicit Type Casting
  104.    //return len;
  105.    return (int32_t)len;
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement