PiKVM - Open and inexpensive DIY IP-KVM on Raspberry Pi
开源项目:https://github.com/pikvm
目的:在 rk3568上实现 pikvm所有功能 ,本篇主要实现 rk3568 usb Gadget (hid,ums)
硬件:
开发板既要当USB OTG口既要当键盘,又要当鼠标使用。则要生成两个hid:,一个键盘hidg0,一个鼠标hidg1。
在rockchip_linux_defconfig中添加
CONFIG_USB_CONFIGFS_F_HID = y
CONFIG_USB_CONFIGFS_MASS_STORAGE=y
./build.sh 编译kernel
./build.sh kernel
确认kernel/drivers/usb/gadget/function/f_hid.c被编译 f_hid.o
烧录固件boot.img 切换到loader模式
进入系统后执行
echo usb_hid_en > /tmp/.usb_config & /etc/init.d/S50usbdevice restart
USB功能配置成功会有如下log,表明进入USB Ready:
[ 5662.081549] android_work: sent uevent USB_STATE=CONNECTED
[ 5662.085903] configfs-gadget gadget: high-speed config #1: b
[ 5662.086881] android_work: sent uevent USB_STATE=CONFIGURED
如果需要添加两个hid,分别做keyboard,mouse
diff --git a/external/rkscript/S50usbdevice b/external/rkscript/S50usbdevice
index 1162f296f..0ad102150 100644
--- a/external/rkscript/S50usbdevice
+++ b/external/rkscript/S50usbdevice
@@ -64,6 +64,7 @@ function_init()
mkdir ${USB_FUNCTIONS_DIR}/mass_storage.0
mkdir ${USB_FUNCTIONS_DIR}/uvc.gs6
mkdir ${USB_FUNCTIONS_DIR}/hid.usb0
+ mkdir ${USB_FUNCTIONS_DIR}/hid.usb1
}
configfs_init()
@@ -342,11 +343,19 @@ bind_functions()
test $RNDIS_EN = on && syslink_function rndis.gs0
if [ $HID_EN = on ]; then
+ # Keyboard
echo 1 > /sys/kernel/config/usb_gadget/rockchip/functions/hid.usb0/protocol
echo 1 > /sys/kernel/config/usb_gadget/rockchip/functions/hid.usb0/subclass
echo 8 > /sys/kernel/config/usb_gadget/rockchip/functions/hid.usb0/report_length
echo -ne \\x05\\x01\\x09\\x06\\xa1\\x01\\x05\\x07\\x19\\xe0\\x29\\xe7\\x15\\x00\\x25\\x01\\x75\\x01\\x95\\x08\\x81\\x02\\x95\\x01\\x75\\x08\\x81\\x03\\x95\\x05\\x75\\x01\\x05\\x08\\x19\\x01\\x29\\x05\\x91\\x02\\x95\\x01\\x75\\x03\\x91\\x03\\x95\\x06\\x75\\x08\\x15\\x00\\x25\\x65\\x05\\x07\\x19\\x00\\x29\\x65\\x81\\x00\\xc0 > /sys/kernel/config/usb_gadget/rockchip/functions/hid.usb0/report_desc
syslink_function hid.usb0
+
+ # Mouse
+ echo 2 > /sys/kernel/config/usb_gadget/rockchip/functions/hid.usb1/protocol
+ echo 1 > /sys/kernel/config/usb_gadget/rockchip/functions/hid.usb1/subclass
+ echo 3 > /sys/kernel/config/usb_gadget/rockchip/functions/hid.usb1/report_length
+ echo -ne \\x05\\x01\\x09\\x02\\xa1\\x01\\x09\\x01\\xa1\\x00\\x05\\x09\\x19\\x01\\x29\\x03\\x15\\x00\\x25\\x01\\x95\\x03\\x75\\x01\\x81\\x02\\x95\\x01\\x75\\x05\\x81\\x03\\x05\\x01\\x09\\x30\\x09\\x31\\x15\\x81\\x25\\x7f\\x75\\x08\\x95\\x02\\x81\\x06\\xc0\\xc0 > /sys/kernel/config/usb_gadget/rockchip/functions/hid.usb1/report_desc
+ syslink_function hid.usb1
fi
if [ $UMS_EN = on ];then
改完后需要删除 buildroot/output/rockchip_rk3568,重新编译。
验证功能的话,直接改 buildroot/output/rockchip_rk3568/target/etc/init.d/S50usbdevice
buildroot/output/rockchip_rk3568/target/etc/init.d/.usb_config
usb_adb_en
usb_hid_en
usb_ums_en
ums_block=/dev/block/by-name/userdata
ums_block_auto_mount=on
github仓库:https://github.com/aagallag/hid_gadget_test
The HID Gadget driver provides emulation of USB Human Interface
Devices (HID). The basic HID handling is done in the kernel,
and HID reports can be sent/received through I/O on the
/dev/hidgX character devices.
复制hid_gadget_test.c 到sdk,执行
rk3568-sdk/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc hid_gadget_test.c -o hid_gadget_test -static
生成 hid_gadget_test 使用adb push 到开发板
即可开始测试,输入 g i s t r --left-shift 按下回车将发送数据
基本参数 | |
---|---|
微处理器 CPU | RK3568 /3568J/3568M |
内存 | 2GB/4GB/8GB 默认 4G |
存储 | 8GB/16GB/32GB/64GB/128GB/256GB 默认 32GB |
系统 | linux、安卓、debian、银河麒麟操作系统 |
接口参数 | |
USB 接口 | 4 路 USB2.0、2 路 USB3.0 |
以太网 | 2 路 1000M 网口 |
串口接口 | 4 路 232 接口,1 路 RS232/485 转换(默认 RS232),通过贴片切换 |
音视频信号输入 | 支持 Mic in/Line in 支持 HDMI 输入 |
支持 Line out | |
音视频信号输出 | 支持功放左右声道输出(8Ω,5W) |
支持 3.5MM 耳机左右声道输出 | |
支持 3 路显示输出。HDMI,LVDS,MIPI,EDP,其中 LVDS 和 MIPI 二选一 | |
WIFI/蓝牙 | WIFI 2.4G/5G 及蓝牙 V4.0/4.2 |
TF 卡 | 支持支持外部存储卡扩展 |
RTC 实时时钟 | 支持 |
SATA 供电接口 | 提供 12V/5v 电源;(SATA 5V/12V) |
I2C/SPI/GPIO | 8 路 GPIO、2 路 I2C,1 路 SPI |
TP I2C | 支持 |
SATA 3.0 接口 | 支持 |
PCIE 接口 | 1 路 PCIE-2X 接口,可依据需求外加扩展卡 |