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

1、数据结构分析(1)中断描述符结构structirq_desc:1)打开CONFIG_SPARSE_IRQ宏(中断编号不连续),中断描述符以radix-tree来组织,用户在初始化时进行动态分配,然后再插入radix-tree中;2)关闭CONFIG_SPARSE_IRQ宏(中断编号连续),中断描述符以数组的形式组织,并且已经分配好;3)不管哪种形式,最终都可以通过linuxirq号来找到对应的中断描述符;(2)stru...
摘要由CSDN通过智能技术生成


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
                //  irq_of_parse_and_map也可以调用到该函数,其将中断映射到Linux 空间;irq_of_parse_and_map是个wrapper,更容易调用——drivers\of\Irq.c


(2)  irq_create_of_mapping(&oirq)


                
  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
IIO(Industrial I/O)子系统Linux内核中的一个子系统,它为驱动程序提供了一种通用的接口,用于访问各种硬件设备的模拟输入/输出接口。IIO子系统支持各种类型的模拟输入/输出设备,包括ADC(模拟数字转换器)、DAC(数字模拟转换器)、压力传感器、光传感器等等。 IIO框架提供了一些基础的数据结构,用于描述IIO设备和它们的数据: 1. struct iio_dev:IIO设备的描述结构体,包括设备名称、所属总线、设备ID、通道信息、触发器信息等等。 2. struct iio_chan_spec:IIO设备通道的描述结构体,包括通道名称、数据类型、量程、采样频率等等。 3. struct iio_buffer:IIO设备数据缓冲区的描述结构体,包括缓冲区大小、数据指针、数据类型等等。 4. struct iio_poll_func:IIO设备的轮询函数,用于读取硬件设备的数据。 IIO子系统还提供了一些基础的函数,用于IIO设备的注册、数据采集、数据存储等等。这些函数包括: 1. iio_device_register():注册IIO设备。 2. iio_device_unregister():注销IIO设备。 3. iio_buffer_alloc():分配IIO设备的数据缓冲区。 4. iio_buffer_free():释放IIO设备的数据缓冲区。 5. iio_read_channel_raw():读取IIO设备通道的原始数据。 6. iio_read_channel_processed():读取IIO设备通道的处理后数据。 7. iio_push_to_buffers():将IIO设备的数据写入数据缓冲区。 总之,IIO子系统提供了一个通用的接口,使得驱动程序可以方便地访问各种类型的模拟输入/输出设备。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值