Linux驱动开发之按键输入实验【完整教程】

本文详细介绍了Linux驱动开发中的按键输入实验,包括修改设备树、创建字符设备驱动框架、添加读取函数、GPIO初始化、驱动入口与出口函数的实现,以及应用程序的编写。通过这个教程,读者可以理解并完成一个完整的按键驱动开发过程。
摘要由CSDN通过智能技术生成

做驱动都是有流程的嘛,要写驱动,第一件事便是去修改设备树。
                  

                ## 完整的代码见最后

一:修改设备树
在&iomux中添加pinctrl:

pinctrl_key: keygrp{
   
			fsl,pin = <
				MX6ULL_PAD_UART1_CTS_B__GPIO1_IO18 0xF080
			>;
		};

然后创建子节点key

key{
   
		compatible = "alientek,key";
		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_key>;
		key-gpios = <&gpio1 18 GPIO_ACTIVE_HIGH>;
		status = "okay";
	};

至此,设备树相关的就已经添加完成了

二:准备好一个最基本的字符设备驱动框架的模板
这里我就直接放出我构建的最基本字符设备了,有需要的可以直接使用

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/io.h>
#include <linux/cdev.h>
#include <linux/slab.h>
#include <linux/device.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/of_irq.h>
#include <linux/gpio.h>
#include <linux/of_gpio.h>

#define KEY_CNT 1
#define KEY_NAME "key1"

/*key设备结构体*/
struct key_dev{
   
    dev_t devid;
    int major; //主设备号
    int minor; //次设备号
    struct cdev cdev;
    struct class *class;
    struct device *device;
    struct device_node *nd;
    int key_gpio;
};
struct key_dev key;/*KEY*/

static int key_open(struct inode *inode, struct file *filp)
{
   
    filp->private_data = &key;
    return 0;
}
static int key_release(struct inode *inode, struct file *filp)
{
   
    return 0;
}
static ssize_t key_write(struct file *filp, const char __user *buf, size_t count, loff_t *ppos)
{
   
    int ret;
        
    return 0;
}
/*cdev操作集合*/
static const struct file_operations key_fops = {
   
    .owner   = THIS_MODULE,
    .write   = key_write,
    .open    = key_open,
    .release = key_release,
};

/*驱动入口函数*/
static int __init key_init(void)
{
   
    int ret = 0;

    /*1注册字符设备驱动*/
    key.major = 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);
    }
    if(ret <0){
   
        goto fail_devid;
    }
    printk("key major = %d, key = %d \r\n",key.major,key.minor);

    /*2初始化cdev*/
    key.cdev
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拼个世界给自己

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值