1 /******************************************************************************/
2 /* src/booter/IntMng/IntMngPic.c */
4 /* Copyright (C) 2017 Mochi. */
5 /******************************************************************************/
6 /******************************************************************************/
8 /******************************************************************************/
11 #include <hardware/IA32/IA32Instruction.h>
12 #include <hardware/I8259A/I8259A.h>
22 /******************************************************************************/
24 /******************************************************************************/
26 #ifdef DEBUG_LOG_ENABLE
27 #define DEBUG_LOG( ... ) \
28 DebugLogOutput( CMN_MODULE_INTMNG_PIC, \
32 #define DEBUG_LOG( ... )
36 #define PIC_MASK_STATE_DISABLE ( 0 ) /**< マスク無効状態 */
37 #define PIC_MASK_STATE_ENABLE ( 1 ) /**< マスク有効状態 */
40 #define PIC_NUM ( 2 ) /**< PIC数 */
41 #define PIC_MASTER ( 0 ) /**< PIC1マスタ */
42 #define PIC_SLAVE ( 1 ) /**< PIC2スレーブ */
46 uint8_t maskState; /**< PICマスク状態 */
47 uint8_t mask[ PIC_NUM ]; /**< PICマスク値 */
48 uint8_t reserved; /**< パディング */
52 /******************************************************************************/
54 /******************************************************************************/
56 static picTbl_t gPicTbl;
59 /******************************************************************************/
61 /******************************************************************************/
62 /******************************************************************************/
65 * @details PIC管理サブモジュールの初期化を行う。
67 /******************************************************************************/
68 void IntMngPicInit( void )
71 DEBUG_LOG( "%s() start.", __func__ );
74 IA32InstructionOutByte( I8259A_S_PORT_ICW1, 0x11 );
75 IA32InstructionOutByte( I8259A_S_PORT_ICW2, 0x28 );
76 IA32InstructionOutByte( I8259A_S_PORT_ICW3, 0x02 );
77 IA32InstructionOutByte( I8259A_S_PORT_ICW4, 0x01 );
80 IA32InstructionOutByte( I8259A_M_PORT_ICW1, 0x11 );
81 IA32InstructionOutByte( I8259A_M_PORT_ICW2, 0x20 );
82 IA32InstructionOutByte( I8259A_M_PORT_ICW3, 0x04 );
83 IA32InstructionOutByte( I8259A_M_PORT_ICW4, 0x01 );
86 gPicTbl.mask[ PIC_MASTER ] = 0xFF;
87 gPicTbl.mask[ PIC_SLAVE ] = 0xFF;
93 DEBUG_LOG( "%s() end.", __func__ );
99 /******************************************************************************/
102 * @details PICに指定したIRQ番号の割込み許可設定を行う。
104 * @param[in] irqNo IRQ番号
115 * - I8259A_IRQ10 IRQ10
116 * - I8259A_IRQ11 IRQ11
117 * - I8259A_IRQ12 IRQ12
118 * - I8259A_IRQ13 IRQ13
119 * - I8259A_IRQ14 IRQ14
120 * - I8259A_IRQ15 IRQ15
122 /******************************************************************************/
123 void IntMngPicAllowIrq( uint8_t irqNo )
126 DEBUG_LOG( "%s() start. irqNo=%#X", __func__, irqNo );
129 if ( ( irqNo >= I8259A_IRQ0 ) &&
130 ( irqNo <= I8259A_IRQ7 ) ) {
131 /* PIC1(マスタ)向け割込み番号 */
133 /* PIC1(マスタ)用マスク設定 */
134 gPicTbl.mask[ PIC_MASTER ] &= ~( 0x01 << irqNo );
137 /* PIC2(スレーブ)向け割込み番号 */
139 /* PIC1(マスタ)用マスク設定 */
140 gPicTbl.mask[ PIC_MASTER ] &= ~I8259A_OCW1_M2;
142 /* PIC2(スレーブ)用マスク設定 */
143 gPicTbl.mask[ PIC_SLAVE ] &= ~( 0x01 << ( irqNo - I8259A_IRQ8 ) );
147 if ( gPicTbl.maskState == PIC_MASK_STATE_ENABLE ) {
155 DEBUG_LOG( "%s() end.", __func__ );
161 /******************************************************************************/
164 * @details PICに指定したIRQ番号の割込み拒否設定を行う。
166 * @param[in] irqNo IRQ番号
177 * - I8259A_IRQ10 IRQ10
178 * - I8259A_IRQ11 IRQ11
179 * - I8259A_IRQ12 IRQ12
180 * - I8259A_IRQ13 IRQ13
181 * - I8259A_IRQ14 IRQ14
182 * - I8259A_IRQ15 IRQ15
184 /******************************************************************************/
185 void IntMngPicDenyIrq( uint8_t irqNo )
188 DEBUG_LOG( "%s() start. irqNo=%#X", __func__, irqNo );
191 if ( ( irqNo >= I8259A_IRQ0 ) &&
192 ( irqNo <= I8259A_IRQ7 ) ) {
193 /* PIC1(マスタ)向け割込み番号 */
195 /* PIC1(マスタ)用マスク設定 */
196 gPicTbl.mask[ PIC_MASTER ] |= 0x01 << irqNo;
199 /* PIC2(スレーブ)向け割込み番号 */
201 /* PIC2(スレーブ)用マスク設定 */
202 gPicTbl.mask[ PIC_SLAVE ] |= ( 0x01 << ( irqNo - I8259A_IRQ8 ) );
204 /* PIC2(スレーブ)の全マスク判定 */
205 if ( gPicTbl.mask[ PIC_SLAVE ] == 0xFF ) {
208 /* PIC1(マスタ)用マスク設定 */
209 gPicTbl.mask[ PIC_MASTER ] |= I8259A_OCW1_M2;
214 if ( gPicTbl.maskState == PIC_MASK_STATE_ENABLE ) {
222 DEBUG_LOG( "%s() end.", __func__ );
228 /******************************************************************************/
231 * @details PIC割込みを無効化する。
233 /******************************************************************************/
234 void IntMngPicDisable( void )
237 DEBUG_LOG( "%s() start.", __func__ );
240 gPicTbl.maskState = PIC_MASK_STATE_DISABLE;
242 /* PIC1(マスタ)割込みマスク設定 */
243 IA32InstructionOutByte( I8259A_M_PORT_OCW1, 0xFF );
245 /* PIC2(スレーブ)割込みマスク設定 */
246 IA32InstructionOutByte( I8259A_S_PORT_OCW1, 0xFF );
249 DEBUG_LOG( "%s() end.", __func__ );
255 /******************************************************************************/
258 * @details PIC割込みを有効化する。
260 /******************************************************************************/
261 void IntMngPicEnable( void )
264 DEBUG_LOG( "%s() start.", __func__ );
267 gPicTbl.maskState = PIC_MASK_STATE_ENABLE;
269 /* PIC1(マスタ)割込みマスク設定 */
270 IA32InstructionOutByte( I8259A_M_PORT_OCW1, gPicTbl.mask[ PIC_MASTER ] );
272 /* PIC2(スレーブ)割込みマスク設定 */
273 IA32InstructionOutByte( I8259A_S_PORT_OCW1, gPicTbl.mask[ PIC_SLAVE ] );
276 DEBUG_LOG( "%s() end.", __func__ );
282 /******************************************************************************/
285 * @details PICに指定したIRQ番号のEOI通知を行う。
287 * @param[in] irqNo IRQ番号
298 * - I8259A_IRQ10 IRQ10
299 * - I8259A_IRQ11 IRQ11
300 * - I8259A_IRQ12 IRQ12
301 * - I8259A_IRQ13 IRQ13
302 * - I8259A_IRQ14 IRQ14
303 * - I8259A_IRQ15 IRQ15
305 /******************************************************************************/
306 void IntMngPicEoi( uint8_t irqNo )
309 DEBUG_LOG( "%s() start. irqNo=%#X", __func__, irqNo );*/
312 if ( ( irqNo >= I8259A_IRQ0 ) &&
313 ( irqNo <= I8259A_IRQ7 ) ) {
314 /* PIC1(マスタ)向け割込み番号 */
317 IA32InstructionOutByte( I8259A_M_PORT_OCW2,
323 /* PIC2(スレーブ)向け割込み番号 */
326 irqNo -= I8259A_IRQ8;
328 /* PIC2(スレーブ)EOI通知 */
329 IA32InstructionOutByte( I8259A_S_PORT_OCW2,
334 /* PIC2(スレーブ)EOI通知 */
335 IA32InstructionOutByte( I8259A_M_PORT_OCW2,
342 DEBUG_LOG( "%s() end.", __func__ );*/
348 /******************************************************************************/