linux驱动 -- 输入子系统

1:输入子系统介绍

        一个统一的输入设备的开发框架, 统一生成设备文件, 统一返回固定格式值。

2:输入子系统开发设备

        键盘、鼠标、触摸屏等等。

3:输入子系统运行框架

        应用层:操作设备文件+open+close+read+write

        输入子系统:为中间层

        驱动层:注册设备为输入子系统,把输入设备的事件告诉给输入子系统

4:输入子系统的开发


            无需再去注册生产设备文件,也无需做上层的交互->不需要返回有效数据
    在输入子系统中:
            1:需要把设备注册为输入子系统的设备
            函数原型:
                    input_register_device(struct input_dev * dev);
            2:在内核层上报输入设备的行为、事件
            比如按键摁下需要告诉输入子系统
            松开也需要告诉输入子系统
            采用中断的方式确定按键摁下

5:内核接口函数

头文件:

#include "linux/input.h"

函数功能:上报事件给输入子系统
    任何输入子系统注册设备,一旦发生任何事件都应该上报给输入子系统
    上报事件函数原型:
        

input_event(struct input_dev * dev ,unsigned int typedef,unsigned int code,int value);

函数参数:
    dev:
        上报给你注册哪个输入子系统设备
        核心结构体
    type:
        上报事件的类型->
            EV_SYN->代表上报了一个同步消息
            数据就会产生同步(输入子系统是有类似缓冲区概念)
            EV_KEY->
            代表上报了按键事件
    code:
        上报具体的什么事件
        EV_SYN ->这个地方固定填写 0
        EV_KEY ->
        这个地方则代表你上报按键的具体是哪个按键!
        KEY_1 KEY_2 KEY_Q ......
    value:
        代表具体上报值
        如果你用 EV_SYN ->此处固定填 0
        如果你用 EV_KEY ->代表你上报按键的具体的状态
        0->按键松开
        1->按键按下

函数功能:向内核注册输入子系统
函数原型:

 int input_register_device(struct input_dev *dev);

函数参数:
    dev:
        输入子系统的核心结构体需要用->input_allocate_device(void)开辟
        struct input_dev
        {
            const char *name;
            unsigned long evbit[BITS_TO_LONGS(EV_CNT)]
            这是记录当前注册输入子系统支持的事件
            其中相关重要参数
                EV_SYN:同步事件
                EV_KEY:输入子系统支持 按键事件
                EV_REL:相对事件
                EV_ABS:绝对坐标
                EV_REP:重复事件->列如按下不松手
                通过函数set_bit();设置
                用法:set_bit(EV_KEY,dev->evbit);
            unsigned long keybit[BITS_TO_LONGS(KEY_CNT)];
                往keybit里面添加支持的键值,这个为键盘设备,摁下后会是一个世界编码表。
            
        }
函数返回值:
        注册输入子系统成功返回 0
        注册输入子系统失败返回非 0

6:按键输入代码参考示例

#include "linux/kernel.h"
#include "linux/module.h"
#include "linux/of.h"
#include "linux/cdev.h"
#include "linux/fs.h"
#include "linux/gpio.h"
#include "linux/of_gpio.h"
#include "linux/device/class.h"
#include "linux/device.h"
#include "linux/platform_device.h"
#include "linux/miscdevice.h"
#include "asm/uaccess.h"
#include "linux/input.h"
#include "linux/irq.h"
#include "linux/interrupt.h"
int irqnum;
int gpio_num;
int value =0 ;
struct input_dev * mykeyp;
irqreturn_t mykey_irq(int irqnum, void * arg)
{value = gpio_get_value(gpio_num);if(value == 0)//按键松开{input_event(mykeyp,EV_KEY,KEY_1,0);}else//按键按下!{input_event(mykeyp,EV_KEY,KEY_1,1);}input_sync(mykeyp);return 0;
}
int mykey_probe(struct platform_device * devp)
{int ret = 0;gpio_num = of_get_named_gpio(devp->dev.of_node,"xyd-gpios",0);gpio_request(gpio_num,"xyd_key");gpio_direction_input(gpio_num);//1:获取中断号irqnum = platform_get_irq(devp,0);//2:注册中断ret =devm_request_irq(&devp->dev,irqnum,mykey_irq,0,"key_irq",NULL);ret = ret ;//3:注册按键为输入子系统设备mykeyp = input_allocate_device();mykeyp->name = "xyd_key";set_bit(EV_KEY,mykeyp->evbit);//按键事件支持set_bit(EV_REP,mykeyp->evbit);//重复事件支持set_bit(KEY_1,mykeyp->keybit);//支持按键 1mykeyp->keycodemax = 1;return input_register_device(mykeyp);
}
struct of_device_id key_id_table={.compatible = "xyd_key",
};
struct platform_driver keyplat={.driver={.name = "xyd_key",.of_match_table = &key_id_table,},.probe = mykey_probe,
};
static int __init mykey_init(void)
{return platform_driver_register(&keyplat);
}
static void __exit mykey_exit(void)
{ }
module_init(mykey_init);
module_exit(mykey_exit);
MODULE_LICENSE("GPL");

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

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

