输入子系统开发实战:键盘鼠标触摸屏

Linux下输入子系统上报触摸屏坐标 在 Linux 中,输入子系统是由输入子系统设备驱动层、输入子系统核心层(Input Core)和输入子系统事件处理层(Event Handler)组成。 阅读详情

一、顶级架构一句话总结

input_dev(设备) → Input核心层 → input_handler(事件处理) → 用户空间(/dev/input/eventX)

输入子系统统一管理键盘、鼠标、触摸屏、游戏手柄等输入设备。


二、输入子系统架构

架构层次

┌─────────────────────────────────────────────────────────┐
│                 输入子系统架构                           │
├─────────────────────────────────────────────────────────┤
│                                                         │
│   用户空间    /dev/input/eventX, evtest, libinput       │
│       ↓                                                 │
│   事件处理    input_handler (evdev, keyboard, mousedev) │
│       ↓                                                 │
│   Input核心   input.c (统一抽象层)                      │
│       ↓                                                 │
│   设备驱动    input_dev (按键、触摸屏、鼠标驱动)        │
│       ↓                                                 │
│   硬件层      GPIO、I2C、SPI设备                        │
│                                                         │
└─────────────────────────────────────────────────────────┘

核心数据结构

// 输入设备
struct input_dev {
    const char *name;
    const char *phys;
    const char *uniq;
    struct input_id id;

    unsigned long evbit[BITS_TO_LONGS(EV_CNT)];    // 支持的事件类型
    unsigned long keybit[BITS_TO_LONGS(KEY_CNT)];  // 支持的按键
    unsigned long relbit[BITS_TO_LONGS(REL_CNT)];  // 支持的相对坐标
    unsigned long absbit[BITS_TO_LONGS(ABS_CNT)];  // 支持的绝对坐标

    unsigned int keycodemax;
    unsigned int keycodesize;
    void *keycode;

    struct ff_device *ff;  // 力反馈

    unsigned int repeat_key;
    struct timer_list timer;

    int sync;

    struct device dev;
    struct list_head h_list;
    struct list_head node;
};

// 输入事件
struct input_event {
    struct timeval time;
    __u16 type;   // 事件类型
    __u16 code;   // 事件代码
    __s32 value;  // 事件值
};

事件类型

#define EV_SYN          0x00  // 同步事件
#define EV_KEY          0x01  // 按键事件
#define EV_REL          0x02  // 相对坐标
#define EV_ABS          0x03  // 绝对坐标
#define EV_MSC          0x04  // 杂项事件
#define EV_SW           0x05  // 开关事件
#define EV_LED          0x11  // LED事件
#define EV_SND          0x12  // 声音事件
#define EV_REP          0x14  // 重复事件
#define EV_FF           0x15  // 力反馈
#define EV_PWR          0x16  // 电源事件
#define EV_FF_STATUS    0x17  // 力反馈状态

三、输入设备驱动开发

API函数

#include <linux/input.h>

// 分配输入设备
struct input_dev *input_allocate_device(void);
struct input_dev *devm_input_allocate_device(struct device *dev);

// 释放输入设备
void input_free_device(struct input_dev *dev);

// 注册/注销
int input_register_device(struct input_dev *dev);
void input_unregister_device(struct input_dev *dev);

// 设置能力
void input_set_capability(struct input_dev *dev, unsigned int type, unsigned int code);
void input_set_abs_params(struct input_dev *dev, unsigned int axis, int min, int max, int fuzz, int flat);

// 上报事件
void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value);
void input_report_key(struct input_dev *dev, unsigned int code, int value);
void input_report_rel(struct input_dev *dev, unsigned int code, int value);
void input_report_abs(struct input_dev *dev, unsigned int code, int value);
void input_sync(struct input_dev *dev);

按键驱动示例

#include <linux/module.h>
#include <linux/input.h>
#include <linux/gpio.h>
#include <linux/gpio/consumer.h>
#include <linux/interrupt.h>
#include <linux/platform_device.h>

struct button_data {
    struct input_dev *input;
    struct gpio_desc *gpio;
    int irq;
};

static irqreturn_t button_irq_handler(int irq, void *dev_id)
{
    struct button_data *data = dev_id;
    int state;

    // 读取GPIO状态
    state = gpiod_get_value(data->gpio);

    // 上报按键事件
    input_report_key(data->input, KEY_ENTER, !state);
    input_sync(data->input);

    return IRQ_HANDLED;
}

static int button_probe(struct platform_device *pdev)
{
    struct button_data *data;
    struct device *dev = &pdev->dev;
    int ret;

    data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
    if (!data)
        return -ENOMEM;

    // 获取GPIO
    data->gpio = devm_gpiod_get(dev, "button", GPIOD_IN);
    if (IS_ERR(data->gpio))
        return PTR_ERR(data->gpio);

    // 获取中断号
    data->irq = gpiod_to_irq(data->gpio);
    if (data->irq < 0)
        return data->irq;

    // 分配输入设备
    data->input = devm_input_allocate_device(dev);
    if (!data->input)
        return -ENOMEM;

    // 设置设备名称
    data->input->name = "my-button";
    data->input->id.bustype = BUS_HOST;

    // 设置支持的事件
    set_bit(EV_KEY, data->input->evbit);
    set_bit(KEY_ENTER, data->input->keybit);

    // 或使用input_set_capability
    input_set_capability(data->input, EV_KEY, KEY_ENTER);

    // 注册输入设备
    ret = input_register_device(data->input);
    if (ret)
        return ret;

    // 注册中断
    ret = devm_request_irq(dev, data->irq, button_irq_handler,
                           IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
                           "button_irq", data);
    if (ret)
        return ret;

    platform_set_drvdata(pdev, data);
    dev_info(dev, "Button input device registered\n");
    return 0;
}

static const struct of_device_id button_of_match[] = {
    { .compatible = "mycompany,button", },
    { }
};
MODULE_DEVICE_TABLE(of, button_of_match);

static struct platform_driver button_driver = {
    .probe = button_probe,
    .driver = {
        .name = "button_input",
        .of_match_table = button_of_match,
    },
};
module_platform_driver(button_driver);

MODULE_LICENSE("GPL");

四、触摸屏驱动示例

#include <linux/module.h>
#include <linux/input.h>
#include <linux/i2c.h>
#include <linux/interrupt.h>
#include <linux/gpio/consumer.h>

struct touchscreen_data {
    struct i2c_client *client;
    struct input_dev *input;
    struct gpio_desc *irq_gpio;
    int max_x;
    int max_y;
};

static irqreturn_t touchscreen_irq_handler(int irq, void *dev_id)
{
    struct touchscreen_data *data = dev_id;
    u8 buf[8];
    int x, y, pressed;

    // 读取触摸数据(假设I2C协议)
    i2c_smbus_read_i2c_block_data(data->client, 0x00, 8, buf);

    x = (buf[0] << 8) | buf[1];
    y = (buf[2] << 8) | buf[3];
    pressed = buf[4] & 0x01;

    // 上报触摸事件
    if (pressed) {
        input_report_key(data->input, BTN_TOUCH, 1);
        input_report_abs(data->input, ABS_X, x);
        input_report_abs(data->input, ABS_Y, y);
        input_report_abs(data->input, ABS_PRESSURE, 255);
    } else {
        input_report_key(data->input, BTN_TOUCH, 0);
        input_report_abs(data->input, ABS_PRESSURE, 0);
    }
    input_sync(data->input);

    return IRQ_HANDLED;
}

static int touchscreen_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
    struct touchscreen_data *data;
    struct device *dev = &client->dev;
    int ret;

    data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
    if (!data)
        return -ENOMEM;

    data->client = client;

    // 从设备树获取分辨率
    of_property_read_u32(dev->of_node, "touchscreen-size-x", &data->max_x);
    of_property_read_u32(dev->of_node, "touchscreen-size-y", &data->max_y);

    // 分配输入设备
    data->input = devm_input_allocate_device(dev);
    if (!data->input)
        return -ENOMEM;

    data->input->name = "my-touchscreen";
    data->input->id.bustype = BUS_I2C;

    // 设置支持的事件类型
    set_bit(EV_KEY, data->input->evbit);
    set_bit(EV_ABS, data->input->evbit);

    // 设置触摸按键
    input_set_capability(data->input, EV_KEY, BTN_TOUCH);

    // 设置绝对坐标参数
    input_set_abs_params(data->input, ABS_X, 0, data->max_x, 0, 0);
    input_set_abs_params(data->input, ABS_Y, 0, data->max_y, 0, 0);
    input_set_abs_params(data->input, ABS_PRESSURE, 0, 255, 0, 0);

    // 设置多点触摸(可选)
    set_bit(INPUT_PROP_DIRECT, data->input->propbit);

    // 注册输入设备
    ret = input_register_device(data->input);
    if (ret)
        return ret;

    // 注册中断
    ret = devm_request_threaded_irq(dev, client->irq, NULL,
                                     touchscreen_irq_handler,
                                     IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
                                     "touchscreen_irq", data);
    if (ret)
        return ret;

    i2c_set_clientdata(client, data);
    dev_info(dev, "Touchscreen registered\n");
    return 0;
}

static const struct of_device_id touchscreen_of_match[] = {
    { .compatible = "mycompany,touchscreen", },
    { }
};
MODULE_DEVICE_TABLE(of, touchscreen_of_match);

static struct i2c_driver touchscreen_driver = {
    .probe = touchscreen_probe,
    .driver = {
        .name = "touchscreen",
        .of_match_table = touchscreen_of_match,
    },
};
module_i2c_driver(touchscreen_driver);

MODULE_LICENSE("GPL");

五、鼠标驱动示例

static int mouse_probe(struct platform_device *pdev)
{
    struct input_dev *input;

    input = devm_input_allocate_device(&pdev->dev);
    if (!input)
        return -ENOMEM;

    input->name = "my-mouse";
    input->id.bustype = BUS_USB;

    // 设置支持的事件
    set_bit(EV_KEY, input->evbit);
    set_bit(EV_REL, input->evbit);

    // 设置按键
    set_bit(BTN_LEFT, input->keybit);
    set_bit(BTN_RIGHT, input->keybit);
    set_bit(BTN_MIDDLE, input->keybit);

    // 设置相对坐标
    set_bit(REL_X, input->relbit);
    set_bit(REL_Y, input->relbit);
    set_bit(REL_WHEEL, input->relbit);

    return input_register_device(input);
}

// 上报鼠标移动
void mouse_report_move(struct input_dev *input, int dx, int dy)
{
    input_report_rel(input, REL_X, dx);
    input_report_rel(input, REL_Y, dy);
    input_sync(input);
}

// 上报鼠标按键
void mouse_report_button(struct input_dev *input, int button, int pressed)
{
    input_report_key(input, button, pressed);
    input_sync(input);
}

// 上报滚轮
void mouse_report_wheel(struct input_dev *input, int delta)
{
    input_report_rel(input, REL_WHEEL, delta);
    input_sync(input);
}

六、用户空间测试

evtest工具

# 安装工具
apt install evtest

# 查看输入设备
ls /dev/input/
cat /proc/bus/input/devices

# 测试输入设备
evtest /dev/input/event0

# 实时监控
evtest --grab /dev/input/event0

读取输入事件

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h>

int main()
{
    int fd;
    struct input_event ev;

    fd = open("/dev/input/event0", O_RDONLY);
    if (fd < 0) {
        perror("open");
        return -1;
    }

    while (read(fd, &ev, sizeof(ev)) == sizeof(ev)) {
        printf("Type: %d, Code: %d, Value: %d\n",
               ev.type, ev.code, ev.value);
    }

    close(fd);
    return 0;
}

七、调试技巧

查看设备信息

# 查看所有输入设备
cat /proc/bus/input/devices

# 查看设备能力
ls /sys/class/input/input0/capabilities/

# 查看设备属性
cat /sys/class/input/input0/name
cat /sys/class/input/input0/phys

内核调试

# 查看输入子系统日志
dmesg | grep -i input

# 动态调试
echo "module input +p" > /sys/kernel/debug/dynamic_debug/control

八、终极总结

输入子系统 = 统一的输入设备管理框架

  • 核心结构:input_dev、input_event
  • 事件类型:EV_KEY(按键)、EV_REL(相对)、EV_ABS(绝对)
  • 上报流程:input_report_* → input_sync
  • 用户接口:/dev/input/eventX

掌握输入子系统,就能开发各类输入设备驱动!

基于GEC6818的触摸屏 在Linux的内核中,对输入设备的使用,实际上运用了3大块来管理,他们分别是所谓的输入设备驱动层、输入子系统核心层,以及事件触发层。他们各自的工作分别是: 输入设备驱动层: 每一种设备都有其特定的驱动程序,他们被妥当地装载到操作系统的设备模型框架内,封装硬件所提供的功能,向上提供规定的接口。 核心层: 此处将收集由设备驱动层发来的数据,整合之后触发某一事件。 事件触发层: 这一层是我们需要关注的,我们可以通过在用户空间读取相应设备的节点文件来获知某设备的某一个动作。 阅读详情

相关推荐

linux 处理键盘 鼠标事件

