栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Linux驱动学习记录-10.按键输入

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Linux驱动学习记录-10.按键输入

采用原子操作,设置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.测试App
int 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.运行

和之前一样

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/334426.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号