== 타겟 보드 이전 강좌에서도 독자들에게 양해를 구했듯이 실제 사용 가능한 부트로더를 만들려면 타겟이 분명해야 한다. 여러 프로세서를 지원하는 공개된 부트로더들 역시 환경 설정시에 타겟을 설정하게 하는 것이 그 이유이다. 때문에 필자 회사에서 개발한 EZ-X5 보드를 소개할 수밖에 없는 점을 이해해 주기 바란다. <그림 3>은 이번 연재를 통해 만들어보게 될 ‘이지부트’라는 부트로더가 실장될 타겟 보드(모델명 EZ-X5)의 외관이다. 실장 내용은 다음과 같다.
◆ PXA255 400MHz ◆ 32MB SDRAM ◆ Boot Flash(NOR FLASH ROM 29LV800) ◆ Data Flash(NAND FLASH K9F1208U0A) ◆ Ethernet CS8900A ◆ Toutch Controller MK712 ◆ JTAG 변환 회로 ◆ USB 커넥터 ◆ 확장 커넥터 ◆ DEBUG LED ◆ LCD 확장 커넥터 ◆ FFUART/BTUART 2포트 커넥터
<그림 3> EZ-X5 타겟 보드
이 타겟 보드에 실장된 모든 디바이스를 부트로더에서 모두 처리할 필요는 없다. 왜냐 하면 이지부트는 최종적으로 리눅스 커널이 동작된다는 것을 염두에 두었기 때문이다. 실제 이지부트에서 지원하는 디바이스들은 32MB SDRAM, Boot Flash(NOR FLASH ROM 29LV800), Data Flash(NAND FLASH K9F1208U0A), Ethernet CS8900A, DEBUG LED(GPIO) 등이다. 열거된 디바이스들은 부트로더에서 실제 구현할텐데, 상세한 내용은 연재를 진행하면서 필요할 때마다 설명하도록 하겠다. 여기서는 그냥 이런 것이 있구나 하는 정도만 기억하자.
== 보드 시험을 위한 프로그램 보드를 시험하는 목적은 프로세서가 동작하는가에 대한 검증이다. 이 보드 시험에서 테스트 프로그램의 부트코드가 정상적으로 동작한다면 두 가지의 검증이 되는 것이다. 첫 번째는 보드의 동작이다. 아주 최소한의 동작이기는 하나 보드가 동작하기 시작하면 하드웨어적인 시험을 하기 위한 프로그램의 동작이 가능하기 때문에 이후의 검증 과정이 한결 수월해진다. 두 번째는 크로스 컴파일러의 구축에 대한 검증이다. 부트 코드가 동작한다는 것은 크로스 컴파일 환경에 이상이 없다는 것을 의미하기 때문이다. 서두에서 얘기했지만 하드웨어 검증이 끝나는 최초 시점은 부트 코드가 동작하는 조건이다. 하드웨어 검증만으로는 보드가 살았다고 할 수 없다. 더구나 구축된 크로스 컴파일 환경이 정말 정상적으로 동작되는지 역시 알 수 없는 것이다. 따라서 보드 시험을 위한 프로그램 설계는 아주 간단한 것을 수행하는 것으로 해야 한다. 필자가 즐겨 사용하는 방법은 LED를 점멸시키는 것이다. LED를 점멸시키는 프로그램을 주로 이용하는 이유는 초기 보드 시험시의 조건 때문이다. 프로세서가 동작하는 최소한의 조건은 전원, 클럭, 롬, 프로세서만 있으므로 처음 시험시에는 RAM을 비롯한 주변 디바이스도 달지 않고 시험한다. 주변 칩이 모두 달려 있으면 문제가 발생해도 정확하게 어디가 문제인지 알 수 없기 때문이다. 아무래도 동작을 확인하려면 시각적으로 확인하는 것이 좋기 때문에 디버그용 LED를 달아서 해당 LED를 동작시키는 코드를 작성한다. 이런 시험 코드를 작성하기 위해서 알아야 할 최소한의 내용은 다음과 같다.
◆ 리셋시 프로세서 동작 ◆ PXA255의 GPIO 관련된 내용
또한 프로그램의 제약 조건이 있는데 그것은 스택 구조를 이용하는 방법의 프로그램이 불가능하다는 것이다. 왜냐하면 스택이라고 하는 것은 램을 이용하는 프로그램 방식인데, 앞에서 말했듯이 램을 달지 않고 초기에 시험하기 때문이다. 실제 PXA255와 같이 SDRAM을 사용하는 프로세서는 메모리 환경 설정 레지스터를 프로그래밍하는 것이 다소 복잡하다. 보드에 전원이 인가된 이후에 프로세서가 가장 처음 하는 행동은 리셋이다. 이 리셋에 대하여 알려면 먼저 ARM의 인터럽트에 대한 지식과 PXA255의 리셋에 관련된 지식이 필요하다.
== ARM의 인터럽트와 벡터 테이블 ARM에는 FIQ(Fast Interrupt reQuest)와 IRQ(Interrupt ReQuest), Abort, Software Interrupt, Undefined Instruction Trap의 5가지 인터럽트가 있다. 각 인터럽트가 발생하면 ARM은 해당 인터럽트에 대응하는 벡터 테이블의 명령을 수행한다. <표 1>은 인터럽트 벡터 테이블이다. 테이블에서 보듯이 각 주소는 4바이트 단위로 수행 명령을 가지게 된다. ARM은 RISC 구조의 간단한 명령 구조를 가지고 있기 때문에 4바이트로 점프 명령이 가능하므로 각 주소에는 실제 인터럽트를 처리하는 루틴으로 점프하는 명령만을 넣는다. 이중 Normal Interrupt와 Fast Interrupt는 발생 소스가 여러 가지 있으므로 외부 디바이스로 인터럽트 컨트롤러가 간여하게 된다. 실제 PXA255의 인터럽트 중에서 리셋에 관련된 내용을 알아보자.
== PXA255의 리셋 PXA255의 리셋 신호의 종류에는 GPIO, 워치독, 하드웨어의 3가지이다. 이중 보드 살리기에 관련된 리셋은 하드웨어 리셋이다. 하드웨어 리셋은 전원이 투입된 후 자동으로 리셋 신호 발생 회로 또는 스위치와 같은 리셋 신호 발생 회로에서 발생된 신호를 nRESET 단자에 일정한 시간 동안 인가함으로로써 발생된다. 하드웨어 리셋 신호는 프로그램으로 금지시킬 수 없다. 또한 내부적인 운영 모드는 리셋에 아무런 영향을 끼칠 수 없다. nRESET 신호는 nRESET_OUT에 연동되어 외부에 리셋 상태를 전달할 수만 있다. 리셋 상태에서는 프로세서의 모든 내용이 초기화된다. 내부 코어와 다비이스들은 사전에 정의된 리셋 초기 상태 값을 유지한다. 이때 외부에서 인가되는 nBATT_FAULT와 nVDD_ FAULT 신호들은 무시된다. 메모리 컨트롤러가 정지되므로 다이나믹 램과 같은 디바이스의 내용은 소실된다. 리셋 상태에 진입한 후에 nRESET 신호 핀에 다시 하이 상태가 일정한 시간 이상 인가되면 리셋 상태가 종료되고 다음과 같은 부팅 순서로 진행된다.
◆ 3.6864MHz 오실레이터와 PLL 클럭 제너레이터의 안정 상태를 위해서 잠시 기다린다. ◆ nRESET_OUT 신호가 하이 상태가 된다. ◆ 정상적인 부팅 순서가 시작되며 디바이스들은 사전에 정의된 상태를 갖는다.
이때의 프로세서는 최초의 리셋 어드레스인 0000-0000번지의 명령을 읽으려고 시도한다. 여기서 한 가지 기억해 두어야 할 것은 하드웨어 리셋이 된 상태는 자동적으로 슈퍼바이저 모드로 전환되고, 내부 코어에 전달되는 클럭은 PXA255가 비록 400MHz로 동작된다 하더라도 3.6864MHz가 그대로 전달된다는 점이다. 즉 동작 속도가 3.6864MHz밖에 안 되어 매우 느리게 동작한다. 또한 메모리 접근 속도도 설정할 수 있는 가장 느린 속도의 접근을 시도한다. 때문에 대부분의 롬 디바이스에 접근이 가능하고 메모리에서 데이터를 읽어올 수 있는 것이다.
<표 1> 인터럽트 벡터 테이블 | |