Linux下鼠标和键盘的模拟控制,也就是为手势和语音控制鼠标和键盘部分服务的。        有关于本系统构建的文章结构都会由三个部分来组织,一是该功能模块的介绍和在Linux下简单应用程序的实现;二是将该功能模块整合到交互系统(先以TLD为地基)中去;三是分析目前存在的问题与未来的解决构思。 一、input子系统和模拟程序编写:         Linux 输入子系统是 Lin

shijian408的专栏 9738

Linux系统struct input_event结构体分类型(鼠标、键盘、触屏)详解与例子

Linux系统是通过输入子系统来管理输入设备(如鼠标、键盘、触摸屏、游戏摇杆)的。配置了内核支持输入设备且有对应驱动的情况下,当系统接入输入设备,会在/dev目录或/dev/input下生成对应设备文件,下图是鼠标、键盘在不同情况下/dev/input的设备文件。每当输入设备有事件产生时,内核就会将事件上报到设备文件,事件数据以为单位存入设备文件,所以读取这些输入设备文件时使用结构体,这个结构体定义在input-event-codes.h。

wkd_007的博客 1万+

粤嵌6818开发板触摸屏应用

嵌入式Linux开发粤语嵌6818开发板之触摸屏的使用教程

m0_64148419的博客 4878

linux环境下模拟鼠标键盘驱动

在 Linux 环境下编写模拟键盘和鼠标驱动的指南在虚拟化环境(如 KVM)中,将硬件功能转化为软件功能,并通过 API 调用进行控制,可以实现对键盘和鼠标的模拟驱动。本文将详细介绍模拟键盘和鼠标驱动的原理、实现方法、示意代码,以及在 KVM 上运行的思路和工作流。目录概述模拟键盘和鼠标驱动的目标是将硬件输入设备的功能转化为软件接口,使得应用程序可以通过 API 调用来模拟输入操作。

远方雪的专栏 1674

RK3568平台开发系列讲解(输入系统篇)什么是输入子系统

输入子系统模型,也是字符设备驱动模型的封装(如:杂项设备驱动模型)。但是比较适合与设计输入类型设备的设备驱动。 linux内核支持的输入设备类型:

内核笔记 5397

RK3568笔记十五:触摸屏测试

若该文为原创文章,转载请注明原文出处。使用正点原子的ATK-RK3568板子,一直在测试屏幕和视频,突然想到触摸屏测试,一直没有用过,原子给的demo跑的是QT系统,触摸功能是正常的,测试一下,并记录。

2286

嵌入式Linux入门-输入系统应用编程(鼠标、键盘、触摸屏)

在Linux系统下,我们如何编写程序获得鼠标的位置?键盘的哪一个按键被按下了?触摸屏的哪个位置被触摸了?学过单片机的都知道,这些本质上都是一些信号,由驱动程序解析,但我们讲的是应用编程,也就是说从驱动程序中直接获取我们需要的。那么必然就需要一套规范的接口,不然每个人写的都不一样,做个应用,还得阅读驱动源码,就离谱了。

闪耀大叔的博客 3483

Linux——Linux驱动之使用输入子系统设计按键驱动实战(输入子系统基本概念、代码获取上报信息、相关函数解析)

我们上一次的博文直接使用中断设计的按键驱动程序,实际上,我们使用的按键也是属于一种输入设备,像鼠标、键盘等都是,那么你应该意识到Linux系统对于某一类设备肯定会搞出一套标准的框架出来,那么本节博文我们学习下输入子系统的概念,并且使用输入子系统设计一个按键驱动。

数字世界 万物互联 4024

Linux输入子系统实战:触摸屏事件捕获与解析

本文详细介绍了Linux输入子系统在触摸屏事件捕获与解析中的实战应用。通过识别设备文件、读取input_event结构体,解析单点与多点触控数据,并探讨坐标校准技巧和性能优化方法,帮助开发者高效处理触摸屏输入,提升嵌入式设备的交互体验。

a1b2c3d的博客 600

TPAMI 2025新作LRFormer复现笔记:我的Windows 11 + RTX 4090配置全流程

本文详细记录了在Windows 11系统下使用RTX 4090显卡复现TPAMI 2025顶会论文LRTransformer的完整流程,包括硬件配置、系统优化、Python环境搭建及模型训练中的常见问题解决方案。特别针对Windows平台特有的路径管理、CUDA版本冲突和显存优化等关键技术细节提供了实用指南,帮助开发者高效完成环境搭建和模型训练。

weixin_29094301的博客 412

三相电机控制入门:端电压、相电压、线电压到底怎么测?(附实测波形对比)

