'위즈네트/ioLibrary'에 해당되는 글 4건

ioLibrary 100% 활용하기 (4)


앞서 살펴 본 ioLibrary의 가장 큰 특징은 다음과 같다.

  • 모든 함수의 Success & Fail 처리 : SOCKET ERROR 시 상황 코드
  • Blocked & Non-Blocked I/O function
  • Datagram Data의 Flexible 처리

각 특징들이 어떻게 활용되는지 하나씩 알아보자


Datagram Data의 Flexible 처리

UDP와 같은 Connection-less Datagram 통신은 1:N 통신이 가능하여 WIZnet chip들은 Data Packet외에 IP, Port number와 같은 추가 정보를 Data packet 앞에 추가된다. 따라서 수신한 Data 처리를 Packet단위로 하지 못할 경우 Packet 정보를 제대로 분석할 수 없어 통신에 에러가 발생하게 된다.

ioLibrary에서는 Packet에 대한 정보를 ioLibrary가 내부적으로 관리하여 Packet 처리 오류를 해결하였다.
ioLibrary의 Datagram Flexible 처리는 하나의 Packet을 저장할 메모리가 부족한 시스템에서 아주 유용하게 사용될 수 있다. 즉 하나의 Packet을 원하는 크기대로 나누어 수신하고 분석함으로써 Memory usage를 최소화할 수 있다.
물론, Code는 복잡도가 높아지기 때문에 Code 크기는 증가된다는 단점이 있다.

W5300에서의 TCP Data의 Flexible 처리

W5300에서 Sn_TX_FIFOR/Sn_RX_FIFOR Register는 16bit Access를 기본으로 하므로, 데이타크기가 Even number가 아닌 경우 UDP와 같이 Data 길이에 대한 정보가 추가된다. 이전 API에서는 UDP와 마찬가지로 Packet 단위로 처리해야되며 또한 반드시 FIFO register를 16bit 단위로 처리해야하는 부담이 있었다.

ioLibray에서는 이 모든 문제를 해결하여, Pakcet 크기의 Odd, Even Number에 상관없이 원하는 크기대로 Data를 처리할 수 있다.

How to Usage Example

uint8_t    gDATABUF[TX_RX_MAX_BUF_SIZE];
uint16_t test_size[16] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
uint16_t test_idx1 = 0;


int32_t loopback_udps(uint8_t sn, uint8_t* buf, uint16_t port)
{
       int32_t  ret;
       uint16_t size, sentsize;
       static uint8_t  destip[4];
    static uint16_t destport;
    switch(getSn_SR(sn))
    {
          case SOCK_UDP :
             if((size = getSn_RX_RSR(sn)) > 0) // Don't need to check SOCKERR_BUSY because it doesn't not occur.
            {
                if(size > TX_RX_MAX_BUF_SIZE) size = TX_RX_MAX_BUF_SIZE;
                ret = recvfrom(sn,buf,size,destip,(uint16_t*)&destport);
                //ret = recvfrom(sn,buf,test_size[test_idx1 & 0x0F],destip,(uint16_t*)&destport);
                if(ret <= 0)   // check SOCKERR_BUSY & SOCKERR_XXX. For showing the occurrence of SOCKERR_BUSY.
                {
                    printf("%d: recvfrom error. %ld\r\n",sn,ret);
                    return ret;
                }
                printf("RX_RSR=%u, RECVFROM %d = ", size, ret);
                printf("%d.%d.%d.%d ",destip[0],destip[1],destip[2],destip[3]);
                printf(" (%u)\r\n", destport);
                size = (uint16_t) ret;
                sentsize = 0;
                while(sentsize != size)
                {
                       ret = sendto(sn,buf+sentsize,size-sentsize,destip,destport);
                       if(ret < 0)
                       {
                          printf("%d: sendto error. %ld\r\n",sn,ret);
                          return ret;
                       }
                       sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero.
                }
                test_idx1++;
             }
             break;
          case SOCK_CLOSED:
            printf("%d:LBUStart\r\n",sn);
             if((ret=socket(sn,Sn_MR_UDP,port,0x00)) != sn)
                    return ret;
             printf("%d:Opened\r\n",sn);
             test_idx1 = 0;
             break;
          default :
             break;
       }
       return 1;
}

