Linux驱动学习之按键读取

news2024/11/8 15:40:15

按键读取我们需要实现read函数,

read 函数的 第二个参数被__user 修饰,原则上在内核层我们不能直接访问,需要调用

copy_to_user()这个函数,从内核获取数据到上层。

copy_to_user(void __user volatile * to, const void * from, unsigned long n)

参数1:目标地址,

参数2:数据从哪里来

参数3:多少个字节

 当我们想实现write时,就需要使用,copy_from_user() 从上层获取数据到内核,

copy_from_user(void * to, const void __user volatile * from, unsigned long n)

参数1:目标地址

参数2:数据从哪里来

参数3:多少字节

下面来实现驱动代码

#include "linux/cdev.h"
#include "linux/device.h"
#include "linux/device/class.h"
#include "linux/export.h"
#include "linux/fs.h"
#include "linux/gpio.h"
#include "linux/module.h"
#include "linux/of_device.h"
#include "linux/of_gpio.h"
#include "linux/platform_device.h"
#include "linux/types.h"
#include "linux/uaccess.h"
#include "linux/zconf.h"


uint32_t pin;
dev_t dev_num;
struct cdev *cdev;
struct class *cls;
ssize_t read(struct file *f, char __user *b, size_t s, loff_t *offt)
{
    uint8_t val=gpio_get_value(pin);
    int a=copy_to_user(b,&val,1);
	copy_from_user(void * to, const void __user volatile * from, unsigned long n)
    if(a)
    {
        
    }
    return 0;
}
struct file_operations fops={
   .owner=THIS_MODULE,
   .read=read,
};
int probe(struct platform_device *d)
{
    pin=of_get_named_gpio(d->dev.of_node,"key_pin",0);
    printk("%d\r\n",pin);
    gpio_request(pin,"key");
    gpio_direction_input(pin);
    alloc_chrdev_region(&dev_num, 0, 1,"key");
    cdev=cdev_alloc();
    cdev->ops=&fops;
    cdev_add(cdev,dev_num,1);
    cls=class_create(THIS_MODULE, "key");
    device_create(cls, NULL,dev_num,NULL,"key");
    return 0;
}
int remove(struct platform_device *d)
{
    return 0;
}
static struct of_device_id match={
    .compatible="key",
};

static struct platform_driver driver={
    .probe=probe,
    .remove=remove,
    .driver={
        .name="key",
        .of_match_table=&match,
    },
};
static int __init start(void)
{
    platform_driver_register(&driver);
    printk(KERN_INFO "Hello, world!\n");
    return 0;
}
static void __exit stop(void)
{
    platform_driver_unregister(&driver);
    printk(KERN_INFO "Goodbye, world!\n");
}
module_init(start);
module_exit(stop);
MODULE_LICENSE("GPL");

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2072701.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言笔试题(指针、数组、整数在内存中的存储、结构体......)

文章目录 1.选择题2.代码题2.1 模拟实现strncat2.2 模拟实现strncpy2.3 编写判断大小端程序2.4 模拟实现atoi2.5 BC38 变种水仙花数2.6 BC98 序列中删除指定数字 今天我们一起来看一些题目 1.选择题 解析如下: 正确选项:B A.参数错误;D.返回…

什么是Redis集群的脑裂问题?

