Cygwin에서 ezboot 컴파일 따라하기 -3-

 

문제 수정에 앞서 유영창 이사님과 장형기 팀장님께 도움을 받아서 진행하였습니다.

 

1. ezboot 수정 : arch_s3c2440/console.c (24번째 줄)

 

지난 문서에 의한 에러 메시지....

 

/ezboot/arch_s3c2440/console.c: In function 'console_init':
/ezboot/arch_s3c2440/console.c:52: error: invalid lvalue in assignment
/ezboot/arch_s3c2440/console.c:53: error: invalid lvalue in assignment
/ezboot/arch_s3c2440/console.c:58: error: invalid lvalue in assignment
/ezboot/arch_s3c2440/console.c:62: error: invalid lvalue in assignment
/ezboot/arch_s3c2440/console.c:64: error: invalid lvalue in assignment
/ezboot/arch_s3c2440/console.c:66: error: invalid lvalue in assignment
/ezboot/arch_s3c2440/console.c: In function 'console_putc':
/ezboot/arch_s3c2440/console.c:77: error: invalid lvalue in assignment
make[1]: *** [/ezboot/arch_s3c2440/console.o] Error 1

 

gcc 의 버전이 4.x 가 되면서 애매모한 문법적인 문제는 이제 에러로 처리하기로 한것으로 보입니다.
컴파일 에러가 걸린 부분은 주로 주소 지정과 관련된 에러 인데 S3C2440 일 경우에는 수정이 필요합니다.

 

※ 수정 전 arch_s3c2440/console.c
-----------------------------------------------------------------------------------------------------------------------------------------------
static volatile u32 *UART = (volatile u32 *) &(S3C2440_REG_UART2_BASE); // UART 베이스 어드레스

#define UART_LCR        ((volatile u32) UART[ 0])       //  UART line control register
#define UART_UCR        ((volatile u32) UART[ 1])       //  UART control register
#define UART_FCR        ((volatile u32) UART[ 2])       //  UART FIFO control register
#define UART_MCR        ((volatile u32) UART[ 3])       //  UART modem control register
#define UART_TRxSTAT    ((volatile u32) UART[ 4])       //  UART Tx/Rx status register
#define UART_ERRSTAT    ((volatile u32) UART[ 5])       //  UART Rx error status register
#define UART_FSR        ((volatile u32) UART[ 6])       //  UART FIFO status register
#define UART_MSR        ((volatile u32) UART[ 7])       //  UART modem status register
#define UART_TXD        ((volatile  u8) UART[ 8])       //  UART transmit buffer register
#define UART_RXD        ((volatile  u8) UART[ 9])       //  UART receive buffer register
#define UART_BAUD       ((volatile u32) UART[10])       //  Baud rate divisor register

-----------------------------------------------------------------------------------------------------------------------------------------------

 

이 부분을 다음과 같이 수정해야 합니다.

 

※ 수정 후 arch_s3c2440/console.c
-----------------------------------------------------------------------------------------------------------------------------------------------
static volatile u32 *UART = (volatile u32 *) &(S3C2440_REG_UART2_BASE); // UART 베이스 어드레스

#define UART_LCR        (*((volatile u32 *) (&UART[ 0])))       //  UART line control register
#define UART_UCR        (*((volatile u32 *) (&UART[ 1])))       //  UART control register
#define UART_FCR        (*((volatile u32 *) (&UART[ 2])))       //  UART FIFO control register
#define UART_MCR        (*((volatile u32 *) (&UART[ 3])))       //  UART modem control register
#define UART_TRxSTAT    (*((volatile u32 *) (&UART[ 4])))       //  UART Tx/Rx status register
#define UART_ERRSTAT    (*((volatile u32 *) (&UART[ 5])))       //  UART Rx error status register
#define UART_FSR        (*((volatile u32 *) (&UART[ 6])))       //  UART FIFO status register
#define UART_MSR        (*((volatile u32 *) (&UART[ 7])))       //  UART modem status register
#define UART_TXD        (*((volatile  u8 *) (&UART[ 8])))       //  UART transmit buffer register
#define UART_RXD        (*((volatile  u8 *) (&UART[ 9])))       //  UART receive buffer register
#define UART_BAUD       (*((volatile u32 *) (&UART[10])))       //  Baud rate divisor register

-----------------------------------------------------------------------------------------------------------------------------------------------

 

Cygwin에서 /ezboot 로 가서 ez-s3c2440_make.sh 파일을 실행합니다.

 

 

 

2. ezboot 수정 : main/net.c (45번째 줄)

 

 

다음과 같은 에러가 발생합니다.

 

/ezboot/main/net.c: In function 'IPChecksum':
/ezboot/main/net.c:45: error: invalid lvalue in increment
make[1]: *** [/ezboot/main/net.o] Error 1
make[1]: Leaving directory `/ezboot/main'
make: *** [all] Error 2

 

다음과 같은 문장 역시 문법적으로 애매한 구석이 있습니다.

 

※ 수정 전 main/net.c
-----------------------------------------------------------------------------------------------------------------------------------------------
unsigned IPChecksum(char *ptr, int len)
{
    u32     xsum;

    xsum = 0;
    while (len-- > 0) xsum += *((u16 *)ptr)++;
-----------------------------------------------------------------------------------------------------------------------------------------------

 

이 부분을 다음과 같이 수정해야 합니다.

 

※ 수정 전 main/net.c
-----------------------------------------------------------------------------------------------------------------------------------------------
unsigned IPChecksum(char *ptr, int len)
{
    u32     xsum;

    xsum = 0;
    while (len-- > 0)
    {
         xsum += *((u16 *)ptr);
         ptr  += 2;

    }
-----------------------------------------------------------------------------------------------------------------------------------------------

 

Cygwin에서 /ezboot 로 가서 ez-s3c2440_make.sh 파일을 실행합니다.

 

 

컴파일이 정상적으로 완료되었습니다.

 

하지만, 테스트 결과 NAND FLASH에서 배드블럭을 처리하는 오류를 발생하였습니다.

정상적인 진행이 불가하여 EZ-AT7 을 사용하여, 제공된 부트로더를 사용하였습니다.

오류를 수정할 때까지, Cygwin에서 컴파일한 ezboot 파일을 EZ-S3C2440 보드에 사용하지 마시기 바랍니다.

 

다음 강좌에서 수정하도록 하겠습니다.