相关文章

Netty 学习笔记

Java 网络编程 早期的 Java API 只支持由本地系统套接字库提供的所谓的阻塞函数,下面的代码展示了一个使用传统 Java API 的服务器代码的普通示例 // 创建一个 ServerSocket 用以监听指定端口上的连接请求 ServerSocket serverSocket new ServerSocket(5000); //…

OS常规测试方法-PPMU

step 0: 检查工作: 检查每根pin连接到指定的PPMU资源是否正确继电器资源在PRJ文件中是否定义正确 step 1 设计者设计的测试电路继电器重置初始化close应该闭合的继电器 step 2 DPS pin电压置0V,同时考虑电流量程wait闭合测试机DPS通道RELAYwait st…

android13 隐藏状态栏里面的飞行模式 隐藏蓝牙 隐藏网络

总纲 android13 rom 开发总纲说明 目录 1.前言 2.问题分析 3.代码分析 4.代码修改 5.编译运行 6.彩蛋 1.前言 android13 隐藏状态栏里面的飞行模式,或者其他功能,如网络,蓝牙等等功能,隐藏下图中的一些图标。 2.问题分析 这里如果直接找这个布局的话,需要跟的逻…

nefu暑假acm集训1 构造矩阵 个人模板+例题汇总

前言&#xff1a; 以下都是nefu暑假集训的训练题&#xff0c;我在此把我的模板和写的一些练习题汇总一下并分享出来&#xff0c;希望在能满足我复习的情况下能帮助到你。 正文&#xff1a; 模板&#xff1a; #include<bits/stdc.h> using namespace std; typedef long…

算法训练营|图论第5天

题目&#xff1a;107.寻找存在的路径 题目链接&#xff1a; 107. 寻找存在的路径 (kamacoder.com) 代码&#xff1a; #include<bits/stdc.h> #include<unordered_map> #include<unordered_set> using namespace std; vector<int>father; int find(…

Celery 中,广播模式可以通过使用 RabbitMQ 的 fanout 交换机来实现

这里写自定义目录标题 设置 Django 的 settings 模块从 Django 的 settings 文件中加载 Celery 配置自动发现任务使 Celery 实例可用配置 Celery 的任务路由 在 Celery 中&#xff0c;广播模式可以通过使用 RabbitMQ 的 fanout 交换机来实现。fanout 交换机会将消息广播到所有绑…

嵌入式开发者必备资料库 【完全免费】

嵌入式资料网盘分享文案 &#x1f31f; 嵌入式开发者必备资料库 &#x1f31f; 亲爱的嵌入式开发爱好者们&#xff0c; 我们为大家准备了一份丰富的嵌入式资料网盘&#xff0c;涵盖了单片机、Linux系统、硬件设计等多个领域的优质资源&#xff0c;助力你的学习和项目开发&…

国外课程环境总结

CS106L2023 and CS106B 环境配置(详细教程)_cs106b 2023-CSDN博客

Java:内存过高和CPU过高的排查流程

一、CPU占用过高排查流程 1、利用 top 命令可以查出占 CPU 最高的的进程pid 。 假设pid为 98762、查看该进程下占用最高的线程id。 top -Hp 98763、假设占用率最高的线程 ID 为 6900&#xff0c;将其转换为 16 进制形式 (因为 java native 线程以16进制形式输出) 。 printf…

