10.IMX6ULL LINUX驱动之按键读取

320 阅读1分钟

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;
}