linux驱动学习笔记6

  1. 在open函数中写申请中断函数 request_irq
int request_irq(unsigned int irq, 
void (*handler)(int irq, void *dev_id, struct pt_regs *regs ), 
unsigned long irqflags, 
const char * devname, 
void *dev_id);

irq是要申请的硬件中断号,在include\asm-arm\arch-s3c2410\irqs.h中定义。

#define IRQ_EINT0      S3C2410_IRQ(0)       /* 16 */
#define IRQ_EINT1      S3C2410_IRQ(1)
#define IRQ_EINT2      S3C2410_IRQ(2)
#define IRQ_EINT3      S3C2410_IRQ(3)
#define IRQ_EINT4t7    S3C2410_IRQ(4)       /* 20 */
#define IRQ_EINT8t23   S3C2410_IRQ(5)
#define IRQ_RESERVED6  S3C2410_IRQ(6)       /* for s3c2410 */
#define IRQ_CAM        S3C2410_IRQ(6)       /* for s3c2440,s3c2443 */
#define IRQ_BATT_FLT   S3C2410_IRQ(7)
#define IRQ_TICK       S3C2410_IRQ(8)       /* 24 */
#define IRQ_WDT        S3C2410_IRQ(9)       /* WDT/AC97 for s3c2443 */
#define IRQ_TIMER0     S3C2410_IRQ(10)
#define IRQ_TIMER1     S3C2410_IRQ(11)
#define IRQ_TIMER2     S3C2410_IRQ(12)
#define IRQ_TIMER3     S3C2410_IRQ(13)
#define IRQ_TIMER4     S3C2410_IRQ(14)
#define IRQ_UART2      S3C2410_IRQ(15)
#define IRQ_LCD        S3C2410_IRQ(16)      /* 32 */
#define IRQ_DMA0       S3C2410_IRQ(17)      /* IRQ_DMA for s3c2443 */
#define IRQ_DMA1       S3C2410_IRQ(18)
#define IRQ_DMA2       S3C2410_IRQ(19)
#define IRQ_DMA3       S3C2410_IRQ(20)
#define IRQ_SDI        S3C2410_IRQ(21)
#define IRQ_SPI0       S3C2410_IRQ(22)
#define IRQ_UART1      S3C2410_IRQ(23)
#define IRQ_RESERVED24 S3C2410_IRQ(24)      /* 40 */
#define IRQ_NFCON      S3C2410_IRQ(24)      /* for s3c2440 */
#define IRQ_USBD       S3C2410_IRQ(25)
#define IRQ_USBH       S3C2410_IRQ(26)
#define IRQ_IIC        S3C2410_IRQ(27)
#define IRQ_UART0      S3C2410_IRQ(28)      /* 44 */
#define IRQ_SPI1       S3C2410_IRQ(29)
#define IRQ_RTC        S3C2410_IRQ(30)
#define IRQ_ADCPARENT  S3C2410_IRQ(31)

handler是向系统登记的中断处理函数。
irqflags是中断触发方式,如高电平触发,下降沿触发…。include\linux\irqs.h

#define IRQ_TYPE_NONE       0x00000000  /* Default, unspecified type */
#define IRQ_TYPE_EDGE_RISING    0x00000001  /* Edge rising type */
#define IRQ_TYPE_EDGE_FALLING   0x00000002  /* Edge falling type */
#define IRQ_TYPE_EDGE_BOTH (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING)
#define IRQ_TYPE_LEVEL_HIGH 0x00000004  /* Level high type */
#define IRQ_TYPE_LEVEL_LOW  0x00000008  /* Level low type */
#define IRQ_TYPE_SENSE_MASK 0x0000000f  /* Mask of the above */
#define IRQ_TYPE_PROBE      0x00000010  /* Probing in progress */

devname是设备名字。
devid是设备ID。

这个函数做了以下几件事情:
a.分配一个irqaction。
b.把这个结构放入irq_desc中。
c.设置引脚。
d.使能中断。

函数运行正常时返回 0 ,否则返回对应错误的负值。

2.在close函数写中断释放函数 free_irq

void free_irq(  unsigned int irq,
    void * dev_id);

这个函数做了以下几件事情:
a.出链。
b.禁止中断。
c.设置引脚。
函数运行正常时返回 0 ,否则返回对应错误的负值。

3.写中断处理函数
中断处理程序声明:

static irqreturn_t intr_handler(int irq, void *dev_id, struct pt_regs *regs)

说明:
该类型与request_irq()参数中的handler所要求的参数类型相匹配。
int irq :中断号;
void *dev_id :与request_irq()的参数dev_id一致,可以根据这个设备id号得到相应设备的数据结构,进而的到相应设备的信息和相关数据;
struct pt_regs *regs :它指向一个数据结构,此结构保存的是中断之前处理器的寄存器和状态。主要用在程序调试,一般忽略。
返回值:中断程序的返回值是一个特殊类型——irqreturn_t。但是中断程序的返回值却只有两个值IRQ_NONE和IRQ_HANDLED。
IRQ_NONE:中断程序接收到中断信号后发现这并不是注册时指定的中断原发出的中断信号;
IRQ_HANDLED:接收到了准确的中断信号,并且作了相应正确的处理。
亦可以使用宏IRQ_RETVAL(x),若x为非0值,该宏返回IRQ_HANDLED,否则返回IRQ_NONE。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值