Mini2440 按键驱动程序学习笔记

发布者:清新风华最新更新时间:2024-06-28 来源: elecfans关键字:Mini2440  代码 手机看文章 扫描二维码
随时随地手机看文章

参考了友善之臂的按键驱动程序韦东山写的《嵌入式Linux应用开发完全手册》【下载见http://www.linuxidc.com/Linux/2011-01/31114.htm】一书的第20章—Linux异常处理体系结构部分的按键驱动程序,修改了部分内容,学习了嵌入式Linux下按键驱动程序。

按照习惯,先看原理,对所学习的知识结构有了大致的了解了开始阅读别人的代码,仔细分析代码实现的每个过程。由于时间有限,我只了解了一些概念性的理论和内核代码中部分数据结构,学习的过程还有待深入。对于我这样的初学者来说,想把资料中所介绍的每个原理和具体的实现方法都完全掌握,恐怕不止是时间的问题,我所追求的是一种快速上手的方法,先学会用再深入学习。

下面是经我改动后的按键驱动程序:

/*buttons_driver.c*/

 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

     

#define DEVICE_NAME     'buttons'

     

      struct button_irq_desc {

             int irq;

             int pin;

             int pin_setting;

             int number;

             char *name;

      };

     

      static struct button_irq_desc button_irqs [] = {

             {IRQ_EINT8 , S3C2410_GPG0 ,  S3C2410_GPG0_EINT8  , 0, 'KEY0'},

             {IRQ_EINT11, S3C2410_GPG3 ,  S3C2410_GPG3_EINT11 , 1, 'KEY1'},

             {IRQ_EINT13, S3C2410_GPG5 ,  S3C2410_GPG5_EINT13 , 2, 'KEY2'},

             {IRQ_EINT15, S3C2410_GPG7 ,  S3C2410_GPG7_EINT15 , 3, 'KEY3'},

             {IRQ_EINT14, S3C2410_GPG6 ,  S3C2410_GPG6_EINT14 , 4, 'KEY4'},

             {IRQ_EINT19, S3C2410_GPG11,  S3C2410_GPG11_EINT19, 5, 'KEY5'},

      };

     

      static volatile char key_values [] = {'0', '0', '0', '0', '0', '0'};

     

      static DECLARE_WAIT_QUEUE_HEAD(button_waitq);

     

      static volatile int ev_press = 0;

     

     

      static irqreturn_t buttons_interrupt(int irq, void *dev_id)

      {

             struct button_irq_desc *button_irqs = (struct button_irq_desc *)dev_id;

                   

             if ('0'== key_values[button_irqs->number]) { // Changed

     

                    key_values[button_irqs->number] =  '1';

             }

             else if('1' == key_values[button_irqs->number]){

                    key_values[button_irqs->number] = '0';

             }

             ev_press = 1;

             wake_up_interruptible(&button_waitq);

            

             return IRQ_RETVAL(IRQ_HANDLED);

      }

     

     

      static int s3c24xx_buttons_open(struct inode *inode, struct file *file)

      {

             int i;

             int err;

             //set the interrupt to falling

       //友善的是上升沿和下降沿都中断,这里改成下降沿中断

             for (i = 0; i < sizeof(button_irqs)/sizeof(button_irqs[0]); i++) {

                    err = request_irq(button_irqs[i].irq, buttons_interrupt, IRQ_TYPE_EDGE_FALLING,

                                                  button_irqs[i].name, (void *)&button_irqs[i]);

                    if (err)

                           break;

             }

     

             if (err) {

                    i--;

                    for (; i >= 0; i--) {

                    disable_irq(button_irqs[i].irq);

                           free_irq(button_irqs[i].irq, (void *)&button_irqs[i]);

                    }

                    return -EBUSY;

             }

     

             ev_press = 1;

            

             return 0;

      }

     

     

      static int s3c24xx_buttons_close(struct inode *inode, struct file *file)

      {

             int i;

            

             for (i = 0; i < sizeof(button_irqs)/sizeof(button_irqs[0]); i++) {

             free_irq(button_irqs[i].irq, (void *)&button_irqs[i]);

             }

     

             return 0;

      }

     

     

      static int s3c24xx_buttons_read(struct file *filp, char __user *buff, size_t count, loff_t *offp)

      {

             unsigned long err;

     

             if (!ev_press) {

             if (filp->f_flags & O_NONBLOCK)

                    return -EAGAIN;

             else

                    wait_event_interruptible(button_waitq, ev_press);

             }

            

             ev_press = 0;

     

             err = copy_to_user(buff, (const void *)key_values, min(sizeof(key_values), count));

     

             return err ? -EFAULT : min(sizeof(key_values), count);

      }

 

      #if 0

      static unsigned int s3c24xx_buttons_poll( struct file *file, struct poll_table_struct *wait)

      {

             unsigned int mask = 0;

[1] [2]
关键字:Mini2440  代码 引用地址:Mini2440 按键驱动程序学习笔记

上一篇:u-boot-2011.03在mini2440/micro2440上的移植 在RAM中运行
下一篇:mini2440_buttons.c驱动程序解读

推荐阅读最新更新时间:2026-03-23 02:54

linux-2.6.32在mini2440开发板上移植 按键驱动程序移植
编者:按键驱动程序涉及到linux中断程序的编写。 1、按键原理图。 2、驱动程序的编写移植。 在/linux-2.6.32.2/drivers/char/目录下创建一个新的驱动程序文件mini2440_buttons.c,内容及详细注释如下: span style= font-size: 18px; #include linux/module.h #include linux/kernel.h #include linux/fs.h #include linux/init.h #include linux/delay.h #include linux/poll.h #include linux/irq.h #include
[单片机]
linux-2.6.32在<font color='red'>mini2440</font>开发板上移植 <font color='red'>按键</font><font color='red'>驱动程序</font>移植
mini2440 简单按键中断模式驱动程序
Makefile KERN_DIR = /home/grh/kernel_source_code/linux-2.6.32.2 all : make -C $(KERN_DIR) M=`pwd` modules arm-linux-gcc key_interrupt_app.c -o key_interrupt_app clean : make -C $(KERN_DIR) M=`pwd` modules clean rm -rf modules.order obj-m += key_interrupt.o copy : cp key_interrupt.ko key_interrupt_app
[单片机]
<font color='red'>mini2440</font> 简单<font color='red'>按键</font>中断模式<font color='red'>驱动程序</font>
mini2440按键驱动程序分析
先说明一下按键与S3C2440芯片的连接方式: KEY1 ---- EINT8 ---- GPG0 KEY2 ---- EINT11 ---- GPG3 KEY3 ---- EINT13 ---- GPG5 KEY4 ---- EINT14 ---- GPG6 KEY5 ---- EINT15 ---- GPG7 KEY6 ---- EINT19 ---- GPG11 驱动程序源码如下: (drivers/char/mini2440_buttons.c) #include linux/module.h #include linux/kernel.h #include linux/fs.h #include linux
[单片机]
mini2440 ADC可调电阻驱动程序开发源代码(杂项设备驱动框架)
/*********************************************************/ /****s3c2440 ADC可调电阻驱动程序开发源代码(杂项设备驱动框架)****/ /********************************************************/ #include #include #include #define DEVICE_NAME adc_driver /*设备名称*/ static void __iomem *adc_base; /*定义了一个用来保存经过虚拟映射后的内存地址 */ static struct clk *adc_cl
[单片机]
驱动程序实例(四):按键驱动程序(platform + input子系统 + 外部中断方式)
正文 结合之前对Linux内核的platform总线与input子系统的分析 ,本文将编写基于platform总线和input子系统的Button设备的实例代码并对其进行分析。 platform总线的分析,详见Linux platform驱动模型。 input子系统的分析,详见Linux字符设备驱动框架(四):Linux内核的input子系统。 硬件接口:   CPU:s5pv210;   Button的GPIO:GPIO_H0_2,EINT2;   LED的工作方式:按键弹起,低电平;按键按下,高电平。 1. device 在/kernel/arch/arm/mach-s5pv210/includ
[单片机]
S3C6410输入子系统按键驱动程序
以前写的驱动程序要另外写一个测试程序,这样的驱动程序就有很大的局限性,只能自己用,为了通用性,别人的应用程序也可以用我的驱动程序就要引入输入子系统。在这个驱动程序里设置了5个按键L, S, ENTER, LEFTSHIFT, ESC.设置这几个按键主要是为了方便测试。以下是驱动程序button_input.c #include linux/module.h #include linux/init.h #include linux/fs.h #include linux/interrupt.h #include linux/irq.h #include linux/sched.h #include linux/pm.h
[单片机]
S3C6410输入子系统<font color='red'>按键</font><font color='red'>驱动程序</font>
mini2440简单的裸机led流水灯代码
MINI2440简单的裸机led流水灯代码 ADS配置target setting的post-liner为ARM formELF language setting的ARM Assembler和ARM C Compile的Target中的Architecture or processor设置为arm920T linker中的ARM linker中output--simple image--RO base设置为0x30000000;options--Image entry point设置为0x30000000;layout--object/symbol设置为Init.o(就是汇编的名字改了后缀.o文件名称) 汇编代码:Init
[单片机]
ARM-LINUX按键中断驱动程序
驱动程序 #include linux/module.h #include linux/kernel.h #include linux/moduleparam.h #include linux/init.h #include linux/kdev_t.h #include linux/fs.h #include linux/cdev.h #include linux/device.h #include asm/arch/regs-gpio.h #include asm/hardware.h #include asm/uaccess.h #include linux/p
[单片机]
ARM-LINUX<font color='red'>按键</font>中断<font color='red'>驱动程序</font>
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved