
            ＝ TOPPERS/JSPカーネル ユーザズマニュアル ＝
                （ARMv4/LPC2388 ターゲット依存部）

          （Release 1.4.3対応，最終更新: 21-Sep-2009）

------------------------------------------------------------------------ 
 TOPPERS/JSP Kernel
     Toyohashi Open Platform for Embedded Real-Time Systems/
     Just Standard Profile Kernel

 Copyright (C) 2000-2007 by Embedded and Real-Time Systems Laboratory
                             Toyohashi Univ. of Technology, JAPAN
               2009 by Suikan
               
 上記著作権者は，以下の (1)〜(4) の条件か，Free Software Foundation 
 によって公表されている GNU General Public License の Version 2 に記
 述されている条件を満たす場合に限り，本ソフトウェア（本ソフトウェア
 を改変したものを含む．以下同じ）を使用・複製・改変・再配布（以下，
 利用と呼ぶ）することを無償で許諾する．
 (1) 本ソフトウェアをソースコードの形で利用する場合には，上記の著作
     権表示，この利用条件および下記の無保証規定が，そのままの形でソー
     スコード中に含まれていること．
 (2) 本ソフトウェアを，ライブラリ形式など，他のソフトウェア開発に使
     用できる形で再配布する場合には，再配布に伴うドキュメント（利用
     者マニュアルなど）に，上記の著作権表示，この利用条件および下記
     の無保証規定を掲載すること．
 (3) 本ソフトウェアを，機器に組み込むなど，他のソフトウェア開発に使
     用できない形で再配布する場合には，次のいずれかの条件を満たすこ
     と．
   (a) 再配布に伴うドキュメント（利用者マニュアルなど）に，上記の著
       作権表示，この利用条件および下記の無保証規定を掲載すること．
   (b) 再配布の形態を，別に定める方法によって，TOPPERSプロジェクトに
       報告すること．
 (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
     害からも，上記著作権者およびTOPPERSプロジェクトを免責すること．

 本ソフトウェアは，無保証で提供されているものである．上記著作権者お
 よびTOPPERSプロジェクトは，本ソフトウェアに関して，その適用可能性も
 含めて，いかなる保証も行わない．また，本ソフトウェアの利用により直
 接的または間接的に生じたいかなる損害に関しても，その責任を負わない．

 @(#) $Id: armv4_lpc2388.txt,v 1.1.2.1 2009/09/21 07:06:11 suikan Exp $
------------------------------------------------------------------------


１．ARMv4 ターゲット依存部の概要


1.1 ターゲットシステムと開発環境

ARMV4 プロセッサのターゲットシステムとしては，ARMv4アーキテクチャのCPU
コアを搭載した以下のボードをサポートしている．なお，Thumb命令はサポー
トしていない．

  ・CQ出版社製の CQ-FRK-NXP-ARM(LPC2388, Interface誌2009/05号付録)

開発環境には，GCC などの GNU開発環境を用い，オブジェクトファイルフォー
マットは ELF を標準とする．

CQ-FRK-NXP-ARMでは、実行環境として内部FLASH ROMを使うことを想定して
いる。


1.2 サポートする機能の概要

ARMv4 依存の機能として、性能評価用システム時刻参照機能(vxget_tim)をサポ
ートしている。割込みの禁止と許可(dis_int、ena_int)にも対応している。


1.3 他のLPC2388システムへのポーティング

他のLPC2388システムにポーティングするためには，システム依存部に以下のコード
が必要となる．
 
  ・PLLの初期化コード

LPC2388 はシリアル、タイマー、割り込みコントローラを内蔵しているため、
PLL 以外の部分はほとんどの場合変更不要と思われる。

1.4 LPC2388 の初期化

chip_suppor.S の hardware_init_hook で、VIC の初期化を行っている。
Users Manual を読む限りではこれは不要のはずだが、実際には初期化を
しないと動作が不定になる。

1.5 シリアルポート

CQ-FRK-NXP-PARM では LPC2388 上の U0 をカーネルログ出力用に使用する．
ディフォルトでは，速度57600bps,データ:8bit,Parity:none,Stop:1bitであ
る。

LPC2388 にはU0-U3の4つの UART がある。これらのうち U1 は IrDA 対応で
あり、マニュアルでも別扱いにっている。そのため、TOPPERS/JSP for LPC2388
では、U1 を飛ばして、 U0, U2, U3 をそれぞれシリアルポート 1, 2, 3に
割り当てている。


1.6 Thumbコードについて

Thumbコードの利用については，現時点ではサポートしてない．


２．ARMv4 プロセッサ依存部の機能

この節では、カーネルおよびシステムサービスの機能の中で、ARMv4依存の部分
について解説する。


2.1 データ型

int型および unsigned int型のサイズは 32ビットである。

2.2 割込み管理機能と割込みハンドラ

カーネル管理外の割込みとしては FIQがある。よって、CPUロック状態や初
期化ルーチン内では、FIQ 以外の割込みはすべて禁止されている。具体的には、
CPSR(カレントプログラム状態レジスタ)のIRQ禁止ビット(ビット7)が 1 に設
定される。


DEF_INH で指定する割込みハンドラ番号(inhno)は、LPC2388の VIC で内蔵
ペリフェラル毎に定義されている割り込み番号である．データ型(INHNO)は
 unsigned int型に定義されている。


2.3 CPU例外管理機能とCPU例外ハンドラ

DEF_EXC で指定する割込みハンドラ番号(excno)は、ARMv4 で定義されている，
例外要因である．そのデータ型(EXCNO)は unsigned int 型に定義されている。
DEF_EXC で、例外コード番号として有効でない値や、CPU例外に対応しない番号
を指定した場合の動作は保証されない。

CPU例外ハンドラに渡されるp_excinfは，CPU例外発生時のコンテキストを保存
したスタックへのポインタが渡される．スタックの構造を以下に示す．


      ----------------------
     |        CPSR          |  <-- p_excinf
      ----------------------
     |         R0           |
      ----------------------
     |         R1           |
      ----------------------
     |         R2           |
      ----------------------
     |         R3           |
      ----------------------
     |         ip           |
      ----------------------
     |         lr           |
      ----------------------
     |         PC           |
      ----------------------


2.4 スタートアップモジュール

ARMv4 依存のスタートアップモジュール(start.S)では、次の初期化処理を行う。

(A) プロセッサモードの初期化とスタックポインタの初期化

最初に、プロセッサモードをスパーバイザーモード(SVC)、IRQ,FIQ割込みを禁止
にする．

次に、スタックポインタ(sp)を STACKTOP に設定する。ここで割込みスタッ
クポインタに設定されたスタック領域は、カーネル起動後は非タスクコンテキ
スト用のスタック領域として使われる。STACKTOP は、sys_config.h 部で定義
することを想定している。

(B) hardware_init_hook の呼出し

hardware_init_hook が 0 でない場合には、hardware_init_hook を呼び出す。
hardware_init_hook は、カーネルが起動される前に行う必要があるターゲッ
ト依存の初期化を行うために用意している。hardware_init_hook がどこでも
定義されていない場合、リンカでこのシンボルを 0 に定義する(リンカスク
リプト内に記述あり)。

LPC2388でのhardware_init_hookについては、1.4節を参照のこと。

(C) bssセクションと dataセクションの初期化

bssセクションをゼロクリアする。また、dataセクションを初期化する。

(D) software_init_hook の呼出し

software_init_hook が 0 でない場合には、software_init_hook を呼び出す。
software_init_hook は、カーネルが起動される前に行う必要があるソフトウェ
ア環境(具体的には、ライブラリ)依存の初期化を行うために用意している。
software_init_hook がどこでも定義されていない場合、リンカでこのシンボ
ルを 0 に定義する(リンカスクリプト内に記述あり)。

(E) カーネルの起動

kernel_start へ分岐し、カーネルを起動する。kernel_start からリターンし
てくることは想定していない。



３．システム依存部の機能


3.1 システムクロックドライバ

システムクロックドライバが isig_tim を呼び出す周期は、sys_defs.h 中の 
TIC_NUME と TIC_DENO で定義されている(標準は 1ミリ秒周期)。この定義
を変更することで、isig_tim を呼び出す周期を変更することができる。


3.2 性能評価用システム時刻参照機能

ARMv4 依存部では、性能評価用システム時刻参照機能(vxget_tim)をサポートし
ている。


3.3 シリアルインタフェースドライバ

LPC2388 依存部では，Intergrator/AP上の U0 をサポートしている．


４．開発環境の構築

開発環境の構築方法については，GNU開発環境構築マニュアルを参照のこと．


4.1 開発環境のバージョン
動作確認したツールのバージョンは以下の通りである．

    BINUTILS : 2.19.51
    GCC-CORE : 4.3.3
    GDB      : 6.8.50

もしくは

    Codesourcery lite 2009q1

５．その他

5.1 ディレクトリ・ファイル構成

ARMv4 ターゲット依存部の各ファイルの概要は次の通り．

    config/armv4/
        Makefile.config MakefileのARMv4依存定義
        armelf.ld       ビッグエンディアン用リンカスクリプト
        armv4.h         ARMv4の定義
        cpu_config.c    プロセッサ依存部の関数
        cpu_config.h    プロセッサ依存部の構成定義
        cpu_context.h   コンテキスト操作
        cpu_defs.h      プロセッサ依存部のアプリケーション用定義
        cpu_insn.h      低レベルのプロセッサ操作ルーチン
        cpu_rename.def  カーネルの内部識別名のリネーム定義
        cpu_rename.h    カーネルの内部識別名のリネーム
        cpu_support.S   プロセッサ依存部のサブルーチン
        cpu_unrename.h  カーネルの内部識別名のリネーム解除
        makeoffset.c    offset.h 生成サポートプログラム
        start.S         スタートアップモジュール
        tool_config.h   開発環境依存部の構成定義（GNU開発環境用）
        tool_defs.h     開発環境依存部のアプリケーション用定義（GNU開発環境用）

    config/armv4/integrator
        Makefile.config Makefileの Integrator 依存定義
        hw_serial.cfg   SIOドライバのコンフィギュレーションファイル
        hw_serial.h     SIOドライバ
        hw_timer.h      タイマ操作ルーチン
        integrator.c    Integrator ハードウェア操作関数
        integrator.h    Integrator ハードウェア定義
        integrator.ld   Integrator リンカスクリプト
        sys_config.c    システム依存部の関数
        sys_config.h    システム依存部の構成定義
        sys_defs.h      システム依存部のアプリケーション用定義
        sys_rename.def  カーネルの内部識別名のリネーム定義
        sys_rename.h    カーネルの内部識別名のリネーム
        sys_support.S   システム依存部のサブルーチン
        sys_unrename.h  カーネルの内部識別名のリネーム解除
        
    config/armv4/_common_lpc2388
		chip_config.c	LPC2388依存部の関数
		chip_config.h	LPC2388依存部の構成定義
		chip_defs.h		LPC2388依存部のアプリケーション用定義
		chip_support.S	LPC2388依存部のサブルーチン
		hw_serial.cfg	SIOドライバのコンフィグレーションファイル
		hw_serial.h		SIOドライバ
		hw_timer.h		タイマー操作ルーチン
		lpc2388.h		LPC2388 ハードウェア定義
		lpc2388.ld		LPC2388 リンカスクリプト
		sys_rename.def	カーネルの内部識別名のリネーム定義
		sys_rename.h	カーネルの内部識別名のリネーム
		sys_unrename.h	カーネルの内部識別名のリネーム解除
    config/armv4/cq_frk_nxp_arm
	    Makefile.config Makefileの CQ-FRK-NXP-ARM 依存定義
		sys_config.c	システム依存部の関数
		sys_config.h	システム依存部の構成定義
		sys_defs.h		システム依存部のアプリケーション用定義
    