== PXA255의 GPIO EZ-X5의 LED는 GPIO 2, 3, 4, 5에 연결돼 있다. 따라서 LED 시험을 하기 위해서는 PXA255의 GPIO에 대해 알아봐야 한다. GPIO(General Purpose Input Output)는 일반적인 용도의 입출력 포트를 의미하며, 구조는 <그림 4>와 같다. 이처럼 복잡한 구조를 갖는 이유는 하나의 입출력 핀에 여러 가지 기능을 부여하기 때문이다. 기본적으로 입력과 출력이 가능하며, 하나의 핀은 GPIO로 사용될 수도 있지만 다른 기능으로도 사용이 가능하다.
<표 2> GPIO의 구조
이 모든 것을 설명하기는 지면 사정상 곤란하므로 시험 코드를 작성하기 위해 필요한 사항에 대해서만 알아보자. 우선 살펴봐야 할 것은 GPIO에 관련된 레지스터이다. PXA255의 GPIO는 다음과 같은 레지스터를 갖는다.
◆ 핀의 특성 부여용 레지스터 GPDR - GPIO 입출력 방향 설정 레지스터 GAFR - GPIO 이외의 기능으로 사용 허가 설정 레지스터 GRER - GPIO 입력 상승 에지 검출 허가 레지스터 GFER - GPIO 입력 하강 에지 검출 허가 레지스터
◆ 데이터 출력 및 검출용 레지스터 GPSR - GPIO 출력 셋 레지스터 GPCR - GPIO 출력 클리어 레지스터 GPLR - GPIO 입력 레벨 검출 레지스터 GEDR - GPIO 입력 에지 검출 레지스터
이 레지스터에 접근하기 위해서 한 가지 짚고 넘어가야 할 것이 있다. 인텔의 i386 계열의 프로세서들은 I/O의 주소와 메모리 주소가 분리되어 있다. 하지만 ARM은 이렇게 분리되어 있지 않기 때문에 I/O의 접근과 메모리 접근이 같은 방식으로 수행된다. 즉 I/O는 일반 메모리처럼 접근하도록 프로그래밍한다는 것이다. 또한 PXA255의 코어를 제외한 내부 디바이스들은 이미 주소가 할당되어 있다. 따라서 GPIO를 제어하기 위해서는 GPIO를 제어하는 컨트롤러 레지스터에 접근해야 한다. GPIO의 레지스터 주소는 <표 2>와 같다.
<표 2> GPIO의 레지스터 주소
이렇게 상당히 많은 레지스터가 존재하는 이유는 GPIO가 80개 이상이기 때문에 32비트 하나의 레지스터로는 모두 제어할 수 없기 때문이다. EX-X5에서 LED를 제어하는 GPIO는 레지스터를 2, 3, 4, 5번이다. 또한 출력으로만 이용하고 리셋시에는 부가 기능이 해제되기 때문에 관련된 레지스터는 GPDR, GPSR, GPCR이다. 이 레지스터의 주소는 다음과 같다.
◆ GPDR0 0x40E0000C ◆ GPSR0 0x40E00018 ◆ GPCR0 0x40E00024
GPDR은 GPIO를 출력으로 설정하는 레지스터인데 GPIO 핀에 해당하는 비트 값이 1로 설정되면 출력이 된다. 리셋시에는 모두 입력 상태를 갖는다. GPSR과 GPCR은 PXA255의 GPIO 출력 제어의 특성 때문에 이렇게 두 개의 레지스터로 나누어진다. 필자의 개인적인 입장으로 보면 PXA255는 각 비트별 제어가 무척 쉽다. 왜냐하면 특정 GPIO의 출력을 하이 상태로 만들 경우 GPSR의 비트 중에 해당 GPIO 비트만 1로 설정해 써넣으면 1이 아닌 다른 GPIO에는 영향을 미치지 않기 때문이다. GPCR은 출력을 로우로 만들어 주며 GPSR과 제어 방식은 동일하다.
== LED 제어 프로그램 LED를 제어하기 위한 부트 프로그램을 작성하기 위해서는 ARM 어셈블러를 알아야 한다. 하지만 ARM 명령을 여기서 모두 소개하기는 힘들기 때문에 프로그램의 실제 코딩과 관련된 것만 필요할 때마다 알아보겠다(자세한 내용은 kelp.or.kr의 자료실을 참고하라. ARM7의 명령에 관련된 한글 문서가 있으며, 영문으로 쉽게 구할 수도 있다). 부트코드에 사용되는 ARM 명령은 기본적으로 ARM7이든 ARM9든 XScale이든 모두 다 동일하기 때문에 ARM7의 명령어만 숙지해도 문제가 없을 것이다. 우리가 작성하고자 하는 LED 제어 부트 프로그램은 크게 ▲ start.S(프로그램) ▲ start-ld-script(링크 정보) ▲ Makefile(메이크 파일)의 3가지 파일로 구성되어 있다. 각 파일을 좀더 상세히 알아보자. | |