zoukankan      html  css  js  c++  java
  • nes 红白机模拟器 第8篇 USB 手柄支持

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

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

    usb 2-2.2: new full-speed USB device number 5 using uhci_hcd
    usb 2-2.2: New USB device found, idVendor=20bc, idProduct=5500
    usb 2-2.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
    usb 2-2.2: Product: Android Gamepad
    usb 2-2.2: Manufacturer: ShanWan
    input: 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/input5
    hid-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 <stdio.h>
     6 #include <sys/types.h>
     7 #include <sys/stat.h>
     8 #include <fcntl.h>
     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 
    ", 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 的支持。

  • 相关阅读:
    Can't use Subversion command line client: svn
    SpringMVC配置easyui-datagrid
    找不到提交和更新按钮,subversion不见了,无法更新和上传代码
    静态资源[org.springframework.web.servlet.PageNotFound]
    Field 'id' doesn't have a default value
    MySql 插入数据中文乱码
    Junit 测试 Spring
    mybatis动态SQL
    Mybatis 3.3.0 Log4j配置
    MappingJacksonHttpMessageConverter过期
  • 原文地址:https://www.cnblogs.com/ningci/p/6934453.html
Copyright © 2011-2022 走看看