在RK平台上利用gadget去模拟一个HID触摸屏驱动

本文档详述了在RK3568平台上,如何通过gadget模拟一个HID触摸屏驱动,实现USB连接主机后的触摸交互。首先调整HID键盘驱动,使其在主机上显示为HID键盘,接着改造报告描述符以支持绝对位置的触摸点击,最后通过坐标转换函数实现精确的屏幕定位。
摘要由CSDN通过智能技术生成
目的:

在大屏触摸屏上点击一个位置,通过RK3568模拟出来的触摸屏能够在usb连接的主机上也点击相对的位置。

实现HID调通的办法:

首先先把HID调通,在kernel/drivers/usb/gadget/legacy/hid.c文件中修改添加一个HID键盘,使得通过OTG的usb口连接主机后,在主机上能够识别该OTG口为一个HID键盘;
通过查询资料——https://blog.csdn.net/donghailin/article/details/106096566
添加相应代码后再编译烧录,成功在开发板上找到hidg0文件,随后通过
echo otg > /sys/devices/platform/fe8a0000.usb2-phy/otg_mode 命令把该usb口配置成otg模式,(可以先cat一下看看是不是otg模式,我这里是host模式所以要改),同时也要mask掉adba.service,随后连接主机,能够看到设备管理器中新添加了一个hid 键盘。已经可以找到hidg0文件,接下来的操作都是通过它来实现

调试:

参考kernel/Documentation/usb/gadget_hid.txt中的测试例程,对HID键盘进行测试,结果成功在主机上写入字母或功能键;

/* hid_gadget_test */
/*其中第一个参数是hidg0文件位置;第二个参数是m鼠标 k键盘*/
#include <pthread.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <fcntl.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define BUF_LEN 512

struct options {
   
	const char    *opt;
	unsigned char val;
};

static struct options kmod[] = {
   
	{
   .opt = "--left-ctrl",		.val = 0x01},
	{
   .opt = "--right-ctrl",		.val = 0x10},
	{
   .opt = "--left-shift",		.val = 0x02},
	{
   .opt = "--right-shift",	.val = 0x20},
	{
   .opt = "--left-alt",		.val = 0x04},
	{
   .opt = "--right-alt",		.val = 0x40},
	{
   .opt = "--left-meta",		.val = 0x08},
	{
   .opt = "--right-meta",		.val = 0x80},
	{
   .opt = NULL}
};

static struct options kval[] = {
   
	{
   .opt = "--return",	.val = 0x28},
	{
   .opt = "--esc",	.val = 0x29},
	{
   .opt = "--bckspc",	.val = 0x2a},
	{
   .opt = "--tab",	.val = 0x2b},
	{
   .opt = "--spacebar",	.val = 0x2c},
	{
   .opt = "--caps-lock",	.val = 0x39},
	{
   .opt = "--f1",		.val = 0x3a},
	{
   .opt = "--f2",		.val = 0x3b},
	{
   .opt = "--f3",		.val = 0x3c},
	{
   .opt = "--f4",		.val = 0x3d},
	{
   .opt = "--f5",		.val = 0x3e},
	{
   .opt = "--f6",		.val = 0x3f},
	{
   .opt = "--f7",		.val = 0x40},
	{
   .opt = "--f8",		.val = 0x41},
	{
   .opt = "--f9",		.val = 0x42},
	{
   .opt = "--f10",	.val = 0x43},
	{
   .opt = "--f11",	.val = 0x44},
	{
   .opt = "--f12",	.val = 0x45},
	{
   .opt = "--insert",	.val = 0x49},
	{
   .opt = "--home",	.val = 0x4a},
	{
   .opt = "--pageup",	.val = 0x4b},
	{
   .opt = "--del",	.val = 0x4c},
	{
   .opt = "--end",	.val = 0x4d},
	{
   .opt = "--pagedown",	.val = 0x4e},
	{
   .opt = "--right",	.val = 0x4f},
	{
   .opt = "--left",	.val = 0x50},
	{
   .opt = "--down",	.val = 0x51},
	{
   .opt = "--kp-enter",	.val = 0x58},
	{
   .opt = "--up",		.val = 0x52},
	{
   .opt = "--num-lock",	.val = 0x53},
	{
   .opt = NULL}
};

int keyboard_fill_report(char report[8], char buf[BUF_LEN], int *hold)
{
   
	char *tok =
gadget-2是一款用于模拟宇宙大规模结构形成和演化的软件。在移植和优化方面,考虑到加速卡异构平台的特点,可以采取以下策略。 首先,对加速卡异构平台进行充分了解。了解平台的硬件架构、计算能力和内存层次结构等方面的特点,对移植和优化工作至关重要。 其次,使用并行计算框架。面对加速卡强大的并行计算能力,可以采用CUDA或OpenCL等并行计算框架来充分利用加速卡的计算资源。通过把模拟任务划分为多个并行子任务,可以实现并行计算,提高模拟的效率。 第三,优化算法和数据结构。在移植到加速卡异构平台时,需要对算法和数据结构进行优化,以适应平台的特点。通过减少内存访问、利用高速缓存和共享内存等技术,可以提高程序的效率和性能。 第四,合理划分任务和数据。将模拟任务和数据划分为适合加速卡的大小和个数,以充分利用加速卡的计算能力和内存容量。同时,要考虑数据的传输和通信开销,尽量减少数据在加速卡和主机之间的传输次数。 最后,进行性能优化和调试。通过性能分析工具和调试器,对移植后的程序进行性能分析和调试,找出性能瓶颈并进行优化。可以采用代码重构、循环展开、数据预取等技术,提高程序的性能和效率。 综上所述,移植和优化gadget-2到加速卡异构平台需要充分了解平台特点,使用并行计算框架,优化算法和数据结构,合理划分任务和数据,并进行性能优化和调试。通过这些措施,可以充分利用加速卡的计算能力,提高模拟的效率和性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值