Linux 嵌入式驱动开发外部中断

本文介绍了Linux嵌入式驱动中关于外部中断的开发,包括request_irq函数的使用,中断处理函数的返回值,以及如何申请和释放中断。讲解了container_of()函数的应用,用于从成员地址获取结构体起始地址。同时阐述了中断处理的上下半部概念,提到了tasklet和工作队列作为下半部处理机制。
摘要由CSDN通过智能技术生成

1. 外部中断框架
  • 中断号:通过中断号即可区分不同的中断

    1. 申请中断号 step 3

    request_irq 函数,申请中断并使能,可能导致睡眠,不能在中断上下文或者其他禁止睡眠的代码段中使用。

    /* 函数原型 */
    /*
     * irq:		申请的中断号
     * handler:	中断处理函数
     * flags:		中断标志
     * name:		中断名
     * dev:		一般情况下将 dev 设置为设备结构体
     */
    int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev);
    

    flags:在文件 include/linux/interrupt.h 里面查看所有的中断标志

    - IRQF_SHARED			# 共享中断线,dev 参数作为唯一区分他们的标志
    - IRQF_ONESHOT
    - IRQF_TRIGGER_NONE
    - IRQF_TRIGGER_RISING	# 上升沿触发
    - IRQF_TRIGGER_FALLING	# 下降沿触发
    - IRQF_TRIGGER_HIGH		# 高电平触发
    - IRQF_TRIGGER_LOW		# 低电平触发
    

    name:设置中断后,cat /proc/interrupts 查看对应的中断名字

    return0 -> 申请成功;-EBUSY -> 已被申请;other negative value -> 申请失败

    1. 释放中断号 step 5

    free_irq 函数,释放相应的中断,删除中断处理函数并且禁止中断。

    void free_irq(unsigned int irq, void *dev);
    
    • 中断处理函数 step 4

    使用 request_irq 函数申请中断的时候需要设置中断处理函数。

    /*
     * int:		相应的中断号
     * void *:		通用指针,要求与 request_irq 函数的 dev 参数保持一致
     * return:		irqreturn_t 类型
     */
    irqreturn_t (*irq_handler_t) (int, void *);
    /* 示例 */
    static irqreturn_t xxx_irq_handler(int irq_num, void *dev){
         ...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值