本文为三相电机控制初学者提供了端电压、相电压和线电压的完整测量指南。通过厘清三者的物理定义与测量方法,详细讲解了如何搭建虚拟星形点电路,并对比分析了方波、SPWM和SVPWM三种主流控制模式下关键电压波形的核心特征与差异,帮助工程师掌握正确的示波器测量与波形解读技巧。

oauth7security的博客 650

瑞芯微RK3568开发板——触摸屏

摘要:本文详细介绍了RK3568开发板触摸屏的工作原理及编程实现。系统采用Linux输入子系统三层架构处理触摸数据,最终封装为input_event结构体。触摸屏设备文件为/dev/input/event6,其1024×600分辨率与LCD屏完全匹配,确保坐标精准对应。文章提供了完整的代码示例,展示了如何读取触摸坐标、检测按压/松开状态等操作,为嵌入式触摸屏开发提供了实用参考。

weixin_74767968的博客 945

Quartus ||———基于Verilog HDL的数字秒表设计实验

Quartus ||———基于Verilog HDL的数字秒表设计实验一、实验目的二、实验步骤(一)新建工程(二)添加设计文件(三)综合分析与功能仿真1、综合分析2、功能仿真 一、实验目的 用Verilog HDL设计一个数字跑表,所需引脚和功能如下: 二、实验步骤 (一)新建工程 在创建好工程名称后,选定芯片类型 (二)添加设计文件 新建Verilog文件,键入代码如下 module n_clk_top( input clk, input rese

TBMmagic的博客 5525

输入子系统

我们上报的数据按照具体的格式上报给输入子系统的核心层,我们的应用就可以通过设备节点来获得按照具体格式上报来的数据了。封装数据是输入子系统核心层来帮我们完成的,我们只需要按照指定的类型和这个类型对应的数据来上报给输入子系统的核心层即可。输入子系统是Linux专门作的一套框架来处理输入事件的,像鼠标,键盘,触摸屏这些都是输入设备,但是这些输入设备的类型又都不一样,因此为了统一这些设备驱动标准应运而生。在/dev/input下面则是输入设备节点,这些节点对应的则是我们当前系统的输入设备,可以通过。

qq_45132517的博客 1825

Ansys Lumerical双层扭曲液晶偏振光栅仿真:宽角度衍射效率优化

Ansys Lumerical双层扭曲液晶偏振光栅仿真研究 摘要 本文采用Ansys Lumerical软件平台,对双层扭曲液晶偏振光栅的宽角度衍射特性进行系统仿真研究。针对6μm周期的液晶光栅结构,以1050nm、1064nm和1550nm三个近红外波段为研究对象,在±40°入射角范围内优化平均衍射效率。研究基于液晶材料的双折射特性(Δn=0.135),通过构建两层扭曲方向相反的液晶层结构,扫描0-90°单层扭曲角度和不同厚度参数,利用RCWA求解器进行严格耦合波分析~~~~~~~

huanghm88的专栏 164

投稿前利用GPT-5.5给论文做一次深度校对,投稿命中率翻倍!

3)一致性:请对比摘要的结论与正文(如果我也提供了正文),确保完全一致。请严格检查结果部分,确保客观性:1)纯粹性检查:标出所有包含“为什么”(解释)或“这意味着什么”(暗示)的主观语句,这些应移至讨论部分。请你帮我评估讨论部分的深度:1)解释与对比:检查每一项主要结果是否都解释了原因,并引用了前人研究进行对比(一致或相悖)。我见过太多人把校对理解为检查错别字了,实际上,校对要看的远不止这个,像逻辑是否连贯、术语是否前后一致、图表有没有被正确引用等等的这些细节,往往决定了文章是秒被拒,还是能顺利进入外审。

智能AI让学术科研更容易 412

【Liux下6818开发板(ARM)】触摸屏

对于6818开发板来说,使用触摸屏可以实现更加直观、方便的交互操作,为嵌入式系统提供了更加友好的用户界面。通过Linux输入子系统的支持,开发人员可以轻松获取触摸屏的输入信息,并根据具体应用场景实现不同的交互功能。

qq_64928278的博客 3744

科研牛马千万不要错过!手把手教你用AI精准匹配真实参考文献,仅需一个专业应用+两个提示词指令

