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 \n", 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 的支持。