EZ-S3C2410 용 이지부트 시리얼 포트

자…

이제 여러분은 눈치 채셨을 겁니다.

커널 소스상에서 압축 푸는 부분부터 시리얼 포트를 수정해야 한다는 것을

우선 부트로더부터 확인해 봅시다.

EZ-S3C2410 용 이지부트는 시리얼 포트(UART) 로 3번째 것을 사용합니다.

이지 부트 로더의 다음 소스 부분에서 처리 하고 있습니다.

소스 : ezboot\arch_s3c2410\ console.c

void console_init( u32 baudrate)
{
    int  dummy;
                                                                 
    // 포트를 선택한다.
    UART = (volatile u32 *) &(S3C2410_REG_UART2_BASE);
        :
        :

}



오호…

UART2 라서 두 번째 포트라고 우기시는 분 혹시 있으신 거 아니죠?
UART0 번부터 시작합니다. ^^

zImage 시리얼 포트 관련 함수 추적하기

그렇다면

zImage 의 head 프로그램이 압축을 풀면서 메시지를 표출할 때 사용하는 포트를 UART 2 번을 사용해야 하는 겁니다.

이걸 수정하려면 당연히 시리얼 포트를 처리하는 함수를 찾아서 이 부분을 수정해야 겠죠?

우선 ARM 에서 커널 압축 이미지를 푸는 소스의 위치는 어디 일까요?

예 바로 요기 입니다.

              linux/arch/arm/boot/compressed/

이중 head.S 가 가장 먼저 실행하는 루틴을 가지고 있고
misc.c 가 압축을 푸는 부분입니다.

이중 misc.c 를 분석하면 압축 해제 중에 다음 두 가지 루틴을 호출하게 됩니다.
뭐.. 기타 다른 매크로 함수도 있지만 가장 중요한 것을 꼽자면 이 두 가지 입니다.

              static inline void arch_decomp_setup(void)
              static inline void putc(char c);

arch_decomp_setup 함수는 압축을 해제 하기 전 초기화 할 루틴을 선언하도록 되어 있습니다. 예를 들면 시리얼 포트 초기화 같은 거죠

putc 함수는 압축을 해제 할 때 문자를 표출할 때 사용되는 가장 기본 되는 매크로 함수로 시리얼 포트로 한 글자 내 보내는 처리를 하게 됩니다.

이 두 함수가 사용되는 곳을 찾기 위해서

                 linux/arch/arm/

이 디렉토리에서

                  [root@localhost arm]# grep arch_decomp_setup * -R

명령을 실행하면 검색 결과로 너무 많은 것이 나옵니다.
 

흐흐

그래서 제가 골라 주면

      plat-s3c/include/plat/uncompress.h:arch_decomp_setup(void)

요놈이 되겠습니다.

이게 맞는지 어떻게 아냐구요?

그건 plat-s3c/include/plat/uncompress.h 에서 일부러 에러가 나도록 편집해서 커널을 컴파일 해 보면 압니다.

그리고 일단 통밥상 plat-s3c 이런 문구가 있잖습니까?

이건 플랫폼 S3C 계열이다. 뭐 이런 의미죠..

Arm 에서는 3가지 개념이 있습니다.

ARCH , MACH ,PLAT

흠…. 이건 나중에 설명하기로 하죠…

이런 거 일일이 설명 하다 보면 진도 못 나갑니다. ㅎㅎ

일단 소스를 훓어 보다 보면

초보분들



뭐가 뭔지 모르실텐데요…

다른 것은 제쳐 두고 시리얼 출력하는 부분이 어디 인가를 추적해 보면

대략 다음과 같은 매크로가 시리얼 처리를 위한 지정임을 알 수 있습니다.

     #define uart_base S3C24XX_PA_UART + (0x4000*CONFIG_S3C_LOWLEVEL_UART_PORT)

즉 uart_base 가 처리되는 출력 주소를 지정하게 되는 겁니다.
 

흠.

그렇다면

여기서 핵심 키워드는

        CONFIG_S3C_LOWLEVEL_UART_PORT

같군요

호~~

       CONFIG_

이런 접두사가 붙었다면 이것은 커널 컴파일 환경 설정 변수라는 의미인데
이것을 사용자가 선택하도록 하는 부분이 어디에 있겠다는
생각이 머리에 팍~스쳐 지나갑니다.

이런 CONFIG_ 가 붙은 변수는 Kconfig 상에서 CONFIG_ 를 제거한 키워드로 찾아 봐야 합니다.

요렇게요

     [root@localhost arm]# grep S3C_LOWLEVEL_UART_PORT * -R | grep Kconfig

이렇게 찾아 보니

     arch/arm/plat-s3c/Kconfig

란 파일에

    “S3C UART to use for low-level messages” 란 메시지로


S3C_LOWLEVEL_UART_PORT 를 선언하고 있는 것을 알 수 있습니다.

Kconfig 는 커널 컴파일 옵션 설정용 파일이므로

그렇다면 우리는

    make menuconfig 란 명령을 이용해서

이 값을 재 설정해야 한다고 판단할 수 있습니다.

커널 컴파일 환경 설정

수정 순서는

System Type --> S3C UART to use for low-level messages
Kernel hacking -->  S3C UART to use for low-level debug

순 입니다.

이걸 화면으로 찍어 보면 다음과 같습니다.

 A009_000_kernel_config_b1_580.png
[A009_000_kernel_config_b1.png]
A009_000_kernel_config_b2_580.png  

[A009_000_kernel_config_b2.png]
A009_000_kernel_config_b3_580.png
[A009_000_kernel_config_b3.png]
A009_000_kernel_config_b4_580.png
 [A009_000_kernel_config_b4.png]
A009_001_kernel_config_1_580.png  
[A009_001_kernel_config_1.png]
A009_002_kernel_config_2_580.png  
[A009_002_kernel_config_2.png]
A009_003_kernel_config_3_580.png  
[A009_003_kernel_config_3.png]
A009_004_kernel_config_4_580.png  
[A009_004_kernel_config_4.png]
A009_005_kernel_config_5_580.png  
[A009_005_kernel_config_5.png]
A009_006_kernel_config_6_580.png  
[A009_006_kernel_config_6.png]


자 이제 설정이 끝났으면 컴파일 해서 보드에 올려 봅시다.

[root@localhost linux]# make zImage
  :
  :
[root@localhost linux]# cp arch/arm/boot/zImage /tftpboot/zImage.ez-s3c2410
cp: overwrite `/tftpboot/zImage.ez-s3c2410'? y




짜짠~~~

이런 메시지가 나옵니다.

 A009_010_kernel_boot1_580.png
[A009_010_kernel_boot1.png]

일단 무언가 나오기는 하는데

요건 도대체 무슨 화면일까요?