RK3568平台(USB篇)USB HID设备

news2024/10/7 12:24:45

一.USB HID设备简介

USB HID设备主要用于和计算机进行交互通信,典型的USB HID类设备包括USB键盘、USB鼠标、USB游戏手柄等等,这些都是日常生活中常见的设备。以USB接口的鼠标为例,打开计算机的“设备管理器”,可以在“鼠标和其他指针设备”中找到USBHID接口的鼠标,其名称一般为“HID-Compliantmouse”,如图9.1所示。双击该设备,在打开的“HID-Compliantmouse属性”对话框中查看设备类信息,如图9.2所示。这里显示了当前设备属于Mouse类,也就是鼠标类。

二.配置HID

在内核中,配置USB键盘、鼠标、触摸屏驱动有多种方式,我们采用其中一种即可。

(1) 通用HID驱动程序

如果要使用USB接口的keyboards(键盘)、mice(鼠标)、joysticks(摇杆)、graphic tablets(绘图板)等其他的HID设备,那么就需要配置USB HID Transport layer(USB人机接口设备传输层)。

USB HID transport layer此选项对应配置项就是CONFIG_USB_HID,也就是通用HID驱动程序。

Device Drivers --->
    HID support  --->
		[*] HID bus support
		     -*-  HID bus core support
			 <*>  Generic HID driver
     	     USB HID support  --->
		     	<*> USB HID transport layer
			 	[*] PID device support
	 		 	[*] /dev/hiddev raw HID device support

USB HID Transport Layer是USB协议栈中的一个组件,用于支持 HID类型的设备与计算机之间的通信。USB HID传输层负责解析来自HID设备的数据,并将其转换为适当的格式,以便应用程序可以理解和使用。

通用HID驱动程序在内核源码的/kernel-5.10/drivers/hid/usbhid目录下。

三.HID设备调试

lsubs:

插入usb hid设备后,新生成的pid vid 093a:2510。

ls /dev/hid*会发现新生成的hid设备的dev节点。

console:/ # ls /dev/hid*
/dev/hidraw0

ls /dev/input/event* 发现新生成/dev/input/event2。

cat /dev/input/event2会收到设备发送过来的数据。

在终端cat出现的是乱码,因为终端的数据格式不一样,没有解析好usb hid设备发过来的数据,但是可以看到乱码就说明有数据发送过来。

通过usbmon抓取usb hid设备数据包

在menuconfig中选取:

确认内核支持usbmon模块:

ls /sys/module/usbmon

这个我使用的是android13的GKI版本,选择后还是不支持usbmon,后续研究。

代码实现读取usbhid设备触摸框的版本号:

#define HID_DEV_PATH   "/dev/hidraw"
#define TOUCH_F_VID         (0x093a)
#define TOUCH_F_PID         (0x2510)

static IMW_U8 usb_version[64] = {0};

int nRet = -1;
int nIndex = 0;
int nCount = 0;
int nHidDevHandle = -1;
int ret = 0;
IMW_U8 ist[64]={0xa1,0x55,0xc1,0x01};

char devPath[HID_PATH_SIZE];
struct hidraw_devinfo info;

for(nIndex = 0; nIndex < HID_PATH_COUNT; nIndex++)
{
    memset(devPath,0x00,sizeof(devPath));
    memset(&info,0x00,sizeof(info));
    snprintf(devPath, sizeof(devPath), "%s%d", HID_DEV_PATH, nIndex);
    nHidDevHandle = open(devPath , O_RDWR);
    if(nHidDevHandle < 0)
    {
        close(nHidDevHandle);
        continue;
    }

    nRet = ioctl(nHidDevHandle, HIDIOCGRAWINFO , &info);
    if(nRet < 0)
    {
        close(nHidDevHandle);
        continue;
    }
    if(TOUCH_F_VID == info.vendor && TOUCH_F_PID == (info.product & 0xFFFF) && (nCount < 2))
    {
        if(usb_version[0] != 0x00){
            return -1;
        }

        if (nHidDevHandle > 0) {
            ret = write(nHidDevHandle,ist,64);
            if(ret > 0){
                IMW_U8 buf[64];
                nret = read(nHidDevHandle, buf, 64);
                if(nret > 0){
                    if(buf[0] == 0xa1 && buf[1] == 0x55 && buf[2] == 0xc1 && buf[3] == 0x01){
                        memcpy(usb_version,&buf[0],BUFF_MAX);
                    }
                }
            }
        }else{
            return -1;
        }
    }
}

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

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

