一、原理图
电平状态:
按键按下,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 =