博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
nes 红白机模拟器 第8篇 USB 手柄支持
阅读量:4698 次
发布时间:2019-06-09

本文共 2559 字,大约阅读时间需要 8 分钟。

买了一个支持 USB OTG, 蓝牙 连接的 安卓手柄。

接到 ubunto 上 dmesg 可以看到识别出来的信息,内核已经支持了。

usb 2-2.2: new full-speed USB device number 5 using uhci_hcdusb 2-2.2: New USB device found, idVendor=20bc, idProduct=5500usb 2-2.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0usb 2-2.2: Product: Android Gamepadusb 2-2.2: Manufacturer: ShanWaninput: ShanWan     Android Gamepad as /devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb2/2-2/2-2.2/2-2.2:1.0/input/input5hid-generic 0003:20BC:5500.0002: input,hidraw1: USB HID v1.10 Gamepad [ShanWan     Android Gamepad] on usb-0000:02:00.0-2.2/input0

根据 VID 20bc  PID  5500 在 内核源码中搜索

hid/hid-ids.h:196:#define USB_VENDOR_ID_BETOP_2185V2BFM 0x20bc
hid/hid-betopff.c:16: *  0x20bc:0x5500 "BTP2185 V2 BFM mode Joystick"
配置内核加上 hid-betopff.c
Device Drivers
    Input device support
        HID support
            Special HID drivers
                Betop Production Inc. force feedback support

使用新内核启动后,接入 USB 手柄,有打印信息,有生成设备节点

写测试程序,确定按键的对应码。

1 /** 2  * 参考内核文档 joystick-api.txt 3  * author: ningci dev date: 2017-06-02 18:00 4  */ 5 #include 
6 #include
7 #include
8 #include
9 10 struct js_event { 11 unsigned int time; /* event timestamp in milliseconds */ 12 unsigned short value; /* value */ 13 unsigned char type; /* event type */ 14 unsigned char number; /* axis/button number */ 15 };16 17 int main(int argc, char **argv)18 {19 struct js_event e;20 int fd = open("/dev/input/js0", O_RDONLY);21 while(1)22 {23 if(0 < read (fd, &e, sizeof(e)))24 {25 printf("value:0x%x type:0x%x number:0x%x \n", e.value, e.type, e.number);26 }27 }28 close(fd);29 return 0;30 }

测试后有用的按键的整理

value:0x8001 type:0x2 number:0x5   上
value:0x0 type:0x2 number:0x5         松开

value:0x7fff type:0x2 number:0x5     下
value:0x0 type:0x2 number:0x5        松开
value:0x8001 type:0x2 number:0x4   左
value:0x0 type:0x2 number:0x4        松开
value:0x7fff type:0x2 number:0x4    右
value:0x0 type:0x2 number:0x4       松开
value:0x1 type:0x1 number:0xa      选择
value:0x0 type:0x1 number:0xa      松开
value:0x1 type:0x1 number:0xb      开始
value:0x0 type:0x1 number:0xb      松开
value:0x1 type:0x1 number:0x0   A
value:0x0 type:0x1 number:0x0   松开
value:0x1 type:0x1 number:0x1   B
value:0x0 type:0x1 number:0x1   松开
value:0x1 type:0x1 number:0x3   X
value:0x0 type:0x1 number:0x3   松开
value:0x1 type:0x1 number:0x4   Y
value:0x0 type:0x1 number:0x4   松开

因为USB 手柄在 read 时会阻塞,所以改用 多线程方式,进入输入。

全整源码,可以关注 github 。

暂未支持 连A  连B 的支持。

转载于:https://www.cnblogs.com/ningci/p/6934453.html

你可能感兴趣的文章
npm和gulp学习
查看>>
一次清空所有数据方法
查看>>
libz.dylib的研究 libz.1.2.5.tbd
查看>>
在CentOS 7中安装与配置Tomcat-8方法
查看>>
log4net使用详解
查看>>
django配置mysql
查看>>
【校内互测】Sunshine’s string(merge) (状压dp)
查看>>
关注细节但不陷入细节
查看>>
【Python】django模型models的外键关联使用
查看>>
httperf ---linux web站点压力测试
查看>>
SSH和SSM对比总结
查看>>
vue结合element实现自定义上传图片、文件
查看>>
C# 用委托实现Callback
查看>>
2019春第一次课程设计实验报告
查看>>
Kubernetes集群部署及简单命令行操作
查看>>
logistic回归
查看>>
《python基础教程》笔记之 列表
查看>>
dbForge mysql数据库比对
查看>>
Linux 搭建NFS文件服务器实现文件共享
查看>>
vue项目微信分享之后路由链接被破坏怎么办
查看>>