void main(void)
{
    int32_t ret = 0;
    //
    // Initialize system & ioLibrary
    //
    while(1)
    {
        if((ret = loopback_udp(0, gDATABUF,ip, 3000)) < 0)
        {
            printf("ERROR : ErrCode = %d\r\n", ret);
            while(1);
        }
    }
}

recvfrom()에 전달되어지는 ip와 port는 전역변수나 static 변수를 사용해야 한다. 이는 packet이 완전히 처리될 때까지 Peer의 정보를 유지하기 위함이다.

Tip

  • int8_t getsockopt(uint8_t sn, sockopt_type sotype, void arg);
    : sotype에 따라 현 Socket의 Optional 정보를 구할 수 있다. 성공시 결과는
    arg 값으로 확인가능하다.
    • sotype
      • SO_REMAINSIZE : 현 Packet의 남은 크기를 알려준다.
      • SO_PACKINFO : 현 Packet에 대한 정보 (PACK_FIRST, PACK_REMAINED, PACK_COMPLETED)를 알려준다.

마치며

총 4편으로 구성 ioLibrary 100% 활용하기 를 마치며, 끝까지 읽어 주신 분들에게 우선 감사드리며, 작은 도움이나마 되길 바란다. 앞으로 W5XXX 시리즈 뿐만 아니라, ioLibrary가 지속적으로 개선 발전해 나가길 바란다.

저작자 표시 동일 조건 변경 허락
신고
블로그 이미지

밤소 MidnightCow

위즈네트 칩(W5300, W5200, W7100, W7500) 개발자

ioLibrary 100% 활용하기 (3)


앞서 살펴 본 ioLibrary의 가장 큰 특징은 다음과 같다.

  • 모든 함수의 Success & Fail 처리 : SOCKET ERROR 시 상황 코드
  • Blocked & Non-Blocked I/O function
  • Datagram Data의 Flexible 처리

각 특징들이 어떻게 활용되는지 하나씩 알아보자


Blocked vs Non-Blocked I/O function

Blocked I/O function 이란, 함수를 호출 할 경우 해당 함수 수행이 완료되기 전까지 return하지 않는 함수이다.
예로, connect(sn, ip, port) 함수를 호출 하였다고 가정할 경우 ip와 port 정보를 갖는 상대방과 접속을 성공하거나 실패할 때 까지 connect() 계속 기다린다. 즉 리턴하지 않고 block 되어진다.
반면, Non-Blocked I/O function는 해당 함수의 수행이 완료되거나, 수행 결과를 기다리지 않고 호출과 동시에 미리 정의된 결과값을 리턴하게 된다. 따라서, 사용자는 함수수행의 결과에 대한 확인를 계속 확인하여야 한다.

Blocked IO Mode

User Application 이 순차적으로 수행될 필요가 있으며, 다른 작업 시간에 영향에 주지 않을 경우 적용될 수 있다.
Blocked IO Mode는 Program이 직관적이여서 Debugging이 용이하나, 함수를 수행하는 동안 Resources를 독점하므로 다른 작업을 수행할 수 없다.

ioLibrary에서 Blocked IO Function은 socket command를 수행하고 그 결과를 확인할 때까지 호출함수가 리턴하지 않음을 의미한다.

아래 코드는 Blocked IO mode로 socket api를 사용하여 Loopback Server 와 Client을 구현한 예이다.

 

  • Client
uint8_t sn = 0;
int32_t ret = 0;
uint8_t ip[4] = {192,168,0,100};
uint8_t buf[2048] = {0,};
while(1)
{
    ret = socket(sn, Sn_MR_TCP, 3000, 0x00);
    if(ret &lt; 0)
    {
        printf("ERROR : SOCKET open , ErrCode=%d \r\n", ret);
        close(sn);
        break;
    }
    ret = connect(sn,ip,5000);
    if(ret &lt; 0)
    {
        printf("ERROR : SOCKET Connect , ErrCode=%d \r\n", ret);
        close(sn);
        break;
    }
    while(1)
    {
        ret = recv(sn, buf, sizeof(buf));
        if(ret &lt; 0)
        {
            printf("ERROR : SOCKET recv , ErrCode=%d \r\n", ret);
            disconnect(sn);
            close(sn);
            break;
        }
        ret = send(sn, buf, ret);
        if(ret &lt; 0)
        {
            printf("ERROR : SOCKET send , ErrCode=%d \r\n", ret);
            disconnect(sn);
            close(sn);
            break;
        }
    }
}

