10.3 uinput

uinput 简介

uinput 是一个内核驱动,应用程序通过它可以在内核中模拟一个输入设备,其设备文件名是 /dev/uinput 或 /dev/input/uinput。

uinput 使用

使用 uinput 时遵循以下步骤:

  1. 通过 open 打开 uinput 设备
  2. 通过 ioctl 设置属性位图
  3. 通过 ioctl 设置事件类型位图和对应的事件码位图
  4. 通过 ioctl 设置ID和名称
  5. 通过 ioctl 创建输入设备
  6. 通过 write 上报输入事件
  7. 通过 close 关闭 uinput 设备

使能 uinput

在内核源码目录通过 make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- menuconfig 打开配置菜单,然后选择 User level driver support ,路径如下:

	-> Device Drivers-> Input device support-> Miscellaneous devices<M> User level driver support

如果选择编译成模块,其生成 ko 文件位于内核目录的 drivers/input/misc/中,文件名是uinput.ko

编程实践

在应用层中使用 uinput 在内核中模拟一个按键输入设备,程序流程如下:

  1. 打开 uinput 设备
  2. 设置属性位图、事件类型位图、事件码位图
  3. 设置ID和名称
  4. 创建输入设备
  5. 周期上报按键事件
    完整的代码如下所示:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <string.h>
#include <linux/uinput.h>void emit(int fd, int type, int code, int val)
{struct input_event ie;ie.type = type;ie.code = code;ie.value = val;//以下参数忽略ie.time.tv_sec = 0;ie.time.tv_usec = 0;//上报输入事件write(fd, &ie, sizeof(ie));
}int main(int argc, const char *argv[])
{int fd;struct uinput_setup usetup;const char *name = "/dev/uinput";if(argc >= 2)name = argv[1];//打开 uinput 设备fd = open(name, O_WRONLY);if(fd < 0){perror("open");return -1;}//设置属性位图if(ioctl(fd, UI_SET_PROPBIT, INPUT_PROP_BUTTONPAD) < 0){close(fd);perror("UI_SET_PROPBIT");return -1;}//设置事件类型位图和对应的事件码位图if(ioctl(fd, UI_SET_EVBIT, EV_KEY) < 0){close(fd);perror("UI_SET_EVBIT");return -1;}if(ioctl(fd, UI_SET_KEYBIT, KEY_0) < 0){close(fd);perror("UI_SET_KEYBIT");return -1;}//设置ID和名称memset(&usetup, 0, sizeof(usetup));usetup.id.bustype = BUS_USB;usetup.id.vendor = 0x1234;usetup.id.product = 0x5678;strcpy(usetup.name, "Example device");if(ioctl(fd, UI_DEV_SETUP, &usetup) < 0){close(fd);perror("UI_DEV_SETUP");return -1;}//创建输入设备if(ioctl(fd, UI_DEV_CREATE) < 0){close(fd);perror("UI_DEV_CREATE");return -1;}while(1){emit(fd, EV_KEY, KEY_0, 1);emit(fd, EV_SYN, SYN_REPORT, 0);usleep(500*1000);emit(fd, EV_KEY, KEY_0, 0);emit(fd, EV_SYN, SYN_REPORT, 0);usleep(500*1000);}//close(fd);
}

测试程序参考10.1Linux输入子系统介绍中的按键测试程序

上机测试

  1. 修改内核,使能 uinput
  2. 在这里下载代码,并进行编译,得到 uinput_app.out 和 test_app.out 两个可执行程序。
  3. 执行命令 ./uinput_app.out ,此时会通过 uinput 在内核空间创建一个按键输入设备。
    在这里插入图片描述
  4. 打开另一个终端,执行命令 ./test_app.out /dev/input/event0 ,运行测试程序,其中 /dev/input/event0 为按键输入设备的文件名,由系统自动生成,需要根据实际情况确定,此时测试程序会输出按键状态。
    在这里插入图片描述

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

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

相关文章

前端---html 的介绍

1. 网页效果图 --CSDN 2. html的定义 HTML 的全称为&#xff1a;HyperText Mark-up Language, 指的是超文本标记语言。 标记&#xff1a;就是标签, <标签名称> </标签名称>, 比如: <html></html>、<h1></h1> 等&#xff0c;标签大多数都是…

