免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1057 | 回复: 0
打印 上一主题 下一主题

键盘控制LED驱动程序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-31 00:06 |只看该作者 |倒序浏览
  第一个键盘中断驱动程序:
基于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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP