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 되기 전에 소프트웨어에 의해 초기화되어야 한다.
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 는 원하는 인터럽트를 선택하기 위해서는 사용자에 의해 구성되어야 한다.
ICLR 은 Pending Interrupt 가 FIQ 인터럽트를 발생시킬 것인지 IRQ 인터럽트를 발생시킬 것인지를 제어한다. 만약 Pending Interrupt 가 Unmask 되어 있다면, 어느 프로세서 인터럽트가 동작할 것인지를 일치하는 ICLR Bit Field 는 디코딩한다. 만약 인터럽트가 Mask 되어 있으면, ICMR 내의 일치하는 Bit 는 아무런 영향을 받지 않는다. Reset 에서 ICMR 은 모두 0 으로 초기화되며, 소프트웨어는 정규동작 값을 반영하도록 ICLR 를 구성해야 한다.
ICCR 은 단일 제어 Bit, Disable Idle Mask(DIM) 을 포함한다. 정규 Idle 모드에서 어떤 Enable 된 인터럽트는 ICMR 내의 값에 무관하게 Idle 모드로부터 프로세서를 탈출하게 만든다. 만약 이 Bit 가 Set 되면, Idle 모드로부터 프로세서를 탈출시키는 인터럽트는 ICMR 에 의해 정의된다.
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 에 대한 설명이다.
다음은 ICFP 에 대한 설명이다.
ICPR 은 시스템 내의 모든 Active 인터럽트들을 보여주는 32 Bit Read-Only 레지스터이다. 이들 Bit 들은 ICMR 의 상태에 영향을 받지 않는다. 소스 상에서 인터럽트 상태 Bit 를 Clear 할 때, 자동으로 일치하는 ICPR Flag 는 Clear 된다. 인터럽트당 하나의 Bit 를 포함한다. 이들 Bit 들은 인터럽트 요구가 어느 장치에 의해 발생되었는지를 지시한다.
프로세서는 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 해야 한다.
OSMR3 은 Watchdog Compare Register 로 이용될 수 있다. 이 기능 OWER[0] 을 set 함으로서 Enable 된다. 이 레지스터에 대한 Compare 가 발생하고 watchdog 이 Enable 되어질 때, Reset 이 프로세서에 적용되며 대부분의 내부 상태들은 Clear 된다. 내부적인 Reset 은 256 개 프로세서 클럭들과 연결되고 제거된다. watchdog 으로서 OSMR3 을 이용할 때, 다음 과정이 제안된다.
한편 OS 코드는 각각 March 가 발생하기 전에 주기적으로 위의 과정을 반복한다. Match 가 일어나면 OS 타이머는 프로세서를 reset 시킨다.
이들 레지스터들은 32 Bit 폭을 가지며 프로세서에 의해 Read/Write 가능하다. 그들은 3.6864 MHz 클럭의 각 Rising Edge 후에 OSCR 과 비교된다. 이들 중 어떤 레지스터가 카운터 레지스터와 일치하고 적당한 인터럽트 Enable bit 가 Set 되어지면, 그때 OSSR 상에 일치하는 상태 Bit 는 Set 된다. 상태 Bit 는 CPU 인터럽트를 야기하기 위하여 Unmask 될 수 있는 인터럽트 제어 장치로 Routing 된다. OSMR3 역시 Watchdog 타이머로 이용될 수 있다.
OIER 은 Match 레지스터 중에 하나와 OS 타이머 카운터 사이에 정합이 OSSR 상에 상태 Bit 를 Set 하는 것을 지시하는 4 개의 Enable Bit 를 포함한다. 각 정합 레지스터는 일치하는 Enable Bit 를 가진다. Enable bit 를 Clear 하는 것은 만약 그것이 이미 Set 되어 있다면 일치하는 인터럽트 상태 Bit 를 Clear 하지 못한다.
OWER 은 Watchdog 기능을 Enable 하는 단일 제어 Bit(Bit 0) 을 포함한다. 이 Bit 는 1 을 기입함으로써 Set 되며 하드웨어 Reset, Sleep, Reset, Watchdog reset, 그리고 GPIO Reset 과 같은 Reset 기능 중에ㅔ 하나에 의해서만 Clear 된다.
OSCR 은 3.6864 MHz 클럭의 Rising Edge 에 대해 증가하는 32 Bit 카운터이다. 이 카운터는 어떤 때이든지 Read/Write 가능하다. 그것은 시스템이 MMU 보호 매커니즘을 통해 이 레지스터를 Write-Protect 한다. OSCR 이 쓰여진 후에 레지스터가 갱신되기 전에 Delay 가 발생한다. 소프트웨어는 레지스터가 새로운 값으로 변화된 것을 확인하게 한다.
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 을 쓰는 것은 아무런 영향을 받지 않는다.