相关文章

mac上使用finder时候,显示隐藏的文件或者文件夹

默认在finder中是不显示隐藏的文件和文件夹的&#xff0c;但是想创建.gitignore文件&#xff0c;并向里面写入内容&#xff0c;即便是打开xcode也是不显示这几个隐藏文件的&#xff0c;那有什么办法呢&#xff1f; 使用快捷键&#xff1a; 使用finder打开包含隐藏文件的文件夹…

Web缓存代理和CDN 内容分发网络

目录 1.WEB缓存代理 1.1 WEB缓存代理作用 1.2 常见WEB缓存代理 1.3 Nginx 配置 缓存代理 2. CDN内容分发网络 1.WEB缓存代理 1.1 WEB缓存代理作用 存储一些之前给访问过的&#xff0c;且可能要被再次访问的静态网页资源对象&#xff0c;使客户端可以直接从缓存代理服务器…

NSSCTF-Web题目19(数据库注入、文件上传、php非法传参)

目录 [LitCTF 2023]这是什么&#xff1f;SQL &#xff01;注一下 &#xff01; 1、题目 2、知识点 3、思路 [SWPUCTF 2023 秋季新生赛]Pingpingping 4、题目 5、知识点 6、思路 [LitCTF 2023]这是什么&#xff1f;SQL &#xff01;注一下 &#xff01; 1、题目 2、知识…

【数值计算库-超长笔记】Python-Mpmath库:高精度数值计算

原文链接&#xff1a;https://www.cnblogs.com/aksoam/p/18279394 更多精彩&#xff0c;关注博客园主页&#xff0c;不断学习&#xff01;不断进步&#xff01; 我的主页 csdn很少看私信&#xff0c;有事请b站私信 博客园主页-发文字笔记-常用 有限元鹰的主页 内容&#xf…

RTSP协议在视频监控系统中的典型应用、以及视频监控设备的rtsp地址格式介绍

目录 一、协议概述 1、定义 2、提交者 3、位置 二、主要特点 1、实时性 2、可扩展性 3、控制功能 4、回放支持 5、网络适应性 三、RTSP的工作原理 1、会话准备 2、会话建立 3、媒体流控制 4、会话终止 5、媒体数据传输 四、协议功能 1、双向性 2、带外协议 …

已解决java.awt.geom.NoninvertibleTransformException:在Java2D中无法逆转的转换的正确解决方法,亲测有效!!!

已解决java.awt.geom.NoninvertibleTransformException&#xff1a;在Java2D中无法逆转的转换的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 出现问题的场景 报错原因 解决思路 解决方法 1. 检查缩放因子 修改后的缩放变换 …

《昇思25天学习打卡营第9天|onereal》

继续学习昨天的 基于MindNLPMusicGen生成自己的个性化音乐 生成音乐 MusicGen支持两种生成模式&#xff1a;贪心&#xff08;greedy&#xff09;和采样&#xff08;sampling&#xff09;。在实际执行过程中&#xff0c;采样模式得到的结果要显著优于贪心模式。因此我们默认启…

实用软件分享-----一款免费的投屏软件(支持手机投屏到电脑)Aiseesoft Phone Mirror 2.2.36 x64

专栏介绍:本专栏主要分享一些实用的软件(Po Jie版); 声明1:软件不保证时效性;只能保证在写本文时,该软件是可用的;不保证后续时间该软件能一直正常运行;不保证没有bug;如果软件不可用了,我知道后会第一时间在题目上注明(已失效)。介意者请勿订阅。 声明2:本专栏的…

JDeveloper 12C 官网下载教程

首先、我们要登录Oracle官网 Oracle 甲骨文中国 | 云应用和云平台 登录进去如果不是中文可以点击右上角带有国旗的图标就行更改&#xff0c;选择一个你能看懂的文字。 然后&#xff0c;点击“资源”—点击“开发人员下载” 然后&#xff0c;点击“开发工具” 这里有很多工具可…

Codeforces Round 954 (Div. 3)(A~E)