recv()에서 Data를 수신하거나 실패할 경우에만, 다음 함수 Send()를 수행하게 된다. 각 단계 함수 호출이 실패하였을 경우 소켓을 해제하고 while(1)에 의해 소켓 생성, 연결, 전송, 수신을 계속 반복한다.

 

  • Server
uint8_t sn = 0;
int32_t ret = 0;
uint8_t buf[20] = "Hello, ioLibrary!!!\0";
while(1)
{
    ret = socket(sn, Sn_MR_TCP, 5000, 0x00);
    if(ret &lt; 0)
    {
        printf("ERROR : SOCKET open , ErrCode=%d \r\n", ret);
        close(sn);
        break;
    }
    ret = listen(sn);
    if(ret &lt; 0)
    {
        printf("ERROR : SOCKET Listen , ErrCode=%d \r\n", ret);
        close(sn);
        break;
    }
    while(getSn_SR(sn) != SOCK_ESTABLISHED);    // Wait until a peer connect to server
    if(ret &lt; 0)
    {
        printf("ERROR : SOCKET Connect , ErrCode=%d \r\n", ret);
        close(sn);
        break;
    }
    while(1)
    {
        ret = send(sn, buf, strlen(buf));
        if(ret &lt; 0)
        {
            printf("ERROR : SOCKET send , ErrCode=%d \r\n", ret);
            close(sn);
            break;
        }
        ret = recv(sn, buf, sizeof(buf));
        if(ret &lt; 0)
        {
            printf("ERROR : SOCKET recv , ErrCode=%d \r\n", ret);
            close(sn);
            break;
           }
    }
}

send()에서 Data를 전송 완료하거나 실패한 후 recv()를 수행한다. 이때 send()가 성공했을 경우만 recv()를 수행해야 정상적인 Loopback이 된다.
각 단계 함수 호출이 실패하였을 경우 소켓을 해제하고 while(1)에 의해 소켓 생성, 연결, 전송, 수신을 계속 반복한다.

 

Non-Blocked IO mode

User Application 이 순차적으로 수행될 필요가 없거나, 다른 작업을 일정 시간 내에 수행해야 할 경우 사용된다.
Non-Blocked IO Mode는 Program이 작업 간 Schedule을 잘 고려해야 함으로 구현 상의 어려움이 있으며, Debugging이 쉽지 않다.

ioLibrary에서 Non-Blocked IO Function은 socket command만을 수행하고 바로 리턴하거나, 수행 준비가 되어 있지 않을 경우 바로 리턴한다. 이때 Return 값이 SOCK_OK 이라 하더라도 그 결과가 성공했음을 뜻하지는 않는다. 또 SOCK_BUSY인 경우 Command 수행 준비가 아직 되지 않은 상태이므로 반드시 확인하여 해당 command가 수행될 수 있도록 재시도를 하여야 한다.

아래 코드는 Non-Blocked IO mode로 socket api를 사용하여 Blocked IO mode의 Loopback Server 와 Client을 동일하게 순차적으로 수행될 수 있도록 구현한 예이다.

 

  • Client
