input子系统学习(一)

1、输入子系统框架

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2、编写一个简单的设备驱动层代码

#include<linux/module.h>
#include<linux/init.h>
#include<linux/input.h>
#include<linux/time.h>struct input_dev *my_input_dev;static void timer_function(struct timer_list *t);
DEFINE_TIMER(test_timer,timer_function);
static void timer_function(struct timer_list *t)
{static int value = 0;value = value?0:1;input_event(my_input_dev,EV_KEY,KEY_1,value);input_event(my_input_dev,EV_SYN,SYN_REPORT,0);//printk("in timer_function\n");mod_timer(&test_timer,jiffies_64+msecs_to_jiffies(1000));
}static int my_input_dev_init(void)
{int ret;my_input_dev = input_allocate_device();if(!my_input_dev){printk("input_allocate_device is error\n");return -1;}my_input_dev->name = "my_input_dev_test";__set_bit(EV_KEY,my_input_dev->evbit);__set_bit(EV_SYN,my_input_dev->evbit);__set_bit(KEY_1,my_input_dev->keybit);ret = input_register_device(my_input_dev);if(ret < 0){printk("input_register_device is error\n");goto error;}test_timer.expires = jiffies_64 + msecs_to_jiffies(1000);add_timer(&test_timer);printk("my_input_dev_init ok\n");return 0;
error:printk("my_input_dev_init error\n");input_free_device(my_input_dev);return ret;
}static void my_input_dev_exit(void)
{//struct input_dev *my_input_dev;input_unregister_device(my_input_dev);del_timer(&test_timer);printk("my_input_dev_exit ok\n");}module_init(my_input_dev_init);
module_exit(my_input_dev_exit);
MODULE_LICENSE("GPL");

编译成ko
在这里插入图片描述
放到开发板上加载
在这里插入图片描述
cat /proc/bus/input/devices在这里插入图片描述

hexdump /dev/input/event11 查看上报的数据包
在这里插入图片描述

3、匹配规则和流程

input_register_deviceinput_attach_handler(dev, handler)input_match_device(handler, dev)//如果input_match_device返回id不为0,则调用connect函数handler->connect(handler, dev, id)

在这里插入图片描述
遍历链表,查找匹配的事件处理层input_handler
在这里插入图片描述
在这里插入图片描述
可以看到,有没有定义match函数都可以进行匹配
在这里插入图片描述
在这里插入图片描述
通用事件处理层input_handler
在这里插入图片描述
这里是可以和所有的input设备驱动进行匹配
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
先后注册dev和handler都可以进行匹配

input_register_handler(&evdev_handler)input_attach_handler(dev, handler)input_match_device(handler, dev)//如果input_match_device返回id不为0,则调用connect函数handler->connect(handler, dev, id)

在这里插入图片描述

在这里插入图片描述

4、多对多的匹配关系

在这里插入图片描述
在这里插入图片描述
可以看到有四个handler和我的dev进行匹配
在这里插入图片描述
那为什么只生成一个设备节点呢?因为只有evdev中的connec函数注册了字符设备
可以看下kbd的connect函数

grep "kbd" drivers/* -nwr

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5、上报数据格式分析

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

所以一个input_event数据包所占大小为8+2+2+4=24字节
在这里插入图片描述

tv_sec:e08f 667f 0000 0000 
tv_usec:c3ac 0000 0000 0000
type:0001 
code:0002 
value:0001 0000 

6、编写app获取type、code和value

#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include<linux/input.h>#define INPUT_DEV  "/dev/input/event11"
int main()
{struct input_event input_event;int ret;int fd = open(INPUT_DEV,O_RDWR);if(fd < 0){printf("open input_dev error\n");return -1;}while(1){ret = read(fd,&input_event,sizeof(struct input_event));if(ret < 0){printf("read input_dev error\n");return -2;}printf("input_event.type = %04x,input_event.code = %04x,input_event.value = %08x\n",\input_event.type,input_event.code,input_event.value);}return 0;
}

交叉编译app

/home/johan/share/rk3588/linux_sdk/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc app_test.c -o app_test

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

中医背诵笔记(黄帝内经、伤寒论等)

目录 黄帝内经上古天真论今人和古人之差异&#xff08;精神内守&#xff0c;病安从来&#xff1f;&#xff09;男女每个年龄阶段身体状态至人、圣人、贤人 宣明五气篇五脏所藏 与 五脏所主七情与情绪与气的关系 天干地支天干地支与脏腑经络的关系 伤寒论六种伤寒组合及对应的药…

一款轻量级的通信协议---MQTT (内含Linux环境搭建)

目录 MQTT MQTT的关键特点&#xff1a; 应用场景 Linux环境搭建&#xff1a; 1. 安装mosquitto 2. Linux下客户端进行通信 3. PC端和Linux下进行通信 安装MQTT. fx 4. MQTT.fx的使用 1. 点击连接 ​编辑 2. 连接成功 3. 订阅主题或者给别的主题发送消息 遇到的问…

(项目实战)聚合支付系统开发环境搭建-基于VMware17安装Centos7.9

1 开发环境介绍 dtpay聚合支付系统和ecard预付卡系统&#xff0c;服务端部署在Linux环境。后续的开发环境&#xff0c;生产环境都是基于Linux进行搭建&#xff0c;系统使用到的相关中间件(RocketMQ,Redis&#xff0c;Nginx等)&#xff0c;配置中心Nacos&#xff0c;数据库MySQ…

CSS实现动画

CSS实现动画主要有三种方式&#xff1a;transition&#xff0c;transform&#xff0c;和animation1。以下是一些详细的逻辑&#xff0c;实例和注意事项&#xff1a; Transition&#xff1a;transition可以为一个元素在不同状态之间切换的时候定义不同的过渡效果。例如&#xff…

OpenCV学习之cv2.getGaussianKernel函数

OpenCV学习之cv2.getGaussianKernel函数 一、简介 cv2.getGaussianKernel 是 OpenCV 中用于生成一维高斯核&#xff08;Gaussian Kernel&#xff09;的函数。 高斯核在图像处理中主要用于图像的平滑处理、模糊处理以及作为卷积核来进行各种图像操作。生成的高斯核可以用于卷…

Emp.dll文件丢失?理解Emp.dll重要性与处理常见问题

在繁多的动态链接库&#xff08;DLL&#xff09;文件中&#xff0c;emp.dll 可能不是最广为人知的&#xff0c;但在特定软件或环境中&#xff0c;它扮演着关键角色。本文旨在深入探讨 emp.dll 的功能、重要性以及面对常见问题时的解决策略。 什么是 emp.dll&#xff1f; Emp.d…

python 第6册 辅助excel 002 批量创建非空白的 Excel 文件

---用教授的方式学习 此案例主要通过使用 while 循环以及 openpyxl. load_workbook()方法和 Workbook 的 save()方法&#xff0c;从而实现在当前目录中根据已经存在的Excel 文件批量创建多个非空白的Excel 文件。当运行此案例的Python 代码&#xff08;A002.py 文件&#xff0…

Java面试题:解释函数式编程的概念,并讨论在Java中实现函数式编程的方法

函数式编程&#xff08;Functional Programming&#xff0c;FP&#xff09;是一种编程范式&#xff0c;它将计算视为数学函数的评估&#xff0c;避免使用可变状态和副作用。函数式编程的核心理念包括&#xff1a; 函数是第一类公民&#xff1a;函数可以作为参数传递给其他函数…

【STM32】在标准库中使用定时器

1.TIM简介 STM32F407系列控制器有2个高级控制定时器、10个通用定时器和2个基本定时器。通常情况下&#xff0c;先看定时器挂在哪个总线上APB1或者APB2&#xff0c;然后定时器时钟需要在此基础上乘以2。 2.标准库实现定时中断 #ifndef __BSP_TIMER_H #define __BSP_TIMER_H#if…

Java面试题:讨论Java 8中Lambda表达式的使用,以及它们如何简化代码

Java 8引入的Lambda表达式是对Java语言的一次重要扩展&#xff0c;极大地简化了代码的书写&#xff0c;提升了代码的可读性和可维护性。下面详细讨论Lambda表达式的使用以及它们如何简化代码。 Lambda表达式的使用 Lambda表达式主要用于替代匿名内部类&#xff0c;从而简化代…

2.1 大语言模型的训练过程 —— 《带你自学大语言模型》系列

《带你自学大语言模型》系列部分目录及计划&#xff0c;完整版目录见&#xff1a; 带你自学大语言模型系列 —— 前言 第一部分 走进大语言模型&#xff08;科普向&#xff09; 第一章 走进大语言模型1.1 从图灵机到GPT&#xff0c;人工智能经历了什么&#xff1f;1.2 如何让…

现代信号处理——Introduction

Introduction(引言)&#xff1a; 现代信号处理是研究生阶段要学习的课程之一&#xff0c;学习这门课程的起源来自我的本科期间的数字信号处理的老师&#xff0c;课堂上她格外强调掌握一门技术和自发学习的重要性。因此在数字信号处理的第一轮学习告一段落后&#xff0c;我并未…

【力扣 389】找不同 C++题解(字符串+排序)

给定两个字符串 s 和 t &#xff0c;它们只包含小写字母。 字符串 t 由字符串 s 随机重排&#xff0c;然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。 示例 1&#xff1a; 输入&#xff1a;s “abcd”, t “abcde” 输出&#xff1a;“e” 解释&#xff1a;‘…

【C++多线程】std::condition_variable到底是什么

2024年6月29日&#xff0c;周日下午 std::condition_variable 是C11标准库中用于线程同步的一个设施&#xff0c;它通常与 std::unique_lock 或 std::mutex 结合使用&#xff0c;允许一个线程在某些条件成立之前挂起&#xff08;等待&#xff09;&#xff0c;而另一个线程可以通…

基于MDEV的PCI设备虚拟化DEMO实现

利用周末时间做了一个MDEV虚拟化PCI设备的小试验&#xff0c;简单记录一下&#xff1a; DEMO架构&#xff0c;此图参考了内核文档&#xff1a;Documentation/driver-api/vfio-mediated-device.rst host kernel watchdog pci driver: #include <linux/init.h> #include …

【网络架构】keepalive

目录 一、keepalive基础 1.1 作用 1.2 原理 1.3 功能 二、keepalive安装 2.1 yum安装 2.2 编译安装 三、配置文件 3.1 keepalived相关文件 3.2 主配置的组成 3.2.1 全局配置 3.2.2 配置虚拟路由器 四、实际操作 4.1 lvskeepalived高可用群集 4.2 keepalivedngi…

Transformer 模型的详细配置---归一化、位置、激活函数和注意力机制

文章目录 归一化方法激活函数位置编码注意力机制归一化方法 大语言模型的预训练过程中经常会出现不稳定的问题。为了应对这一问题,深度学习方法通常会采用特定的归一化策略来加强神经网络训练过程的稳定性。原始的 Transformer 模型主要使用了层归一化方法(Layer Normalizati…

AI视界引擎 | ​基于 YOLOv8 和计算机视觉 CV 的实时识别系统!

本文来源公众号“AI视界引擎”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;​基于 YOLOv8 和计算机视觉 CV 的实时识别系统&#xff01; 技术进步和创新正在尽可能地推进作者的日常生活&#xff0c;但仍有很大一部分社会群体因为…

自研Eclipse插件的生成及安装和使用

说明&#xff1a; 本处是使用个人自研的Eclipse插件为例&#xff0c;创建了一个菜单式的插件组&#xff0c;插件组下&#xff0c;有一个生成右击Jakarta EE服务端点类后&#xff0c;生成端点对应的Restful客户端。有什么问题&#xff0c;欢迎大家交流&#xff01;&#xff01;…

cython 笔记

数据类型 # bool 类型 // bool_type_ptactice.pyx cdef bint a 123 # 非0 为 真 &#xff0c; 0 为假 cdef bint b -123 cdef bint c 0 py_a a # cdef 定义的内容没法直接在python中直接引用 py_b b py_c c// main.py import pyximport pyximport.install(language_le…