- 论坛徽章:
- 0
|
第一个键盘中断驱动程序:
基于2.6内核的键盘控制LED驱动程序
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define DEVICE_NAME "button_int"
#define button_MAJOR 233
#define LED_SET_PIN 0X1
#define LED_CLR_PIN 0X2
#define KEY1_IRQ IRQ_EINT0
#define KEY2_IRQ IRQ_EINT1
static unsigned long mini_led_table[] =
{
S3C2410_GPB5,
S3C2410_GPB6,
S3C2410_GPB7,
S3C2410_GPB8,
};
static unsigned long mini_led_cfg_table[] = {
S3C2410_GPB5_OUTP,
S3C2410_GPB6_OUTP,
S3C2410_GPB7_OUTP,
S3C2410_GPB8_OUTP,
};
int led_on(int arg)
{
s3c2410_gpio_setpin(mini_led_table[arg], 0); //s3c2410_gpio_setpin端口位输入
return 0;
}
int led_off(int arg)
{
s3c2410_gpio_setpin(mini_led_table[arg], 1);
return 0;
}
static int button_open(struct inode *inode,struct file *file)
{
printk(KERN_INFO "I am open yeh\n");
enable_irq(KEY1_IRQ);
return 0;
}
static int button_release(struct inode *inode,struct file *file)
{
disable_irq(KEY1_IRQ);
return 0;
}
static int interrupt_kirq1(int irq,void *id,struct pt_regs *r)
{
printk(KERN_INFO "button down\n");
disable_irq(KEY1_IRQ);
led_on(0);
led_on(1);
led_on(2);
led_on(3);
enable_irq(KEY1_IRQ);
return IRQ_HANDLED;
}
static int interrupt_kirq2(int irq,void *id,struct pt_regs *r)
{
printk(KERN_INFO "button down\n");
disable_irq(KEY1_IRQ);
led_off(0);
led_off(1);
led_off(2);
led_off(3);
enable_irq(KEY2_IRQ);
return IRQ_HANDLED;
}
static int button_read(struct file *filp,char *buf,size_t count,loff_t *f_pos)
{
return 0;
}
static int button_ioctl(struct inode *inode, struct file *file,unsigned int cmd, unsigned long arg)
{
switch(cmd)
{
case 0:
led_off(arg);
break;
case 1:
led_on(arg);
break;
default:
return -1;
}
return 0;
}
static struct file_operations button_fops={
.owner=THIS_MODULE,
.open=button_open,
.read=button_read,
.ioctl=button_ioctl,
.release=button_release,
};
static int button_init(void)
{
int ret;
int i;
s3c2410_gpio_cfgpin(S3C2410_GPF0,S3C2410_GPF0_INP);
set_irq_type(KEY1_IRQ,IRQT_FALLING);
request_irq(KEY1_IRQ,interrupt_kirq1,SA_INTERRUPT,"button",0);
set_irq_type(KEY2_IRQ,IRQT_FALLING);
request_irq(KEY2_IRQ,interrupt_kirq2,SA_INTERRUPT,"button1",0);
ret=register_chrdev(button_MAJOR,DEVICE_NAME,&button_fops);
if(ret < 0)
{
printk(DEVICE_NAME "register error\n");
return ret;
}
for (i = 0; i < 4; i++)
{
s3c2410_gpio_cfgpin(mini_led_table, mini_led_cfg_table);
s3c2410_gpio_setpin(mini_led_table, 1);
}
printk(DEVICE_NAME "initialized\n");
return 0;
}
void button_exit(void)
{
free_irq(KEY1_IRQ,interrupt_kirq1);
free_irq(KEY2_IRQ,interrupt_kirq2);
unregister_chrdev(button_MAJOR,DEVICE_NAME);
}
module_init(button_init);
module_exit(button_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("wbwen163@163.com");
MODULE_DESCRIPTION("button driver for S3C2440");
注:
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/95058/showart_2041691.html |
|