Linux高级应用(十三)按键控制

一、原理图
电平状态:
按键按下,GPIO是低电平;按键没有按下,GPIO是高电平

按钮 ARM的GPIO
KEY1 — GPH2_0 ----- S5PV210_GPH2(0)
KEY2 — GPH2_1 ----- S5PV210_GPH2(1)
KEY3 — GPH2_2 ----- S5PV210_GPH2(2)
KEY4 — GPH2_3 ----- S5PV210_GPH2(3)

二、驱动程序设计

1、申请四个GPIO作为资源

2、将四个GPIO设置为输入(不同)

3、注册混杂设备

4、定义混杂设备

5、定义文件操作集(不同)

static struct file_operations mini210_key_fops = {
.owner = THIS_MODULE,
.open = mini210_key_open,
.read = mini210_key_read,
.release = mini210_key_release,
};

//给应用程序read()的接口
//struct file *filp – 内核中,指向驱动程序的文件指针
//char __user *buf – 应用程序read()从这里读取数据
//size_t len – 应用程序read()数据的长度(字节数)
//loff_t *off – 文件指针的偏移值
static ssize_t mini210_key_read(struct file *filp, char __user *buf, size_t len, loff_t *off)
{
char key_flag[4]; //用来保存四个按钮的值

int ret,i;
if(len != 4)
	return -EINVAL;//Invalid argument

for(i=0;i<4;i++)
	key_flag[i] = gpio_get_value(???);

//将驱动程序的数据拷贝给应用程序
ret = copy_to_user(buf, key_flag, len);
if(ret != 0){
	return -EFAULT;
}

return len;	

}

三、应用程序设计

int main(void)
{
int fd_key;
char key_buf[4];
fd_key = open("/dev/key_drv", O_RDWR);
if(fd_key == -1)
{
perror(“open key”);
return -1;
}
while(1)
{
read(fd_key, key_buf, 4);
for(int i=0;i<4;i++)
printf(“key[%d+1]=%d\n”, i, key_buf[i]);
printf("\r\n");
usleep(200*1000);
}

close(fd_key);

return 0;

}

//驱动的头文件
#include <linux/init.h>
#include <linux/module.h>
#include <linux/gpio.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/miscdevice.h>


struct gpio_info {
   
	unsigned int gpio_num;
	char gpio_name[12];
};

static struct gpio_info key_info[4] ={
   
	{
   
		.gpio_num = S5PV210_GPH2(0),
		.gpio_name = "GPH20-KEY1",
	},
	{
   
		.gpio_num =
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值