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

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

usb -2.2: new full-speed USB device number  using uhci_hcd
usb -2.2: New USB device found, idVendor=20bc, idProduct=
usb -2.2: New USB device strings: Mfr=, Product=, SerialNumber=
usb -2.2: Product: Android Gamepad
usb -2.2: Manufacturer: ShanWan
input: ShanWan Android Gamepad as /devices/pci0000:/::11.0/::00.0/usb2/-/-2.2/-2.2:1.0/input/input5
hid-generic :20BC:5500.0002: input,hidraw1: USB HID v1. Gamepad [ShanWan Android Gamepad] on usb-::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 手柄,有打印信息,有生成设备节点

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

 /**
* 参考内核文档 joystick-api.txt
* author: ningci dev date: 2017-06-02 18:00
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> struct js_event {
unsigned int time; /* event timestamp in milliseconds */
unsigned short value; /* value */
unsigned char type; /* event type */
unsigned char number; /* axis/button number */
}; int main(int argc, char **argv)
{
struct js_event e;
int fd = open("/dev/input/js0", O_RDONLY);
while()
{
if( < read (fd, &e, sizeof(e)))
{
printf("value:0x%x type:0x%x number:0x%x \n", e.value, e.type, e.number);
}
}
close(fd);
return ;
}

测试后有用的按键的整理
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 的支持。

nes 红白机模拟器 第8篇 USB 手柄支持的更多相关文章

  1. arm 2440 linux 应用程序 nes 红白机模拟器 第4篇 linux 手柄驱动支持

    小霸王学习机的真实手柄,实测CPU 占用 80% 接线图: 手柄读时序: joypad.c 驱动: 普通的字符设备驱动. #include <linux/module.h> #includ ...

  2. nes 红白机模拟器 第4篇 linux 手柄驱动支持

    小霸王学习机的真实手柄,实测CPU 占用 80% 接线图: 手柄读时序: joypad.c 驱动: 普通的字符设备驱动. #include <linux/module.h> #includ ...

  3. nes 红白机模拟器 第7篇 编译使用方法

    模拟器,基于 InfoNES ,作者添加修改以下功能: 1, joypad 真实手柄驱动程序(字符型设备驱动) 2,原始图像只有256*240 ,添加 图像放大算法,这里实现了2种,a, 最近邻插值 ...

  4. arm 2440 linux 应用程序 nes 红白机模拟器 第1篇

    对比了很多种,开源的 NES 模拟器 VirtuaNES , nestopia , FakeNES , FCEUX , InfoNES , LiteNES 最后决定使用 LiteNES 进行移值,它是 ...

  5. nes 红白机模拟器 第1篇

    对比了很多种,开源的 NES 模拟器 VirtuaNES , nestopia , FakeNES , FCEUX , InfoNES , LiteNES 最后决定使用 LiteNES 进行移值,它是 ...

  6. arm 2440 linux 应用程序 nes 红白机模拟器 第2篇 InfoNES

    InfoNES 支持 map ,声音,代码比较少,方便 移值. 在上个 LiteNES  的基础上,其实不到半小时就移值好了这个,但问题是,一直是黑屏.InfoNES_LoadFrame ()  Wo ...

  7. nes 红白机模拟器 第6篇 声音支持

    InfoNES 源码中并没有包含 linux 的声音支持. 但提供 wince 和 win 的工程,文件,通过分析,win 的 DirectSound 发声,在使用 linux ALSA 实现. 先使 ...

  8. nes 红白机模拟器 第5篇 全屏显示

    先看一下效果图 放大的原理是使用最初级的算法,直接取对应像素法. /*================================================================= ...

  9. nes 红白机模拟器 第2篇 InfoNES

    InfoNES 支持 map ,声音,代码比较少,方便 移值. 在上个 LiteNES  的基础上,其实不到半小时就移值好了这个,但问题是,一直是黑屏.InfoNES_LoadFrame ()  Wo ...

随机推荐

  1. JavaScript 的DOM操作及实例

    一.Windows对象操作 (1).用代码打开窗口:window.open("第一部分","第二部分","第三部分","第四部分& ...

  2. Vue+elementUI build打包部署后字体图标丢失问题

    错误描述:Vue+elementUI  build打包部署后字体图标丢失,控制台显示文件element-icons.woff和element-icons.ttf文件404 错误展现: 控制台报错截图 ...

  3. PyCharm4.5 中文破解版破解步骤

    1.在下载之家下载PyCharm4.5中文版软件包,然后右击软件安装包选择解压到“pycharm4.5.3”. 2.在解压文件夹中找到pycharm-professional-4.5.3,右击打开. ...

  4. STL:map中的lower_bound和upper_bound

    今天在做leetcode的Longest Increasing Subsequence题目时,需要用到二分查找,于是翻看了<STL源码剖析>这本书,发现map里面有lower_bound和 ...

  5. Jmeter之压力测试总结

    一.基本概念 1.线程组N:代表一定数量的并发用户,所谓并发就是指同一时刻访问发送请求的用户.线程组就是模拟并发用户访问. 2.Ramp-Up Period(in seconds):建立所有线程的周期 ...

  6. 牛客-小w的a=b问题

    题目传送门 sol1:老实做,预处理出所有2到1e5的素数,对所有数进行分解质因数,然后对比因子个数.感觉有点卡常,用了快读然后多次优化之后才过的,map也用上了. 素数筛,快速分解质因数 #incl ...

  7. iOS高仿微信悬浮窗、忍者小猪游戏、音乐播放器、支付宝、今日头条布局滚动效果等源码

    iOS精选源码 iOS WKWebView的使用源码 模仿apple music 小播放器的交互实现 高仿微信的悬浮小窗口 iOS仿支付宝首页效果 [swift]仿微信悬浮窗 类似于今日头条,网易新闻 ...

  8. MOOC(7)- case依赖、读取json配置文件进行多个接口请求-跳过测试用例(6)

    初始化.跳过测试用例 # test_class_6.py import unittest from mock import mock from day_20200208_mooc.base.inter ...

  9. springboot项目实现jar包外配置文件管理

    背景 为实现快速搭建和开发,项目以Springboot框架搭建,springboot搭建的项目可以将项目直接打成jar包并运行,无需自己安装配置Tomcat或者其他服务器,是一种方便快捷的部署方式. ...

  10. [hdu4630] No Pain No Game

    某次模拟赛的T1. 刚开始怀疑是RMQ......我真是太弱了QAQ 题目传送门 正解是离线操作,把所有询问按r从小到大排序. 然后把数从左到右处理,处理完第i个数,就可以回答所有r==i的询问了. ...