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 + -
显示快捷键?