
物联网嵌入式音视频后端【免费下载链接】NanoKVMAffordable, Multifunctional, Nano RISC-V IP-KVM项目地址https://gitcode.com/gh_mirrors/na/NanoKVM点击查看免费下载NanoKVM 是一个基于 RISC-V 芯片的迷你 IP-KVM 设备其仓库中的support目录承载了设备上除 Web 服务之外的所有辅助性功能包括图像获取编码子系统、系统状态监控、系统更新、屏幕按键驱动等。本文以 support/README_ZH.md 为骨架结合仓库中 SG2002 平台的源码kvm_system、kvm_vision与 Go 侧调用链系统讲解 support 目录的职责划分、双芯片版本差异、MaixCDK 编译环境准备以及 kvm_system / kvm_vision 两大工程从编译、拷贝到部署入固件的完整流程。读完本文你将能够独立配置编译环境、编译图像与系统监控组件并把产物集成进 NanoKVM 的/kvmapp运行目录。support 目录NanoKVM 的辅助功能集合根据 support/README_ZH.md 的说明/support目录包含 NanoKVM 的辅助性功能涵盖以下几类模块图像子系统即 kvm_vision负责 HDMI 输入图像的采集与编码输出 MJPEG/H.264 码流供上层使用系统状态监控即 kvm_system 中的状态采集逻辑实时读取网卡、HDMI、USB、HID、分辨率、帧率、编码质量等状态系统更新kvm_system 提供的恢复更新recovery update能力屏幕按键驱动OLED 显示驱动与物理按键的长按/短按逻辑少部分的系统功能如 WiFi 配网、看门狗、密码重置、主机电源控制等。这些辅助功能与主程序是分层配合的关系主程序是 Go 编写的 Web 服务server图像子系统被编译为动态库dl_lib供 Go 通过 cgo 调用而 kvm_system 则是一个独立的 C 守护进程与 Go 服务一起部署在/kvmapp目录下仓库中 kvmapp/kvm_system 即其目标部署位置。双版本架构SG2002 与 H618NanoKVM 根据主控芯片的不同分为两个版本二者的工程结构与编译环境差异较大因此仓库将其分别存放芯片平台覆盖产品型号存放目录SG2002NanoKVM-Lite / NanoKVM-Full / NanoKVM-PCIesupport/sg2002H618NanoKVM-Prosupport/h618需要说明的是当前仓库快照中仅收录了 SG2002 平台的完整工程support/sg2002下有kvm_system、kvm_vision_test与additional组件源码H618 目录未包含在本快照内。因此本文的编译与原理说明均基于 SG2002 平台展开。SG2002 平台采用 Sipeed 的 MaixCDK 构建框架。仓库中 support/sg2002/README_ZH.md 给出了完整的编译说明下面逐一展开。环境准备MaixCDK 构建框架SG2002 平台 support 部分的工程全部在MaixCDK框架下编译。编译前需要保证 MaixCDK 环境已正确配置这是后续一切编译操作的前置条件。MaixCDK 为 Sipeed 提供的 C/C 组件化构建框架负责解析组件的CMakeLists.txt与Kconfig、拉取 SDK 组件并产出可执行文件或动态库。需要理解的是NanoKVM 的 kvm_vision / kvm_system 并非独立可编译的孤立工程它们依赖 MaixCDK 内置的vision、peripheral、sophgo-middleware等组件见 support/sg2002/additional/vision/CMakeLists.txt、support/sg2002/additional/kvm/CMakeLists.txt。NanoKVM 通过additional目录对这些组件进行定制覆盖编译脚本会在构建前自动同步这些定制组件到 MaixCDK 环境中。kvm_system系统监控、更新与屏幕按键守护进程职责概述kvm_system负责 NanoKVM 的系统状态监控、系统更新、屏幕按键驱动和少量系统功能使用 MaixCDK 编译为一个独立的可执行文件。从源码结构看它由以下模块组成system_state状态采集网卡、HDMI、USB、流参数与看门狗system_ctrlWiFi 配网生成 hostapd/udhcpd/dnsmasq 配置、STA 连接、密码重置oled_ctrl / oled_uiOLED 点阵驱动与 UI 绘制libqrQR 码生成用于 WiFi 配网二维码显示hdmiHDMI 相关控制main.cpp入口启动 OLED、按键、系统状态三个线程。编译步骤按照 support/sg2002/README_ZH.md编译 kvm_system 的完整流程为保证上述 MaixCDK 环境已正确配置修改 support/sg2002/build 中的MAIXCDK_PATH和NanoKVM_PATH两个路径变量执行./build kvm_system编译 kvm_system使用scp ./kvm_system/dist/kvm_system_release/kvm_system root192.168.x.x:/kvmapp/kvm_system将产物拷贝入 NanoKVM 进行测试使用./build add_to_kvmapp将可执行文件放入/kvmapp安装包内使用./build kvm_system clean清除 kvm_system 的编译产物。注意第 4 步中的./kvm_system/dist/...是相对编译工程目录的路径实际位于仓库的 support/sg2002/kvm_system/dist/kvm_system_release/kvm_system 下dist 为编译输出目录需先完成编译才会生成。build 脚本的编译细节build 脚本除了上文提到的三个动作外还做了几件关键事情路径定义MAIXCDK_PATHMaixCDK 安装位置与NanoKVM_PATH本仓库根目录通过export暴露给子进程KVMAPP_PATH$NanoKVM_PATH/kvmapp指向固件运行目录组件同步update_lib首次编译时若检测到 MaixCDK 的components/kvm不存在会先把 MaixCDK 原生的vision、maix_i2c.cpp、sample_common_sensor.c备份到additional/original再把仓库 support/sg2002/additional 下的定制组件kvm、kvm_mmf、vision、I2C 端口实现、sophgo-middleware 样例复制进 MaixCDKcomponents目录。这也是additional目录存在的意义——对 SDK 组件做 NanoKVM 专属定制平台校验读取工程build/config/project_vars.json中的PLATFORM: maixcam字段若平台不匹配会先maixcdk distclean再从零构建maixcdk build输入2触发 from_zeroadd_to_kvmappkvm_system 的产物dist/kvm_system_release/kvm_system会被chmod x后复制到kvmapp/kvm_systemkvm_vision 的动态库目录则复制到kvmapp/server/即 server/dl_lib 的对应位置。运行时架构三个线程从 main.cpp 可以看到kvm_system 启动后并行运行三个线程共享 config.h 中定义的两大状态结构体kvm_sys_state_t与kvm_oled_state_tthread_oled_handleOLED 线程初始化 OLEDOLED_Init、OLED_ColorTurn、OLED_DisplayTurn按page/sub_page分派 UI 绘制主页面kvm_main_ui_disp、WiFi 配置页kvm_wifi_config_ui_disp并执行oled_auto_sleep自动熄屏thread_key_handle按键线程打开/dev/input/event0读取 input_event区分短按与长按config.h 中KEY_LONG_PRESS1500ms、KEY_LONGLONG_PRESS9000ms驱动页面切换、WiFi 配网流程启动、系统重启/恢复等thread_sys_handle系统状态线程周期性调用 system_state 模块刷新各项状态并同步到共享结构体供 OLED 与上层使用。状态监控的数据来源config.h 的kvm_sys_state_t结构体完整描述了 kvm_system 监控的指标及其底层数据来源这些信息可以直接在 NanoKVM 设备上验证状态字段数据来源含义eth_statecat /sys/class/net/eth0/carrier以太网链路状态wifi_statecat /sys/class/net/wlan0/carrierWiFi 链路状态tail_stateifconfig tailscale0 \| grep inet addrTailscale 是否取得 IPhdmi_state共享 VI 状态失败时原生回退HDMI 输入状态usb_statecat /sys/class/udc/4340000.usb/stateUSB 设备控制器状态hid_state是否存在/sys/kernel/config/usb_gadget/g0/configs/c.1/hid.GS*HID 键盘鼠标功能是否挂载rndis_state是否存在.../rndis.usb0RNDIS 网络功能udisk_state是否存在.../mass_storage.disk0U 盘虚拟存储功能host_pwr_statecat /sys/class/gpio/gpio504/value被控主机电源状态hdmi_width/heightcat /kvmapp/kvm/width、/kvmapp/kvm/height当前 HDMI 分辨率now_fpscat /kvmapp/kvm/now_fps实时编码帧率qltycat /kvmapp/kvm/qlty当前编码质量可见 kvm_system 与图像子系统通过/kvmapp/kvm/下的共享文件交换运行时信息。此外 system_state.h 定义了网卡状态枚举NIC_STATE_UP/DOWN/RUNNING/UNKNOWN/NO_EXIST以及一套临时看门狗机制watchdog_mode_path/etc/kvm/watchdog、watchdog_temp_path/tmp/watchdog、watchdog_file/tmp/nanokvm_wd通过create_temp_watchdog/auto_remove_temp_watchdog/check_watchdog实现系统卡死检测与自动恢复config.h 中KVM_WD_COUNT_MAX10、RM_Watchdog_times60。OLED 显示与按键驱动细节OLED 硬件通过 I2C 连接oled_ctrl.h标准型号 I2C 地址0x3DPCIe 型号为0x3C命令/数据通道分别为0x00/0x40。OLED 页面定义包含主页面KVM 初始化状态、ETH/WiFi IP、HDMI 状态、HDMI 分辨率、流类型MJPEG/H264、帧率、JPEG 质量、CPU 空闲率WiFi 配网页面配合 system_ctrl 的配网流程显示 QR 码由 libqr 生成。OLED 支持多套点阵字库6x8、8x4、16x8以及状态图标HDMI/USB/ETH/WiFi 的连接与断开图案OLED_ShowKVMState以位掩码方式刷新状态位HDMI_STATE 0x01、HID_STATE 0x02、ETH_STATE 0x04、WIFI_STATE 0x08。kvm_vision图像获取编码子系统职责概述kvm_vision是 NanoKVM 图像获取编码子系统的统称。它使用 MaixCDK 编译出动态库libkvm.so供 Go 主程序通过 cgo 调用配套的kvm_vision_test工程则用于编译和测试该动态库。核心源码位于 support/sg2002/additional/kvm对外接口定义在 kvm_vision.h。从 kvm_vision.cpp 源码可以看出该子系统直接操作底层媒体框架kvm_mmf / sophgo-middleware管理 VI视频输入分辨率、VPSS 处理与 VENC 编码器并维护编码缓冲区kvmv_data_buffer_size4、fresh_frame_discard_count5。默认参数包括VI 分辨率 1920x1080、MJPEG 默认质量 60、H264 默认质量 1000、H264 GOP 30分辨率支持范围 32x3 至 1920x1080。编译步骤按照 support/sg2002/README_ZH.md编译 kvm_vision 的完整流程为保证 MaixCDK 环境已正确配置修改 build 中的MAIXCDK_PATH和NanoKVM_PATH路径执行./build kvm_vision编译 kvm_vision_test使用kvm_vision_test/dist/kvm_vision_test_release/dl_lib/中的动态库进行测试使用./build add_to_kvmapp将动态库放入/kvmapp安装包内使用./build kvm_vision clean清除编译产物。编译成功后动态库产物对应仓库 server/dl_lib 下的一批.so文件libkvm.so、libkvm_mmf.so、libvenc.so、libvpu.so、libisp.so等其中libkvm.so即 kvm_vision 对外封装的图像接口库。对外 API 与返回码kvm_vision.h 定义了核心 API函数作用kvmv_init(_debug_info_en)初始化图像子系统可开调试信息kvmv_read_img(w, h, type, qlty, data, size)获取编码图像带自动初始化free_kvmv_data(data)释放单次读取的编码数据free_all_kvmv_data()清空全部编码缓冲区set_h264_gop(gop)设置 H264 GOP 长度set_frame_detact(en)开启/关闭帧变化检测kvmv_deinit()反初始化并释放资源kvmv_hdmi_control(en)/kvmv_hdmi_signal_active()HDMI 输出控制与信号检测kvmv_read_img的_type参数取值0为 MJPEG1/2为 H264 SPS/PPS标记 Deprecated3/4为 H264 I 帧/P 帧_qlty参数按编码类型区分取值范围MJPEG 为 50–100H264 为 500–10000。返回码语义如下返回码含义-7HDMI 输入分辨率错误-6不支持的输入分辨率需在被控主机端修改-5正在获取图像请等待-4正在修改图像分辨率请等待-3编码缓冲区已满IMG_BUFFER_FULL-2VENC 编码器错误-1未获取到图像IMG_NOT_EXIST0成功获取 MJPEG 编码图像3 / 4成功获取 H264 I 帧 / P 帧5图像未变化配合帧变化检测测试工程与 Go 侧调用链kvm_vision_test/main/src/main.cpp 演示了动态库的典型用法先kvmv_hdmi_control(0/1)打开 HDMI再kvmv_init(0)set_h264_gop(30)随后循环调用kvmv_read_img交替测试不同参数首次以 1920x1080、MJPEG、质量 3000 超时读取之后以自动分辨率、超时 60ms 读取最后free_kvmv_data释放并通过kvmv_deinit收尾。Go 侧的真实调用位于 server/common/kvm_vision.go通过 cgo 编译指令#cgo LDFLAGS: -L../dl_lib -lkvm链接动态库GetKvmVision()以单例方式调用C.kvmv_initReadMjpeg(width, height, quality)以 MJPEG 类型type0调用C.kvmv_read_img成功后将编码数据转换为 Go 的[]byte返回给上层流服务。这正是编译出动态库供 Go 调用这句话的落地实现印证了 kvm_vision 在整个 NanoKVM 软件栈中的位置图像采集 → VENC 编码 → libkvm.so → Go 流服务 → Web 前端。部署与验证把产物装进 NanoKVM编译与测试完成后产物通过两条路径进入设备手动拷贝测试scp直接推送到设备的/kvmapp/kvm_system替换守护进程或/kvmapp/server/dl_lib替换动态库适合快速迭代验证打入安装包在编译后执行./build kvm_system add_to_kvmapp或./build kvm_vision add_to_kvmapp脚本会自动把可执行文件/动态库复制到仓库 kvmapp 目录对应位置随固件打包发布。验证 kvm_system 是否正常工作可观察设备 OLED 是否按页面显示 IP/HDMI/流状态对应 oled_ui.h 的页面逻辑并检查/tmp/nanokvm_wd看门狗文件是否按预期创建/清除验证 kvm_vision 是否正常可在 Web 界面确认 MJPEG/H264 画面、帧率与质量切换生效对应kvmv_read_img的 type/qlty 参数参考 server/common/kvm_vision.go 的 ReadMjpeg 实现。小结NanoKVM 的support目录是设备侧能力的核心载体SG2002 平台NanoKVM-Lite/Full/PCIe基于 MaixCDK 框架产出kvm_system系统监控/更新/OLED/按键守护进程与kvm_vision图像获取编码动态库两类关键产物前者负责看得见、管得住后者负责看得清、传得动二者通过/kvmapp目录与 Go 主服务紧密协作。掌握 build 脚本的路径配置、组件同步与 add_to_kvmapp 机制即可独立完成这两个子系统的编译、测试与固件集成为后续二次开发如自定义 OLED 页面、调整编码参数、扩展状态监控项打下基础。赞分享物联网嵌入式音视频后端【免费下载链接】NanoKVMAffordable, Multifunctional, Nano RISC-V IP-KVM项目地址https://gitcode.com/gh_mirrors/na/NanoKVM点击查看免费下载相关推荐NanoKVM support 目录全解析SG2002 平台系统监控与图像子系统的编译部署指南NanoKVM support 目录全解析SG2002 平台系统监控与图像子系统的编译部署指南 NanoKVM 作为基于 RISC V 的 IP KVM 设备物联网嵌入式音视频后端rustup 交叉编译完全指南Host 平台与编译 Target 的安装、管理与底层原理rustup 交叉编译完全指南Host 平台与编译 Target 的安装、管理与底层原理 本指南以 rustup 用户手册中 Targets and cros开发工具F´ 的 fprime-util 开发辅助工具完全指南构建、测试与跨平台编译实战F´ 的 fprime util 开发辅助工具完全指南构建、测试与跨平台编译实战 fprime util 是 F´F Prime飞行软件与嵌入式系统框架自嵌入式系统编程上一篇3个关键优势PyStray让你的Python应用在系统托盘大放异彩下一篇猫抓插件浏览器资源嗅探的智能解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考