浅析linux下鼠标驱动的实现

Linux 下wifi 驱动开发(四)—— USB接口WiFi驱动浅析 前面学习了SDIO接口的WiFi驱动,现在我们来学习一下USB接口的WiFi驱动,二者的区别在于接口不同。而USB接口的设备驱动,我们前面也有学习,比如USB摄像头驱动、USB鼠标驱动,同样都符合LinuxUSB驱动结构:            USB设备驱动(字符设备、块设备、网络设备)                                                | 阅读详情

浅析linux下鼠标驱动的实现

【浅析linux下键盘设备工作和注册流程】

对于鼠标驱动和前面分析过的键盘驱动都是共用input模型,所以,对于事件上报和处理的方式都没有区别,只是mouse鼠标驱动当上报完dx,dy,left,middle,right之后,需要调用input_sync(),将前面上报的仅仅填充在缓冲区中的数据,通过mousedev_notify_readers()发送给open了的挂接在mousedev->client_list链表上等待获取鼠标信息的client门,鼠标设备和键盘设备类似都是在/dev/input/目录下创建了一个char类型的设备节点,由应用程序使用read或者poll来阻塞调用,对于键盘设备为/dev/input/event0,...,/dev/input/eventx,对于鼠标设备为/dev/input/mouse0,...,/dev/input/mousex,可以使用sudo cat /dev/input/event0来从终端上截获显示按键的信息,使用sudo cat /dev/input/mouse0来捕捉鼠标的信息.
  让我们来看看驱动源码【gliethttp.Leith】:
============drivers/input/mouse/amimouse.c============
    input_report_rel(amimouse_dev, REL_X, dx);
    input_report_rel(amimouse_dev, REL_Y, dy);

    input_report_key(amimouse_dev, BTN_LEFT, ciaa.pra & 0x40);
    input_report_key(amimouse_dev, BTN_MIDDLE, potgor & 0x0100);
    input_report_key(amimouse_dev, BTN_RIGHT, potgor & 0x0400);

    input_sync(amimouse_dev);//拷贝到open了的每个client的client->packets[16]环形缓冲区,每个应用程序在调用open时,mousedev_open都会调用kzalloc来申请一个独立的mousedev_client结构体,然后将该client挂接到mousedev->client_list链表,最后由mousedev_notify_readers向mousedev->client_list链表上挂接的每个client拷贝鼠标信息,最后wake_up唤醒read或poll.

============drivers/input/mousedev.c============
mousedev_read=>mousedev_packet=>如果dx,dy,dz同时都为0,说明鼠标停止了,那么client->ready = 0;
mousedev_event(dev, EV_SYN, SYN_REPORT, 0)=>mousedev_notify_readers=>如果dx,dy,dz有一个发生了移动或者鼠标按键上一次的按键不同,那么client->ready = 1;拷贝数据到mousedev->client_list链表上挂接的每个client的环形缓冲区,最后调用wake_up_interruptible(&mousedev->wait);唤醒因为read或者poll操作而被pending住的应用程序,比如xWindows系统或者MiniGUI系统.

mousedev_write=>mousedev_generate_response=>向client->ps2[6]缓冲区填充数据,有效数据的个数为client->bufsiz,之后执行如下赋值client->buffer = client->bufsiz;让client->buffer等于client->ps2[6]数据缓冲区中有效数据的个数.

static ssize_t mousedev_read(struct file *file, char __user *buffer,
             size_t count, loff_t *ppos)
{
    struct mousedev_client *client = file->private_data;
    struct mousedev *mousedev = client->mousedev;
    signed char data[sizeof(client->ps2)];
    int retval = 0;

    if (!client->ready && !client->buffer && mousedev->exist &&
     (file->f_flags & O_NONBLOCK))
        return -EAGAIN;

    retval = wait_event_interruptible(mousedev->wait,
            !mousedev->exist || client->ready || client->buffer);
    //等待条件满足或者信号发生,client->ready和client->buffer都可以在调用wake_up_interruptible(&mousedev->wait)之后,因为为真,而继续往下执行.
    if (retval)
        return retval;

    if (!mousedev->exist)
        return -ENODEV;

    spin_lock_irq(&client->packet_lock);//禁止中断

    if (!client->buffer && client->ready) {
        mousedev_packet(client, client->ps2);
        client->buffer = client->bufsiz;
    }

    if (count > client->buffer)
        count = client->buffer;

    memcpy(data, client->ps2 + client->bufsiz - client->buffer, count);
//所以从这里可以看出,client->bufsiz为ps2[]数组有效数据索引的上限值,
//client->buffer为ps2[]数组索引的下限值
    client->buffer -= count;//这样之后,再次执行read时,将会接续该buffer偏移位置继续读取.

    spin_unlock_irq(&client->packet_lock);//打开中断

    if (copy_to_user(buffer, data, count))//拷贝到用户空间
        return -EFAULT;

    return count;
}

