OSDN Git Service

タイマ制御(スリープ)機能追加
[mochi/master.git] / src / kernel / TimerMng / TimerMngPit.c
1 /******************************************************************************/
2 /* src/kernel/TimerMng/TimerMngPit.c                                          */
3 /*                                                                 2018/10/22 */
4 /* Copyright (C) 2016-2018 Mochi.                                             */
5 /******************************************************************************/
6 /******************************************************************************/
7 /* インクルード                                                               */
8 /******************************************************************************/
9 /* 共通ヘッダ */
10 #include <stdarg.h>
11 #include <stdint.h>
12 #include <kernel/config.h>
13 #include <hardware/I8254/I8254.h>
14 #include <hardware/I8259A/I8259A.h>
15 #include <hardware/IA32/IA32Instruction.h>
16
17 /* 外部モジュールヘッダ */
18 #include <Cmn.h>
19 #include <Debug.h>
20 #include <IntMng.h>
21 #include <TaskMng.h>
22 #include <TimerMng.h>
23
24 /* 内部モジュールヘッダ */
25 #include "TimerMngCtrl.h"
26
27
28 /******************************************************************************/
29 /* 定義                                                                       */
30 /******************************************************************************/
31 /* デバッグトレースログ出力マクロ */
32 #ifdef DEBUG_LOG_ENABLE
33 #define DEBUG_LOG( ... )                        \
34     DebugLogOutput( CMN_MODULE_TIMERMNG_PIT,    \
35                     __LINE__,                   \
36                     __VA_ARGS__ )
37 #else
38 #define DEBUG_LOG( ... )
39 #endif
40
41 /** PIT(カウンタ0)カウンタ設定値 */
42 #define PIT_CYCLE ( I8254_CLOCK / MK_CONFIG_TICK_HZ )
43
44
45 /******************************************************************************/
46 /* グローバル関数定義                                                         */
47 /******************************************************************************/
48 /******************************************************************************/
49 /**
50  * @brief       PIT割込みハンドラ
51  * @details     PITからの割込み処理を行う。
52  * 
53  * @param[in]   intNo   割込み番号
54  * @param[in]   context 割込み発生時コンテキスト情報(未使用)
55  */
56 /******************************************************************************/
57 void TimerMngPitHdlInt( uint32_t        intNo,
58                         IntMngContext_t context )
59 {
60     /* デバッグトレースログ出力 *//*
61     DEBUG_LOG( "%s() start. intNo=%#x", __func__, intNo );*/
62     
63     /* 割込み処理終了通知 */
64     IntMngPicEoi( I8259A_IRQ0 );
65     
66     /* タイマ制御実行 */
67     CtrlRun();
68     
69     /* スケジューラ実行 */
70     TaskMngSchedExec();
71     
72     /* デバッグトレースログ出力 *//*
73     DEBUG_LOG( "%s() end.", __func__ );*/
74     
75     return;
76 }
77
78
79 /******************************************************************************/
80 /**
81  * @brief       PIT管理初期化
82  * @details     PIT管理サブモジュールの初期化を行う。
83  */
84 /******************************************************************************/
85 void TimerMngPitInit( void )
86 {
87     /* デバッグトレースログ出力 */
88     DEBUG_LOG( "%s() start.", __func__ );
89     
90     /* PIT(カウンタ0)初期化 */
91     IA32InstructionOutByte( I8254_PORT_CTRLW,
92                             ( I8254_CTRLW_SC_CNTR0 |
93                               I8254_CTRLW_RW_BOTH  |
94                               I8254_CTRLW_M_MODE2  |
95                               I8254_CTRLW_BCD_BIN    ) );
96     IA32InstructionOutByte( I8254_PORT_CNTR0, I8254_CNTR_LOW(  PIT_CYCLE ) );
97     IA32InstructionOutByte( I8254_PORT_CNTR0, I8254_CNTR_HIGH( PIT_CYCLE ) );
98     
99     /* 割込みハンドラ設定 */
100     IntMngHdlSet( INTMNG_PIC_VCTR_BASE + I8259A_IRQ0,       /* 割込み番号     */
101                   TimerMngPitHdlInt,                        /* 割込みハンドラ */
102                   IA32_DESCRIPTOR_DPL_0               );    /* 特権レベル     */
103     
104     /* 割込み許可設定 */
105     IntMngPicAllowIrq( I8259A_IRQ0 );
106     
107     /* デバッグトレースログ出力 */
108     DEBUG_LOG( "%s() end.", __func__ );
109     
110     return;
111 }
112
113
114 /******************************************************************************/