uint8_t sn = 0;
int32_t ret = 0;
uint8_t ip[4] = {192,168,0,100};
uint8_t buf[2048] = {0,};
while(1)
{
    if(getSn_SR(sn) == SOCK_CLOSED)
    {
        ret = socket(sn, Sn_MR_TCP, 3000, SF_IO_NONBLOCK);  // Non-Blocked Mode로 Open
        if(ret &lt; 0)
        {
            printf("ERROR : SOCKET open , ErrCode=%d \r\n", ret);
            close(sn);
            break;
        }
        while(getSn_SR(sn) != SOCK_INIT);    //SOCKET이 생성될 때까지 기다린다.
        ret = connect(sn,ip,5000);
        if(ret &lt; 0)
        {
            printf("ERROR : SOCKET Connect , ErrCode=%d \r\n", ret);
            close(sn);
            break;
        }
    }
    else if(getSn_SR(sn) == SOCK_ESTABLISHED)  // SOCKET 이 접속에 성공했다면,
    {
        ret = recv(sn, buf, sizeof(buf));  // SOCK_BUSY인 경우 반복 호출한다.
        if(ret &lt; 0)
        {
            printf("ERROR : SOCKET recv , ErrCode=%d \r\n", ret);
            disconnect(sn);
            close(sn);
            break;
        }
        else if(ret &gt; 0)  //  수신 DATA가 있다면 Loopback 한다.
        {
            while(1) // SOCK_BUSY 인 경우 재시도를 위해 while() loop 사용
            {
                ret = send(sn, buf, ret);
                if(ret &lt; 0)
                {
                    printf("ERROR : SOCKET send , ErrCode=%d \r\n", ret);
                    disconnect(sn);
                    close(sn);
                    break;
                }
           }
        }
    }
}
  • Server
uint8_t sn = 0;
int32_t ret = 0;
uint8_t ip[4] = {192,168,0,100};
uint8_t buf[2048] = {0,};
while(1)
{
    if(getSn_SR(sn) == SOCK_CLOSED)
    {
        ret = socket(sn, Sn_MR_TCP, 5000, SF_IO_NONBLOCK);  // Non-Blocked Mode로 Open
        if(ret &lt; 0)
        {
            printf("ERROR : SOCKET open , ErrCode=%d \r\n", ret);
            close(sn);
            break;
        }
        ret = connect(sn,ip,5000);
        if(ret &lt; 0)
        {
            printf("ERROR : SOCKET Connect , ErrCode=%d \r\n", ret);
            close(sn);
            break;
        }
    }
    else if(getSn_SR(sn) == SOCK_ESTABLISHED)  // SOCKET 이 접속에 성공했다면,
    {
        ret = send(sn, buf, ret);
        if(ret &lt; 0)
        {
            printf("ERROR : SOCKET send , ErrCode=%d \r\n", ret);
            disconnect(sn);
            close(sn);
            break;
        }
        else if(ret &gt; 0)  //  수신 DATA가 있다면 Loopback 한다.
        {
            while(1) // SOCK_BUSY 인 경우 재시도를 위해 while() loop 사용
            {
                ret = recv(sn, buf, sizeof(buf));  // SOCK_BUSY인 경우 반복 호출한다.
                if(ret &lt; 0)
                {
                    printf("ERROR : SOCKET recv, ErrCode=%d \r\n", ret);
                    disconnect(sn);
                    close(sn);
                    break;
                }
           }
        }
    }
}

Blocked IO mode에서 Non-blocked IO 처럼 사용하기

앞서 살펴본 example은 Blocked와 Non-Blocked의 차이점을 잘 알 수 있다.
여기서 Loopback은 echo-back을 수행하는 것으로 수신한 데이타를 전송해야 하는 순차적 프로그램이다. 즉 순차적 기능을 수행해야 할 경우 Blocked IO mode가 구현하기 훨씬 쉽다. 하지만 복잡도는 높아지지만, 다른 작업을 수행할 수 있는 Non-Blocked IO mode 기능이 필요할 경우가 대부분이다.

이 두가지 장점을 모두 살리는 코드를 살펴보자. 이때 가장 중요한 함수 3가지가 있다.

  • getSn_SR() : SOCKET 상태를 모니터링한다
  • getSn_RX_RSR() : 수신한 Data 크기가 얼마인지 확인한다.
  • getSn_TX_FSR() : 자주 사용되지는 않지만, 전송 가능한 Data 크기가 얼마인지 확인한다.

ioLibrary는 이 3가지 함수를 이용하여 Blocked IO function을 Non-Blocked IO mode처럼 사용할 수 있는 skeleton code를 제공한다. skeleton code의 핵심은 위의 3가지 함수를 이용하여 Blocked IO function을 호출할 시점을 정확히 파악하여 해당 function을 호출함으로써, Blocked time은 최소하는데 있다.

Skeleton Code

 

  • TCP
