void setupIRQEnv() { //mask all interrupt ClrIntStatus(); //create interrupt handler table creatIntHandlerTable(); //register interrupt setIRQHandler(nTIMER0_INT, Timer0_ISR); setIRQHandler(UART0_INT, UARTIrq); //setIRQHandler(nDMA0_INT, Dma0Done); //setIRQHandler(nDMA1_INT, Dma1Done); setIRQHandler(nDMA2_INT, IsrForUSBDma2); //setIRQHandler(nDMA3_INT, Dma3Done); setIRQHandler(nIIC_INT, IICInt); setIRQHandler(nEXT8_23_INT,ExternIntDevice); setIRQHandler(nUSBD_INT,usbIRQ); //enable IRQ enable_IRQ(); //enable device interrupt Enable_EInt(IRQ_LAN); Enable_Int(nTIMER0_INT); Enable_Int(UART0_INT); //Enable_Int(nDMA0_INT); //Enable_Int(nDMA1_INT); Enable_Int(nDMA2_INT); //Enable_Int(nDMA3_INT); Enable_Int(nIIC_INT); Enable_Int(nEXT8_23_INT); Enable_Int(nUSBD_INT); }
// IRQ割り込みハンドラ void IRQ_handler(void){ // IRQ割り込みを停止 disable_IRQ(); // printf("get IRQ in IRQ handler\n"); // printf("CPSR (in IRQ_handler) = 0x%08x\n",getmode()); // Basic IRQ pendingをチェック if(*INTERRUPT_IRQ_BASIC_PENDING & 0x01 != 0){ // タイマー割り込み // デバッグ用 // printf("Timer IRQ start\n"); // printf("Timer Raw IRQ before: 0x%08x\n",*TIMER_RAWIRQ); // printf("irq_pending0 before : 0x%08x\n",*INTERRUPT_IRQ_BASIC_PENDING); // タイマ割り込み処理 timerIRQ_func(); // 割り込みフラグクリア *TIMER_IRQ_CLR = 0; // デバッグ用 // フラグがクリアされたかチェック // printf("irq_pending0 after: 0x%08x\n",*INTERRUPT_IRQ_BASIC_PENDING); // printf("Timer Raw IRQ after: 0x%08x\n",*TIMER_RAWIRQ); // printf("Timer IRQ end\n"); } // TODO: その他の割り込みも調べる // IRQ割り込みを許可 enable_IRQ(); return; }
void Timer_attachInterrupt(void (*f)(void)){ // 割り込みフラグクリア *TIMER_IRQ_CLR = 0; // 関数ポインタセット timerIRQ_func = f; // タイマー開始 Timer_start(); // 割り込み有効 enable_timer_interrupt(); enable_IRQ(); }
void mouse_init() { printf(LNG_MOUSE_SETUP); mouse_waitcmd(1); outportb(0x64,0xA8); mouse_waitcmd(1); outportb(0x64,0x20); unsigned char status_byte; mouse_waitcmd(0); status_byte = (inportb(0x60) | 2); mouse_waitcmd(1); outportb(0x64, 0x60); mouse_waitcmd(1); outportb(0x60, status_byte); mouse_write (0xF6); mouse_read(); mouse_write (0xF4); mouse_read(); add_IRQ_handler(12, mouse_IRQhandler); enable_IRQ(12); _kprintOK(); }