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

目的:

在大屏触摸屏上点击一个位置,通过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 =
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值