liunx2.6.30.4 key interrupt s3c2440

#include <linux/module.h>

#include <linux/kernel.h>

#include <linux/fs.h>

#include <linux/init.h>

#include <linux/delay.h>

#include <asm/irq.h>

#include <linux/interrupt.h>

#include <asm/uaccess.h>

#include <asm/arch/regs-gpio.h>

#include <asm/hardware.h>

#define DEVICE_NAME     "buttons"

#define BUTTON_MAJOR    232

struct button_irq_desc {

int irq;

unsigned long flags;

char *name;

};

static struct button_irq_desc button_irqs [] = {

{IRQ_EINT2, IRQF_TRIGGER_FALLING, "KEY1"}, /* K1 */

{IRQ_EINT3, IRQF_TRIGGER_FALLING, "KEY2"}, /* K2 */

{IRQ_EINT4,  IRQF_TRIGGER_FALLING, "KEY3"}, /* K3 */

{IRQ_EINT5,  IRQF_TRIGGER_FALLING, "KEY4"}, /* K4 */

};

static volatile int press_cnt [] = {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)

{

volatile int *press_cnt = (volatile int *)dev_id;

*press_cnt = *press_cnt + 1;

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;

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

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

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

if (err)

break;

}

if (err) {

i--;

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

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

return -EBUSY;

}

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 *)&press_cnt[i]);

}

return 0;

}

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

{

unsigned long err;

wait_event_interruptible(button_waitq, ev_press);

ev_press = 0;

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

memset((void *)press_cnt, 0, sizeof(press_cnt));

return err ? -EFAULT : 0;

}

static struct file_operations s3c24xx_buttons_fops = {

.owner   =   THIS_MODULE,

.open    =   s3c24xx_buttons_open,

.release =   s3c24xx_buttons_close,

.read    =   s3c24xx_buttons_read,

};

static int __init s3c24xx_buttons_init(void)

{

int ret;

ret = register_chrdev(BUTTON_MAJOR, DEVICE_NAME, &s3c24xx_buttons_fops);

if (ret < 0) {

printk(DEVICE_NAME " can‘t register major number\n");

return ret;

}

printk(DEVICE_NAME " initialized\n");

return 0;

}

static void __exit s3c24xx_buttons_exit(void)

{

unregister_chrdev(BUTTON_MAJOR, DEVICE_NAME);

}

module_init(s3c24xx_buttons_init);

module_exit(s3c24xx_buttons_exit);

MODULE_AUTHOR("litingting");

MODULE_DESCRIPTION("gec2440 BUTTON Driver");

MODULE_LICENSE("GPL");

时间: 2024-12-06 12:34:11

liunx2.6.30.4 key interrupt s3c2440的相关文章

&lt;第四次作业查阅&gt;hashmap由value找key的算法

问题:不同于第三次作业,第三次作业是按照key的值排序输出,第四次作业则是要求按照频率(hashmap的value值)排序,然后输出key的值,最开始的想法是还是沿用第三次作业的做法,想着查询一下怎么从value反得到key的值,最后发现这种做法不仅麻烦,而且效率特别低,也给了我启示,由于key-value对可能出现多对一的情况,所以由key的value比较容易高效,但是反之的效率就比较低,应该尽量能够避免试图通过value得key. Map中是一个key有且只有一个value. 但是一个val

Leetcode题解(30)

98. Validate Binary Search Tree 题目 分析:BST按照中序遍历之后所得到的序列是一个递增序列,因此可以按照这个思路,先中序遍历,保存好遍历的结果,然后在遍历一遍这个序列.判断其是否递增 代码如下: 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(i

stc89c52开发板遥控器解码 红外线发射 内置 eeprom 存储 串口显示编码

单片机,大概三年前,就买了一本 <爱上单片机> 最后就学会,用面包板了,编程书上基本没讲. 看原理图,看时序图,看数据手册, 都没讲. 而且书上自带的代码写的很烂. 1,缩近控制不好 2,命名混乱 3,做if 的时候 不变的常量放在左侧,这是很基本的约定 ... 最后,还是什么也没有学会. 直到去年,开始学 ARM 了. 学完了 ARM 前面发的(s3c2440)以后, 在回头看单片机,发现单片机真是,简单的不得了! 但是也发现,单片机,不如 ARM 功能强大.速度也慢.很多控制器,没有,要用

Spring Integration

The Cafe Sample(小卖部订餐例子) 小卖部有一个订饮料服务,客户可以通过订单来订购所需要饮料.小卖部提供两种咖啡饮料 LATTE(拿铁咖啡)和MOCHA(摩卡咖啡).每种又都分冷饮和热饮 整个流程如下: 1.有一个下订单模块,用户可以按要求下一个或多个订单. 2.有一个订单处理模块,处理订单中那些是关于订购饮料的. 3.有一个饮料订购处理模块,处理拆分订购的具体是那些种类的饮料,把具体需要生产的饮料要求发给生产模块 4.有一个生产模块,进行生产. 5.等生成完成后,有一个订单确认模

Guava Cache源码详解

目录 一.引子 二.使用方法 2.1 CacheBuilder有3种失效重载模式 2.2 测试验证 三.源码剖析 3.1 简介 3.2 源码剖析 四.总结 优点: 缺点: 正文 回到顶部 一.引子 缓存有很多种解决方案,常见的是: 1.存储在内存中 : 内存缓存顾名思义直接存储在JVM内存中,JVM宕机那么内存丢失,读写速度快,但受内存大小的限制,且有丢失数据风险. 2.存储在磁盘中: 即从内存落地并序列化写入磁盘的缓存,持久化在磁盘,读写需要IO效率低,但是安全. 3.内存+磁盘组合方式:这种

OSAL之按键驱动

本博文根据协议栈1.3.2,尊重原创,注明出处,欢迎转载 学习按键驱动的主要有两大块: 第一:按键引脚设置: 第二:按键事件的触发检测与轮询,以及按键消息的发送 先说明第一大块,按键引脚设置, 超出cc2540片子从机的按键两个按键,按键是共地.所以它的触发方式是下降沿触发按键中断,同时程序对按键按下这个动作检测是中断方式检测,一旦有按键按下,触发一个按键轮询函数执行,同时把对按键的检测方式换成轮询模式.所以对按键引脚设置的内容也就出来了.主要一下几个方面: 1.设置按键映射到的物理引脚GPIO

mysql之索引原理与慢查询优化

一.介绍 1.什么是索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句的优化显然是重中之重.说起加速查询,就不得不提到索引了. 2.为什么要有索引呢? 索引在MySQL中也叫做"键",是存储引擎用于快速找到记录的一种数据结构.索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要.索引优化应该是对查询性能优化最有效的手段了.

微信接入机器人实现对别人消息和群at消息的自动回复

微信接入机器人实现对别人消息和群at消息的自动回复 有时候,我们想让我们的微信号对别人发出的各种消息做出回复.我们可以通过接入图灵机器人的方式实现. IDLE编写py文件并保存,命名为wxbot. #!/usr/bin/env python # coding: utf-8 import os import sys import webbrowser import pyqrcode import requests import json import xml.dom.minidom import

Map-HashMap-LinkedHashMap-Map.Entry-Collections-可变参数

一.Map 接口(java.util) 定义:public interface Map<K,V> 介绍:     (1)Map是一个接口,含有两个泛型,创建子类对象的时候,需要传递两个泛型的值;     (2)将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值.(值可以重复)     (3)Map集合是双列集合的顶层接口,Map中的方法,所有的子类都可以使用; 特点:     (1)所有的键(K)必须唯一不能重复;     (2)操作数据(增删改查)的时候,都是以键值对的