14_input子系统my_touch_device,my_touch_handlerLinux内核模块

01_basicLinux内核模块_the kernel was built by:x86 64-linux-gnu-gcc-12(ub-CSDN博客文章浏览阅读678次,点赞3次,收藏3次。环境ID=ubuntuMakefilemodules:clean:basic.creturn 0;运行效果。_the kernel was built by:x86 64-linux-gnu-gcc-12(ubuntu 12.3.0-1ubuntu1~22.04https://blog.csdn.net/m0_37132481/article/details/136157384环境

root@T:/media/sf_D_DRIVE/kmodule/14_input_dev# cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.1 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.1 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
root@T:/media/sf_D_DRIVE/kmodule/14_input_dev#
 

 my_touch_device.c

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/input.h>
#include <linux/cdev.h>
#include <uapi/linux/major.h>#define TAG "HELLO# "static struct input_dev *my_input_touch;static int my_touch_device_init(void)
{int err;printk(TAG "%s called\n", __func__);/* input device */my_input_touch = input_allocate_device();set_bit(EV_KEY, my_input_touch->evbit);set_bit(KEY_Q, my_input_touch->keybit);my_input_touch->name = "don't care";/* for device match handler */my_input_touch->id.product = 666;err = input_register_device(my_input_touch);return 0;
}
static void my_touch_device_exit(void)
{printk(TAG "%s called\n", __func__);input_unregister_device(my_input_touch);
}module_init(my_touch_device_init);
module_exit(my_touch_device_exit);
MODULE_LICENSE("GPL");

 my_touch_handler.c

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/input.h>
#include <linux/cdev.h>
#include <uapi/linux/major.h>#define TAG "HELLO# "struct my_touch
{struct input_handle handle;struct device dev;struct cdev cdev;struct class *class;
};struct my_client
{char touchdata[10];struct my_touch *mytc;
};static void my_event(struct input_handle *handle, unsigned int type,unsigned int code, int value)
{printk(TAG "%s called, type,code,value=%u,%u,%d\n", __func__, type, code, value);
}static int my_cdev_open(struct inode *inode, struct file *file)
{struct my_touch *mytc = container_of(inode->i_cdev, struct my_touch, cdev);struct my_client *client = kzalloc(sizeof(struct my_client), GFP_KERNEL);printk(TAG "%s called\n", __func__);client->mytc = mytc;file->private_data = client;return 0;
}
static int my_cdev_release(struct inode *inode, struct file *file)
{struct my_client *client = file->private_data;printk(TAG "%s called\n", __func__);kfree(client);return 0;
}static ssize_t my_cdev_read(struct file *file, char __user *buf, size_t size, loff_t *ppos)
{struct my_client *client = file->private_data;// simulate hardware reportinput_report_key(client->mytc->handle.dev, KEY_Q, 1);input_report_key(client->mytc->handle.dev, KEY_Q, 0);input_sync(client->mytc->handle.dev);printk(TAG "%s called\n", __func__);return simple_read_from_buffer(buf, size, ppos, client->touchdata, sizeof(client->touchdata));
}
static ssize_t my_cdev_write(struct file *file, const char __user *buf, size_t size, loff_t *ppos)
{struct my_client *client = file->private_data;printk(TAG "%s called\n", __func__);/* in case of echo command */if(size > sizeof(client->touchdata)){return -EINVAL;}else{/* nothing to do */}return simple_write_to_buffer(client->touchdata, sizeof(client->touchdata), ppos, buf, size);
}
static const struct file_operations my_cdev_fops = {.owner          = THIS_MODULE,.open           = my_cdev_open,.release        = my_cdev_release,.read           = my_cdev_read,.write          = my_cdev_write,
};static int my_connect(struct input_handler *handler,struct input_dev *dev,const struct input_device_id *id)
{int err;int minor;struct my_touch *mytc;printk(TAG "%s called\n", __func__);mytc = kzalloc(sizeof(struct my_touch), GFP_KERNEL);mytc->handle.dev = input_get_device(dev);mytc->handle.handler = handler;mytc->handle.private = mytc;err = input_register_handle(&mytc->handle);err = input_open_device(&mytc->handle);minor = input_get_new_minor(0, 0, true);device_initialize(&mytc->dev);/* let udev create file /dev/input/mytouch%d */dev_set_name(&mytc->dev, "mytouch%d", minor);mytc->dev.devt = MKDEV(INPUT_MAJOR, minor);;mytc->dev.class = &input_class;cdev_init(&mytc->cdev, &my_cdev_fops);/* create file /sys/dev/char/13:MONOR */err = cdev_device_add(&mytc->cdev, &mytc->dev);return 0;
}
static void my_disconnect(struct input_handle *handle)
{struct my_touch *mytc = handle->private;printk(TAG "%s called\n", __func__);input_close_device(&mytc->handle);input_unregister_handle(&mytc->handle);cdev_device_del(&mytc->cdev, &mytc->dev);input_free_minor(MINOR(mytc->dev.devt));kfree(mytc);
}static const struct input_device_id my_ids[] = {{.flags = INPUT_DEVICE_ID_MATCH_PRODUCT,.product = 666,},{ },
};static struct input_handler my_handler = {.event =        my_event,.connect =      my_connect,.disconnect =   my_disconnect,.name =         "my_handler",.id_table =     my_ids,
};static int my_touch_handler_init(void)
{int err;printk(TAG "%s called\n", __func__);/* input handler */err = input_register_handler(&my_handler);return 0;
}
static void my_touch_handler_exit(void)
{printk(TAG "%s called\n", __func__);input_unregister_handler(&my_handler);
}module_init(my_touch_handler_init);
module_exit(my_touch_handler_exit);
MODULE_LICENSE("GPL");

效果

 

 

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

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

相关文章

贷款年利率迷局:年利率3.8%为何变成2.07%?

朋友们&#xff0c;聊聊贷款那点事儿&#xff0c;特别是那个让人又爱又恨的年利率&#xff0c;听起来简单&#xff0c;3.8%就是一年给银行3.8%的贷款总额当利息&#xff0c;对吧&#xff1f;但别急&#xff0c;这里头学问大着呢&#xff01;有时候&#xff0c;你发现标着3.8%的…

keil调试变量值被篡改问题

今天遇到一个代码中变量值被篡改的问题&#xff0c;某个数组的第一个值运行一段时间之后变成了0&#xff0c;如图&#xff1a; 看现象基本可以断定是内存越界导致的&#xff0c;但是要如果定位是哪里内存越界呢? keil提供了两个工具 1、set access breakpoint at(设置访问断点…

ES6标准---【八】【学习ES6看这一篇就够了!!!】

目录 前言 export命令 输出变量 输出函数/类 export中的as别名 export必须一一对应 export接口的响应性 注意 import命令 import命令的语法 import命令里的as别名 import的只读性 import命令具有提升性 import的一些约定 import的静态执行 import的唯一执行性 模…

基于SmartUpload组件实现文件上传功能的案例

SmartUpload组件简介 SmartUpload组件 专门用于实现文件上传及下载的免费组件SmartUpload组件特点 使用简单&#xff1a;编写少量代码&#xff0c;完成上传下载功能能够控制上传内容能够控制上传文件的大小、类型缺点&#xff1a;目前已停止更新服务 SmartUpload组件应用 单文…

【Java】多线程前置知识 初识Thread

多线程前置知识 & 初识Thread 冯诺依曼体系结构初步认识存储设备CPU指令 操作系统初识操作系统内核态和用户态 进程/任务进程是什么进程的管理进程的调度虚拟内存地址进程间的通信 线程线程的出现线程是什么线程可能出现的问题线程与进程的联系和区别 协程初识Thread类Thre…

Java lambda表达式的变量捕获

有人看到这个lambda表达式能够访问isQuit这个变量而且还是可以被修改的变量&#xff0c;就发出疑问了&#xff0c;之前不是说lambda不能不或变量吗&#xff1f; 1.规则 java的lambda表达式变量捕获规则只是针对于外部作用域的局部变量来说的&#xff01;&#xff01;&#xf…

Linux环境变量进程地址空间

目录 一、初步认识环境变量 1.1常见的环境变量 1.2环境变量的基本概念 二、命令行参数 2.1通过命令行参数获取环境变量 2.2本地变量和内建命令 2.3环境变量的获取 三、进程地址空间 3.1进程&#xff08;虚拟&#xff09;地址空间的引入 3.2进程地址空间的布局和理解 …

【机器学习】:深潜智能的底层逻辑、前沿探索与未来展望】

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 在科技的浩瀚星空中&#xff0c;机器学习犹如一颗璀璨的新星&#xff0c;以其独特的魅力和无限潜力&#xff0c;引领着我们向智能的深处探索。今天&#xff0c;我们将一同踏上这场深度之旅&#xff0c;不仅解析…

pdf图片怎么提取出来?这6个pdf图片提取工具全搞定,值得推荐!

在我们的日常办公和学习中&#xff0c;pdf文件成为了信息传递的重要载体。然而&#xff0c;有时我们在pdf文档中发现一些精彩的图片&#xff0c;想将其提取出来供个人使用或分享给他人。无论是为了更灵活的处理&#xff0c;还是为了发送特定的图像&#xff0c;提取pdf中的图片都…

国产新港海岸NCS8622Type-C/DP1.4 to HDMI2.0 Converter

NCS8622是一款高性能低功耗的Type-C/DP1.4至HDMI2.0转换器&#xff0c;设计用于将USB Type-C源或DP1.4源连接到HDMI2.0。
 NCS8622集成了符合DP1.4标准的接收器和符合HDMI2.0标准的发射器。 此外&#xff0c;CC控制器用于CC通信以实现DP替代模式。
 DP接收器集成了HDCP 1.…

gazebo 仿真阶段性问题汇总二

目录 写在前面的话遇到的问题问题一&#xff1a;启动了多个 robot_state_publisher解决办法 问题二&#xff1a;rviz 启动报错解决办法 问题三&#xff1a;rviz 中 wheel 一直指向 base_link解决方法 问题四&#xff1a;摄像头和opencv坐标系的问题解决方法 问题五&#xff1a;…

Submariner 部署全过程

Submariner 部署全过程 部署集群配置 broker 集群&#xff1a; pod-cidr&#xff1a;11.244.0.0/16 service-cidr 11.96.0.0/12 broker 172.100.0.109 node 172.100.0.108 集群 1&#xff08; pve3 &#xff09;&#xff1a; pod-cidr&#xff1a;10.244.0.0/16 service-…

微信支付开发-支付工厂JsApi产品代码

一、JSAPI支付产品、APP支付产品、小程序支付产品流程图 二、H5支付产品、Native支付产品 三、工厂父类抽象类代码开发 <?php /*** 微信父类抽象类* User: 龙哥三年风水* Date: 2024/9/19* Time: 11:33*/ namespace Payment\WechatPay; abstract class WechatPaymentHandl…

翻页时钟 2.0-自动置顶显示,点击小时切换显示标题栏不显示标题栏-供大家学习研究参考

更新内容 自动置顶显示点击小时切换显示标题栏&#xff0c;&#xff08;显示标题栏后可移动时钟位置&#xff0c;鼠标拖动边框调整时钟大小&#xff09;不显示标题栏时&#xff0c;透明部分光标可穿透修正一个显示bu 下载地址&#xff1a; https://download.csdn.net/download…

一站式项目管理系统如何实现全链条数字化管理?

在当今数字化高速发展的时代&#xff0c;项目申报领域也面临着管理方式的革新挑战。从传统的人工管理到如今追求高效、精准的数字化管理模式转变&#xff0c;是行业发展的必然趋势。如启服云项目管理系统之类的出现&#xff0c;为项目申报管理带来了新的思路。 立项阶段的数字化…

假期学习笔记总结--iOS 自动释放池

iOS 自动释放池 https://juejin.cn/post/6844904094503567368#heading-23 ARC和MRC 苹果在 iOS 5 中引入了ARC&#xff08;Automatic Reference Counting&#xff09;自动引用计数内存管理技术&#xff0c;通过LLVM编译器和Runtime协作来进行自动管理内存。LLVM编译器会在编…

怎么把图片压缩变小?把图片压缩变小的八种压缩方法介绍

怎么把图片压缩变小&#xff1f;在当今这个信息高度共享的时代&#xff0c;图片不仅仅是简单的视觉元素&#xff0c;它们承载着我们的记忆、故事和创意。无论是旅行的风景、家庭的聚会&#xff0c;还是工作中的项目展示&#xff0c;图片都在我们的生活中扮演着不可或缺的角色。…

文达通从创业板、北交所转战港股:净利润下滑,资产负债率124%

《港湾商业观察》施子夫 8月13日&#xff0c;青岛文达通科技股份有限公司&#xff08;以下简称&#xff0c;文达通&#xff09;递表港交所获受理&#xff0c;联席保荐机构为山证国际、浤博资本。 在选择递表港交所前&#xff0c;文达通曾于新三板挂牌上市并且还曾尝试谋求创业…

智谱清影 -CogVideoX-2b-部署与使用,带你揭秘生成6s视频的极致体验!

文章目录 1 效果展示2 CogVideoX 前世今生3 CogVideoX 部署实践流程3.1 创建丹摩实例3.2 配置环境和依赖3.3 模型与配置文件3.4 运行4 遇到问题 1 效果展示 A street artist, clad in a worn-out denim jacket and a colorful bandana, stands before a vast concrete wall in …

产品:直播送礼延迟这么大,你就不能快点吗

先赞后看&#xff0c;南哥助你Java进阶一大半 其实抖音的实时音视频技术RTC&#xff0c;是来源于火山引擎RTC的支持&#xff0c;抖音、火山引擎、巨量引擎都属于字节旗下不同的业务板块。 我是南哥&#xff0c;一个Java学习与进阶的领路人。 相信对你通关面试、拿下Offer进入心…