对于mouse和keyboard来说poll方法是同时处理多项输入的相当高效的信息处理方法,应用程序可以使用select或者poll甚至epoll来等待多个事件的发生,比如同时等待mouse和key的发生,然后来统一处理【gliethttp.Leith】.
static unsigned int mousedev_poll(struct file *file, poll_table *wait)
{
    struct mousedev_client *client = file->private_data;
    struct mousedev *mousedev = client->mousedev;

    poll_wait(file, &mousedev->wait, wait);
    return ((client->ready || client->buffer) ? (POLLIN | POLLRDNORM) : 0) |
        (mousedev->exist ? 0 : (POLLHUP | POLLERR));
}
以上鼠标input事件和键盘的input时间基本一致,最后都是调用input_report_rel()、input_report_key()等,不同的是mousedev_event只有当调用input_sync才会发生向client的数据拷贝动作,而键盘的evdev_event的事件处理函数不管是什么信息都会执行如下遍历:
list_for_each_entry_rcu(client, &evdev->client_list, node)
    evdev_pass_event(client, &event);
来完成向每个client数据buffer拷贝数据【gliethttp.Leith】.

Linux驱动开发、17-输入子系统浅析 输入子系统 1、概念:内核对分散的,多种不同类别的输入设备进行统一处理的驱动程序。 2、输入子系统的好处: a) 统一物理形态各异的相似的输入设备的处理功能 b) 提供了用于分发输入报告给用户应用程序的简单事件(event)接口。驱动程序不必创建、管理/dev节点以及相关的访问方法,因此它能方便地被调用输入API以发送鼠标移动,键盘按键或者触摸事件给用户空间 c) 抽取了输入驱动程序的通 阅读详情

相关推荐

VSCode插件全攻略:5分钟搞定Mermaid流程图实时预览(含常见报错解决)

本文提供了一份详细的VSCode插件实战指南,帮助开发者快速配置Mermaid流程图实时预览环境。文章涵盖核心插件选择、高效工作流搭建,并重点解决了图表渲染失败、样式异常等常见报错问题,旨在提升技术文档的编写效率与可视化质量。

rust6ferris的博客 1487

linux屏幕触碰事件,触摸屏中鼠标事件的捕获和传递及触摸屏的移植

触摸屏中鼠标事件的捕获和传递及触摸屏的移植在Linux系统中,如果硬件设备的驱动程序被正确安装,那么在/dev路径下会有相应的设备文件,它们是对应硬件设备的驱动程序接口,应用程序可以打开这些设备文件,从中读取的数据就对应着硬件设备传回的信息。当鼠标被点击时,会产生中断并进入中断处理程序,在中断处理程序中,鼠标的动作会被翻译成相应的数据存在一个数据缓冲区中。用户打开设备文件后,就是从这个这个缓冲区读...

weixin_35658042的博客 1051

DINOv3实战指南:如何利用零样本视觉模型革新工业质检

本文详细介绍了如何利用DINOv3零样本视觉模型革新工业质检流程。通过无需标注数据的自监督学习技术,DINOv3能快速部署高精度检测系统,显著降低成本和提升效率。文章涵盖模型选型、数据准备、实时检测优化及典型行业解决方案,为工业质检提供革命性AI实践指南。

ansible6ops的博客 124

[Linux] C获取键盘,鼠标数据

当键盘有输入时,会有对应的一堆16进制输出。它其实对应着input_event结构体【24字节】。检测指令:cat /dev/input/event1 | hexdump。

wabil的专栏 2807

NC数据预处理避坑指南:从MATLAB读取到GeoTIFF导出,解决坐标翻转与值域异常

