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 는 원하는 인터럽트를 선택하기 위해서는 사용자에 의해 구성되어야 한다.

  1. 22 개의 인터럽트에 대한 마스크 비트를 가진다.
  2. 마스크 비트가 1로 설정되어 있을 경우에만 CPU 로 인터럽트가 전달된다.
  3. ICIP 레지스터의 비트나 ICFP 레지스터의 비트가 세팅되었다면, ICMR 레지스터(register) 의 마스크 비트가 1 로 설정되어 있을 경우에만 CPU 로 인터럽트가 전달된다.
  4. PXA255 가 idle 모드에 있다면, 마스크 비트들은 무시되고 바로 인터럽트가 전달된다.

ICLR 은 Pending Interrupt 가 FIQ 인터럽트를 발생시킬 것인지 IRQ 인터럽트를 발생시킬 것인지를 제어한다. 만약 Pending Interrupt 가 Unmask 되어 있다면, 어느 프로세서 인터럽트가 동작할 것인지를 일치하는 ICLR Bit Field 는 디코딩한다. 만약 인터럽트가 Mask 되어 있으면, ICMR 내의 일치하는 Bit 는 아무런 영향을 받지 않는다. Reset 에서 ICMR 은 모두 0 으로 초기화되며, 소프트웨어는 정규동작 값을 반영하도록 ICLR 를 구성해야 한다.

  1. 22 개의 인터럽트에 대해서 FIQ 나 IRQ 인터럽트를 발생시킬지를 제어한다.
  2. 비트의 값이 0 이라면 IRQ 가, 1 이라면 FIQ 가 발생한다.

ICCR 은 단일 제어 Bit, Disable Idle Mask(DIM) 을 포함한다. 정규 Idle 모드에서 어떤 Enable 된 인터럽트는 ICMR 내의 값에 무관하게 Idle 모드로부터 프로세서를 탈출하게 만든다. 만약 이 Bit 가 Set 되면, Idle 모드로부터 프로세서를 탈출시키는 인터럽트는 ICMR 에 의해 정의된다.

  1. PXA255 을 idle 모드에서 복귀하는 역할을 수행하기 위한 한 0 번 비트만(DIM : Disable Idle Mask) 를 이용한다.
  2. 0 번 비트가 1 이면 PXA255 를 Idle 모드에서 복귀시킬 수 있는 모든 인터럽트는 ICMR 의 비트들에 의해서 결정된다.
  3. 0 번 비트가 0 이면 모든 Enable 된 인터럽트들이 PXA255 을 idle 모드에서 복귀시키게 된다.

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 에 대한 설명이다.

  1. 일반적인 인터럽트 처리인 IRQ 에서 어떤 소스에서 발생한 인터럽트인지를 판별하게 된다.
  2. 레지스터의 비트 값들은 인터럽트 서비스 루틴에서 사용되어 처리된다.
  3. 인터럽트 상태 비트에 1 을 써줌으로써 클리어하는 것은 인터럽트 소스 내에 다른 인터럽트 상태 비트가 설정되어 있지 않았다면 자동적으로 해당하는 ICIP 와 ICFP 의 비트를 지우게 된다.
  4. PXA255 에서 사용하는 각 인터럽트에 대한 비트 맵핑을 가지며, ICIP 에 해당하는 비트가 1 이라면 해당하는 소스 디바이스에서 IRQ 요구가 있었음을 나타낸다.

다음은 ICFP 에 대한 설명이다.

  1. 빠른 인터럽트 처리인 FIQ 에서 어떤 소스에서 발생한 인터럽트인지를 판별
  2. 레지스터의 비트 값들은 ISR 에서 사용되어 처리된다.
  3. PXA255 에서 사용하는 각 인터럽트에 대한 비트 매핑을 가지며, ICFP 의 해당하는 비트가 1 이라면 해당하는 소스 디바이스에서 FIQ 요구가 있었음을 나타낸다.
  4. 인터럽트 상태 비트에 1 을 써줌으로써 클리어 하는 것은 인터럽트 소스내에 다른 인터럽트 상태 비트가 설정되어 있지 않았다면 자동적으로 해당하는 ICIP 와 ICFP 의 비트를 지우게 된다.

ICPR 은 시스템 내의 모든 Active 인터럽트들을 보여주는 32 Bit Read-Only 레지스터이다. 이들 Bit 들은 ICMR 의 상태에 영향을 받지 않는다. 소스 상에서 인터럽트 상태 Bit 를 Clear 할 때, 자동으로 일치하는 ICPR Flag 는 Clear 된다. 인터럽트당 하나의 Bit 를 포함한다. 이들 Bit 들은 인터럽트 요구가 어느 장치에 의해 발생되었는지를 지시한다.

  1. 현재 활성화된 모든 인터럽트들을 보여주는 레지스터
  2. ICPR 레지스터의 32 비트 중에서 22 비트만을 사용하여 어떠한 인터럽트가 발생했는지를 볼 수 있다.
  3. 비트들은 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 해야 한다.

OSMR3 은 Watchdog Compare Register 로 이용될 수 있다. 이 기능 OWER[0] 을 set 함으로서 Enable 된다. 이 레지스터에 대한 Compare 가 발생하고 watchdog 이 Enable 되어질 때, Reset 이 프로세서에 적용되며 대부분의 내부 상태들은 Clear 된다. 내부적인 Reset 은 256 개 프로세서 클럭들과 연결되고 제거된다. watchdog 으로서 OSMR3 을 이용할 때, 다음 과정이 제안된다.

  1. 카운터의 현재 값이 읽혀진다.
  2. 읽혀진 값에 Offset 이 더해진다. Offset 은 다음 Time-out 전에 시간량과 같다.
  3. 갱신된 값은 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 을 쓰는 것은 아무런 영향을 받지 않는다.

  • computer/rtcclab/pxa255_이해하기.txt
  • Last modified: 4 years ago
  • by likewind