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驱动程序解读

推荐阅读最新更新时间:2024-11-13 06:24

新 MATLAB Test 使工程师和研究人员能大规模开发、执行、测量和管理 MATLAB 代码中的动态测试
新的 MATLAB Test 使工程师和研究人员能够大规模开发、执行、测量和管理 MATLAB 代码中的动态测试 MATLAB 和 Simulink 版本 2023a 还包括全新的与更新的模块集及工具箱,可简化航空航天、汽车和无线通信行业中基于模型的设计 中国 北京,2023 年 3 月 22 日 —— MathWorks 今天发布了 MATLAB® 和 Simulink® 产品系列版本 2023a(R2023a)。 R2023a 推出了两款新产品和增强功能,支持工程师和研究人员开发、执行、管理、测试、验证其 MATLAB 代码工程,并生成相关文档。 MATLAB Test™ 使工程师和研究人员能够大规模开发、执行、测
[工业控制]
51单片机:点亮一个LED并闪烁(仿真+代码
点亮一个LED,这是单片机的一个最简单的入门实验。能让你初步了解到单片机的作用。(因为简单就只在仿真软件上给大家看一下) 先给大家看一下仿真软件的电路(软件为Proteus) 左侧为时钟电路和复位电路,右侧便是我们的实验电路。 实验电路:一个LED灯+100电阻 (因为LED电压电流很小,所以必须加一个电阻限流一下,在现实试验中我们也得加个电阻,不要太大也不能太小,不然起不到作用) 右击晶振点击属性改12KHz,LED段的电阻同样点开属性改为100,其余的话数值可以不用改动。 单片机下载程序,只要右击单片机进入属性找到程序文件夹中的后缀名为.hex,确定就好。 上图是在仿真软件中需要用到的元件,点击元件模式
[单片机]
51单片机:点亮一个LED并闪烁(仿真+<font color='red'>代码</font>)
mini2440裸机试炼之—RTC闹钟中断,节拍中断
环境搭建 硬件环境:J-link v8、mini2440、J-link转接板、串口转USB线 软件环境:windows7(32位)、开发板uboot(NandFlash)、J-link驱动(J-Link ARM V4.10i)、SecureCRT、ADS1.2 其中ADS里的AXD设置:加载JlinkRDI.dll+Options- Configure Interface...,在Session File一页中选择“Run Configuration Script”,将该name.txt文本文件作为一个脚本加进来,确定。 name.txt内容 Setmem 0x53000000 0x00000000 3
[单片机]
<font color='red'>mini2440</font>裸机试炼之—RTC闹钟中断,节拍中断
Stm32采用环形缓冲区接收rk3588的数据代码
```c #include stm32f10x.h #include usart.h #include ring_buffer.h #define BUFFER_SIZE 128 uint8_t buffer ; // 定义一个大小为128的缓冲区 ring_buffer_t ring_buffer; // 定义一个环形缓冲区结构体 void USART1_IRQHandler(void) { if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) // 判断是否接收到数据 { uint8_t data = USART_ReceiveData(USART1); // 读取接收
[单片机]
变频器故障代码有哪些
  变频器故障代码大全   PG故障也是我们在使用中经常遇到的问题。一般不允许吊装开环控制。   主要原因:   1、PG连接不正确或断开;   2、PG屏蔽接地不良,信号干扰;   3、PG卡有故障,需要更换。   此外,如果PG本身出现故障,还会报警。但是有些变频器会单独引用故障代码,比如西门子代码F051。   不及物动词通信故障(总线,F082)   一般来说,调试过程中通信故障频繁发生。尤其是变频器和plc之间的程序设置。   变频器故障代码:   1、OC报警,键盘面板LCD显示:加、减、恒速时过电流。   2、OLU报警,键盘面板LCD显示:变频器过负载。   3、OU1报警,键盘面板LCD显示:加速时过电压。
[嵌入式]
基于ATmega16单片机 程控滤波器程序源代码
#include avr/io.h #include avr/signal.h #include avr/interrupt.h #include util/delay.h #define uint unsigned int #define uchar unsigned char static uchar interrupt ,count; static uchar b; uint a; SIGNAL(SIG_OVERFLOW1)/*溢出中断*/ { TCNT1H=0X7F; TCNT1L=0XFC; interrupt++; if(interrupt==a) { interrupt=0;
[单片机]
网络安全专家指出,互联设备需要电子商务级的安全标准
2016年7月21日,北京讯 据众多知名技术安全领域专家表示,数以亿计的互联设备正面临潜在的安全风险,除非对安全要求敏感的软件能实现电子商务级的安全标准。 包括ARM, Intercede, Solacia 和 赛门铁克在内的公司纷纷展开合作,评估数以亿计来自不同领域连接设备的安全挑战,包括诸如工业、家庭、健康服务和运输领域。最后得出结论:任何系统都有可能被侵入,除非能建立系统级的信任根(root of trust)。 为了应对该风险,企业达成开放信任协议(OTrP, Open Trust Protocol)合作,利用在大型银行和敏感数据业务在客户端(如手机、平板等)应用中所使用的成熟技术,将安全架构与受信任代码管理(truste
[安防电子]
新型的按键扫描程序,仅三行代码
对于单片机或嵌入式系统而言,按键是必不可少的。记得刚开始学51单片机的时候,刚接触到按键扫描程序,理解起来很是费力,感觉代码量不少。后来有接触到 stm32的按键扫描程序,觉得不错。今天一个偶然的机会从阿莫电子网看到这篇关于按键扫描的程序,觉得很不错;于是就转载整理出来了。不过,代码是否可行我没有上机实践过,但是我相信应该没问题的。 我在网上游逛了很久,也看过不少源程序了,没有发现这种按键处理办法的踪迹,所以,我将他共享出来,和广大同僚们共勉。我非常坚信这种按键处理办法的便捷和高效,你可以移植到任何一种嵌入式处理器上面,因为C语言强大的可移植性。 同时,这里面用到了一些分层的思想,在单片机当中也是相当有用的,也是本文
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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