【改进】IMX257实现GPIO-IRQ中断按键获取键值驱动程序

发布者:温暖梦想最新更新时间:2024-08-16 来源: cnblogs关键字:中断按键 手机看文章 扫描二维码
随时随地手机看文章

一、使用struct pin_desc 管理按键的值

1.定义结构体

2.将前面我们申请中断时写的(void *)1修改为 &pins_desc[n]

在ioctl中,设置中断中修改

在key_release中释放中修改

3.在中断程序中利用我们定义的struc pins_desc判断并得到按键的值

4.得到按键键值后,唤醒程序,在read函数中返回键值

附上驱动源程序:


  1 /******************************

  2     linux key_query

  3  *****************************/

  4 #include

  5 #include

  6 #include

  7 #include

  8 #include

  9 #include

 10 #include

 11 #include

 12 #include

 13 #include

 14 #include

 15 #include

 16 #include //error: 'TASK_INTERRUPTIBLE' undeclared 

 17 #include

 18 

 19 #include 'mx257_gpio.h'

 20 #include 'mx25_pins.h'

 21 #include 'iomux.h'

 22 

 23 #define Driver_NAME 'key_interrupt'

 24 #define DEVICE_NAME 'key_interrupt'

 25 

 26 #define GPIO2_21    MX25_PIN_CLKO

 27 #define GPIO3_15    MX25_PIN_EXT_ARMCLK

 28 #define GPIO2_10    MX25_PIN_A24

 29 #define GPIO2_11    MX25_PIN_A25

 30 #define GPIO2_8     MX25_PIN_A22

 31 #define GPIO2_9     MX25_PIN_A23

 32 #define GPIO2_6     MX25_PIN_A20

 33 #define GPIO2_7     MX25_PIN_A21

 34 //command

 35 #define key_input     0

 36 #define version        1

 37 //定义各个按键按下的键值

 38 struct pin_desc{

 39     unsigned int pin;

 40     unsigned int key_val;

 41 };

 42 //当按键按下时,键值分别为 以下值

 43 struct pin_desc pins_desc[8] = {

 44     {GPIO2_6,    0x01},

 45     {GPIO2_7,    0x02},

 46     {GPIO2_8,    0x03},

 47     {GPIO2_9,    0x04},

 48     {GPIO2_10,    0x05},

 49     {GPIO2_11,    0x06},

 50     {GPIO2_21,    0x07},

 51     {GPIO3_15,    0x08},

 52 };

 53 //定义一个全局变量,用于保存按下的键值

 54 static unsigned int key_val;

 55 

 56 //interrupt head

 57 static DECLARE_WAIT_QUEUE_HEAD(key_interrupt_wait);

 58 static volatile unsigned char ev_press;  

 59 

 60 static int major=0;

 61 

 62 //auto to create device node

 63 static struct class *drv_class = NULL;

 64 static struct class_device *drv_class_dev = NULL;

 65 

 66 

 67 /* 应用程序对设备文件/dev/key_query执行open(...)时,

 68  * 就会调用key_open函数*/

 69 static int key_open(struct inode *inode, struct file *file)

 70 {

 71     printk('<0>function open!nn');

 72     

 73     return 0;

 74 }

 75 

 76 /* 中断程序key_irq */

 77 static irqreturn_t key_irq(int irq, void *dev_id)

 78 {

 79     struct pin_desc * pindesc = (struct pin_desc *)dev_id;

 80     //发生了中断

 81     //printk('<0>function interrupt key_irq!nn');

 82     //获取按键键值

 83     if(gpio_get_value(IOMUX_TO_GPIO(pindesc->pin))){

 84         /* 按下 */

 85         key_val = pindesc->key_val;

 86     }else{

 87         key_val = 0x80 | pindesc->key_val;

 88     }

 89     printk('<0>get key 0x%x',key_val);    

 90     ev_press = 1;

 91     wake_up_interruptible(&key_interrupt_wait);

 92 

 93     return IRQ_RETVAL(IRQ_HANDLED);

 94 }

 95 

 96 

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

 98 {

 99     int ret;

100     //如果按键没有按下,没有中断,休眠

101     wait_event_interruptible(key_interrupt_wait,ev_press);

102 

103     ret = copy_to_user(buff,&key_val,sizeof(key_val));

104     if(ret){

105         ;

106     }

107     ev_press = 0;

108     return sizeof(key_val);

109 

110     //int cnt=0;

111     //unsigned char key_vals[8];

112 

113     /*

114     // reading the pins value

115     key_vals[0] = gpio_get_value(IOMUX_TO_GPIO(GPIO2_6)) ? 1 : 0;

116     key_vals[1] = gpio_get_value(IOMUX_TO_GPIO(GPIO2_7)) ? 1 : 0;

117     key_vals[2] = gpio_get_value(IOMUX_TO_GPIO(GPIO2_8)) ? 1 : 0;

118     key_vals[3] = gpio_get_value(IOMUX_TO_GPIO(GPIO2_9)) ? 1 : 0;

119     key_vals[4] = gpio_get_value(IOMUX_TO_GPIO(GPIO2_10)) ? 1 : 0;

120     key_vals[5] = gpio_get_value(IOMUX_TO_GPIO(GPIO2_11)) ? 1 : 0;

121     key_vals[6] = gpio_get_value(IOMUX_TO_GPIO(GPIO2_21)) ? 1 : 0;

122     key_vals[7] = gpio_get_value(IOMUX_TO_GPIO(GPIO3_15)) ? 1 : 0;

123     

124     //printk('<0>%04d key pressed: %d %d %d %d %d %d %d %dn',cnt++,key_vals[0],key_vals[1],key_vals[2],key_vals[3],key_vals[4],key_vals[5],key_vals[6],key_vals[7]); 

125     */

126 }