while(1)
{
    switch(getSn_SR())
    {
        case SOCK_ESTABLISED :
            if(getSn_RX_RSR() &gt;0) recv();
            if(getSn_TX_FSR() &gt; 0) send();
            break;
        case SOCK_CLOSE_WAIT:    // 이 상태는 Half-closed 상태로 DATA를 송수신할 수 있다.
            if((len=getSn_RX_RSR()) &gt;0) recv(len);
            if((len=getSn_TX_FSR()) &gt; 0) send(len); // getSn_TX_FSR()은 잘 사용하지 않는다.
            disconnect();
            break;
        case SOCK_INIT :
            connect();  // For Client
            listen();    // For Server
            break;
        case SOCK_CLOSED:
            socket();
            break;
    }
}
  • UDP
while(1)
{
    switch(getSn_SR())
    {
        case SOCK_UDP :
            if((len=getSn_RX_RSR()) &gt; 0) recvfrom();
            if((len=getSn_TX_RSR()) &gt; 0) sendto();
            break;
        case SOCK_CLOSED:
            socket();
            break;
    }
}

Example by using the skeleton code

ioLibraray 의 Loopback Application을 참조하라.

[Loopbac Example in ioLibrary]


저작자 표시 동일 조건 변경 허락
신고
블로그 이미지

밤소 MidnightCow

위즈네트 칩(W5300, W5200, W7100, W7500) 개발자

ioLibrary 100% 활용하기 (2)


앞서 살펴 본 ioLibrary의 가장 큰 특징은 다음과 같다.

  • 모든 함수의 Success & Fail 처리 : SOCKET ERROR 시 상황 코드
  • Blocked & Non-Blocked I/O function
  • Datagram Data의 Flexible 처리

각 특징들이 어떻게 활용되는 하나씩 알아보자


SOCKET ERROR 시 상황 코드

SOCKET ERROR는 아래와 같이 정의된다.(socket.h 참조)

#define SOCK_OK 1 ///< Result is OK about socket process. 
#define SOCK_BUSY 0 ///< Socket is busy on processing the operation. Valid only Non-block IO Mode. 
#define SOCK_FATAL -1000 ///< Result is fatal error about socket process. 

#define SOCK_ERROR            0        
#define SOCKERR_SOCKNUM       (SOCK_ERROR - 1)     ///< Invalid socket number
#define SOCKERR_SOCKOPT       (SOCK_ERROR - 2)     ///< Invalid socket option
#define SOCKERR_SOCKINIT      (SOCK_ERROR - 3)     ///< Socket is not initialized or SIPR is Zero IP address when Sn_MR_TCP
#define SOCKERR_SOCKCLOSED    (SOCK_ERROR - 4)     ///< Socket unexpectedly closed.
#define SOCKERR_SOCKMODE      (SOCK_ERROR - 5)     ///< Invalid socket mode for socket operation.
#define SOCKERR_SOCKFLAG      (SOCK_ERROR - 6)     ///< Invalid socket flag
#define SOCKERR_SOCKSTATUS    (SOCK_ERROR - 7)     ///< Invalid socket status for socket operation.
#define SOCKERR_ARG           (SOCK_ERROR - 10)    ///< Invalid argument.
#define SOCKERR_PORTZERO      (SOCK_ERROR - 11)    ///< Port number is zero
#define SOCKERR_IPINVALID     (SOCK_ERROR - 12)    ///< Invalid IP address
#define SOCKERR_TIMEOUT       (SOCK_ERROR - 13)    ///< Timeout occurred
#define SOCKERR_DATALEN       (SOCK_ERROR - 14)    ///< Data length is zero or greater than buffer max size.
#define SOCKERR_BUFFER        (SOCK_ERROR - 15)    ///< Socket buffer is not enough for data communication.

#define SOCKFATAL_PACKLEN     (SOCK_FATAL - 1)     ///< Invalid packet length. Fatal Error.

Socket 함수를 호출하여 사용할 경우 함수 리턴 값을 항상 확인하고 Error 상황이 발생하였을 경우 이에 해당하는 Exception 처리를 습관화하자.

이는 실제 Network application 제품을 개발 할 경우 혹시 모를 필드테스트에서의 상황을 명확히 파악하여 방어적 코드를 구현함에 있어 많은 도움이 된다.

