/* * TOPPERS/OSEK Kernel * Toyohashi Open Platform for Embedded Real-Time Systems/ * OSEK Kernel * * Copyright (C) 2006 by Witz Corporation, JAPAN * * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation * によって公表されている GNU General Public License の Version 2 に記 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, * 利用と呼ぶ)することを無償で許諾する. * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー * スコード中に含まれていること. * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 * の無保証規定を掲載すること. * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ * と. * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 * 作権表示,この利用条件および下記の無保証規定を掲載すること. * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに * 報告すること. * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. * * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. * */ /* * サンプル向けターゲット依存モジュール(CQ7144A用) */ #include "sample_config.h" #include "sh7144.h" /* * OIL定義シンボルの外部参照 */ DeclareCounter( SampleCnt ); /* * 内部関数プロトタイプ宣言 */ ISR( CounterInt ); ISR( HwCnt2Int ); /* * アプリケーションモード用 */ /* * アプリケーションモード決定用の情報取得処理 * * システムごとに任意の入力手法により実装すること. * 0,1,2が判別できること.3は2と同じ扱いになる. */ UINT8 GetAppModeInfo( void ) { /* * 本来はここでアプリケーションモードの判定を行うべきだが、 * ボード上にモードを取得できるH/Wが実装されていないため、 * 常に0を返す. */ return 0; } /* GetAppModeInfo */ /* * サンプルカウンタソース用 * * CQ7144AではCMT1で実装する. */ /* * SignalCounter実行用割込み初期化処理 * * タイマの起動は別関数で行う. */ void InitCounterInt( void ) { /* * CMTモジュールスタンバイ解除 */ MSTCR2 &= (UINT16)~0x1000; /* CMT有効 */ /* * コンペアマッチタイマを停止して各レジスタ設定 */ CMSTR &= (UINT16) ~0x0002; /* カウント停止 */ /* * 分周比 周辺クロック 1/8, 割り込み禁止 * CMCSR の bit7 が割込み要求フラグであり,同時にクリアしている. */ CMCSR_1 = 0x0000; /* * コンペマッチカウンタ目標値設定 * タイマ起動直後にコンペアマッチさせるため */ CMCOR_1 = (UINT16)0x0001; /* * タイマコンペア割込みレベル設定(設定レベルはヘッダ参照) */ IPRG = (UINT16) ((IPRG & ~0xF) | (UINT16)CFG_INTLVL_COUNTER); /* * カウンタクリアと割込み許可 */ CMCNT_1 = 0x0000; /* カウントクリア */ CMCSR_1 |= 0x0040; /* コンペアマッチ割込み許可 */ } /* InitCounterInt */ /* * SignalCounter実行用割込み停止処理 */ void TermCounterInt( void ) { CMSTR &= (UINT16) ~0x0002; /* カウント停止 */ CMCSR_1 = 0x0000; /* 機能初期化 */ } /* TermCounterInt */ /* * SignalCounter実行用割込み起動処理 */ void ActCounterInt( void ) { CMCNT_1 = (UINT16)0x0000; /* カウントクリア */ CMSTR |= (UINT16) 0x0002; /* カウント開始 */ } /* ActCounterInt */ /* * SignalCounter実行用割込みサービスルーチン */ ISR( CounterInt ) { StatusType ercd; /* * 1回のみ SignalCounter 実行したいため,タイマを停止する. */ CMCSR_1 &= (UINT16)~0x0040; /* コンペアマッチ割込み禁止 */ CMSTR &= (UINT16) ~0x0002; /* カウント停止 */ /* * 割込み要求クリア */ CMCSR_1 &= (UINT16)~0x0080; /* 割込み要求クリア */ /* * カウンタ加算通知処理実行 */ ercd = SignalCounter( SampleCnt ); /* エラーリターンの場合はシャットダウン */ if( ercd != E_OK ){ ShutdownOS( ercd ); } } /* ISR( CounterInt ) */ /* * ISR1・ISR2稼動確認用 * * CQ7144AではMTUA1,B2で実装する. */ /* * ハードウェアカウンタバッファ */ static UINT8 hw_cnt1; static UINT8 hw_cnt2; /* * ISR1・ISR2カウンタ初期化処理 */ void InitHwCntInt( void ) { /* * ハードウェアカウンタ初期化 */ hw_cnt1 = (UINT8)0; hw_cnt2 = (UINT8)0; /* * MTUモジュールスタンバイ解除 */ MSTCR2 &= (UINT16)~0x2000; /* MTU有効 */ /* * タイマを停止して各レジスタ設定 */ TSTR &= (UINT8)~0x06; /* * タイマカウンタクリア */ TCNT_1 = (UINT16)0x0000; TCNT_2 = (UINT16)0x0000; /* * タイマチャネル1,2 アップエッジ, 1/64分周 * タイマチャネル1 = TGR-A * タイマチャネル2 = TGR-B */ TCR_1 = (UINT8)0x23; TCR_2 = (UINT8)0x43; /* * コンペアマッチカウンタ設定 */ TGRA_1 = CFG_HW_CNT1; TGRB_2 = CFG_HW_CNT2; /* * タイマコンペア割込みレベル設定(設定レベルはヘッダ参照) * TSR の bit0,1 が割込み要求フラグによりクリアしている. */ IPRD = (UINT16) ((IPRD & ~(0xFu << 4)) | (CFG_INTLVL_HW_CNT1 << 4)); IPRE = (UINT16) ((IPRE & ~(0xFu << 12)) | (CFG_INTLVL_HW_CNT2 << 12)); TSR_1 &= (UINT8) ~0x01; TSR_2 &= (UINT8) ~0x02; /* * 割込み許可 A,B */ TIER_1 |= (UINT8)0x01; TIER_2 |= (UINT8)0x02; /* * タイマカウント開始 */ TSTR |= (UINT8)0x06; } /* InitHwCntInt */ /* * ISR1・ISR2カウンタ停止処理 */ void TermHwCntInt( void ) { TIER_1 &= (UINT8) ~0x01; /* 割込み禁止 */ TIER_2 &= (UINT8) ~0x02; /* 割込み禁止 */ TSTR &= (UINT8) ~0x06; /* カウント停止 */ } /* TermHwCntInt */ /* * ISR1・ISR2カウンタ取得処理 * * hw_cnt1とhw_cnt2の同時取得は保障しなくてよい(割込み禁止は不要). */ void GetHwCnt( UINT8 *isr1_cnt, UINT8 *isr2_cnt ) { *isr1_cnt = hw_cnt1; *isr2_cnt = hw_cnt2; } /* GetHwCnt */ /* * ISR1カウンタ加算用割込みサービスルーチン */ #if defined( OMIT_ISR1_ENTRY ) /* ISR1入り口未生成時は本関数を割込み関数指定する */ #pragma interrupt HwCnt1Int #endif /* OMIT_ISR1_ENTRY */ void HwCnt1Int( void ); void HwCnt1Int( void ) { /* 割込み要求クリア */ TSR_1 &= (UINT8)~0x01; hw_cnt1++; } /* HwCnt1Int */ /* * ISR2カウンタ加算用割込みサービスルーチン */ ISR( HwCnt2Int ) { /* 割込み要求クリア */ TSR_2 &= (UINT8)~0x02; hw_cnt2++; } /* ISR( HwCnt2Int ) */