WHAT - 通过 react-use 源码学习 React(State 篇)

目录 一、官方介绍1. Sensors2. UI3. Animations4. Side-Effects5. Lifecycles6. State7. Miscellaneous 二、源码学习示例&#xff1a;n. xx - yyState - createMemoState - createReducer 一、官方介绍 Github 地址 react-use 是一个流行的 React 自定义 Hook 库&#xff0…

Qt 学习第7天:Qt核心特性

元对象系统Meta-object system 来自AI生成&#xff1a; Qt中的元对象系统&#xff08;Meta-Object System&#xff09;是Qt框架的一个核心特性&#xff0c;它为Qt提供了一种在运行时处理对象和类型信息的能力。元对象系统主要基于以下几个关键概念&#xff1a; 1. QObject&a…

Linux实现异步IO的方法:epoll,posix aio,libaio,io_uring

Linux中异步IO的实现方式大概有以下几种&#xff1a; 1. epoll 熟悉网络编程的人可能会想到select&#xff0c;poll&#xff0c;epoll这些异步IO的方式&#xff0c;但实际上这些方式叫做非阻塞IO&#xff0c;并不是实际意义上的异步IO。因此这些只能用于异步的Socket IO&…

有了豆包Marscode你还害怕不会写代码吗?

前言 随着科技的飞速发展&#xff0c;软件开发者们正面临着前所未有的挑战。编程任务变得越来越复杂&#xff0c;他们不仅需要编写和维护大量的代码&#xff0c;还要在严格保证代码质量的同时&#xff0c;提高开发效率。在这种背景下&#xff0c;一款高效且实用的辅助编码工具…

Depth anything v2环境相关问题

环境配置&#xff1a;numpy版本 2.x的版本不兼容。 因为我的torch版本较高&#xff0c;所以numpy改成一个较高的版本&#xff1a;1.26.4。可用 warning&#xff1a;xFormers not available xFormers: 一个用于推理加速的库&#xff0c;尤其是当输入尺寸增大时&#xff0c;能…

FastJson序列化驼峰-下划线转换问题踩坑记录

背景 问题描述 在MySQL数据表中&#xff0c;存在一个JSON结构的扩展字段&#xff0c;通过updateById进行更新写入操作。更新写入的同一个字段名出现了混合使用了驼峰命名和下划线命名两种格式。 ps: FastJson版本是1.2.83 问题影响 数仓同学离线统计数据时发现字段名有两种…

单链表——环形链表II

方法一 难想&#xff0c;但代码容易实现 根据第一道环形链表的题目我们可以得知快慢指针相交的节点&#xff0c;但是如果想要知道进入环形链表的第一个节点&#xff0c;我们就还需要定义一个指针从链表的头节点开始&#xff0c;与相交的节点同时行走&#xff0c;当两个节点重…

LeetCode刷题:3.无重复字符的最长子串

问题&#xff1a;首先分析问题得出需求 1.要求得到一个唯一最长子串的序列的长度。 子串&#xff1a;依据其形式是拥有一段长度的&#xff0c;所以考虑滑动窗口 唯一&#xff1a;考虑使用HashSet 需求描述&#xff1a;要求得到滑动窗口的大小&#xff0c;也就是左右指针的距离&…

milvus多个Querynode,资源消耗都打在一个节点上

milvus 查询时的原理 当读取数据时&#xff0c;MsgStream对象在以下场景中创建&#xff1a; 在 Milvus 中&#xff0c;数据必须先加载后才能读取。当代理收到数据加载请求时&#xff0c;会将请求发送给查询协调器&#xff0c;查询协调器决定如何将分片分配到不同的查询节点。…

根据两个位置的经纬度,计算其距离和方位

#include <iostream> #include <cmath>const double EARTH_RADIUS 6371000.0; // 地球半径 (单位&#xff1a;米) const double DEG_TO_RAD M_PI / 180.0;// 计算两个经纬度之间的距离 (单位&#xff1a;米) 和方位 (单位&#xff1a;度) void calculate_distanc…