특히 Network application은 상대방과의 통신을 기본 전제로 하고 네트워크 자원 상황에 따라 수많은 Exception등이 발생할 수 있기 때문이다.

소켓 생성 시 발생할 수 있는 Error

 socket(sn, mode, port, flag) 
  • SOCKERR_SOCKNUM : 잘못된 Socket Number(sn) 사용 ( 0 <= sn < NUM)
    • W5100 : 0 <= sn < 4
    • W5200, W5300, W5500 : 0 <= sn < 8
  • SOCKERR_SOCKOPT : 잘못된 flag(Socket Option) 사용
  • SOCKERR_SOCKINIT : TCP socket open 실패
    • Source IP address가 0.0.0.0 일 경우
  • SOCKERR_SOCKMODE : 지원하지 않는 Socket Mode를 사용
  • SOCKERR_PORTZERO : Source Port number가 0 일 경우

데이타 전송 시 발생할 수 있는 Error

 send(sn, buf, len)
 sendto(sn, buf, len, ip, port)
  • SOCKERR_SOCKNUM : 잘못된 Socket Number(sn) 사용 ( 0 <= sn < NUM)
  • SOCKERR_SOCKMODE : TCP(send)나 UDP(sendto) Mode가 아닌 경우
  • SOCKERR_TIMEOUT : 데이타 전송 타임아웃 발생
  • SOCKERR_DATALEN : 전송 데이타 크기가 0인 경우(send)나, 최대전송 크기를 초과한 경우(sendto)
  • SOCKERR_SOCKSTATUS : 전송 가능한 소켓 상태가 아닌 경우
  • SOCKERR_SOCKCLOSED : 소켓이 비정상적으로 Closed 된 경우
  • SOCKERR_IPINVALID : IP 주소가 비정상적인 경우(sendto)
  • SOCKERR_PORTZERO : 상대방 포트 번호가 0인 경우 (sendto)
  • SOCK_BUSY : 전송 버퍼가 비워지 않았을 경우 (Non-blocked Io mode 시)

데이타 수신 시 발생할 수 있는 Error

recv(sn,buf,len)
recvfrom(sn,buf,len,ip,port)
  • SOCKERR_SOCKNUM : 잘못된 Socket Number(sn) 사용 ( 0 <= sn < NUM)
  • SOCKERR_SOCKMODE : TCP(send)나 UDP(sendto) Mode가 아닌 경우
  • SOCKERR_SOCKSTATUS : 수신 가능한 상태가 아닌 경우
  • SOCKERR_SOCKCLOSED : 소켓이 비정상적으로 Closed 된 경우
  • SOCKERR_SOCKBUSY : 수신할 데이타가 없는 경우(Non-blocked IO mode 시)

소켓 연결 시 발생할 수 있는 Error

connect(sn,ip,port)
  • SOCKERR_SOCKNUM : 잘못된 Socket Number(sn) 사용 ( 0 <= sn < NUM)
  • SOCKERR_SOCKMODE : TCP가 아닌 경우
  • SOCKERR_IPINVALID : 상대방 IP 주소가 0.0.0.0인 경우
  • SOCKERR_PORTZERO : 상대방 Port number가 0 일 경우
  • SOCKERR_TIMEOUT : 상대방이 응답이 없이 없는 경우
  • SOCKERR_BUSY : 상대방의 응답을 기다리는 경우(Non-blocked IO)

소켓 연결 해제 시 발생할 수 있는 Error

disconnect(sn)
  • SOCKERR_SOCKNUM : 잘못된 Socket Number(sn) 사용 ( 0 <= sn < NUM)
  • SOCKERR_SOCKMODE : TCP가 아닌 경우(disconnect)
  • SOCKERR_TIMEOUT : 상대방이 응답이 없이 없는 경우(disconnect)
  • SOCKERR_BUSY : 상대방의 응답을 기다리는 경우(disconnect, Non-blocked IO)

저작자 표시 동일 조건 변경 허락
신고
블로그 이미지

밤소 MidnightCow

위즈네트 칩(W5300, W5200, W7100, W7500) 개발자

