pxa255 타겟보드를 포팅할 때, 알아야할 것들에 대해서 알아본다. 어떤 일이든지 간에 특히 포팅 작업은 타겟 아키텍처에 대한 이해가 선행되지 않으면 안된다.
그래서 해당 아키텍처에 대한 메뉴얼이나 해당 h/w 데이터 시트는 필수적으로 가지고 있어야 한다.
각 레지스터 설명
인터럽트
인터럽트 제어장치는 모든 인터럽트 소스들을 위한 차단 기능을 제공하며, FIQ 나 IRQ 프로세서 인터럽트 중에 하나를 발생시킨다. 프로세서의 인터럽트 계층은 다음의 2 가지 레벨이다.
1차 레벨은 ICMR 내 모든 Enable 되고 비차단된 인터럽트 소스들로부터 인터럽트를 구별하는 것이다. 이 레벨은 3개의 레지스터에 의해 제어된다. 먼저 ICPR 은 시스템 내의 모든 Active 된 인터럽트들을 구별한다. 둘째로, ICIP 는 IRQ 인터럽트를 발생시킬 수 있는 모든 소스로부터 인터럽트들을 포함한다. 또한 ICLR 은 IRQ 를 발생시키기 위해 ICIP 에게 인터럽트를 보내도록 프로그램 된다. ICFP 는 FIQ 를 발생시킬 수 있는 모든 소스로 부터 인터럽트를 포함한다. Interrupt Controller Level RFIQ 를 생성하기 위해서 ICFP 에 인터럽트를 보낸다.
2차 레벨은 소스장치(1차 레벨 인터럽트 Bit 를 생성하는 장치) 내에 포함된 레지스터들을 이용한다. 2차 레벨 인터럽트 상태는 인터럽트에 대한 추가적인 정보를 제공하며, 인터럽트 Service Routine 내에 사용된다. 일반적으로 다중 2차 레벨 인터럽트는 1차 레벨 인터럽트 Bit 를 생성하기 위해서 OR된다. 대부분의 경우에, 인터럽트의 근원은 2개 레지스터 위치를 읽음으로써 결정된다. 즉, 인터럽트를 요구하는 장치를 결정하기 위한 IRQ 인터럽트를 위한 ICIP 나 FIQ 인터럽트를 위한 ICFP 가 있다. 다음은 해당 레지스터들에 대한 설명이다.
레지스터
한편 Reset 된 후에, FIQ 와 IRQ 인터럽트들은 CPU 와 함께 Disable 되며, 모든 인터럽트 제어장치 레지스터들의 상태는 0x0 으로 Set 된다. 또한 인터럽트 제어장치 레지스터들은 인터럽트들이 CPU 내에서 다시 Enable 되기 전에 소프트웨어에 의해 초기화되어야 한다.
Interrupt Controller Mask Register(ICMR)
ICMR 은 Pending Interrupt Bit 당 하나의 Mask Bit 를 가진다. Mask Bit 는 Pending Interrupt Bit 가 프로세서 인터럽트(IRQ 나 FIQ)를 발생시키는 것을 제어한다. Pending Interrupt 가 Active 될 때, 그것은 일치하는 ICMR Mask Bit 가 1 로 Set 되면 CPU 에 의해 처리된다. 반면에 Idle 모드에서 ICCR[DIM] 이 Mask 를 위해 영향을 미치도록 Set 되어야 하며, 그렇지 않으면 인터럽트를 요구하는 소스는 그와 일치하는 Bit 를 Set 하고, 그것의 Mask Bit 의 상태에 무관하게 인터럽트는 자동적으로 처리된다.
Mask Bit 는 인터럽트를 발생하는 소스들의 주기적인 소프트웨어 Polling 을 허용한다. ICMR 은 RESET 에서 0 으로 초기화되어 모든 인터럽트들은 Mask 되며, ICMR 는 원하는 인터럽트를 선택하기 위해서는 사용자에 의해 구성되어야 한다.
- 22 개의 인터럽트에 대한 마스크 비트를 가진다.
- 마스크 비트가 1로 설정되어 있을 경우에만 CPU 로 인터럽트가 전달된다.
- ICIP 레지스터의 비트나 ICFP 레지스터의 비트가 세팅되었다면, ICMR 레지스터(register) 의 마스크 비트가 1 로 설정되어 있을 경우에만 CPU 로 인터럽트가 전달된다.
- PXA255 가 idle 모드에 있다면, 마스크 비트들은 무시되고 바로 인터럽트가 전달된다.
Interrupt Controller Level Register(ICLR)
ICLR 은 Pending Interrupt 가 FIQ 인터럽트를 발생시킬 것인지 IRQ 인터럽트를 발생시킬 것인지를 제어한다. 만약 Pending Interrupt 가 Unmask 되어 있다면, 어느 프로세서 인터럽트가 동작할 것인지를 일치하는 ICLR Bit Field 는 디코딩한다. 만약 인터럽트가 Mask 되어 있으면, ICMR 내의 일치하는 Bit 는 아무런 영향을 받지 않는다. Reset 에서 ICMR 은 모두 0 으로 초기화되며, 소프트웨어는 정규동작 값을 반영하도록 ICLR 를 구성해야 한다.
- 22 개의 인터럽트에 대해서 FIQ 나 IRQ 인터럽트를 발생시킬지를 제어한다.
- 비트의 값이 0 이라면 IRQ 가, 1 이라면 FIQ 가 발생한다.
Interrupt Controller Control Register(ICCR)
ICCR 은 단일 제어 Bit, Disable Idle Mask(DIM) 을 포함한다. 정규 Idle 모드에서 어떤 Enable 된 인터럽트는 ICMR 내의 값에 무관하게 Idle 모드로부터 프로세서를 탈출하게 만든다. 만약 이 Bit 가 Set 되면, Idle 모드로부터 프로세서를 탈출시키는 인터럽트는 ICMR 에 의해 정의된다.
- PXA255 을 idle 모드에서 복귀하는 역할을 수행하기 위한 한 0 번 비트만(DIM : Disable Idle Mask) 를 이용한다.
- 0 번 비트가 1 이면 PXA255 를 Idle 모드에서 복귀시킬 수 있는 모든 인터럽트는 ICMR 의 비트들에 의해서 결정된다.
- 0 번 비트가 0 이면 모든 Enable 된 인터럽트들이 PXA255 을 idle 모드에서 복귀시키게 된다.
Interrupt Controllere IRQ Pending Register(ICIP) 와 FIQ Pending Register(ICFP)
ICIP 와 ICFP 는 인터럽트당 하나의 Bit 를 포함한다. 이들 Bit 들은 인터럽트 요구가 어느 장치에 의해 발생되었는지를 지시한다. 인터럽트 서비스 루틴 내에 인터럽트 소스를 결정하기 위해 ICIP 와 ICFP 를 읽는다. 일반적으로 소프트웨어는 인터럽트를 어떻게 서비스할 것인지를 결정하기 위해서 인터럽트를 요구한 장치 내의 상태 레지스터를 읽는다. ICPR 내의 Bit 들은 Read-Only 이며, 주어진 인터럽트를 위해 ICIP 와 ICFP 상에 상태 Bit 들을 Logical OR 로 표현한다. 인터럽트가 서비스되어질 때, Handler 는 요구되는 상태 Bit 들에 1 을 기입하며, 소스에서 Pending 인터럽트는 Clear 한다. 소스에서 인터럽트 상태 Bit 를 Clear 함으로써 자동으로 일치하는 ICIP 나 ICFP Flag 를 Clear 한다.
다음은 ICIP 에 대한 설명이다.
- 일반적인 인터럽트 처리인 IRQ 에서 어떤 소스에서 발생한 인터럽트인지를 판별하게 된다.
- 레지스터의 비트 값들은 인터럽트 서비스 루틴에서 사용되어 처리된다.
- 인터럽트 상태 비트에 1 을 써줌으로써 클리어하는 것은 인터럽트 소스 내에 다른 인터럽트 상태 비트가 설정되어 있지 않았다면 자동적으로 해당하는 ICIP 와 ICFP 의 비트를 지우게 된다.
- PXA255 에서 사용하는 각 인터럽트에 대한 비트 맵핑을 가지며, ICIP 에 해당하는 비트가 1 이라면 해당하는 소스 디바이스에서 IRQ 요구가 있었음을 나타낸다.
다음은 ICFP 에 대한 설명이다.
- 빠른 인터럽트 처리인 FIQ 에서 어떤 소스에서 발생한 인터럽트인지를 판별
- 레지스터의 비트 값들은 ISR 에서 사용되어 처리된다.
- PXA255 에서 사용하는 각 인터럽트에 대한 비트 매핑을 가지며, ICFP 의 해당하는 비트가 1 이라면 해당하는 소스 디바이스에서 FIQ 요구가 있었음을 나타낸다.
- 인터럽트 상태 비트에 1 을 써줌으로써 클리어 하는 것은 인터럽트 소스내에 다른 인터럽트 상태 비트가 설정되어 있지 않았다면 자동적으로 해당하는 ICIP 와 ICFP 의 비트를 지우게 된다.
Interrupt Controller Pending Register(ICPR)
ICPR 은 시스템 내의 모든 Active 인터럽트들을 보여주는 32 Bit Read-Only 레지스터이다. 이들 Bit 들은 ICMR 의 상태에 영향을 받지 않는다. 소스 상에서 인터럽트 상태 Bit 를 Clear 할 때, 자동으로 일치하는 ICPR Flag 는 Clear 된다. 인터럽트당 하나의 Bit 를 포함한다. 이들 Bit 들은 인터럽트 요구가 어느 장치에 의해 발생되었는지를 지시한다.
- 현재 활성화된 모든 인터럽트들을 보여주는 레지스터
- ICPR 레지스터의 32 비트 중에서 22 비트만을 사용하여 어떠한 인터럽트가 발생했는지를 볼 수 있다.
- 비트들은 ICMR 레지스터의 상태에 영향을 받지 않는다.
운영체제 타이머
프로세서는 3.6864 MHz 발진기에 의해 클럭되는 32 Bit OS 타이머를 가진다. OSCR 은 Free Running Up-Counter 이다. OS 타이머는 4 개의 32 Bit Match Register(OSMR3, OSMR2, OSMR1, OSMR0)를 포함하며, 사용자들은 이들 레지스터들을 읽고 쓸 수 있다. 한편 OSCR 상에 값이 Match 레지스터 중의 어떤 값과 일치하고 인터럽트 Enable Bit 가 Set 될 때, OSSR 내에 일치하는 Bit 는 Set 된다. 이들 Bit 들은 역시 인터럽트를 발생시킬 수 있도록 프로그램될 수 있는 인터럽트 제어장치로 Routing 된다. OSMR3 역시 프로세서가 Reset 될 때 Watchdog Match Register 로서 동작한다. OSCR 과 OSMR 레지스터들을 초기화하고 FIQ 와 IRQ 가 CPU 내에서 Enable 되기 전에 어떤 상태 Bit 들은 Clear 해야 한다.
Watchdog 타이머 동작
OSMR3 은 Watchdog Compare Register 로 이용될 수 있다. 이 기능 OWER[0] 을 set 함으로서 Enable 된다. 이 레지스터에 대한 Compare 가 발생하고 watchdog 이 Enable 되어질 때, Reset 이 프로세서에 적용되며 대부분의 내부 상태들은 Clear 된다. 내부적인 Reset 은 256 개 프로세서 클럭들과 연결되고 제거된다. watchdog 으로서 OSMR3 을 이용할 때, 다음 과정이 제안된다.
- 카운터의 현재 값이 읽혀진다.
- 읽혀진 값에 Offset 이 더해진다. Offset 은 다음 Time-out 전에 시간량과 같다.
- 갱신된 값은 OSMR3 에 도로 쓰여진다.
한편 OS 코드는 각각 March 가 발생하기 전에 주기적으로 위의 과정을 반복한다. Match 가 일어나면 OS 타이머는 프로세서를 reset 시킨다.
레지스터
OS Timer Match Register 0-3 (OSMRx)
이들 레지스터들은 32 Bit 폭을 가지며 프로세서에 의해 Read/Write 가능하다. 그들은 3.6864 MHz 클럭의 각 Rising Edge 후에 OSCR 과 비교된다. 이들 중 어떤 레지스터가 카운터 레지스터와 일치하고 적당한 인터럽트 Enable bit 가 Set 되어지면, 그때 OSSR 상에 일치하는 상태 Bit 는 Set 된다. 상태 Bit 는 CPU 인터럽트를 야기하기 위하여 Unmask 될 수 있는 인터럽트 제어 장치로 Routing 된다. OSMR3 역시 Watchdog 타이머로 이용될 수 있다.
OS Timer Interrupt Enable Register(OIER)
OIER 은 Match 레지스터 중에 하나와 OS 타이머 카운터 사이에 정합이 OSSR 상에 상태 Bit 를 Set 하는 것을 지시하는 4 개의 Enable Bit 를 포함한다. 각 정합 레지스터는 일치하는 Enable Bit 를 가진다. Enable bit 를 Clear 하는 것은 만약 그것이 이미 Set 되어 있다면 일치하는 인터럽트 상태 Bit 를 Clear 하지 못한다.
OS Timer Watchdog Match Enable Register(OWER)
OWER 은 Watchdog 기능을 Enable 하는 단일 제어 Bit(Bit 0) 을 포함한다. 이 Bit 는 1 을 기입함으로써 Set 되며 하드웨어 Reset, Sleep, Reset, Watchdog reset, 그리고 GPIO Reset 과 같은 Reset 기능 중에ㅔ 하나에 의해서만 Clear 된다.
OS Timer Counter Register(OSCR)
OSCR 은 3.6864 MHz 클럭의 Rising Edge 에 대해 증가하는 32 Bit 카운터이다. 이 카운터는 어떤 때이든지 Read/Write 가능하다. 그것은 시스템이 MMU 보호 매커니즘을 통해 이 레지스터를 Write-Protect 한다. OSCR 이 쓰여진 후에 레지스터가 갱신되기 전에 Delay 가 발생한다. 소프트웨어는 레지스터가 새로운 값으로 변화된 것을 확인하게 한다.
OS Timer Status Register(OSSR)
OSSR 은 4 개의 Match register 중에 어떤 것과 OSCR 사이에 Match 가 발생하였음을 나타내는 상태 Bit 들을 포함한다. 이 Bit 들은 Match Event(following the rising edge of the 3.6864 MHz clock) 가 발생하고 일치하는 인터럽트 Enable Bit 가 OIER 에서 Set 되어질때, Set 된다. OSSR Bit 들은 적당한 Bit 위치에 1 을 씀으로서 Clear 된다. 이 레지스터에 0 을 쓰는 것은 아무런 영향을 받지 않는다.