Linux驱动之按键读取IO
输入除了GPIO驱动框架修改电气特性修改为输入模式。该程序是简单的测试GPIO的输入模式,后面会写中断按键输入。
一、修改设备树
/{
key{
#address-cells = <1>;
#size-cells = <1>;
compatible = "pintitus,key";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_gpio_keys>;
key-gpios = <&gpio5 1 GPIO_ACTIVE_HIGH>;
status = "okay";
};
}
pinctrl_gpio_keys: keysgrp{
fsl,pins = <
MX6UL_PAD_SNVS_TAMPER1__GPIO5_IO01 0x000110A1
>;
};
二、驱动程序
/*设备结构体*/
struct gpio_dev{
dev_t devid; /*设备号*/
int major; /*主设备号*/
int minor; /*次设备号*/
struct cdev cdev; /*字符设备*/
struct class *class; /*设备的类*/
struct device *device;/*设备*/
struct device_node *nd;/*设备结点*/
int key_gpio[1]; /*IO的编号*/
char *name[11]; /*IO申请名称*/
atomic_t status; /*key状态*/
};
struct gpio_dev key;
ssize_t key_read(struct file *filp, char __user *buf, size_t count, loff_t *ppos){
struct gpio_dev *dev = filp->private_data;
unsigned char value;
//printk("---------key_read--------\r\n");
if(gpio_get_value(dev->key_gpio[0]) == 1){ /* 按下 */
while(!gpio_get_value(dev->key_gpio[0]));
atomic_set(&dev->status , KEY_DOWN);
}else{
atomic_set(&dev->status , KEY_INVALUE);
}
value = atomic_read(&dev->status);
copy_to_user(buf, &value, sizeof(count) );
return 0;
}