nes 红白机模拟器 第8篇 USB 手柄支持
买了一个支持 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 手柄支持的更多相关文章
- arm 2440 linux 应用程序 nes 红白机模拟器 第4篇 linux 手柄驱动支持
小霸王学习机的真实手柄,实测CPU 占用 80% 接线图: 手柄读时序: joypad.c 驱动: 普通的字符设备驱动. #include <linux/module.h> #includ ...
- nes 红白机模拟器 第4篇 linux 手柄驱动支持
小霸王学习机的真实手柄,实测CPU 占用 80% 接线图: 手柄读时序: joypad.c 驱动: 普通的字符设备驱动. #include <linux/module.h> #includ ...
- nes 红白机模拟器 第7篇 编译使用方法
模拟器,基于 InfoNES ,作者添加修改以下功能: 1, joypad 真实手柄驱动程序(字符型设备驱动) 2,原始图像只有256*240 ,添加 图像放大算法,这里实现了2种,a, 最近邻插值 ...
- arm 2440 linux 应用程序 nes 红白机模拟器 第1篇
对比了很多种,开源的 NES 模拟器 VirtuaNES , nestopia , FakeNES , FCEUX , InfoNES , LiteNES 最后决定使用 LiteNES 进行移值,它是 ...
- nes 红白机模拟器 第1篇
对比了很多种,开源的 NES 模拟器 VirtuaNES , nestopia , FakeNES , FCEUX , InfoNES , LiteNES 最后决定使用 LiteNES 进行移值,它是 ...
- arm 2440 linux 应用程序 nes 红白机模拟器 第2篇 InfoNES
InfoNES 支持 map ,声音,代码比较少,方便 移值. 在上个 LiteNES 的基础上,其实不到半小时就移值好了这个,但问题是,一直是黑屏.InfoNES_LoadFrame () Wo ...
- nes 红白机模拟器 第6篇 声音支持
InfoNES 源码中并没有包含 linux 的声音支持. 但提供 wince 和 win 的工程,文件,通过分析,win 的 DirectSound 发声,在使用 linux ALSA 实现. 先使 ...
- nes 红白机模拟器 第5篇 全屏显示
先看一下效果图 放大的原理是使用最初级的算法,直接取对应像素法. /*================================================================= ...
- nes 红白机模拟器 第2篇 InfoNES
InfoNES 支持 map ,声音,代码比较少,方便 移值. 在上个 LiteNES 的基础上,其实不到半小时就移值好了这个,但问题是,一直是黑屏.InfoNES_LoadFrame () Wo ...
随机推荐
- 105)PHP,递归删除目录
Unlink(文件地址)删除文件.
- 68)PHP,cookie的详细属性和有效期
(1)cookie的有效期: 默认:会话周期结束(就是浏览器关闭),默认情况下,cookie会在浏览器关闭时失效,这种cookie是 临时cookie或者叫会话. 支持设置有效期,setcookie的 ...
- Python 装饰器 多装饰器同时装饰一个函数 多参数函数
装饰器是在不修改源代码的情况下,使用装饰器增加原函数的功能. 在软件开发中有一个原则——"开放-封闭",简单地说就是已经实现的功能不允许被修改,但可以被扩展. 封闭:已经实现的功能 ...
- spring和mybatis整合报错:org.springframework.beans.MethodInvocationException: Property 'dataSource' threw exception; nested exception is java.lang.NoClassDefFoundError
Exception in thread "main" org.springframework.beans.factory.UnsatisfiedDependencyExceptio ...
- left join on和where 限制查询的区别在于
left join on: 会显示前表的所有数据,不满足显示为null或者为0 . 而where显示的为满足条件的记录,不满足但是存在的数据不显示. 做统计数据的时候,用join on比较合理.
- [LC] 48. Rotate Image
You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). ...
- [LC] 28. Implement strStr()
Implement strStr(). Return the index of the first occurrence of needle in haystack, or -1 if needle ...
- python--防止SQL注入
from pymysql import * def main(): # 创建Connextion连接 conn = connect(host='localhost', port=3306, user= ...
- RxJava操作符实践:8_算术和聚合操作之3_min
发射原始Observable的最小值. Min操作符操作一个发射数值的Observable并发射单个值:最小的那个值. RxJava中,min属于rxjava-math模块. min接受一个可选参数, ...
- 原创:CentOS 环境中 Zabbix 3.4 的安装部署实践
IT管理工作中,如果没有对服务器.网络设备.服务.进程.应用等的监控,往往是用户发送问题报告后才知道出了问题.事后救火显得被动,不能从容面对问题. 才有了部署一套网络监控系统的想法,机缘巧合下结识了Z ...