ioLibrary 100% 활용하기 (1)


ioLibray ?

ioLibrary는 WIZnet의 W5XXX(W5100,W5200,W5300,W5500) 기반의 통합 BSD socket Library를 제공한다.
칩별로 차이가 있는 Hardware dependent code들을 Driver로 분리하여 각각 구현되었고, 이를 이용하여 BSD Socket API를 구현함으로써, Webserver, FTP와 같은 Application Protocol을 구현함에 있어 Hardware적 제약 조건으로부터 자유로워질 수 있으며, Application의 최소한의 수정으로 쉽게 원하는 WIZnet Chip들로 Porting이 가능하다.

ioLibrary 특징

  • DRIVER 분리
    • Basic IO function
      1. WIZCHIP_READ and WIZCHIP_WRITE
      2. 모든 Register & Memory Access를 WIZCHIP_READ & WIZCHIP_WRITE로 통일
      3. Hardware dependent I/F code는 Callback Function으로 분리
      4. Driver 수정없이 callback function 등록만으로 바로 사용
    • Extra Function
      1. Optional : Omissble for code optimization
      2. User-freindly name : 같은 기능 다른 이름의 Register 들을 통일
  • SOCKET API
    • Berkeley Socket API와 유사
    • 네트워크 응용 개발 경험자들은 쉽게 ioLibrary 활용 가능
    • 모든 함수의 상황별 Error Code 지원
    • Blocked or Non-Blocked function 지원
    • Datagram Data 처리의 유연성 : 한 Packet을 원하는 크기로 나누어 수신 가능
  • APPLICATIION PROTOCOL
    • 더욱 풍부해지는 Standard application protocol
    • WIZnet Chip별로 각각 제공되는 Application protocol을 Chip에 관계없이 재사용 가능
  • User Application
    • Easy to migration
    • Easy to upgrade
    • Easy to Maintainment
  • The smallest resouces usage for TCP/IP stack
  • The highest performance at the same board

ioLibrary Version 3.0 Directory 구조

  • [ioLibrary]
    • [Ethernet]
      • wizchip_conf.h & wizchip_conf.c
      • socket.h & socket.c
      • [W5100]
        • w5100.h & w5100.c
      • [W5200]
        • W5200.h & W5200.c
      • [W5300]
        • w5300.h & w5300.c
      • [W5500]
        • w5500.h & w5500.c
    • [Internet]
      • [DHCP]
        • DHCP.h & DHCP.c
      • [DNS]
        • dns.h & dns.c
      • [FTPClient]
        • ftpc.h & ftpc.c
        • stdio_private.h
      • [FTPServer]
        • ftpd.h & ftpd.c
        • stdio_private.h
      • [httpServer]
        • httpParser.h & httpParser.c
        • httpServer.h & httpServer.c
        • httpUtil.h & httpUtil.c
      • [SNMP]
        • snmp.h & snmap.c
        • snmap_custom.h & smtp_custom.c
      • [SNTP]
        • sntp.h & sntp.c
      • [TFTP]
        • tftp.h & tftp.c
      • [Others Will be Added]

Download

[Download on GitHub]

How to Porting into your application

  • TODO
  • How to Register your call-back functions

Refer to My post - W5500 ioLibrary_BSD를 MCU 8051에 포팅하기(1)~(8)

목차

  1. W5500 ioLibrary_BSD를 MCU 8051로 포팅하기(1)
  2. W5500 ioLibrary_BSD를 MCU 8051로 포팅하기(2)
  3. W5500 ioLibrary_BSD를 MCU 8051로 포팅하기(3)
  4. W5500 ioLibrary_BSD를 MCU 8051로 포팅하기(4)
  5. W5500 ioLibrary_BSD를 MCU 8051로 포팅하기(5)
  6. W5500 ioLibrary_BSD를 MCU 8051로 포팅하기(6)
  7. W5500 ioLibrary_BSD를 MCU 8051로 포팅하기(7)
  8. W5500 ioLibrary_BSD를 MCU 8051로 포팅하기(8)

저작자 표시 동일 조건 변경 허락
신고
블로그 이미지

밤소 MidnightCow

위즈네트 칩(W5300, W5200, W7100, W7500) 개발자