二次开发

更新历史
日期 版本 作者 更新内容
2025-4-10 v1.0 BuGu
  • Update docs
2024-9-26 v0.1 BuGu
  • Release docs

NanoKVM除实现KVM功能外还开放了一些数据,用于用户的二次开发,此文档用于描述这些数据的作用,以及开发的注意事项

获取推流相关数据

推流和图像参数位于/kvmapp/kvm文件夹下

  • HDMI 获取的图像原始分辨率

    • 图像宽度: /kvmapp/kvm/width
    • 图像高度: /kvmapp/kvm/height

    示例: 终端查看当前分辨率echo "$(cat /kvmapp/kvm/width) * $(cat /kvmapp/kvm/height)"

    • 注: width/height 仅读取,不可写入,kvm_stream 根据该数据实时修改vi参数,自行修改将导致vi子系统无法解析正确图像
    • 当两参数中有一个或两个全为0时,表明HDMI线缆拔出 或 HDMI 分辨率正在切换
    • width/height 两参数仅在HDMI插入,拔出,或改变分辨率时才能捕获,当 NanoKVM 在开机前插入HDMI线缆,并且HDMI输出非默认1080P分辨率时,vi子系统将无法获取正确的尺寸参数,导致无视频流输出,因此建议用户在第一次开机上电后再插入HDMI,后续每次开机会读取上次关机前保留的HDMI分辨率,故不会受到影响.
  • Stream 传输分辨率

    • Stream 传输分辨率不同与 HDMI 获取的分辨率,有时为了减小传输数据量,可以设置一个较小的传输分辨率,NanoKVM会相应的对图像缩放后再传输
    • 传输分辨率: /kvmapp/kvm/res
      • 0 : 自动,将跟随 HDMI 原始分辨率
      • 480 : 以640*480传输
      • 600 : 以800*600传输
      • 720 : 以1280*720传输
      • 1080: 以1920*1080传输
    • 注: 该参数可读可写

    示例: 终端设置 kvm_stream 以 1280*720 分辨率传输: echo 720 > /kvmapp/kvm/res

  • Stream 最大传输帧率

    • 最大传输帧率: /kvmapp/kvm/fps
    • 范围: 0-60
    • 注: 参数可读可写

    示例: 终端限制 kvm_stream 最大以 45 fps 传输: echo 45 > /kvmapp/kvm/fps

  • Stream 当前传输帧率

    • 当前传输帧率: /kvmapp/kvm/now_fps
    • 范围: 0-60
    • 注: 参数只读

    示例: 查看当前stream分辨率: cat /kvmapp/kvm/now_fps

  • 查看硬件版本

    • NanoKVM有不同的版本,版本之间硬件有所差异,详情请自行翻阅原理图,开机脚本将检测硬件差异,并保存在/etc/kvm/hw
      • alpha : 早期内测版 NanoKVM Full
      • beta : 正式版 NanoKVM Full 和 Lite
      • pcie : NanoKVM PCIe
  • network相关配置

    • /etc/kvm/server.yaml
    • 详情参考WiKi->KVM->NanoKVM Cube->网络
  • USB状态获取

    • cat /sys/class/udc/4340000.usb/state
      • configured 已连接
      • not attached 未连接
  • HDMI状态获取

    • cat /kvmapp/kvm/state
      • 1:HDMI正常
      • 0:HDMI异常
  • ETH状态获取

    • cat /sys/class/net/eth0/carrier
      • 1:网线接入
      • 0:网线断开(不准确)
  • WiFi存在

    • /etc/kvm/wifi_exist 文件存在即为wifi模块存在
  • WiFi状态获取

    • cat /kvmapp/kvm/wifi_state
      • 0:wifi存在但未连接
      • 1:wifi已连接
  • 打开watchdog(实时)

    • touch /etc/kvm/watchdog 打开
    • rm /etc/kvm/watchdog 关闭
  • 关闭ping功能

    • touch /etc/kvm/stop_ping 关闭
    • rm /etc/kvm/stop_ping 打开

