Linux中断子系统(二)—— 通用框架处理

本文详细介绍了Linux中断子系统,从数据结构分析到中断处理,涵盖硬件中断号到Linux irq中断号的映射、中断注册、中断处理流程。重点讨论了中断描述符struct irq_desc、中断控制器硬件操作、中断处理函数的设置以及中断线程化处理的实现。通过对硬件中断号的映射和中断注册,确保设备触发中断时能正确调用到设备驱动的中断处理函数。


1、数据结构分析


(1)中断描述符结构 struct irq_desc


        1)打开CONFIG_SPARSE_IRQ宏(中断编号不连续),中断描述符以radix-
tree 来组织,用户在初始化时进行动态分配,然后再插入 radix-tree 中;
        2)关闭CONFIG_SPARSE_IRQ宏(中断编号连续),中断描述符以数组的
形式组织,并且已经分配好;
        3)不管哪种形式,最终都可以通过linuxirq号来找到对应的中断描述符;


(2)struct irq_chip 用于对中断控制器的硬件操作;struct irq_domain 与中断控制器对应,完成的工作是硬件中断号到Linux irq的映射;struct irq_domain_ops是中断中对应的操作函数;这三者主要在中断控制器驱动中进行初始化设置。


(3)struct irqaction 中handler的设置,用于指向我们设备驱动程序中的中断处理函数,在设备申请注册中断的过程中进行设置


(4)结构体之间的关系
struct irq_desc 包含 struct irqaction 和 struct irq_data

        struct irq_data 包含 struct irq_domain 和 struct irq_chip

                struct irq_domain 包含 struct irq_domain ops

                        struct irqaction 包含 设备驱动中的中断处理函数——irq_handler_t


(5)中断的处理主要有以下几个功能模块:
        1)硬件中断号到Linux irq 中断号的映射,并创建好 irq_desc中断描述符;
        2)中断注册时,先获取设备的中断号,根据中断号找到对应的irq_desc,并将设备的中断处理函数添加到irq_desc中;
        3)设备触发中断信号时,根据硬件中断号得到Linux irq中断号,找到对应的irq_desc,最终调用到设备的中断处理函数;


2、设备硬件中断号到Linux irq 中断号的映射


(1)platform_get_irq(struct platform_device *dev,unsigned int num)

/**drivers\base\Platform.c **/
platform_get_irq(struct platform_device *dev,unsigned int num)
    ---→_platform_get_irq(dev,num)
        ---→of_irq_get(dev->dev.of_node,num)
                //  返回 Linux irq number-driverslof\Irq.c
            ---→of_irq_parse_one(dev,index,&oirq)
                //  从设备数据中解析中断信息
            ---→irq_find_host(oirq.np)
                //  遍历 irq_domain_list链表,找到匹配的irq_domain
            ---→irq_create_of_mapping(&oirq)    //   kernel\irq\lrqdomain.c
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值