irq.c
来自「SMDK2440 boot code, base on vivi」· C语言 代码 · 共 165 行
C
165 行
/* * vivi/kernel/irq.c: simple interrupt core * * Copyright (C) 2001-2004 MIZI Research, Inc. All rights reserved. * * Author: Janghoon Lyu * Created: February 25, 2004 * * 沥富 窜鉴窍霸 父甸妨绊 畴仿沁促. 磊盔档 力茄窍妨绊 沁扁 锭巩俊, * 窜鉴茄 硅凯肺 贸府沁促. */#include <config.h>#include <irq.h>#include <vstring.h>#include <armv.h>#include <vmalloc.h>irq_t irq_routines;irq_handler_t *irq_handlers;static irq_handler_t * search_handler(int irq_num){ irq_handler_t *h = NULL; int i; for (i = 0; i < MAX_IRQ_HANDLERS; i++) { h = irq_handlers + i; if (h->function == NULL) continue; if (h->irq == irq_num) { break; } } if (i == MAX_IRQ_HANDLERS) h = NULL; return h;}static irq_handler_t * search_empty_handler(void){ irq_handler_t *h = NULL; int i; for (i = 0; i < MAX_IRQ_HANDLERS; i++) { h = irq_handlers + i; if (h->function == NULL) { break; } } if (i == MAX_IRQ_HANDLERS) h = NULL; return h;}void do_irq(void){ unsigned int irq_num = NR_IRQS; irq_handler_t *h = NULL; if (irq_routines.search == NULL) return; irq_num = irq_routines.search(); irq_routines.mask_ack(irq_num); h = search_handler(irq_num); if (h == NULL) return; h->function(irq_num, h->data); irq_routines.unmask(irq_num); return;}int request_irq(int irq_num, void (*irq_handler) (int, void *), void *data){ irq_handler_t *h = NULL; if (irq_handlers == NULL) return 1; if (irq_handler == NULL) return 2; if ((irq_num) < 0 || (irq_num) >= NR_IRQS) return 3; h = search_empty_handler(); if (h == NULL) return 4; h->irq = irq_num; h->function = irq_handler; h->data = data; irq_routines.unmask(h->irq); return 0;}int free_irq(int irq_num){ irq_handler_t *h = NULL; h = search_handler(irq_num); if (h == NULL) return 1; h->function = NULL; h->data = NULL; return 0;}void enable_irq(void){ unsigned long cpsr; __asm__("mrs %0, cpsr" : "=r" (cpsr)); cpsr &= ~(I_BIT); __asm__("msr cpsr_c, %0" : : "r" (cpsr)); /* enable IRQ */}void disable_irq(void){ unsigned long cpsr; __asm__("mrs %0, cpsr" : "=r" (cpsr)); cpsr |= (I_BIT); __asm__("msr cpsr_c, %0" : : "r" (cpsr)); /* enable IRQ */}void disable_irq_and_clear(void){ disable_irq(); irq_routines.clear();}int init_irq(void){ irq_handlers = (irq_handler_t *)vmalloc(sizeof(irq_handler_t) * MAX_IRQ_HANDLERS); if (irq_handlers == NULL) return 1; /* 伐捞 歹矾况廉 乐阑 荐档 乐促. */ memset(irq_handlers, 0x00, sizeof(irq_handler_t)*MAX_IRQ_HANDLERS); enable_irq(); arch_init_irq(); irq_routines.clear(); return 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?