目录 一、脑裂的发生 二、脑裂的危害 三、如何避免脑裂? 四、能彻底解决脑裂吗? 所谓脑裂,就像他的名字一样,大脑裂开了,一般来说就是指一个分布式系统中有两个子集,然后每个子集都有一个自己的大脑(Le…

【Excal】And函数

奖金评定说明 业绩低于6000,奖金为100 业绩大于等于6000且小于10000,奖金为200 业绩大于等于10000,奖金为500 然后按回车健 下拉填充

BurpSuite2024.7.3专业版

前言 Burp Suite是一个无需安装软件,下载完成后,直接从命令行启用即可。开箱即可使用支持LInux/Windows/Mac 01更新介绍 2024.7.13版本界面大改动此版本引入了重大的性能升级、对拦截功能的重大增强,以及在审计项目表中新增了扫描插入点列。…

【Nature】在科研中应用ChatGPT:如何与数据对话

随着人工智能技术的迅猛发展,大型语言模型(LLMs)正逐渐成为科研领域的一种创新工具。这些模型通过自然语言处理技术,使得研究人员能够以直观的方式与数据进行交互,从而简化了数据分析和解释的过程。在《自然》杂志2024…

103.二叉树的锯齿形层序遍历

1.题目描述 给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。 示例 1: 输入:root [3,9,20,nul…

Unity-可分组折叠的Editor

Unity-可分组折叠的Editor 🥗功能介绍🍭用法 🥗功能介绍 在序列化的字段上标记特性:[FoldoutGroup(“xxx”)],inspector上就会被分组折叠显示。 (没有被指定的字段自动放到Default组中) 传送门&#x1f30…

如何用Java SpringBoot和Vue搭建高效的OA办公管理系统?

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

深度学习--复制机制:CopyNet 模型在序列到序列模型中的应用以及代码实现

CopyNet 是一种特别设计的序列到序列(Seq2Seq)模型,旨在更好地处理那些在输出序列中需要直接复制输入序列中的部分或全部内容的任务。它在机器翻译、摘要生成、文本复述等任务中有广泛的应用,尤其是在输入和输出有显著重叠的场景。…

Spring--三级缓存机制

一、什么是三级缓存 就是在Bean生成流程中保存Bean对象三种形态的三个Map集合&#xff0c;如下&#xff1a; // 一级缓存Map 存放完整的Bean&#xff08;流程跑完的&#xff09; private final Map<String, Object> singletonObjects new ConcurrentHashMap(256);// 二…

51单片机——LED灯控制

1、LED介绍 中文名&#xff1a;发光二极管 外文名&#xff1a;Light Emitting Diode 简称&#xff1a;LED 用途&#xff1a;照明、广告灯、指引灯、屏幕 2、LED原理图 电阻在原理图上标注为1k&#xff0c;表示这是1千欧的电阻&#xff0c;实际在电路板上的表示是102 102解…

HarmonyOs应用权限申请,system_grant和user_grant区别。本文附头像上传申请user-grant权限代码示例

HarmonyOs应用权限申请&#xff0c;system_grant和user_grant区别。本文附头像上传申请user-grant权限代码示例 system_grant&#xff08;系统授权&#xff09; system_grant指的是系统授权类型&#xff0c;在该类型的权限许可下&#xff0c;应用被允许访问的数据不会涉及到用户…

【大数据算法】一文掌握大数据算法之:排序链表搜索的亚线性算法。

排序链表搜索的亚线性算法 1、引言2、平面图直径问题的亚线性算法2.1 定义2.2 核心原理2.2.1 跳表2.2.2 跳跃搜索2.2.3 分块搜索 2.3 应用场景2.4 算法公式2.5 代码示例 3、总结 1、引言 小屌丝&#xff1a;鱼哥&#xff0c;这茶味道怎么样&#xff1f; 小鱼&#xff1a;嗯&am…

计算机毕业设计选题推荐-保险业务管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

[CUDA编程] --- cuda线程模型

1 核函数 先看一个cuda版本的hello world #include <stdio.h>__global__ void helloworld() {printf("hello world\n"); }int main() {helloworld()<<<1, 1>>>();cudaDeviceSynchronize();return 0; }这里helloworld()<<<1, 1>…

旅行达人必备!有道翻译和这三款神器,轻松走遍世界

在如今的全球化和科技迅猛发展的时代&#xff0c;翻译工具在我们的日常生活中发挥着越来越重要的作用。在各种格式数据的翻译当中&#xff0c;我们就可以发现各种类型的翻译工具纷纷崭露头角。今天就分享三款除了有道翻译外的好用翻译工具&#xff0c;希望可以解决大家翻译的需…

虚幻5|暴击攻击和释放技能,造成伤害

玩家数据的Actor组件制作&#xff1a;虚幻5|制作玩家血量&#xff0c;体力-CSDN博客 造成伤害时&#xff0c;显示暴击及暴击字体颜色和未暴击的字体颜色&#xff0c;还有释放技能连击 一.编辑暴击数据 1.打开之前创建的玩家数据Actor组件 创建一个浮点变量&#xff0c;命名…

从法律风险的角度来看,项目经理遇到不清楚或不明确问题时的处理

大家好&#xff0c;我是不会魔法的兔子&#xff0c;在北京从事律师工作&#xff0c;日常分享项目管理风险预防方面的内容。 序言 在项目开展过程中&#xff0c;有时候会遇到一些不清楚或不明确的状况&#xff0c;但碍于项目进度的紧迫性&#xff0c;不得不硬着头皮做决策&…

喜羊羊教你(如何应对突发的技术故障和危机?)

开发团队如何应对突发的技术故障和危机&#xff1f; 在数字化时代&#xff0c;软件服务的稳定性至关重要。、8月19日下午&#xff0c;网易云音乐疑似出现服务器故障&#xff0c;网页端出现502 Bad Gateway 报错&#xff0c;且App也无法正常使用。 怀疑了自己的电脑、自己的手…

OpenStack 常见模块(二)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…