메뉴 바로가기 본문 바로가기

기술자료

Windows CE 6.0 기반 S3C6410 BSP 의 부트로더 코드 분석하기 (II)
관리자 2009-09-01 오전 11:30:34 조회 16495
Windows CE 6.0 기반 S3C6410 BSP 의 부트로더 코드 분석하기 (II)
 
지난 호에서는 스텝로더 이후에 실행되는 Eboot 에 대해 개괄적으로 살펴보았다. 직접 코드를 추적해 보면 알 수 있겠지만, 상당히 많은 수의 라이브러리들이 링크되어 부트로더가 생성되고, 그 중 상당수는 마이크로소프트에 의해 제공되는 제품 수준의 코드들이다. 또한 OEM 이 구현하는 코드 중 상당수가 이미 칩벤더에 의해 특정 레퍼런스 보드를 기준으로 구현되어 있기 때문에 실제로 제조사가 수정해야 할 부트로더 코드는 그리 많지 않다. 이번 연재에서는 OEM에 의해 비교적 자주 수정되는 하드웨어 모듈을 중심으로 부트로더의 코드를 살펴보고자 한다.
 
글 : 백원석 팀장 / ePlatform 사업부, SG 어드밴텍㈜
www.sgadvantech.kr/esg   / joseph@advantech.co.kr
 
 
부트로더에서의 디바이스 초기화
부트로더는 OS 를 로딩하는데 필요한 최소한의 하드웨어만 초기화 할 뿐, 디바이스 드라이버를 로딩하지는 않는다. 드라이버를 호스팅 할 OS가 아직 로딩되지 않았기 때문에 빚어지는 당연한 결과이기도 하지만, 그렇다고 해서 Windows CE 부트로더 개발자가 디바이스에 대해 전혀 신경쓰지 않아도 된다는 것은 아니다. 부트로더는 소프트웨어이지만 수행 내용을 보자면 오히려 소프트웨어 엔지니어 업무보다는 하드웨어 엔지니어 업무에 훨씬 근접하다고 볼 수 있다. 최소한의 하드웨어라고는 하나 여기에는 클럭, SDRAM, UART, 낸드플래쉬, 디스플레이 컨트롤러, 이더넷 컨트롤러, USB 컨트롤러, GPIO 등 꽤 많은 디바이스가 속해 있다.
이후 절 부터는 이 중 주요한 디바이스 별로 초기화 코드를 살펴보고자 한다.
 
클럭 설정
삼성 S3C6410 의 클럭 구조를 보면 매우 많은 수의 클럭을 제공함을 알 수 있다. 아래의 [그림 1]을 보자. 먼저 S3C6410은 클럭소스로 외부 크리스탈 혹은 외부 클럭을 사용할 수 있으며, CPU의 OM[0] 핀이 0이면 외부 클럭이 사용되고, 그렇지 않을 경우는 외부 크리스탈이 선택된다.
 
 
[그림 1] 외부 클럭 선택
 
하드웨어적으로 XOM0 핀이 1로 설정되어 있음을 알 수 있다. 따라서 본 보드는 외부 클럭(EXTCLK)을 사용하도록 되어 있다는 것을 알 수 있다. 이 외부 클럭은 다시 3개의 PLL 을 통해 보드에서 요구되는 다양한 클럭을 만들어 내게 된다. 다른 ARM 보드와 마찬가지로 AT-6410 보드 역시 APLL, MPLL, EPLL 의 3개의 PLL을 사용한다.
그럼 이제 [그림 2]를 통해 보드에서 사용되는 주요 클럭 몇 가지를 살펴보자. 먼저 ARMCLK은 APLL 을 통해 클럭이 만들어지며 ARM11 core 에 공급되는 것으로서 최대 800Mhz 까지 사용 가능하다. HCLKX2 는 AHB 버스에 존재하는 두 개의 DDR 컨트롤러 DDR0와 DDR1에 클럭을 공급하는 것으로써 최대 266Mhz까지 동작한다. AMBA 버스 중 AHB 버스 상에 클럭을 공급하는 것은 전적으로 DIVHCLK에 달려 있다. 그림에서 HCLK_GATE 레지스터는 HCLKX2와 HCLK 클럭을 마스킹 하는 데 사용된다. 슬립 모드에서 전력 소모량을 줄이기 위해서 사용될 수 있다. ARMCLK 과 HCLKX2, HCLK 클럭 간에는 정해진 비율이 존재한다. 이는 ARM core와 AXI 버스 인터페이스 간의 동기화를 위해 반드시 지켜져야 하는 것이다. 이외에 APB 버스에 공급되는 PCLK이 있고, UART 등 저속 디바이스에 공급되는 SCLK 이 있다.
 
 
[그림 2] ARM 코어 및 버스 클럭 생성
 
