<목차>

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)

 

 

5. 포팅하기 - ioLibrary Compile하기

 

앞 시간에는 작업 Project Directory에 ioLibrary를 설치하였다. 기본 구성이 끝났으므로 Project를 Build 해본다.

다음과 같이 17개의 Warning과 5개의 Error가 발생한다. 

 

C51 COMPILER V9.51 - SN: K1RIC-I06RWZ
COPYRIGHT Copyright (C) 2012 ARM Ltd and ARM Germany GmbH. All rights reserved.
*** WARNING C318 IN LINE 46 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.h: can't open file 'Ethernet/wizchip_conf.h'
make: *** [ioLibrary/Ethernet/W5500/w5500.OBJ] Error 1
*** ERROR C200 IN LINE 65 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: left side of '.' requires struct/union
*** WARNING C322 IN LINE 68 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: unknown identifier
*** WARNING C322 IN LINE 68 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: unknown identifier
*** WARNING C322 IN LINE 83 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: unknown identifier
*** WARNING C322 IN LINE 83 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: unknown identifier
*** ERROR C320 IN LINE 93 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: "Unknown _WIZCHIP_IO_MODE_ in W5000. !!!"
*** WARNING C322 IN LINE 106 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: unknown identifier
*** WARNING C322 IN LINE 106 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: unknown identifier
*** WARNING C322 IN LINE 121 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: unknown identifier
*** WARNING C322 IN LINE 121 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: unknown identifier
*** ERROR C320 IN LINE 131 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: "Unknown _WIZCHIP_IO_MODE_ in W5500. !!!"
*** WARNING C322 IN LINE 145 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: unknown identifier
*** WARNING C322 IN LINE 145 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: unknown identifier
*** WARNING C322 IN LINE 198 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: unknown identifier
*** WARNING C322 IN LINE 198 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: unknown identifier
*** ERROR C320 IN LINE 208 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: "Unknown _WIZCHIP_IO_MODE_ in W5500. !!!!"
*** WARNING C322 IN LINE 222 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: unknown identifier
*** WARNING C322 IN LINE 222 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: unknown identifier
*** WARNING C322 IN LINE 275 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: unknown identifier
*** WARNING C322 IN LINE 275 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: unknown identifier
*** ERROR C320 IN LINE 285 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.c: "Unknown _WIZCHIP_IO_MODE_ in W5500. !!!!"

 

C51 COMPILATION COMPLETE.  17 WARNING(S),  5 ERROR(S) 

 

당황하지 말고 하나씩 살펴보자.

첫번째 Warning "*** WARNING C318 IN LINE 46 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\W5500\w5500.h: can't open file 'Ethernet/wizchip_conf.h'"에서 wizchip_conf.h 파일을 열수 없단다. 이는 ioLibrary Directory가 Include Path에 포함되어 있지 않기 때문이다.

 

 

- ioLibrary Directory 를 Project의 Include Path에 포함시키기

 

Simplicity Studio IDE의 오른쪽 창 Project Explorer에서  Project "ioLibrary_W5500"을 선택하고 우클릭한다. 그러면 Pop-up Menu가 뜨고 거기서 Properties Menu를 클릭한다.

 

 

 

Properties 설정 창에서 다음과 같은 순서를 따라 ioLibrary Directory를 Include Path에 등록한다.

 

 

 

- Project Compile하기

 

Include Path 등록을 마친 후 다시 컴파일을 해보자. 다음과 같이 2개의 Warning과 1개의 Error로 줄어든다.

 

C51 COMPILER V9.51 - SN: K1RIC-I06RWZ
COPYRIGHT Copyright (C) 2012 ARM Ltd and ARM Germany GmbH. All rights reserved.
*** WARNING C322 IN LINE 132 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet/wizchip_conf.h: unknown identifier

C51 COMPILATION COMPLETE.  1 WARNING(S),  0 ERROR(S)
Finished building: ../ioLibrary/Ethernet/W5500/w5500.c
 
Building file: ../ioLibrary/Ethernet/socket.c
Invoking: Keil 8051 Compiler
C51 "@ioLibrary/Ethernet/socket.__i" || test $? -lt 2

