使用Gadget 做usb鼠标键盘设备
使用Gadget 做usb鼠标键盘设备
感谢TI社区提供的好帮助啊!http://e2e.ti.com/support/arm/sitara_arm/f/791/p/571771/2103409?pi316653=2
虽然海思平台和TI平台不一样 ,但也大同小异。
具体的步骤如下:
转到内核目录:
//加载配置文件
>cp xxx .config
修改配置
make xxxx menuconfig
>-> Device Drivers -> USB support -> USB Gadget Support -> <M> USB Gadget Drivers -> <M> HID Gadget
进到:
>-> Device Drivers -> USB support > USB Gadget Support-> USB Peripheral Controller
> ->Device Drivers ->USB support > USB Gadget Support -> USB Peripheral Controller -> Hisilicon USB2. Device Controller SUPPORT
+ [*] Hisilicon USB2. Device auto switch
打开自动切换功能。
需要注意的是gadget子项的驱动依赖于udc模块和composite模块,而composite模块又依赖于udc模块,udc是硬件接口模块,直接操作USB寄存器等。composite为上层驱动提供操作UDC。
所以加载顺序必要是udc-hisi.ko 、libcomposite.ko 、g_hid.ko
加载发现出现问题,某些函数不能用,经过研究要打开
> File systems > Pseudo filesystems
+ {*} Userspace-driven configuration filesystem
即可,加载g_hid.ko后出现:
insmod: can't insert 'g_hid.ko': No such device
原因在于没有注册设备报告描述符!!!修改hid.c文件, 头文件:
```
+#include <linux/usb/g_hid.h>
```
添加键盘报告描述符
+static struct hidg_func_descriptor keyboard_report_data =
+{
+ .subclass = , /* No subclass */
+ .protocol = , /* Keyboard */
+ .report_length = ,
+ .report_desc_length = ,
+ .report_desc = {
+ 0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */
+ 0x09, 0x06, /* USAGE (Keyboard) */
+ 0xa1, 0x01, /* COLLECTION (Application) */
+ 0x05, 0x07, /* USAGE_PAGE (Keyboard) */
+ 0x19, 0xe0, /* USAGE_MINIMUM (Keyboard LeftControl) */
+ 0x29, 0xe7, /* USAGE_MAXIMUM (Keyboard Right GUI) */
+ 0x15, 0x00, /* LOGICAL_MINIMUM (0) */
+ 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */
+ 0x75, 0x01, /* REPORT_SIZE (1) */
+ 0x95, 0x08, /* REPORT_COUNT (8) */
+ 0x81, 0x02, /* INPUT (Data,Var,Abs) */
+ 0x95, 0x01, /* REPORT_COUNT (1) */
+ 0x75, 0x08, /* REPORT_SIZE (8) */
+ 0x81, 0x03, /* INPUT (Cnst,Var,Abs) */
+ 0x95, 0x05, /* REPORT_COUNT (5) */
+ 0x75, 0x01, /* REPORT_SIZE (1) */
+ 0x05, 0x08, /* USAGE_PAGE (LEDs) */
+ 0x19, 0x01, /* USAGE_MINIMUM (Num Lock) */
+ 0x29, 0x05, /* USAGE_MAXIMUM (Kana) */
+ 0x91, 0x02, /* OUTPUT (Data,Var,Abs) */
+ 0x95, 0x01, /* REPORT_COUNT (1) */
+ 0x75, 0x03, /* REPORT_SIZE (3) */
+ 0x91, 0x03, /* OUTPUT (Cnst,Var,Abs) */
+ 0x95, 0x06, /* REPORT_COUNT (6) */
+ 0x75, 0x08, /* REPORT_SIZE (8) */
+ 0x15, 0x00, /* LOGICAL_MINIMUM (0) */
+ 0x25, 0x65, /* LOGICAL_MAXIMUM (101) */
+ 0x05, 0x07, /* USAGE_PAGE (Keyboard) */
+ 0x19, 0x00, /* USAGE_MINIMUM (Reserved) */
+ 0x29, 0x65, /* USAGE_MAXIMUM (Keyboard Application) */
+ 0x81, 0x00, /* INPUT (Data,Ary,Abs) */
+ 0xc0 /* END_COLLECTION */
+};
定义键盘设备:
+static struct platform_device keyboard_device = {
+ .name = "hidg",
+ .id = ,
+ .num_resources = ,
+ .resource = ,
+ .dev.platform_data = &keyboard_report_data,
+};
在static int __init hidg_init(void)函数开始处注册键盘设备
+status = platform_device_register(&keyboard_device);
+ if (status < ) {
+ printk("____ reg failed\n");
+ platform_device_unregister(&keyboard_device);
+ return status;
+ }
在驱动卸载处释放键盘设备
platform_driver_unregister(&hidg_plat_driver);
+platform_device_unregister(&keyboard_device);
usb_composite_unregister(&hidg_driver);
添加后即可识别为键盘设别如下图所示:
单个键盘和鼠标没有任何问题,然而同时设置鼠标和键盘加载后出现如下错误:
------------[ cut here ]------------
WARNING: CPU: PID: at fs/sysfs/dir.c: sysfs_warn_dup+0x60/0x70()
sysfs: cannot create duplicate filename ‘/devices/platform/hidg.’
Modules linked in: g_hid(+) libcomposite udc_hisi [last unloaded: g_hid]
CPU: PID: Comm: insmod Tainted: G W 3.18. #
[] (unwind_backtrace) from [] (show_stack+0x10/0x14)
[] (show_stack) from [] (dump_stack+0x88/0x98)
[] (dump_stack) from [] (warn_slowpath_common+0x6c/0x88)
[] (warn_slowpath_common) from [] (warn_slowpath_fmt+0x30/0x40)
[] (warn_slowpath_fmt) from [] (sysfs_warn_dup+0x60/0x70)
[] (sysfs_warn_dup) from [] (sysfs_create_dir_ns+0x88/0x98)
[] (sysfs_create_dir_ns) from [] (kobject_add_internal+0xb0/0x300)
[] (kobject_add_internal) from [] (kobject_add+0x48/0x94)
[] (kobject_add) from [] (device_add+0xd8/0x53c)
[] (device_add) from [] (platform_device_add+0xb4/0x21c)
[] (platform_device_add) from [] (hidg_init+0x38/0xc8 [g_hid])
[] (hidg_init [g_hid]) from [] (do_one_initcall+0x8c/0x1c8)
[] (do_one_initcall) from [] (load_module+0x1740/0x1e88)
[] (load_module) from [] (SyS_init_module+0xd8/0xec)
[] (SyS_init_module) from [] (ret_fast_syscall+0x0/0x38)
—[ end trace c7b2846a724052eb ]—
原因如下位置:
static struct platform_device mouse_device = {
.name = “hidg”,
.id = ,
.num_resources = ,
.resource = ,
.dev.platform_data = &mouse_report_desc,
};
id为0和keyboard的id也是0相同了冲突了!! 经过这样子做,鼠标键盘在dev对应的是hidg0(键盘id 0) hidg1(鼠标id 1),只要打开这两个设备,往这两个设备发送键盘和鼠标报告就可以了
经过如此的配置只要按照顺序加载udc-hisi.ko、libcomposite.ko、以及g_hid.ko即可使用gadget鼠标键盘设备了,卸载这些驱动后,host又可以正常使用。
使用Gadget 做usb鼠标键盘设备的更多相关文章
- Qt移植对USB鼠标键盘、触摸屏的支持
.USB键盘 经过一番搜索,发现对Qt键盘的支持主要关系到两个方面: 1. 键盘类型确定: 4.7以前的Qt版本,如果是PS2圆孔键盘,Qt编译时需加上选项:-qt-kbd-vr41xx(未测试):如 ...
- USB鼠标键盘数据格式以及按键键值
鼠标发送给PC的数据每次4个字节 BYTE1 BYTE2 BYTE3 BYTE4 定义分别是: BYTE1 -- |--bit7: 1 表示 Y 坐标的变化量超出-256 ...
- 解决ubuntu16.04 USB鼠标键盘使用卡顿
小米游戏本,键盘突然M建不能用,去了售后换了个键盘. 小米售后真的不想吐槽……入坑 键盘鼠标卡顿由于挂起导致失灵,每次需要激活所以卡顿 解决办法如下: 编辑如下文件配置 sudo vim /etc/l ...
- STM32 USB 鼠标+键盘 串口控制
*MOS0101000000# 鼠标左键按下 *MOS0102000000# 鼠标右键按下 *MOS0103000000# 鼠标中键按下 *MOS0100000000# 鼠标抬起 *MOS01000a ...
- DM816X 实现 USB HID Gadget 鼠标键盘功能【转】
转自:https://my.oschina.net/renyongke/blog/410695 开发环境: 平台: DM8168 内核 :linux 2.6.32 RDK:DVRRDK_04.00.0 ...
- 玩转X-CTR100 l USB功能-HOST鼠标键盘
更多塔克创新资讯欢迎登陆[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] X-CTR100控制器具有MicroUSB接口,支持SLAVE和HOST两 ...
- usb的hid鼠标键盘报告描述符(五)
title: usb的hid鼠标键盘报告描述符 tags: linux date: 2018/12/20/ 18:05:08 toc: true --- usb的hid鼠标键盘报告描述符 https: ...
- 学习Linux下s3c2440的USB鼠标驱动笔记
1.ARM-Linux下USB驱动程序开发1.1.1.linux下USB配置:*********(MassStorage:存储设备)********************************** ...
- Linux usb子系统(一) _写一个usb鼠标驱动
USB总线是一种典型的热插拔的总线标准,由于其优异的性能几乎成为了当下大小设备中的标配. USB的驱动可以分为3类:SoC的USB控制器的驱动,主机端USB设备的驱动,设备上的USB Gadget驱动 ...
随机推荐
- 【原创】大叔问题定位分享(8)提交spark任务报错 Caused by: java.lang.ClassNotFoundException: org.I0Itec.zkclient.exception.ZkNoNodeException
spark 2.1.1 一 问题重现 spark-submit --master local[*] --class app.package.AppClass --jars /jarpath/zkcli ...
- Apache JMeter压力测试实例
脚本录制 脚本录制,JMeter启用WEB代理,浏览器把代理上网设置为JMeter所在的IP地址,自己电脑就是127.0.0.1代理端口默认8080.至于浏览器修改代理上网服务器,不做截图. Jmet ...
- Flask+Nginx+Supervisor+Gunicorn+HTTPS部署教程(CentOs)
写在前面 之前的文章中,我们详细讲述了怎样安装 Nginx,Python,Supervisor,Gunicorn,HTTPS.经本人多次测试是完全可以跑通的,那么本篇将介绍怎样将这些组合起来运行一个H ...
- java集合(list,set,map)
集合 集合与数组 数组(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用. 集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数情况下使用. ...
- Python内置函数之classmetho staticmethod
当对类的静态属性进行修改时(不需要借助于对象就行类静态属性的修改) class Goods: discount = 0.5 def __init__(self,name,price): self.na ...
- [转] 扩展微信小程序框架功能
通过第三方 JavaScript 库,扩展微信小程序框架功能. 扩展微信小程序框架功能(1)——Promise ES6 对 Promise 有了原生的支持,但微信开发者工具更新版本(0.11.1122 ...
- 微信小程序--家庭记账本开发--03
组件.标签以及模板的使用 在一个微信小程序中,需要用到大量的组件,一些页面的设计也需要模板,在自己所学课程中,对于一些组件.标签模板的使用有了初步的了解. 1.组件 组件是数据和方法的简单封装,对于微 ...
- 理解WidowManager
--摘自<Android进阶解密> *WindowManger的关联类* 1.Window是一个抽象类,具体的实现类为PhoneWindow,它对View进行管理.WindowManage ...
- PYTOGO之旅——环境搭建
Go 语言支持以下系统: Linux FreeBSD Mac OS X(也称为 Darwin) Windows 安装包下载地址为:https://golang.org/dl/. 如果打不开可以使用这个 ...
- VS2015编译FFMPEG,修改FFmpeg缓冲区大小解决实时流解码丢包问题,FFmpeg错误rtsp流地址卡死的问题,设置超时
之前尝试过很多网上利用Windows编译FFmpeg的文章,都没有办法编译X64位的FFmpeg,有些教程中有专门提到编译64位的FFmpeg需要下载mingw-w64-install,但是编译的过程 ...