강좌 & 팁
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.png]
[A009_000_kernel_config_b2.png]
[A009_000_kernel_config_b3.png]
[A009_000_kernel_config_b4.png]
[A009_001_kernel_config_1.png]
[A009_002_kernel_config_2.png]
[A009_003_kernel_config_3.png]
[A009_004_kernel_config_4.png]
[A009_005_kernel_config_5.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.png]
일단 무언가 나오기는 하는데
요건 도대체 무슨 화면일까요?
- A009_010_kernel_boot1_580.png (175.2KB)(191)
- A009_000_kernel_config_b1_580.png (136.6KB)(178)
- A009_000_kernel_config_b2_580.png (142.5KB)(168)
- A009_000_kernel_config_b3_580.png (89.9KB)(162)
- A009_000_kernel_config_b4_580.png (142.3KB)(159)
- A009_001_kernel_config_1_580.png (136.2KB)(194)
- A009_002_kernel_config_2_580.png (154.9KB)(172)
- A009_003_kernel_config_3_580.png (90.3KB)(174)
- A009_004_kernel_config_4_580.png (151.8KB)(180)
- A009_005_kernel_config_5_580.png (135.9KB)(168)
- A009_006_kernel_config_6_580.png (77.9KB)(175)