C51 COMPILER V9.51 - SN: K1RIC-I06RWZ
COPYRIGHT Copyright (C) 2012 ARM Ltd and ARM Germany GmbH. All rights reserved.
*** WARNING C322 IN LINE 132 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet/wizchip_conf.h: unknown identifier
*** ERROR C141 IN LINE 56 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\socket.c: syntax error near ';'
make: *** [ioLibrary/Ethernet/socket.OBJ] Error 1
*** WARNING C322 IN LINE 266 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\socket.c: unknown identifier

C51 COMPILATION COMPLETE.  2 WARNING(S),  1 ERROR(S) 

 

첫번째 Warning을 살펴보자.

*** WARNING C322 IN LINE 132 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet/wizchip_conf.h: unknown identifier

 

wizchip_conf.h의 132번째 줄에 unknown identifier가 있단다.

_WIZCHIP_IO_MODE_BUS 정의에 오타가 있다. 이를  _WIZCHIP_IO_MODE_BUS_ 로 수정한다.

#if _WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_BUS
   #ifndef _WIZCHIP_IO_BASE_   
      #error "You should be define _WIZCHIP_IO_BASE_ to fit your system memory map.
   #endif
#endif

 

두번째 Error

*** ERROR C141 IN LINE 56 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\socket.c: syntax error near ';'

socket.c 파일에서 SOCK_AY_PORT_NUM 정의할 때 세미콜론(;)를 삭제한다.

#define SOCK_ANY_PORT_NUM 0xC000;

세번째 Warring

*** WARNING C322 IN LINE 266 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\socket.c: unknown identifier

socket.c 파일에서 _WZICHIP_ 오타를 _WIZCHIP_ 으로 수정

    

   if(tmp & Sn_IR_SENDOK)
   {
      setSn_IR(sn, Sn_IR_SENDOK);
      #if _WZICHIP_ == 5200
         if(getSn_TX_RD(sn) != sock_next_rd[sn])
         {
            setSn_CR(sn,Sn_CR_SEND);
            while(getSn_CR(sn));
            return SOCKERR_BUSY;
         }
      #endif
      sock_is_sending &= ~(1 << sn);
   }

Warning과 Error가 없을 때까지 Compile 작업을 반복 수행한다.

 

C51 COMPILER V9.51 - SN: K1RIC-I06RWZ
COPYRIGHT Copyright (C) 2012 ARM Ltd and ARM Germany GmbH. All rights reserved.
*** ERROR C141 IN LINE 57 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\wizchip_conf.c: syntax error near ';'
*** ERROR C141 IN LINE 63 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\wizchip_conf.c: syntax error near ';'
*** ERROR C141 IN LINE 69 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\wizchip_conf.c: syntax error near ';'
*** ERROR C141 IN LINE 75 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\wizchip_conf.c: syntax error near ';'
*** ERROR C141 IN LINE 83 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\wizchip_conf.c: syntax error near ';'
*** ERROR C141 IN LINE 92 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\wizchip_conf.c: syntax error near ';'
make: *** [ioLibrary/Ethernet/wizchip_conf.OBJ] Error 1
*** ERROR C141 IN LINE 99 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\wizchip_conf.c: syntax error near ';'
*** ERROR C141 IN LINE 105 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\wizchip_conf.c: syntax error near ';'
*** ERROR C141 IN LINE 112 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\wizchip_conf.c: syntax error near '.'

C51 COMPILATION COMPLETE.  0 WARNING(S),  9 ERROR(S) 

 

8 Error

*** ERROR C141 IN LINE 57 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\wizchip_conf.c: syntax error near ';'

wizchip_conf.c의 함수 구현시 {} 뒤에 세미콜론(;)이 붙어서 발생한 Error이므로 이를 모두 삭제한다.

 

void      wizchip_cris_enter(void)      {};

void      wizchip_cris_exit(void)        {};

void      wizchip_cs_select(void)      {};

void      wizchip_cs_deselect(void)   {};

uint8_t   wizchip_bus_readbyte(uint32_t AddrSel)   { return * ((volatile uint8_t *)((ptrdiff_t) AddrSel)); };

void      wizchip_bus_writebyte(uint32_t AddrSel, uint8_t wb)   { *((volatile uint8_t*)((ptrdiff_t)AddrSel)) = wb; };

