|
#define DEVICE_NAME "mini_buttons"
#define BUTTONS_NUM 6
#define MAX_BUTTONS_BUF 16
#define BUTTONS_MAJOR 252
#define BUTTONSTATUS_DOWNX 0
#define BUTTONSTATUS_DOWN 1
#define BUTTONSTATUS_UP 2
#define BUTTONS_TIMER_DELAY (HZ/50)
#define BUTTONS_TIMER_DELAY1 (HZ/10)
static int buttons_major = BUTTONS_MAJOR;
struct buttons_dev
{
struct cdev cdev;
unsigned int buttonStatus[BUTTONS_NUM];
unsigned char buf[MAX_BUTTONS_BUF];
unsigned int head,tail;
wait_queue_head_t wq;
};
static struct buttons_dev *buttons_devp;
static struct buttons_info
{
unsigned int irq_no;
unsigned int gpio_port;
unsigned int buttons_no;
}buttons_info_tab[BUTTONS_NUM] =
{
{IRQ_EINT8,S3C2410_GPG0,1},
{IRQ_EINT11,S3C2410_GPG3,2},
{IRQ_EINT13,S3C2410_GPG5,3},
{IRQ_EINT14,S3C2410_GPG6,4},
{IRQ_EINT15,S3C2410_GPG7,5},
{IRQ_EINT19,S3C2410_GPG11,6},
};
static struct timer_list buttons_timer[BUTTONS_NUM];
void __iomem * virt_GPGCON;
void __iomem * virt_GPGDAT;
void __iomem * virt_SRCPND;
void __iomem * virt_INTMSK;
void __iomem * virt_INTPND;
void __iomem * virt_EINTPEND;
void __iomem * virt_EINTMASK;
void __iomem * virt_EXTINT1;
void __iomem * virt_EXTINT2;
static int buttons_open(struct inode *inode,struct file *filp);
static int buttons_release(struct inode *inode,struct file *filp);
static ssize_t buttons_read(struct file *filp,char __user *buf,
size_t size,loff_t *ppos);
static struct file_operations buttons_fops =
{
.owner = THIS_MODULE,
.open = buttons_open,
.release = buttons_release,
.read = buttons_read,
// .write = buttons_write,
};
static void buttons_ioremap(void)
{
virt_INTPND=ioremap(0x4a000010,4);
virt_EINTPEND=ioremap(0x560000a8,4);
virt_SRCPND=ioremap(0x4a000000,4);
// virt_EXTINT0=ioremap(0x56000088,4);
virt_EXTINT1=ioremap(0x5600008c,4);
virt_EXTINT2=ioremap(0x56000090,4);
virt_GPGDAT=ioremap(0x56000064,4);
virt_EINTMASK=ioremap(0x560000a4,4);
virt_INTMSK=ioremap(0x4a000008,4);
virt_GPGCON=ioremap(0x56000060,4);
}
static void buttons_iounmap(void)
{
iounmap(&virt_INTPND);
iounmap(&virt_EINTPEND);
iounmap(&virt_SRCPND);
// iounmap(&virt_EXTINT0);
iounmap(&virt_EXTINT1);
iounmap(&virt_EXTINT2);
iounmap(&virt_GPGDAT);
iounmap(&virt_EINTMASK);
iounmap(&virt_INTMSK);
iounmap(&virt_GPGCON);
}
static void buttons_enable_irq(void)
{
unsigned int value;
iowrite32((1<<5),virt_SRCPND);
iowrite32((1<<5),virt_INTPND);
value = ioread32(virt_INTMSK);
value &= ~(1<<5);
iowrite32(value,virt_INTMSK);
value = 0;
value |= (1<<8)|(1<<11)|(1<<13)|(1<<14)|(1<<15)|(1<<19);
iowrite32(value,virt_EINTPEND);
value = ioread32(virt_EINTMASK);
value &= ~((1<<8)|(1<<11)|(1<<13)|(1<<14)|(1<<15)|(1<<19));
iowrite32(value,virt_EINTMASK);
}
static void buttons_enable_irq_again(void)
{
unsigned int value;
value = 0;
value = ioread32(virt_INTPND);
if(value = (1<<5))
{
iowrite32((1<<5),virt_SRCPND);
iowrite32((1<<5),virt_INTPND);
value = ioread32(virt_EINTPEND);
if(value = (1<<8))
{
iowrite32(value,virt_EINTPEND);
}else if(value = (1<<11))
{
iowrite32(value,virt_EINTPEND);
}else if(value = (1<<13))
{
iowrite32(value,virt_EINTPEND);
}else if(value = (1<<14))
{
iowrite32(value,virt_EINTPEND);
}else if(value = (1<<15))
{
iowrite32(value,virt_EINTPEND);
}else if(value = (1<<19))
{
iowrite32(value,virt_EINTPEND);
}
}
}
static void buttons_lowlevel(void)
{
unsigned int value;
value = 0;
value &= ~((7<<0)|(7<<12)|(7<<20)|(7<<24)|(7<<28));
iowrite32(value,virt_EXTINT1);
value &= ~(7<<12);
iowrite32(value,virt_EXTINT2);
}
|
|