ubuntu22.04 下载路径

ftp下载路径 csdn下载 ubuntu22.04下载路径ubuntu-22.04-desktop-amd64.7z.001资源-CSDN文库 ubuntu22.04下载路径ubuntu-22.04-desktop-amd64.7z.002资源-CSDN文库 【免费】ubuntu-22.04-desktop-amd64.7z.003资源-CSDN文库 【免费】ubuntu-22.04-desktop-amd64.7z.004资源-…

【Spring】15 MessageSourceAware 接口

文章目录 1. 简介2. 功能3. 使用3.1 创建并实现接口3.2 配置 Bean 信息3.3 资源文件3.4 创建启动类3.5 启动 4. 应用场景总结 Spring 框架为开发者提供了丰富的扩展点&#xff0c;其中之一是 Bean 生命周期中的回调接口。本文将专注介绍一个与国际化相关的接口 MessageSourceAw…

Plantuml之时序图语法介绍(二十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

sqlite3 c++ VS编译生成静态库

官网 https://www.sqlite.org/download.html 下载sqlite-amalgamation和x86版本下载sqlite-dll-win32-x86、x64位版本sqlite-dll-win64-x64 解压 SQLITE-AMALGAMATION包含 shell.csqlite3.csqlite3.hsqlite3ext.hsqlite-dll-win32-x86包含 sqlite3.def sqlite3.dll建立一个空…

学生管理系统 数据库版结果 查询student表中所有学生信息

1.创建school_java数据库 CREATE DATABASE schooljava; USE schooljava; CREATE TABLE student ( id INT(11), name VARCHAR(25), tel INT(11), sex VARCHAR(6) ); DESC student; java代码 package Mysql; import java.sql.Connection; import java.sql.DriverManager; imp…

游戏服务器列表-增量处理

前言&#xff1a;服务器列表比较简单 固定表/开服表&#xff08;一般只会增加及合并),操作频率很低 一般由 服务器ID IP NAME 开服时间 状态表 服务器ID 状态 这章主要针对 开服表 优化处理 这工具主要是配置前面openresty&#xff08;登录服/微中台&#xff09;给运维人员 使用…

物联网协议之COAP简介及Java实践

目录 前言 一、COAP简介 1、关于COAP 2、COAP特点 3、基于COAP的NB-IoT接入流程 二、CoAP协议JAVA实践 1、californium介绍 2、Java集成 3、Maven 资源引入 4、定义Server端 5、Client调用 6、运行测试 总结 前言 今天平安夜&#xff0c;祝大家圣诞快乐&#xff0c…

【AI提示词艺术】第12期 摄影艺术构图处理和人像生成的技巧

摄影艺术构图 星空宇宙 关键词&#xff1a; 强烈的明暗对比,8k,精细的描述,相片纸,超高分辨率,无建筑的,大自然,星空&#xff0c;云朵&#xff0c;刺眼流星&#xff0c;群星&#xff0c;银河&#xff0c;仰视视角&#xff0c;广角镜头 以下是按照提示词类别整理的相关描述&a…

身为Java“搬砖”程序员,你掌握了多线程吗?

摘要&#xff1a;互联网的每一个角落&#xff0c;无论是大型电商平台的秒杀活动&#xff0c;社交平台的实时消息推送&#xff0c;还是在线视频平台的流量洪峰&#xff0c;背后都离不开多线程技术的支持。在数字化转型的过程中&#xff0c;高并发、高性能是衡量系统性能的核心指…

golang的jwt学习笔记

文章目录 初始化项目加密一步一步编写程序另一个参数--加密方式关于StandardClaims 解密解析出来的怎么用关于`MapClaims`上面使用结构体的全代码实战项目关于验证这个项目的前端初始化项目 自然第一步是暗转jwt-go的依赖啦 #go get github.com/golang-jwt/jwt/v5 go get githu…

HarmonyOS - 鸿蒙开发入门

文章目录 HarmonyOS核心资源特性&#xff1a;全场景终端HarmonyOS 版本 HarmonyOS 和 OpenHarmony教程资源开发环境开发工具 - DevEco开发语言 - ArkTS核心框架 - ArkUI 考证 HarmonyOS 开发交流秋秋群&#xff1a;23458659&#xff0c;V : ez-code&#xff0c;期待交流和合作 …