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);
发布评论