当然也可以借助生成式AI,如GPT-5.2、Gemini 3 Pro粘贴段落,输入设计好的提示词,让模型根据段落内容匹配参考文献,并正确引用到段落合适位置,再按规范格式输出参考文献列表。阅读我提供的【正文文本】,为其中的关键论点寻找真实的、权威的参考文献(优先来源于Nature, Science, IEEE, ACM, PubMed等),并插入引用。若在段落中已经引用好了参考文献,也有参考文献列表,担心引用位置不当或论点、论述逻辑与文献不够契合,则可以用以下结构化提示词,让AI辅助审查。

智能AI让学术科研更容易 1031

输入子系统了解,input_event结构体详解,触摸屏信息种类以及捕获信息,触摸屏生成事件流程总结,触摸屏使用例子以及单击触摸屏例子+双击退出例子

输入子系统了解,input_event结构体详解,触摸屏信息种类以及捕获信息,触摸屏生成事件流程总结,触摸屏使用例子以及单击触摸屏例子+双击退出例子

cyz322649的博客 2447

github创建账号第一步始终出错

github创建账号总结:第一次注册GitHub,填好用户名邮箱密码后进入下一步就卡在哪里,上面还提示Unable to verify your captcha response等,进入网址的解决办法以及下载其他的浏览器也无法解决,用手机浏览器抱着试一试的心态竟然成功了,分享给大家。手机下载谷歌浏览器,进入GitHub正常注册,能向下继续,邮箱验证完以后再用电脑登陆就ok啦

计算机毕业论文源码,学生个人网页制作html源码。贴近用户做网络推广和互联网优化。 4376

第七天 Labview进阶(7.3 Teststand简单使用)

TestStand是NI开发的自动化测试管理软件,支持多语言编程和硬件集成,广泛应用于电子产品和工业测试。安装时需注意版本选择,2022版支持离线安装。使用步骤包括:1)创建测试序列文件;2)插入测试动作并配置参数(如选择VI路径、设置变量);3)添加条件判断和延时控制;4)执行测试序列时具备流程控制功能,如失败步骤自动跳过后续测试。该软件能有效提升测试效率与准确性,通过可视化操作实现复杂测试流程管理。

weixin_38637405的博客 1728

输入子系统以及触摸屏

一.输入子系统: 1.1作用:将输入型设备的共性部分提取出来规范化,便于输入型设备的移植与硬件修改的再编写 1.2 输入模型:输入设备驱动 输入内核 输入事件驱动 后面二者内核已经写好,开发者只需要写好输入设备驱动 1.3 输入子系统设备驱动编写流程:以按键为例 初始化: (1) 分配input_dev结构体:input_dev *dev=input_allocate_device()...

qq_43706825的博客 487

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

linux下鼠标键盘网络通信,:Linux下鼠标和键盘的模拟控制(一)

交互式系统的构建(二) Linux下的鼠标和键盘的模拟控制本文将完成:Linux下的鼠标和键盘的模拟控制,即该服务的一部分鼠标键盘的手势和语音控制关于此内容系统结构的文章结构将分为三个部分,一个是功能模块的介绍和在Linux下的简单应用程序的实现;另一个是集成的功能。功能模块进入交互式系统(基于TLD);第三步是分析当前问题和未来解决方案一、输入子系统和模拟程序编写:Linux输入子系统是用于管理...

weixin_33402252的博客 817

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

linux嵌入式arm基础笔记3之触摸屏原理与输入子系统

==================== 输入子系统================= 触摸屏原理 从技术原理角度讲,触摸屏是一套透明的绝对定位系统,因此他必须具备三个特性: 第一是透明性能:透明材质的好坏会直接影响到触摸屏的视觉效果,主要体现在屏幕的反光性和清晰度。 第二是绝对坐标系统:我们传统的鼠标是一种相对的定位系统,定位只参照前一次的鼠标位置的坐标,而触摸屏需要选哪里就指哪里,这是一种绝对...

qasxc78563的博客 1079

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

触摸屏的使用

输入设备发生的输入都会包装成为一个"输入事件(描述事件的数据)(struct input_event)",把输入事件保存到对应的文件(键盘,鼠标,触摸屏)中。APP OS(linux) 驱动 Hardware。任何设备发生的输入,都会包装成对应的事件保存到发生输入的"设备文件"中。对于APP,所有的设备都是以文件的方式去操作的。都是输入设备,都归结到输入子系统。APP可以获取"输入事件"

qq_68915288的博客 981
上一篇: 内核定时器与延迟工作:时间管理的艺术
下一篇: 杂项设备与虚拟设备:简化驱动开发的神器
LinuxRos
博客等级 码龄5年 11粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值