测试环境 raspberry-zero-w with Linux/arm 4.14.95+ kernel
若已配置了dwc2,g_ether则需要配置pi0其他的连接方式
-
开启dwc2 在/boot/config.txt文末添加
dtoverlay=dwc2
-
开机加载libcomposite 在/etc/modules文末添加
libcomposite
-
编译
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
-
交叉编译
请自行搜索搭建树莓派的交叉编译环境,并保证源码版本与树莓派内核版本一致。
-
-
配置udev
复制规则文件到pi-zero中
# cp ./udev/50-joystick.rules /etc/udev/rules.d/
更新规则
# sudo udevadm control --reload-rules # sudo udevadm trigger
-
加载
# 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
-
卸载
# rmmod js-audio.ko
或
# make uninstall
以上步骤成功的话于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
共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
用python+vue可以简单快速的搭建一个图形测试环境,项目中使用的是Sanic后端与vue前端的组合,延迟会相对较大,可用的GUI程序运行在本地会更为合适。
事实上Nintendo Switch是支持Gadget复合设备的,可以在此基础上实现Joystick/Audio复合设备。 从USB DAC with new 4.0 update可以了解到switch支持了UAC1.0规范,而pi-zero的默认内核实现的UAC2.0,所以直接加载g_audio模块连接到switch上是不会被识别的。
-
重新编译树莓派的linux内核(
是否必要?)在路径
Device Drivers > USB support > USB Gadget Support
下选中
UAC 1.0
保存配置后重新编译内核安装即可
-
测试USB声卡
在主机端查看内核信息或者进入设置中的声音选项可以看到pi-zero模拟的声卡设备信息
-
连接到Nintendo Switch!
看来switch已经把pi-zero模拟的复合设备分别识别为手柄和USB声卡了。
关于Joy-Con可以参照这个著名的逆向工程Nintendo_Switch_Reverse_Engineering, 也可以参照我dump的Pro设备描述符pro-hid-descriptor.txt。
相对于Hori的手柄,NS的Pro提供了更加复杂和丰富的设备指令,包括HD震动、红外摄像头、陀螺仪与加速度传感器等,并且可以自行配置手柄在系统中的颜色显示。当然,协议也是相当复杂。 相关驱动我追加在了pi-ds4-dongle。
我的另一项目pi-ds4-dongle。