2024年5月11日发(作者:)

Generated by Foxit PDF Creator © Foxit Software

For evaluation only.

对一个具有四个按键的按键驱动的分析

源代码:

/*Headers-------------------------------------------------*/

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#ifdef CONFIG_DEVFS_FS

#include

#endif

/*Vars----------------------------------------------------*/

#define DEVICE_NAME "buttons"

#define EXTINT_OFF (IRQ_EINT4 - 4)

unsigned int buttons_major=0;

unsigned int buttons_minor=0;

unsigned int type = IRQT_FALLING;

struct button_info {

unsigned int irq_no;

unsigned int gpio_port;

unsigned int IN;

int button_no;

};

struct button_info realarm_button_info[4] = {

{ IRQ_EINT19, S3C2410_GPG11, S3C2410_GPG11_INP, 1 },

{ IRQ_EINT8, S3C2410_GPG0, S3C2410_GPG0_INP, 2 },

Generated by Foxit PDF Creator © Foxit Software

For evaluation only.

{ IRQ_EINT11, S3C2410_GPG3, S3C2410_GPG3_INP, 3 },

{ IRQ_EINT2, S3C2410_GPF2, S3C2410_GPF2_INP, 4 },

};

struct realarm_button_dev

{

struct button_info buttoninfo_tab[4];

int extint_num[4];

struct semaphore sem;

wait_queue_head_t wq;

struct cdev buttons_dev;

};

struct realarm_button_dev *realarm_button_device;

void s3c_irq_ack(unsigned int irqno)

{

unsigned long bitval = 1UL << (irqno - IRQ_EINT0);

__raw_writel(bitval, S3C2410_SRCPND);

__raw_writel(bitval, S3C2410_INTPND);

return;

}

void s3c_irqext_ack(unsigned int irqno)

{

unsigned long req;

unsigned long bit;

bit = 1UL << (irqno - EXTINT_OFF);

__raw_writel(bit, S3C2410_EINTPEND);

req = __raw_readl(S3C2410_EINTPEND);

if (irqno <= IRQ_EINT7 )

{

if ((req & 0xf0) == 0)

s3c_irq_ack(IRQ_EINT4t7);

}

else

{

if ((req >> 8) == 0)

s3c_irq_ack(IRQ_EINT8t23);