Skip to content

使用raspberry zero模拟nintendo switch的手柄与声卡

License

Notifications You must be signed in to change notification settings

apollotime/pi-joystick

 
 

Repository files navigation

pi zero joystick

测试环境 raspberry-zero-w with Linux/arm 4.14.95+ kernel

配置pi-zero

若已配置了dwc2,g_ether则需要配置pi0其他的连接方式

  1. 开启dwc2 在/boot/config.txt文末添加 dtoverlay=dwc2

  2. 开机加载libcomposite 在/etc/modules文末添加 libcomposite

加载模块

  1. 编译

    CMakeLists.txt仅用于IDE浏览,不能进行编译

    • 本地编译

      下载完整的linux-headers

      apt install raspberrypi-kernel-headers
      

      修改Makefile

      obj-m += js-audio.o
      js-audio-objs = driver.o audio.o joystick.o
      HEAD := $(shell uname -r)
      KERNEL := /usr/src/linux-headers-$(HEAD)/
      PWD := $(shell pwd) 
      all:
      	make -C $(KERNEL) M=$(PWD) modules
      clean:
      	make -C $(KERNEL) M=$(PWD) clean
      

      编译

      make
      
    • 交叉编译

      请自行搜索搭建树莓派的交叉编译环境,并保证源码版本与树莓派内核版本一致。

  2. 配置udev

    复制规则文件到pi-zero中

    # cp ./udev/50-joystick.rules /etc/udev/rules.d/
    

    更新规则

    # sudo udevadm control --reload-rules
    # sudo udevadm trigger
    
  3. 加载

    # insmod js-audio.ko
    

    # make install
    

    成功后可在/dev看到新增的hid设备

    # ls -al /dev/hid*
    
    crw-rw-rw- 1 root root 243, 0 3月  11 17:38 /dev/hidg0
    
  4. 卸载

    # rmmod js-audio.ko
    

    # make uninstall
    

主机端的测试(Ubuntu18.04)

以上步骤成功的话于host端会看到类似内核信息

    # dmesg
    
    [497647.192333] usb 3-1: new high-speed USB device number 12 using xhci_hcd
    [497647.340787] usb 3-1: New USB device found, idVendor=0f0d, idProduct=00c1
    [497647.340789] usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
    [497647.340790] usb 3-1: Product: HORIPAD S
    [497647.340791] usb 3-1: Manufacturer: HORI CO.,LTD.
    [497647.342165] input: HORI CO.,LTD. HORIPAD S as /devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1:1.0/0003:0F0D:00C1.00FA/input/input297
    [497647.342284] hid-generic 0003:0F0D:00C1.00FA: input,hidraw2: USB HID v1.01 Gamepad [HORI CO.,LTD. HORIPAD S] on usb-0000:00:14.0-1/input0

我们的树莓派zero已被成功识别为

USB HID v1.01 Gamepad [HORI CO.,LTD. HORIPAD S]“,“idVendor=0f0d, idProduct=00c1”

在ubuntu下可安装Joystick进行查看测试

# apt install joystick

joystick

输入指令与其他

共8个字节,前两字节为14个按键的高低8位,第三字节为方向键,后四字节为左右模拟摇杆的X与Y轴。

参照Switch-Fightstick给出的按键值,输入按键A和B

// button A
# echo -ne "\x04\x00\x00\x00\x00\x00\x00\x00" > /dev/hidg0

// button B
# echo -ne "\x02\x00\x00\x00\x00\x00\x00\x00" > /dev/hidg0

简单的GUI测试

用python+vue可以简单快速的搭建一个图形测试环境,项目中使用的是Sanic后端与vue前端的组合,延迟会相对较大,可用的GUI程序运行在本地会更为合适。

模拟声卡(New)

事实上Nintendo Switch是支持Gadget复合设备的,可以在此基础上实现Joystick/Audio复合设备。 从USB DAC with new 4.0 update可以了解到switch支持了UAC1.0规范,而pi-zero的默认内核实现的UAC2.0,所以直接加载g_audio模块连接到switch上是不会被识别的。

  1. 重新编译树莓派的linux内核(是否必要?)

    在路径

    Device Drivers > USB support > USB Gadget Support

    下选中

    UAC 1.0

    编译支持UAC 1.0

    保存配置后重新编译内核安装即可

  2. 测试USB声卡

    在主机端查看内核信息或者进入设置中的声音选项可以看到pi-zero模拟的声卡设备信息

    模拟USB声卡

  3. 连接到Nintendo Switch!

    连接

    看来switch已经把pi-zero模拟的复合设备分别识别为手柄和USB声卡了。

模拟Joy-Con与Pro手柄(New)

关于Joy-Con可以参照这个著名的逆向工程Nintendo_Switch_Reverse_Engineering, 也可以参照我dump的Pro设备描述符pro-hid-descriptor.txt

相对于Hori的手柄,NS的Pro提供了更加复杂和丰富的设备指令,包括HD震动、红外摄像头、陀螺仪与加速度传感器等,并且可以自行配置手柄在系统中的颜色显示。当然,协议也是相当复杂。 相关驱动我追加在了pi-ds4-dongle

模拟的Pro手柄

转接PS4蓝牙手柄

我的另一项目pi-ds4-dongle

参考项目

Switch-Fightstick

SwitchInputEmulator

About

使用raspberry zero模拟nintendo switch的手柄与声卡

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C 41.8%
  • Vue 19.3%
  • JavaScript 13.2%
  • C++ 8.9%
  • Python 7.7%
  • CSS 5.0%
  • Other 4.1%