本文详细解析了NC数据预处理中的常见问题,包括MATLAB读取时的坐标翻转与GeoTIFF导出时的值域异常。通过实战案例,介绍了如何解决矩阵方向错乱、处理FillValue与scale_factor、精准移植空间参考等关键问题,帮助研究者高效完成气象数据的批量处理与GIS兼容性验证。

weixin_30788619的博客 654

手把手完整实现STM32+ESP8266+MQTT+阿里云服务器+手机APP应用——第一节—阿里云物联网平台配置+IoTStudio界面绘制+MQTT.fx模拟MQTT客户端与使用AT命令发布订阅消息

通过MQTT.fx模拟连接以及通过CH340串口连接ESP8266发送AT命令,实现阿里云物联网平台发送数据同时接收数据,IOT studio界面显示数据。具体来说:使用ESP8266(本系列使用了ESP8266-ESP01/01S以及正点原子的ATK-ESP8266) 来连接网络,获取设备数据发送到阿里云物联网平台并显示数据,通过IOT studio界面显示数据并发送命令控制设备。本系列使用的主控芯片是STM32F103系列,当然也可以使用其他系列单片机都可以实现,思路都是一样的。同时本系列有手机APP源

嵌入式阿齐Archie 5万+

Linux驱动学习(2) 从usb驱动到input子系统3

input输入子系统 (一)Input子系统简介 1.内核中有一些文档对input子系统有详细的描述 例如\linux-source-4.15.0\Documentation\input\input.rst : For the most usual configuration, with one USB mouse and one USB keyboard, you'll have to load...

xiaoshixiu的专栏 1001

PCL RANSAC拟合空间圆【2026最新版】

RANSAC三维点云空间3D圆拟合。博客长期更新,本文最新更新时间为:2026年4月13日。代码在PCL1.15.0中测试通过

点云侠的博客 7455

Linux USB鼠标驱动入门以及处理流程

Linux USB鼠标驱动入门以及处理流程

我的博客 845

AI: 机器学习的模型是如何训练的?(在试错中学习)

一句话理解机器学习一般训练过程 :通过有标签样本来调整(学习)并确定所有权重Weights和偏差Bias的理想值。 训练的目标:最小化损失函数 (损失函数下面马上会介绍) 机器学习算法在训练过程中,做的就是:检查多个样本并尝试找出可最大限度地减少损失的模型;目标就是将损失(Loss)最小化 在这里插入图片描述 上图就是一般模型训练的一般过程(试错过程),其中 模型: 将一个或多个特征作为输入,然后返回一个预测 (y’) 作为输出。为了进行简化,不妨考虑一种采用一个特征并返回一个预测的模型,如下公式

HowieXue 薛永浩的博客 3万+

