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 ...
随机推荐
- python-django-fastdfs+Nginx的安装和配置_20191122
python-django-fastdfs+Nginx的安装和配置 FastDFS文件系统 FastDFS文件系统简介: 是c语言编写的,是淘宝的架构师写的,存储淘宝的图片,后来开源了, fastDF ...
- python可变类型和不可变类型,深拷贝vs浅拷贝
转载:https://www.cnblogs.com/huamingao/p/5809936.html 核心提示: 可变类型 Vs 不可变类型 可变类型(mutable):列表,字典 不可变类型(un ...
- Painter
时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 杂货店出售一种由N(3<=N<=12)种不同颜色的颜料,每种一瓶(50ML),组成的颜料套装. 你现在需要使用这 ...
- [洛谷P4549] [模板] 裴蜀定理
18.10.03模拟赛T1. 出题人xcj(Mr.Handsome)十分良心,给了一道送分题...... 互测题好久没有出现送分题了.xcj真棒. 题目传送门 幸亏之前看过,否则真的是送分题都拿不到. ...
- container/injection简介以及发展历史
一:什么是Container?Container的作用? 容器是一个标准的软件单元,它将代码及其所有依赖关系打包,以便应用程序从一个计算环境快速可靠地运行到另一个计算环境.container的主要作用 ...
- 在python使用selenium获取动态网页信息并用BeautifulSoup进行解析--动态网页爬虫
爬虫抓取数据时有些数据是动态数据,例如是用js动态加载的,使用普通的urllib2 抓取数据是找不到相关数据的,这是爬虫初学者在使用的过程中,最容易发生的情况,明明在浏览器里有相应的信息,但是在pyt ...
- ArrayList与LinkList对比
本文简要总结一下java中ArrayList与LinkedList的区别,这在面试中也是常常会问到的一个知识点. 先来看一下ArrayList和LinkedList的关系是怎样的: 从继承体系可以看到 ...
- 内核融合:GPU深度学习的“加速神器”
编者按:在深度学习"红透"半边天的同时,当前很多深度学习框架却面临着共同的性能问题:被频繁调用的代数运算符严重影响模型的执行效率. 本文中,微软亚洲研究院研究员薛继龙将为大家介绍 ...
- ubuntu 代理设置
在学习工作中使用vagrant作为开发环境已经有很长一段时间了,使用ubuntu 作为开发系统 在使用中发现,即使修改了apt的source.list源文件,在面对一些开发中需要的软件工具的时候,不可 ...
- javascript中变量命名规则
前言 变量的命名相对而言没有太多的技术含量,今天整理有关于变量命名相关的规则,主要是想告诉大家,虽然命名没有技术含量,但对于个人编码,或者说一个团队的再次开发及阅读是相当有用的.良好的书写规范可以让你 ...