目录 A. X Axis B. Matrix Stabilization C. Update Queries D. Mathematical Problem A. X Axis Problem - A - Codeforces 直接找到第二大的数&#xff0c;答案就是这个数与其他两个数的差值的和。 void solve() {vector<ll>a;for (int i 1; i < 3; i){int x;…

美团实习—后端开发凉经

面试经历分享 日期&#xff1a; 4月22日时长&#xff1a; 50分钟 意外之喜 没想到在面试过程中&#xff0c;我再次被选中进行下一轮&#xff0c;这确实让我感到有些意外和欣喜。这次面试经历对我而言&#xff0c;不仅是一次技能的检验&#xff0c;更是一次知…

【LeetCode】九、双指针算法:环形链表检测 + 救生艇

文章目录 1、双指针算法1.1 对撞双指针1.2 快慢双指针 2、leetcode141&#xff1a;环形链表3、leetcode881&#xff1a;救生艇 1、双指针算法 用两个指针来共同解决一个问题&#xff1a; 1.1 对撞双指针 比如先有一个有序的数组array int[] array {1, 4, 5, 7, 9}先要找两个…

MM-LLM:使用Llava类构建图文多模态大模型实践

多模态大模型的结构如上&#xff0c;llava是用两层MLP作为连接器。该模式也是后续很多工作的基础。 本文主要参考了https://github.com/yuanzhoulvpi2017/zero_nlp/tree/main/train_llava的工作&#xff0c;最初是在b站看到的&#xff0c;讲解的很细致。 基础模型 大语言模型…

【BES2500x系列 -- RTX5操作系统】深入探索CMSIS-RTOS RTX -- 同步与通信篇 -- 消息队列和邮箱处理 --(四)

&#x1f48c; 所属专栏&#xff1a;【BES2500x系列】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f49…

容器内存

一、容器内存概述 容器本质上还是一个进程&#xff0c;是一个被隔离和限制的进程。因此容器内存和进程内存在表现形式上其实是一样的&#xff0c;这块主要涉及三部分内容&#xff1a;RSS&#xff0c;page cache和swap这三部分&#xff0c;容器基于memory Cgroup对内存进行限制…

k8s部署单机版mysql8

一、创建命名空间 # cat mysql8-namespace.yaml apiVersion: v1 kind: Namespace metadata:name: mysql8labels:name: mysql8# kubectl apply -f mysql8-namespace.yaml namespace/mysql8 created# kubectl get ns|grep mysql8 mysql8 Active 8s二、创建mysql配…

某网页gpt的JS逆向

原网页网址 (base64) 在线解码 aHR0cHM6Ly9jbGF1ZGUzLmZyZWUyZ3B0Lnh5ei8 逆向效果图 调用代码&#xff08;复制即用&#xff09; 把倒数第三行换成下面的base64解码 aHR0cHM6Ly9jbGF1ZGUzLmZyZWUyZ3B0Lnh5ei9hcGkvZ2VuZXJhdGU import hashlib import time import reques…

Python学习篇:PyCharm的基本使用教程(二)

目录 1 前言 2 创建Python项目 3 创建Python文件 4 编写 Hello World 并运行 5 PyCharm界面简介 1 前言 PyCharm的使用贯穿整个Python的学习&#xff0c;所以单独拿出来出教程不合适&#xff0c;说多了对于新手来说也还是不明白&#xff0c;这里我们先从学习开始前大家需…

【仪器仪表】 矢量网络分析仪 Vector Network Analyzer

主要功能&#xff1a; 测量S参数&#xff1a; S11&#xff08;输入反射系数&#xff09;&#xff1a;测量输入端口的反射。S21&#xff08;正向传输系数&#xff09;&#xff1a;测量从输入端口到输出端口的传输。S12&#xff08;反向传输系数&#xff09;&#xff1a;测量从输…

【后端面试题】【中间件】【NoSQL】MongoDB的配置服务器、复制机制、写入语义和面试准备

MongoDB的配置服务器 引入了分片机制之后&#xff0c;MongoDB启用了配置服务器(config server) 来存储元数据&#xff0c;这些元数据包括分片信息、权限控制信息&#xff0c;用来控制分布式锁。其中分片信息还会被负责执行查询mongos使用。 MongoDB的配置服务器有一个很大的优…