买了一个支持 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. 105)PHP,递归删除目录

    Unlink(文件地址)删除文件.

  2. 68)PHP,cookie的详细属性和有效期

    (1)cookie的有效期: 默认:会话周期结束(就是浏览器关闭),默认情况下,cookie会在浏览器关闭时失效,这种cookie是 临时cookie或者叫会话. 支持设置有效期,setcookie的 ...

  3. Python 装饰器 多装饰器同时装饰一个函数 多参数函数

    装饰器是在不修改源代码的情况下,使用装饰器增加原函数的功能. 在软件开发中有一个原则——"开放-封闭",简单地说就是已经实现的功能不允许被修改,但可以被扩展. 封闭:已经实现的功能 ...

  4. 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 ...

  5. left join on和where 限制查询的区别在于

    left join on: 会显示前表的所有数据,不满足显示为null或者为0 . 而where显示的为满足条件的记录,不满足但是存在的数据不显示. 做统计数据的时候,用join on比较合理.

  6. [LC] 48. Rotate Image

    You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). ...

  7. [LC] 28. Implement strStr()

    Implement strStr(). Return the index of the first occurrence of needle in haystack, or -1 if needle ...

  8. python--防止SQL注入

    from pymysql import * def main(): # 创建Connextion连接 conn = connect(host='localhost', port=3306, user= ...

  9. RxJava操作符实践:8_算术和聚合操作之3_min

    发射原始Observable的最小值. Min操作符操作一个发射数值的Observable并发射单个值:最小的那个值. RxJava中,min属于rxjava-math模块. min接受一个可选参数, ...

  10. 原创:CentOS 环境中 Zabbix 3.4 的安装部署实践

    IT管理工作中,如果没有对服务器.网络设备.服务.进程.应用等的监控,往往是用户发送问题报告后才知道出了问题.事后救火显得被动,不能从容面对问题. 才有了部署一套网络监控系统的想法,机缘巧合下结识了Z ...