PLL 은 외부 클럭 소스로부터 받은 저주파 신호를 내부 로직을 통해 최대 1.6GHz 까지 증폭시킬 수 있게 된다. 하지만 실제로 6410 CPU 는 최대 800Mhz 까지만 동작하며, ARMCLK 이외의 디바이스에는 훨씬 저속의 클럭만이 필요하므로 대부분 PLL 이 만든 클럭을 분주해서 자기 디바이스에 필요한 클럭을 생성하여 사용하게 된다. 클럭 생성과 관련되어서는 Lock 시간을 설정하는 PLL_LOCK 레지스터와 실제로 생성되는 클럭을 설정하는 PLL_CON레지스터가 사용된다. 클럭의 주파수나 분주값이 변경되어 결과적으로 산출되는 클럭 파형이 변경될 경우에는 안정된 클럭 파형이 공급될 때까지 초기 셋업 타임이 필요하므로 PLL_LOCK 시간이 필요게 된다.
 
 
 [ 표 1 ] PLL 컨트롤 레지스터
 
위의 표 1은 APLL과 MPLL 이 생성해 내는 클럭 값을 설정하기 위한 레지스터 설정을 보여주고 있다. 32번째 ENABLE 비트가 1이면 해당 PLL 은 LOCK 타임 경과 후 미리 설정된 값의 클럭을 만들어 주게 된다. 이때 생성되는 클럭 주파수는 MDIV, PDIV, SDIV 값에 의해 결정되며, 아래 공식에 준한다.
 
FOUT = MDIV X FIN / (PDIV X 2SDIV)
 
각 변수에는 사용 가능한 값의 범위가 있으며, OEM 이 해당 규칙 내에서 적절하게 사용할 수 있겠지만 삼성에서는 클럭 별로 안정적으로 동작하는 최적의 값을 권고하고 있다.
 
표 2   APLL 및 MPLL 산정 표
 
 
S3C6410이 지원하는 최대 클럭이 800Mhz 이지만 부트로더에서는 굳이 최대 성능의 클럭이 필요치 않으므로 아래 코드와 같이 메인 클럭을 533Mhz 으로 설정하고 있다.
 
 
 
마찬가지로 EPLL 이 생성하는 클럭은 아래와 같다.
 
FOUT = (MDIV + KDIV / 216) X FIN / (PDIV X 2SDIV)
 
 
표 2   EPLL 산정 표
 
위와 같은 방식으로 MISC_CON[19] 레지스터가 SYNC667 모드로 설정되어 있다면 1/2 분주기와 1/5 분주기가 사용되는 것이고, 이때 만약 APLL이 1.33GHz의 주파수를 만들어 낸다면 분주기를 거쳐 ARMCLK 에는 667MHz 가 공급되고 HCLKX2 에는 266MHz 가 공급되는 것이다.
 
디스플레이 설정
타겟 보드 상의 대부분의 하드웨어 초기화를 담당하는 OEMPlatformInit() 함수 실행 초반에 디스플레이 컨트롤러 초기화 함수가 호출된다. S3C6410의 디스플레이 컨트롤러는 1bit 에서 24bit 까지의 RGB 포맷 및 YCbCr 4:4:4 등 다양한 컬러 포맷을 지원한다. 디스플레이를 사용하기 위해서는 해상도 설정 및 타이밍, 주파수 설정 등의 작업이 필요하다.
 
시스템 리셋시 LCD 컨트롤러의 출력은 바이패스 모드가 된다. 바이패스 모드와 일반모드 간의 스위칭은 0x7410_800C 의 SEL_BYPASS 레지스터에 의해 이루어진다.
 
디스플레이 컨트롤러의 주요 레지스터는 아래 표와 같다.
 

