采用原子操作,设置GPIO为输入模式,对按键值保护。
文章目录- 一、设备树修改
- 1.找东山的原理图对应的引脚
- 2.找imx6ull芯片手册查此引脚宏定义
- 3.打开dts文件,找到iomuxc,在其下面添加子节点
- 4.在根节点下添加gpio节点,使用刚的节点地址
- 5.检查有无重复定义的节点
- 二、驱动程序
- 三、测试
- 1.测试App
- 2.编译
- 3.运行
一、设备树修改
这里介绍其流程:
1.找东山的原理图对应的引脚 2.找imx6ull芯片手册查此引脚宏定义 3.打开dts文件,找到iomuxc,在其下面添加子节点 4.在根节点下添加gpio节点,使用刚的节点地址 5.检查有无重复定义的节点 二、驱动程序struct key_dev{
dev_t devid;
struct cdev cdev;
struct class *class;
struct device *device;
int major;
int minor;
struct device_node *nd;
int key_gpio;
atomic_t keyvalue;
};
struct key_dev key;
static int keygpio_init()
{
int ret = 0;
key.nd = of_find_node_by_path("/key");
key.key_gpio = of_get_named_gpio(key.nd, "key-gpio", 0);
gpio_request(key.key_gpio, "key0");
ret = gpio_direction_input(key.key_gpio);
}
static int key_open(struct inode *inode, struct file *filp)
{
int ret;
filp->private_data = &key;
ret = keygpio_init();
return 0;
}
static ssize_t key_read (struct file *filp, char __user *buf, size_t cnt, loff_t *offt)
{
int ret = 0;
unsigned char value;
struct key_dev *keydev = filp->private_data;
if(gpio_get_value(keydev->key_gpio) == 1)
{
while(!gpio_get_value(keydev->key_gpio));
atomic_set(&keydev->keyvalue, 1);
}
else
atomic_set(&keydev->keyvalue, 0);
value = atomic_read(&keydev->keyvalue);
ret = copy_to_user(buf, value, sizeof(value));
return ret;
}
static int __init key_init(void)
{
atomic_set(&key.keyvalue, 0);
if(key.major)
{
key.devid = MKDEV(key.major, 0);
register_chrdev_region(key.devid, KEY_CNT, KEY_NAME);
}
else
{
alloc_chrdev_region(&key.devid, 0, KEY_CNT, KEY_NAME);
key.major = MAJOR(key.devid);
key.minor = MINOR(key.devid);
}
key.cdev.owner = THIS_MODULE;
cdev_init(&key.cdev, &key_fops);
cdev_add(&key.cdev, key.devid, KEY_CNT);
key.class = class_create(THIS_MODULE, KEY_NAME);
key.device = devid_create(key.class, NULL, key.devid, NULL, KEY_NAME);
return 0;
}
方便结构化程序设计,对于GPIO的设置专门做了gpio_init()函数,此函数在open中调用。
三、测试 1.测试Appint main(int argc, char *argv[])
{
int fd, retvalue;
char *filename;
unsigned char keyvalue;
if(argc != 2){
printf("Error!");
return 0 ;
}
filename = argv[1];
fd = open(filename, O_RDONLY);
if(fd < 0){
printf("Error!");
return 0 ;
}
while(1){
retvalue = read(fd, &keyvalue, sizeof(keyvalue));
if(keyvalue){
printf("KEY0, value = %c rn", keyvalue);
break ;
}
}
retvalue = close(fd);
return 0;
}
2.编译
和之前一样
3.运行和之前一样