127 

128 static ssize_t key_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)

129 {

130     printk('<0>function write!nn');

131     

132     return 1;

133 }

134 

135 static int  key_release(struct inode *inode, struct file *filp)

136 {

137     printk('<0>function release!nn');

138     //释放中断

139     free_irq(IOMUX_TO_IRQ(GPIO2_21),  &pins_desc[6]);

140     //free_irq(IOMUX_TO_IRQ(GPIO3_15),&pins_desc[7]);

141     free_irq(IOMUX_TO_IRQ(GPIO2_11),  &pins_desc[5]);

142     free_irq(IOMUX_TO_IRQ(GPIO2_10),  &pins_desc[4]);

143     free_irq(IOMUX_TO_IRQ(GPIO2_9),   &pins_desc[3]);

144     //free_irq(IOMUX_TO_IRQ(GPIO2_8), &pins_desc[2]);

145     free_irq(IOMUX_TO_IRQ(GPIO2_7),   &pins_desc[1]);

146     free_irq(IOMUX_TO_IRQ(GPIO2_6),   &pins_desc[0]);

147     return 0;

148 }

149 

150 static int key_ioctl(struct inode *inode,struct file *flip,unsigned int command,unsigned long arg)

151 {

152     int ret;

153     printk('<0>function ioctl!nn');

154     switch (command) {

155         case key_input:    

156             //设置所有的引脚为输入

157             gpio_direction_input(IOMUX_TO_GPIO(GPIO2_21));

158             gpio_direction_input(IOMUX_TO_GPIO(GPIO3_15));

159             gpio_direction_input(IOMUX_TO_GPIO(GPIO2_10));

160             gpio_direction_input(IOMUX_TO_GPIO(GPIO2_11));

161             gpio_direction_input(IOMUX_TO_GPIO(GPIO2_8));

162             gpio_direction_input(IOMUX_TO_GPIO(GPIO2_9));

163             gpio_direction_input(IOMUX_TO_GPIO(GPIO2_6));

164             gpio_direction_input(IOMUX_TO_GPIO(GPIO2_7));

165             printk('<0>have setting all pins to gpio input mod !n');

166             //设置GPIO引脚为上拉模式

167             mxc_iomux_set_pad(GPIO2_6, PAD_CTL_HYS_SCHMITZ | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_22K_PU);

168             mxc_iomux_set_pad(GPIO2_7, PAD_CTL_HYS_SCHMITZ | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_22K_PU);

169             //mxc_iomux_set_pad(GPIO2_8, PAD_CTL_HYS_SCHMITZ | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_22K_PU);

170             mxc_iomux_set_pad(GPIO2_9, PAD_CTL_HYS_SCHMITZ | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_22K_PU);

171             mxc_iomux_set_pad(GPIO2_10, PAD_CTL_HYS_SCHMITZ | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_22K_PU);

172             mxc_iomux_set_pad(GPIO2_11, PAD_CTL_HYS_SCHMITZ | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_22K_PU);

173             mxc_iomux_set_pad(GPIO2_21, PAD_CTL_HYS_SCHMITZ | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_22K_PU);

174             //mxc_iomux_set_pad(GPIO3_15, PAD_CTL_HYS_SCHMITZ | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL | PAD_CTL_22K_PU);

175 

176             //设置GPIO引脚中断  ,下降沿触发

177             request_irq(IOMUX_TO_IRQ(GPIO2_6), key_irq, IRQF_TRIGGER_FALLING, 'key_GPIO2_6', &pins_desc[0]);

178             request_irq(IOMUX_TO_IRQ(GPIO2_7), key_irq, IRQF_TRIGGER_FALLING, 'key_GPIO2_7', &pins_desc[1]);

179             request_irq(IOMUX_TO_IRQ(GPIO2_9), key_irq, IRQF_TRIGGER_FALLING, 'key_GPIO2_9', &pins_desc[3]);

180             request_irq(IOMUX_TO_IRQ(GPIO2_10), key_irq, IRQF_TRIGGER_FALLING, 'key_GPIO2_10', &pins_desc[4]);

[1] [2]
关键字:中断按键 引用地址:【改进】IMX257实现GPIO-IRQ中断按键获取键值驱动程序

上一篇:【改进Poll定时查询】IMX257实现GPIO-IRQ中断按键获取键值驱动程序
下一篇:IMX257实现GPIO-IRQ中断按键驱动程序

推荐阅读最新更新时间:2024-11-02 15:04

S3C2410 按键控制LED(中断
一、开发环境 1、硬件平台:UP-TECH2410DVK1.1 2、主机:PC+eclipse 二、相关原理图 LED1-- GPC5 LED2-- GPC6 LED3-- GPC7 KEY1-- EINIT3 KEY2-- EINIT5 KEY3-- EINIT9 三、基本原理 通过按键的按下而触发中断,从而进行中断处理,进而实现相应功能(如闪烁LED),然后退出中断。 如何判断按键被按下: 以KEY1为例,未按下时,因为EINT3连接的是VDD,所以为高电平,当按键发生,EINT3连接的是GND,接地,此时为低电平。 通过芯片手册可查到EINT3 、5、9连接的为复
[单片机]
S3C2410 <font color='red'>按键</font>控制LED(<font color='red'>中断</font>)
stm32f103按键中断实现方法
#include stm32f10x.h void LED_GPIO_Config() { /*定义一个GPIO_InitTypeDef类型的结构体*/ GPIO_InitTypeDef GPIO_InitStructure; /*开启GPIOB的外设时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); /*选择要控制的GPIOB引脚*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; /*设置引脚模式为通用推挽输出*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode
[单片机]
STM32CubeMX学习笔记2:GPIO按键外部中断控制LED状态
MCU:STM32F103ZET6 IDE: MDK-ARM V5 +STM32CubeMX5.0.0 本次实现的功能是通过按键的外部中断,来改变对应LED的状态,需要将按键的I/O端口映射到外部中断线上。 需要初始化的按键I/O口分别对应PA0PE2PE3PE4,LEDI/O口分别为PC0PC1PC2PC3PC4。 一. 在 Pinout&Configuration---System Core中: 1. 首先设置时钟RCC的HSE(外部高速时钟)为晶振模式:Crystal/ceramic Resonator 2. 设置系统SYS的Debug为Serial Wire: 3. 设置GPIO中的LED
[单片机]
STM32CubeMX学习笔记2:GPIO<font color='red'>按键</font>外部<font color='red'>中断</font>控制LED状态
STM32F103程序设计-7-引脚输入功能-按键中断
AFIO时钟的打开。外部中断、重映射、复用功能?当配置AFIO六个寄存器中的值时就需要打开AFIO时钟。 void EXTI0_Config(void) { /* Enable GPIOA clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); /* Configure PA.00 pin as input floating */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
[单片机]
STM32F103程序设计-7-引脚输入功能-<font color='red'>按键</font>(<font color='red'>中断</font>)
【改进Poll定时查询】IMX257实现GPIO-IRQ中断按键获取键值驱动程序
按键驱动程序中,如果不使用read函数中使程序休眠的,而是还是使用查询方式的话,可以使用Poll函数,来控制一定时间内,如果有按键发生,则立即返回键值。 同时,poll也可以同时监控多个(比如说按键,鼠标,等)一旦发生事件则立即返回。 我们在linux查看帮助: 从帮助中的说明得知, poll, ppoll - wait for some event on a file descriptor poll就是监控某个设备的事件。 修改驱动程序 1.增加头文件 #include linux/poll.h 2.增加key_poll 方法 static unsigned key_poll(struct file *fil
[单片机]
【改进Poll定时查询】<font color='red'>IMX257</font>实现<font color='red'>GPIO-IRQ</font><font color='red'>中断</font><font color='red'>按键</font><font color='red'>获取</font><font color='red'>键值</font>驱动程序
按键中断---那些年我们一起玩mini2440(arm9)裸机
ARM中断控制系统 按键驱动程序设计 一.Arm中断控制系统 1.查询方式 程序不断地查询设备的状态,并做出相应的反应。该方式实现比较简单,常用在比较单一的系统中,比如:一个温控系统中可以实用查询的方式不断检测温度变化。 特点:实现简单;但CPU利用率很低,不适合多任务的系统。 2.中断方式 当事件发生时,硬件会设置某个寄存器;CPU在每执行完一个指令时,查看这个寄存器,如果所关注的事件发生了,则中断当前程序,跳转到一个固定的地址处理这个事件,处理完后返回到被中断的程序中继续运行。 特点:实现相对复杂,但效率较高,是常用的方法。 中断处理流程: (1)中断控制器汇集各类外设发出的中断信号,然后通知CPU; (2)CPU保存当前
[单片机]
<font color='red'>按键</font><font color='red'>中断</font>---那些年我们一起玩mini2440(arm9)裸机
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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