레지스터
주소
사용
MIFPCON
0x7410_800C
SEL_BYPASS[3] 을 통해 Normal 모드 혹은 By-pass 모드로 설정함
SPCON
0x7F00_81A0
LCD_SEL[1:0] 값을 사용하여 호스트 I/F 방식 혹은 RGB I/F 방식으로 설정함
VIDCON0
0x7710_0000
비디오 출력 포맷 설정 및 디스플레이 활성화/비활성화 설정
VIDCON1
0x7710_0004
RGB I/F 컨트롤 신호
I80IFCONx
0x7710_01Bx
i-80 시스템 I/F 컨트롤 신호
ITUIFCON0
0x7710_01A8
ITU(BT.601) 인터페이스 컨트롤
VIDTCONx
0x7710_001x
비디오 출력 타이밍 및 디스플레이 크기 설정
WINCONx
0x7710_002x
각각의 윈도우 포맷 설정
VIDOSDxA,
VIDOSDxB
0x7710_00x0
0x7710_00x4
윈도우 위치 설정
VIDOSDxC
0x7710_00x8
알파값 설정
VIDWxxADDx
0x7710_00Ax
소스 이미지 어드레스 설정
WxKEYCONx
0x7710_014x
컬러키 값 레지스터
WINxMAP
0x7710_01xx
윈도우 색상 컨트롤
WPALCON
0x7710_01A0
팔레트 컨트롤 레지스터
WxPDATAxx
0x7710_03xx
인덱스 별 윈도우 팔레트 데이터

 
아래는 AT-6410 보드의 디스플레이 관련 회로이다. RGB 데이터와 수직/수평 동기신호, 데이터 유효 신호 및 데이터 동기 클럭을 사용되는 RGB 인터페이스 방식임을 알 수 있다.
 
 
 
각 핀은 다음과 같은 역할을 담당한다.

이름
형태
소스/타겟
설명
RGB_HSYNC
출력
Pad
수평동기 신호
RGB_VSYNC
출력
Pad
수직동기 신호
RGB_VCLK
출력
Pad
LCD 비디오 클럭
RGB_VDEN
출력
Pad
데이터 인에이블
RGB_VD[23:0]
출력
Pad
RGB 데이터 출력

 
하드웨어 RGB 인터페이스 방식으로 되어 있으므로 관련 레지스터인 SPCON 에서 LCD_SEL 비트를 01 로 하도록 한다.
 
 
위의 코드는 PlatformInit 함수에서 호출한 InitializeDisplay 함수의 내용이다. 먼저 lcd 판넬의 유형을 정의하였고(), 판넬 타잎 별 정보를 디스플레이 구조체에 저장하였다(,③). 여기에서는 판넬의 해상도와 Front Porch, Back Porch 등 RGB 인터페이스의 타이밍 정보들이 설정된다. 현재 LCD 인터페이스가 RGB 방식이므로 관련 레지스터인 SEL_BYPASS 와 SPCON을 normal 모드로 설정한다().
 
 
 
이후에는 프레임 버퍼를 만들고, LCD 클럭을 설정한 후 부트로더의 로고 이미지를 프레임 버퍼에 복사하고 백라이트를 켜는 작업을 하면 된다.
 
 
맺음말
지금까지 부트로더 코드 중 클럭 설정 부분과 디스플레이 설정 부분을 다뤄보았다. 이외에도 여러가지 토픽들 별로 설명할 수 있겠지만 방법론적으로 거의 동일하다고 볼 수 있으며, 이번 글에서 다룬 코드를 통해서도 알 수 있듯이 부트로더의 특성상 핵심적인 부분은 하드웨어 컨트롤이 대부분이다. 그외 주변에 필요한 로직들은 대부분 마이크로소프트에 의해 이미 제품 수준으로 제공되고 있다. 즉, Windows CE 를 사용하는 고객사들은 최소한의 코드 수정만으로 최소한의 시간만으로도 매우 안정적인 제품 구현을 할 수 있는 것이다. 이미 여러해 동안 Windows CE가 전세계의 수많은 고객사들로부터 최고의 RTOS 로서 인정받고 있다는 사실은 이러한 것과 무관하지 않을 것이다. 모쪼록 마이크로소프트 윈도우 임베디드 OS가 여러 고객사들의 성공적인 비즈니스 파트너로서 부족함이 없이 항상 곁에 있어 주기를 바란다.

답변 목록

회원가입