2012年8月10日金曜日

ターミナル入力・・・・UART+MMU+割り込み(2)

続き。

■仮想メモリ割り当て
設計したメモリマップにしたがって固定のページテーブルを作成する


■割り込み初期化手順
(1)CPUのIRQ割り込みハンドラを登録
(2)CPUの割り込み有効化
 asm ("cpsie i"); でIRQ有効化

(3)UARTにクロック供給
(4)UARTのIRQハンドラを登録
(5)UARTのIRQ出力有効化
 受信割り込みのみ有効化する。
  OMAP3530仕様書の2693ページ 17.6.1 UART/IrDA/CIRレジスタ IER_REGを参照
  IER_REGに1(RHR_ITビット)を書き込み

■割り込みハンドラ
IRQハンドラだけ作成
IRQ以外の割り込みは使用しないのでnop
ハンドラではレジスタをスタックに保存してIRQ処理に飛ぶ

.extern interruptHandler
.global interruptVector

_irq_entry:
    stmfd sp!, {r0 - r12, lr};

    mov r0, #6;
    bl interruptHandler;

    ldmfd sp!, {r0 - r12, lr};
    subs pc, lr, #4;

interruptVector:
    nop;    // Reset
    nop;    // Invalid code
    nop;     // Software Service.
    nop;     // Prefetch Abort
    nop;    // Data Abort
    nop;
    ldr pc, =_irq_entry;
    nop;    // Fast IRQ

■UART割り込みハンドラ
 UARTドライバの割り込みハンドラでは割り込み時にRHRから1文字読み取ってバッファに記録

■サンプル
ソースコード