===================================================================== AT91SAM7S依存部 Last Modified: 29 May 2008 23:23:37 ===================================================================== ○概要 AT91SAM7S依存部では,Atmel製の AT91SAM7S128/256 と AT91SAM7A3 をサポー トする.本カーネルではチップ内蔵の周辺回路のタイマやUARTを使用する.実 行は,フラッシュメモリに書き込み実行することを基本とする.RAM上での実 行は現状サポートしない. ○開発環境 ソフトウェア開発環境は,GNU環境を用いる.動作確認を行った.コンパイラ は,GCC 4.1.1 で,Cygwin用のバイナリを以下のサイトからダウンロードして 用いた. http://www.gnuarm.com/ デバッグ開発環境は,ハードウェアにOLIMEX製 ARM-USB-OCD,PizzaFactory3 基盤,BestTechnology製のTINY JTAG-ICE/ を用い,OpenOCD を経由して GDB によりデバッグする.なお,単に実行するだけなら,Atmel製のフラッシュ書 き込みツールにより書き込み可能である. ○割り込みハンドラ番号と割込み番号 割込みハンドラ番号(inhno)と割込み番号(intno)には,Peripheral ID を用い る.AT91SAM7S512/256/128/64/321 では次のように定義されている. ・FIQ(AIC) 0 ・SYSIRQ 1 ・PIOA 2 ・ADC 4 ・SPI 5 ・US0 6 ・US1 7 ・SSC 8 ・TWI 9 ・PWM 10 ・UDP 11 ・TC0 12 ・TC1 13 ・TC2 14 ・IRQ0 30 ・IRQ1 31 ○割込み優先度 割込み優先度としては,-1 から -8 までの値を設定可能である. ○割込み属性 IRQ割込みに関しては,TA_POSEDGE/TA_LOWLEVELE/TA_HIGHLEVELの属性を設定 可能である. ○ターゲット依存部での定義事項 ターゲット依存部では,使用するLSIにより,Makefile で,Makefile.chip を インクルードする前に次の定義を記述しておく必要がある. AT91SAM7S128の場合 AT91SAM7S_TYPE = at91sam7s128 AT91SAM7S256の場合 AT91SAM7S_TYPE = at91sam7s256 AT91SAM7A3の場合 AT91SAM7S_TYPE = at91sam7s256 gccの-Dオプションで__AT91SAM7A3__を定義する. ○タイムドライバ カーネルでは,タイムティック用にTimer/Counter Channel 0 を用いる.タイ ムティック周期は1msecであり,変更するためには,chip_kernel.h の TIC_NUME と TIC_DENO を変更すること. ○シリアルインタフェースドライバ シリアルインタフェースドライバでは,Debug Unit を用いてシリアル出力を 行う.通信パラメータは次の通りである. 38400bps, 8bit, Non-Parity, 1 Stop bit ボーレートは,at91sam7s.h 内の BAUDRATE の定義で変更可能である. ○開発環境のインストール方法 ●OpenOCDのインストールと実行 Best Technology のホームページからバイナリをダウンロードして展開する. 次のオプションで opencd.exe を実行する $./openocd.exe -f sam7s_c_ram.cfg ●フラッシュメモリへの書き込み 以下のコマンドでASPカーネルをビルドして,バイナリファイルを生成する. make asp.bin Best Technology のホームページから GCC Developer Lite をダウンロードし てインストールする. OpenOCDに含まれる./GDL/at91sam7s_w.script を GCC Developer Lite のイン ストールディレクトリにコピーし,23行目の "flash info 0" を削除. スタートアップメニューから"フラッシュライタ"を実行する.ウィンドウの下 の方をダブルクリックすると CPU TYPE を選択できるので,openOCDを選択す る.書き込みたいファイルを選択し,"かきこみ"ボタンを押す. ●GDBによるデバッグ Best Technology のホームページからダウンロードした,OpenOCDに含まれる ./GDL/gdb_rom.ini を使用する.GDBの動作確認したバージョンは(6.6) ○変更履歴 2008/05/29 chip_def.csv を コンフィギュレータの値取得シンボルテーブルとして指定 する. 2008/05/13 共通部 Release 1.3.1 に対する変更 ===================================================================== TOPPERS標準割込み処理モデル対応のための情報 ===================================================================== ○割込みコントローラの仕様 AT91SAM7Sの割込みコントローラ(AIC)の仕様は次のようになっている. ・32個の割込みをサポート ・個別の禁止許可が可能 Interrupt Enable Command Register(IECR),Interrupt Disable Command Register(IDCR)の各ビットにより禁止/許可する. ・8レベルの割込み優先度をサポート 0が最低優先度7が最高優先度 ・割込みを受け付けると受け付けた割込み優先度がAIC内にセットされ,その 割込み優先度以下の割込みは受け付けなくなる.ただし,AICが保持する割 込み優先度は,ソフトウェア側は設定できない. ・内部割込みはレベルにもエッジにも設定可能 ・各割込みのSource Mode Register(SMR)に,Vector(アドレス)を設定する ことができ,割込みを受け付けると,受け付けた割込みの Vector がInterrupt Vector Register(IVR)に設定される. ・プロセッサでIVRを読み込むと,AICは割込みハンドラが開始されたとみなす. ・プロセッサで End of Interrupt Command Register(EOICR)を書き込むと, 割込みハンドラが終了したとみなす ○割込み要求禁止フラグ 割込み要求禁止フラグは,AICの持つ,割り込みの個別の禁止/許可機能を用い て実現する. ○割込み優先度及び割込み優先度マスク(IPM) 割込み受付時の調停と,割込み受付後のそれ以下の優先度を受け付けないよう にする,AIC内部の割込み優先度マスクはAICの機能で実現可能である.ただし, AIC内部の割込み優先度マスクはソフトウェア的にアクセス不可能であるため, AIC内部の割込み優先度マスクを(モデル上の)割込み優先度マスクとして使 用することは不可能である. そのため,優先度毎に,その優先度以下の割込みを禁止するビットパターンを コンフィギュレータで用意し,ソフトウェア的に割込み優先度マスクを変更す る場合は,この値を使い割込みを禁止することで,(モデル上の)割込み優先 度マスクを実現する. ただし,割込み受付後は,AICが自動的に受け付けた割込みの割込み優先度を AIC内部にセットするため,カーネルの割込みの入り口では,ビットパターン による割込みの禁止は行わない. ○IVRの使用方法 SMRに割込みハンドラのアドレスをセットし,割込み受付時は,割込みエント リの共有ルーチンで,IVRを読み込んで読み込んだアドレスにジャンプするの が本来の使い方である.しかしながら,本カーネルでは,共有の割込みのエン トリで割込み要因を判断して,(モデル上の)割込み優先度マスクをセットす る必要がある.そのため,IVRにはハンドラのアドレスではなく,割込み番号 をセットして使用する. ○コンフィギュレータによる生成データ コンフィギュレータでは,以下のデータを生成する. 割込み優先度テーブル.各割込みの優先度を保持する.値は内部表現で,外部 表現の絶対値. const uint8_t _kernel_inh_ipm_tbl[TNUM_INH]; 割込みマスクテーブル.各割込み優先度で禁止する割り込みのビットパターン を保持する. const uint32_t _kernel_ipm_mask_tbl[(TMAX_INTPRI - TMIN_INTPRI + 1)]; 割込みハンドラテーブル.割込みハンドラのアドレスを保持する. const FP _kernel_inh_tbl[TNUM_INH];