USB HID模拟设备

  • 初始化: NanoKVM借助USB Gedget 模拟 USB HID 设备, 在设备开机脚本 /etc/init.d/S03usbdev 中完成了键盘,鼠标,触屏的初始化
  • 模拟键盘
    • 设备: /dev/hidg0
    • 报文:8byte:
      • 格式: |0x00|0x00|0xXX|0x00|0x00|0x00|0x00|0x00|
      • 第四位代表普通按键键值,如 F11: 0x44
      • 发送键值后需要及时释放
      • 示例: 按下F11按键
        echo -ne \\x00\\x00\\x44\\x00\\x00\\x00\\x00\\x00 > /dev/hidg0   # 按下F11键
        echo -ne \\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00 > /dev/hidg0   # 释放
        
  • 模拟鼠标
    • 设备: /dev/hidg1
    • 报文:4byte:
      • 格式: |b8 按键|s8 x轴相对位移|s8 y轴相对位移|s8 滚轮|
      • 按键
        • 左键按下:0x01
        • 右键按下:0x12 # 兼容多系统
        • 释放:0x00
        • 示例: 点按左键
          echo -ne \\x01\\x00\\x00\\x00 > /dev/hidg1  # 按下左键
          echo -ne \\x00\\x00\\x00\\x00 > /dev/hidg1  # 释放
          
      • 位移 (相对位移)
        • x/y轴相对位移为带符号数,x正值向右移动,y正值向下移动
        • 示例: 右移5格,上移1格
          echo -ne \\x00\\x05\\xff\\x00 > /dev/hidg1
          
      • 滚轮
        • 滚轮为带符号数,正值向下移动
        • 示例: 下移1格
          echo -ne \\x00\\x00\\x00\\x01 > /dev/hidg1
          
  • 模拟触屏
    • 设备: /dev/hidg2
    • 报文:6byte:
      • 格式: |按键|x轴绝对位置低8位|x轴绝对位置高8位|y轴绝对位置低8位|y轴绝对位置高8位|滚轮|
      • 按键
        • 左键按下:0x01
        • 右键按下:0x10
        • 释放:0x00
        • 示例: 点按左键
          echo -ne \\x01\\x00\\x00\\x00\\x00\\x00 > /dev/hidg2  # 按下左键
          echo -ne \\x00\\x00\\x00\\x00\\x00\\x00 > /dev/hidg2  # 释放
          
      • 位移 (绝对位置)
        • x/y均为无符号数,(0x0001,0x0001) 代表左上角, (0x7fff,0x7fff) 代表右下角
        • 示例: 鼠标移动至屏幕正中间
          echo -ne \\x00\\xff\\x3f\\xff\\x3f\\x00 > /dev/hidg2
          
      • 滚轮
        • 滚轮为带符号数,正值向下移动
        • 示例: 下移1格
          echo -ne \\x00\\x00\\x00\\x00\\x00\\x01 > /dev/hidg2
          

IO

ATX电源控制功能借助IO和外置的KVM-B实现,IO和功能对应关系如下
Alpha 版定义(包含早期NanoKVM-Cube)

功能 Linux GPIO编号
PWR LED 输入 504
PWR KEY 输出 503
RST KEY 输出 507

Beta 版定义(包含后期NanoKVM-Cube和全部的NanoKVM-PCIe)

功能 Linux GPIO编号
PWR LED 输入 504
PWR KEY 输出 503
RST KEY 输出 505
+ 读取LED状态 (以Beta为例)
    ```shell
    cat /sys/class/gpio/gpio504/value
    # 0 -> LED亮
    # 1 -> LED咩
    ```
+ 操作电源按钮 (以Beta为例)
    ```shell
    # 按下
    echo 1 > /sys/class/gpio/gpio503/value

    # 等待1s
    sleep 1

    # 抬起
    echo 0 > /sys/class/gpio/gpio503/value
    ```
+ 操作重启按钮 (以Beta为例)
    ```shell
    # 按下
    echo 1 > /sys/class/gpio/gpio505/value

    # 等待1s
    sleep 1

    # 抬起
    echo 0 > /sys/class/gpio/gpio505/value
    ```

注意事项

  • 用户自己构建的程序请不要放在/kvmapp下,每次更新将会重置文件夹内所有内容
  • 模拟键鼠操作可能与前端页面操作冲突