couldn‘t upgrade db schema: insert into ACT_GE_PROPERTY values (‘common.sche[已解决]

启动整合了flowable的项目,初始化时报错。flowable没有自动建表, 原因 测试数据库版本是MySQL5.7。经过查询和尝试,原因是:在这个数据库里面,已经有一个数据库里面有activiti的这些表了,它检索的时候全库检索查到它了,所以flowable不去建表了,但是我们指定的这个schema里卖弄还是空的,所以它报了找不到表。解决方法:mysql的链接上加上参数如下,让本schema成为默认的schema。...

JavaPub 6014

linux系统弹出鼠标,driver: 浅析linux下鼠标驱动的实现

让我们来看看驱动源码:============drivers/input/mouse/amimouse.c============input_report_rel(amimouse_dev,REL_X,dx);input_report_rel(amimouse_dev,REL_Y,dy);input_report_key(amimouse_dev,BTN_LEFT,ciaa.pra&0x4...

weixin_34757706的博客 512

大厂面试:字节跳动大数据面试题及参考答案(10万字长文及多张原理图持续更新)

在 Spark 中,宽窄依赖是用来描述 RDD(弹性分布式数据集)之间的依赖关系的概念。窄依赖是指父 RDD 的每个分区最多被一个子 RDD 的分区使用,即子 RDD 的分区可以通过确定的规则从父 RDD 的分区计算得到,并且不需要跨节点进行数据传输。窄依赖通常可以在一个节点上进行计算,不需要进行数据的 shuffle 操作,因此性能较高。宽依赖是指父 RDD 的一个分区可能被多个子 RDD 的分区使用,即子 RDD 的分区需要通过跨节点的数据 shuffle 操作从父 RDD 的多个分区获取数据。

大模型大数据攻城狮的专栏 1651

linux输入子系统鼠标驱动分析

参考: 《linux输入子系统(7)--mouse_handler的实现》 https://blog.youkuaiyun.com/yuanlulu/article/details/6132227 《浅析linux中鼠标数据读取》 https://www.cnblogs.com/gylei/archive/2013/06/09/31293...

H265技术专栏 418

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

浅析linux下键盘设备工作和注册流程

浅析linux下键盘设备工作和注册流程 【浅析linux下鼠标驱动的实现】  input_init()=> => class_register(&input_class);注册input类 input_proc_init();创建proc下的目录和文件 register_chrdev(INPUT_MAJOR, "input", &input_fops);注册驱动程序到cdev_

xingmeng0518的专栏 1157

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

linux鼠标怎么取出来,浅析linux中鼠标数据读取

#include #include #include #include #include // 以下代码源自// [需要在文本控制台下运行,才能获取到数据,在ubuntu 8.10 GNOME界面只能收到1个字节数据0xfa][luther.gliethttp]// libminigui-1.6.10/src/ial/native/native.c// InitIAL==>__mg_cur_...

weixin_29157493的博客 899

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

linux如何使用鼠标数据的,浅析linux中鼠标数据读取

001#include 002#include 003#include 004#include 005#include 006// 以下代码源自007// [需要在文本控制台下运行,才能获取到数据,在ubuntu 8.10 GNOME界面只能收到1个字节数据0xfa][luther.gliethttp]008// libminigui-1.6.10/src/ial/native/native.c0...

weixin_29669143的博客 511

linux usb wifi 驱动开发,linux 下wifi 驱动开发 usb接口wifi驱动浅析.docx

linux 下wifi 驱动开发 usb接口wifi驱动浅析.docx LINUX下WIFI驱动开发(四)USB接口WIFI驱动浅析前面学习了SDIO接口的WIFI驱动,现在我们来学习一下USB接口的WIFI驱动,二者的区别在于接口不同。而USB接口的设备驱动,我们前面也有学习,比如USB摄像头驱动、USB鼠标驱动,同样都符合LINUXUSB驱动结构USB设备驱动(字符设备、块设备、网络设备)|U...

weixin_36145673的博客 411

linux看鼠标设备描述符,浅析linux下usb鼠标和usb键盘usbhid驱动hid_parse_report报告描述符...

浅析linux下usb鼠标和usb键盘usbhid驱动hid_parse_report报告描述符解析hid_probe==>usb_hid_configure==*>hid = hid_parse_report(rdesc, n)/** Parse a report description into a hid_device structure. Reports are* enumer...

weixin_36382534的博客 730

浅析linux中鼠标数据读取

浅析linux中鼠标数据读取 luther@gliethttp:~$ ll /dev/input/mice crw-rw—- 1 root root 13, 63 2009-07-09 15:54 /dev/input/mice 我们就是去读/dev/input/mice设备节点,源码如下:#include <stdio.h> #include <errno.h> #include <fcnt

pk_20140716的专栏 2127

浅析Linux从API调用到底层驱动的过程

转自:https://blog.youkuaiyun.com/u014294166/article/details/52155913   一、结构流程图 本篇只是嵌入式Linux的开篇,仅仅通过如下结构来简单说说调用流程。  分析:应用层调用open()函数打开鼠标文件时的调用过程。  当用户通过API中的open()函数试图去打开一个鼠标文件时,open()函数会有一个返回值,这个返回值即为文件描述...

zzwdkxx的专栏 4592

浅析linux下usb鼠标和usb键盘usbhid驱动hid_parse_report报告描述符解析

浅析linux下usb鼠标和usb键盘usbhid驱动hid_parse_report报告描述符解析 hid_probe ==>usb_hid_configure ==*>hid = hid_parse_report(rdesc, n) /*  * Parse a report description into a hid_device structure. Reports ar

sunshine 3525
上一篇: Linux设备驱动之HID驱动
下一篇: 浅析linux下键盘设备工作和注册流程
willand1981
博客等级 码龄18年 136粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值