uint8_t   wizchip_spi_readbyte(void)   {return 0;};

void      wizchip_spi_writebyte(uint8_t wb) {};

 

 

1 Error

*** ERROR C141 IN LINE 112 OF D:\UTILs\TMP\WORK\SiLab\ioLibrary_W5500_For_8051\ioLibrary\Ethernet\wizchip_conf.c: syntax error near '.'

이 에러는 KEIL-C compiler가 다음과 같은 STRUCTURE memberd의 초기값 설정을 지원하지 않기 때문에 발생한다.

따라서, 이 코드를 1차 배열 Assign으로 수정한다. 

_WIZCHIP  WIZCHIP =
      {
      .id                  = _WIZCHIP_ID_,
      .if_mode             = _WIZCHIP_IO_MODE_,
      .CRIS._enter         = wizchip_cris_enter,
      .CRIS._exit          = wizchip_cris_exit,
      .CS._select          = wizchip_cs_select,
      .CS._deselect        = wizchip_cs_deselect,
      .IF.BUS._read_byte   = wizchip_bus_readbyte,
      .IF.BUS._write_byte  = wizchip_bus_writebyte
//    .IF.SPI._read_byte   = wizchip_spi_readbyte,
//    .IF.SPI._write_byte  = wizchip_spi_writebyte
      };

 

 Structure member 를 삭제하고 1차배열로 할당한 코드이다.

_WIZCHIP  WIZCHIP =
{
   _WIZCHIP_IO_MODE_,
   _WIZCHIP_ID_,
   wizchip_cris_enter,
   wizchip_cris_exit,
   wizchip_cs_select,
   wizchip_cs_deselect,
   wizchip_bus_readbyte,
   wizchip_bus_writebyte,
 //wizchip_spi_readbyte,
 //wizchip_spi_writebyte
};

 

위 작업을 마무리한 후 다시 컴파일 해본다.  헐 아래와 같이 18 Warning과 155 ERROR가 발생한다. 

 *** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT
make: *** [ioLibrary_W5500.omf] Error 1
    SYMBOL:  ?_WIZ_RECV_DATA?BYTE
    SEGMENT: ?DT?_WIZ_RECV_DATA?W5500

*** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT
    SYMBOL:  ?_WIZ_SEND_DATA?BYTE
    SEGMENT: ?DT?_WIZ_SEND_DATA?W5500

*** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT
    SYMBOL:  ?_WIZCHIP_WRITE_BUF?BYTE
    SEGMENT: ?DT?_WIZCHIP_WRITE_BUF?W5500

*** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT
    SYMBOL:  ?_WIZCHIP_READ_BUF?BYTE
    SEGMENT: ?DT?_WIZCHIP_READ_BUF?W5500

*** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT
    SYMBOL:  ?_WIZCHIP_WRITE?BYTE
    SEGMENT: ?DT?_WIZCHIP_WRITE?W5500

Program Size: data=323.0 xdata=0 code=11868
LINK/LOCATE RUN COMPLETE.  18 WARNING(S),  155 ERROR(S)

 

18 Warning은 전부 *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS  인 것으로 호출되지 않은 함수에 관한 경고이다. 이는 코드 동작에 전혀 문제가 없는 Warning으로 이 Warning을 없애고자한다면 해당 Function을 찾아 모두 주석 처리해주면 된다. 여기서는 그냥 사용한다.

 

155 에러는 Data Segment Error로 각 Function에서 할당되어진 Data나 전역 변수등이 8051의 128 Data  영역에 할당되어 Data overflow를 야기시는 에러이다. Silab C8051F380은 4 KB 영역의 Exteranl Data(XDATA) 영역을 지원하므로 Keil-C compile의 DATA model과 Code model을 모두 Large로 변경한다.  앞서 설명한 Properties 창에서 설정을 변경해보자.

 

- Data & Code Model 변경하기

 

 

 

 

이상 ioLibray_BSD compile을 성공적으로 마무리 했다.

다음 시간에는 WIZnet가 제공하는 Loopback example을 포팅해보면서 생기는 문제점을 하나씩 살펴보면 해결해 나갈 것이다.

 

 

< PREV                                                                                                           NEXT >

블로그 이미지

MidnightCow

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

,