上一篇记录了树莓派自带的gpio驱动(外链网址已屏蔽),在bcm2708_gpio.c实现gpio驱动的同时其实也实现了中断控制器的驱动,本文记录bcm2708_gpio.c中驱动的实现。
一·bcm2708_gpio_irq_init中断初始化函数建立gpio中断描述表
static void bcm2708_gpio_irq_init(struct bcm2708_gpio *ucb)
{
unsigned irq;
printk(KERN_ERR DRIVER_NAME": bcm2708_gpio_irq_init is not null!\n");
ucb->gc.to_irq = bcm2708_gpio_to_irq;//获取该端口对应的中断号
/*针对每一个IRQ Line建立irq_desc*/
for (irq = GPIO_IRQ_START; irq < (GPIO_IRQ_START + GPIO_IRQS); irq++) {
irq_set_chip_data(irq, ucb);//设置私有数据
irq_set_chip_and_handler(irq, &bcm2708_irqchip, handle_simple_irq);//同时设置irq_desc中的handle_irq回调和irq_chip指针
set_irq_flags(irq, IRQF_VALID);
}
bcm2708_gpio_irq.dev_id= ucb;//用于标示唯一性和传递私有结构体
setup_irq(IRQ_GPIO3, &bcm2708_gpio_irq);//IRQ_GPIO3响应bank1和bank2种所有的中断
}
这个函数是在本驱动的bcm