惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
B
Blog RSS Feed
云风的 BLOG
云风的 BLOG
G
Google Developers Blog
Recent Announcements
Recent Announcements
A
About on SuperTechFans
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Google Online Security Blog
Google Online Security Blog
Google DeepMind News
Google DeepMind News
S
Schneier on Security
S
Secure Thoughts
T
The Exploit Database - CXSecurity.com
Martin Fowler
Martin Fowler
P
Proofpoint News Feed
Security Latest
Security Latest
Jina AI
Jina AI
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Recorded Future
Recorded Future
T
Tor Project blog
有赞技术团队
有赞技术团队
H
Hackread – Cybersecurity News, Data Breaches, AI and More
N
News | PayPal Newsroom
博客园 - 三生石上(FineUI控件)
MyScale Blog
MyScale Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
Forbes - Security
Forbes - Security
D
DataBreaches.Net
人人都是产品经理
人人都是产品经理
NISL@THU
NISL@THU
C
Cisco Blogs
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Google DeepMind News
Google DeepMind News
Project Zero
Project Zero
IT之家
IT之家
T
Threatpost
Cyberwarzone
Cyberwarzone
O
OpenAI News
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
J
Java Code Geeks
P
Proofpoint News Feed
The Last Watchdog
The Last Watchdog
月光博客
月光博客
Latest news
Latest news
MongoDB | Blog
MongoDB | Blog
Apple Machine Learning Research
Apple Machine Learning Research

博客园_首页

Linux实操--组管理、权限管理和定时任务 Java + EasyExcel 实现单个接口导出多个Excel Mem0 源码解析系列(二):提示词工程的深度剖析 Openclaw TaskFlow究竟是什么?和普通Skill技能有什么区别 博文阅读密码验证 - 博客园 嘉立创开源:应该是全网MicroPython教程最多的开发板 Hermes Agent 集成实践:从协议到生产 2026年AI编程工具横评:Cursor、Codex、Claude Code、Zed、Windsurf Java程序员必看的RAG入门教程 2026 AI效率神器:Superpowers + Claude Code 保姆级教程 本地大模型部署全攻略:从 0 到 1 玩转 Ollama 【从0到1构建一个ClaudeAgent】内存管理-上下文压缩 .NET 高级开发 | 设计、实现一个事件总线框架 电子小白入门之NE555 3. WorkBuddy:隐藏玩法,一键召唤专家,让 AI 以"专家身份"给你干活 和AI一起搞事情#3:Claude Teammate 游戏开发翻车实录 【OpenClaw】通过 Nanobot 源码学习架构---(7)Memory C# .NET 周刊|2026年3月3期 我在 Debian 11 上把 K8s 单机搭起来了,过程没你想的那么顺(/opt 目录版) 深度学习进阶(七)Data-efficient Image Transformer CLI+Skill搭建浏览器AI自动化框架,告别一切重复枯燥任务 告别Token账单无底洞:OpenClaw本地部署,重塑企业数据主权的唯一解 FastAPI+Vue:文件分片上传+秒传+断点续传,这坑我帮你踩平了! SBTI 爆火后,我做了个程序员版的 CBTI。。已开源 + 附开发过程 多模态检索开始进入工程期:用 Sentence Transformers 搭建可落地的 Multimodal RAG 100多行代码实现一个最简单的Agent(用ReAct) Claude Code 通关手册(八):推荐 5 个 Hooks,代码质量提升 3 倍 老板:“有人截图了!”。安全部门:“收到,马上查暗水印!” - why技术 技术之外,皆是人间 C#/.NET/.NET Core技术前沿周刊 | 第 69 期(2026年4.01-4.12) Snack JSONPath 项目架构分析 Claude Code Buddy 小析:一个非核心功能,如何体现产品的细节完成度 AI新时代下的图床管理方案-Cloudflare图床+MCP+Skills方案指南 化繁为简:顺丰速运App如何通过 HarmonyOS SDK实现专业级空间测量 从零实现富文本编辑器#13-React非编辑节点的内容渲染 AI开发-python-langchain框架(3-23-OpenAI Functions风格Tool Calling智能助手) .NET + AI 进阶实战:基于类的技能开发 - 打造可治理的 Agent 能力模块 【从0到1构建一个ClaudeAgent】规划与协调-技能 上周热点回顾(4.6-4.12) 电子小白的工具三件套:面包板、杜邦线、万能板 单表五亿数据的查询优化 | Mysql、StarRocks 2. WorkBuddy:从“我是谁”到“帮我干活” C# 如何减少代码运行时间:7 个实战技巧 基于HelixToolkit.SharpDX 渲染3D模型 - 笺上知微 从零开始的双臂具身VLA起源及现阶段发展综述 - SkyXZ 记对 xonsh shell 的使用, 脚本编写, 迁移及调优 - pluvium27 受够了Vibe Coding的失控?换个起点,让AI事半功倍 从开始配置漏洞环境到漏洞复现流程 - 難しい 关于10年工作经验的程序员对OpenClaw的实战经验分享以及看法 - 虚无境 Any metadata 的内存布局 C# .NET 周刊|2026年3月2期 - InCerry 我帮你测过了,测试圈排名第二的 Skill 依然很牛逼 Skill Discovery | 无监督技能发现的经典工作总结 - MoonOut PbootCMS 网站内容数量多导致访问慢?这些实用优化方案帮你提速! - 家兴网络技术工作室 上下文工程是什么?过时了么?一文讲明白! - 一枫说码 网站漏洞怎么发现并修复?一篇实用指南(附完整流程) - 家兴网络技术工作室 开了 TUN 模式还是直连?90% 的人都踩过这个坑 Github日报|2026年04月12日 - AI一族 AScript扩展多种脚本语言 - rockey627 AI 学习笔记:Agent 的记忆机制 你能被装进一个文件里吗?——7 万人把同事"蒸馏"成了 AI - 我没有三颗心脏 Claude Code 通关手册(七):给 AI 装上技能包——Skills 完全指南 - 暮色之狐 在浏览器中快速编辑代码:VSCode Web 集成实践 - Newbe36524 蒸馏自己 skill?基于 Deepseek 的蒸馏器,丐版蒸馏方式,简单便捷 - To_Carpe_Diem Spring AI Aliababa和AgentScope,哪个更好? - 苏三说技术 Etsy 把 1000 个 MySQL 分片迁进 Vitess:425TB 数据背后的真正问题不是性能,而是运维规模 MicroPython LVGL基础知识和概念:底层渲染与性能优化 - FreakStudio 数据库草图算法 Python 潮流周刊#146:CPython 引入 Rust 的进展 - 豌豆花下猫 最小生成树 - mofei1116 红日靶场七:从外网入口、容器逃逸到 AD 接管的完整利用链复盘 - YouDiscovered1t 分享四款开源且实用的 Kafka 管理工具 - 追逐时光者 vLLM 权重加载机制全解析:从挑战到理想架构 LCT 学习笔记 - ACehomoxue Avalonia UI 12.0.0 正式发布:架构演进和性能飞跃 - 张善友 当 AI Agent 把调用链拉长,延迟开始成为一门生意 conhost.exe 无法显示 U+2717 - 145a 太秀了,我把自己蒸馏成了 Skill!已开源 - 程序员鱼皮 ASP.NET Core 内存缓存实战:一篇搞懂该怎么配、怎么避坑 基于 Ghostty 带有分割标签页和为 Claude 编程设计的通知终端 - BugShare AI 焊死入口:教育的“操作系统级”重塑 - 郝hai 初级Java开发工程师使用sql脚本编写代码的过程是简单而且不糊涂 - CoderOilStation Claude Code通关手册(六):MCP协议完全指南 - 暮色之狐 边框灯光环绕动画特效实现指南 - Newbe36524 开源:子木蒸馏版的 SEO 审计工具 seo-audit-skill v1.0 我所理解的Python元模型 【从0到1构建一个ClaudeAgent】规划与协调-TodoWrite - 程序员Seven Claude 和 Codex 在审计 Skill 上性能差异探究 - ACai_sec AScript如何实现中文脚本引擎 - rockey627 【渗透测试】HTB Season10 Garfield 全过程wp - dynasty_chenzi Android 开发者为什么必须掌握 AI 能力?端侧视角下的技术变革 树状数组正确性证明 - AC-wyr 你的 AI 焦虑,可能比 AI 本身更危险——ATM 机没有消灭银行柜员,但恐慌消灭了你的判断力 - 我没有三颗心脏 一个拉胯的分库分表方案有多绝望?整个部门都在救火! - 冰河团队 动态规划入门必学之走方格问题 - Ofnoname PostgREST 与 PostgreSQL 角色权限配置全解析(生产级实践) - SheepDog1998 使用 UEFI 图形输出协议 GOP 在屏幕上显示图像的方法 - 阿源- Claude Code通关手册(五):组建你的AI专家团队,子代理系统 - 暮色之狐 一个程序员到架构师的催婚路之感悟(整整10年后的催婚相亲感悟) - MisterLip 用 Agent Skill 自动生成工作周报 - 赵康
Rockchip RK3588 - 内容交互设备架构设计
大奥特曼打小怪兽 · 2026-05-07 · via 博客园_首页

content_interaction_device 是运行在 RK3588 平台上的内容交互设备软件,用于在游戏机主机和触摸显示屏之间透明插入一层交互能力。

设备接收游戏机 HDMI 输出并显示到触摸屏,同时读取触摸屏 Linux input event

  • 直通模式下,视频全屏显示,触摸事件通过 USB Gadget 多点触摸 HID 透传给游戏机;
  • 叠加模式下,屏幕划分为 HTML 内容区和游戏画面区,内容区由本机 Chromium / Qt WebEngine 处理,游戏区触摸坐标换算后转发给游戏机。

一、概述

1.1 功能概览

  • HDMI IN 通过 V4L2 流式采集,使用 MMAP 缓冲并导出 DMA-BUF
  • 当前工业主链路不经过 Qt 搬运视频帧。
  • 当前可运行显示路径为 RGA 转换后输出统一 NV12 DMA-BUF,再交给 DRM Plane 显示。
  • 真实触摸屏输入读取 /dev/input/eventX,支持 EVIOCGRAB 独占设备。
  • USB Gadget 设备时程序仍可运行,只禁用转发给游戏机主机的触摸输出。
  • 直通模式:全屏显示 HDMI 输入,右下角保留模式触发按钮。
  • 叠加模式:
    • 1080P 横屏:左侧 HTML 内容区 20%,右侧游戏区 80%。
    • 4K 竖屏:上方 HTML 内容区 10%,下方游戏区 90%。
  • 15 秒无操作自动恢复直通模式。
  • USB Gadget 模拟多点触摸屏,描述符和应用报文均支持最多 10 点触摸。

1.2 目录

.
├── CMakeLists.txt
├── app/
├── config/
├── docs/
├── scripts/
├── system/
├── touch/
├── ui/
└── video/

1.3 模块划分

1.3.1 模块边界
  • app:应用装配层,负责程序入口、运行期服务装配和跨模块协调。
  • config:读取 config/app.conf,保存静态配置和运行态共享状态。
  • system:日志、信号、udev 等通用系统能力。
  • touch:读取 Linux input event、处理 SYN_DROPPED、坐标映射和 USB Gadget HID 写入。
  • uiQt 主窗口、浏览器内容区、模式按钮和状态提示。
  • videoV4L2 HDMI INDRM 显示路径。
1.3.2 模块文档索引
  • app/README.md:运行期服务装配、布局协调、HDMI 管线控制与线程生命周期。
  • config/README.md:静态配置、运行期共享状态,以及两者的职责边界。
  • system/README.md:日志、状态事件、udev 与进程级系统能力。
  • video/README.mdRK3588 HDMI IN 采集、DRM Plane 显示、硬件视频链路。
  • ui/README.mdQt 控制层、浏览器层、交互布局和本机内容区触摸注入。
  • touch/README.md:真实触摸屏输入、热插拔监听、触摸路由和 USB Gadget 转发。

这些文档重点说明:

  • 模块为什么这样拆;
  • 关键事件流怎么走;
  • 每一层的职责边界在哪里;
  • 后续继续重构时哪些地方不能退回旧实现。
1.3.3 模块依赖关系

当前工程按 app / ui / touch / video / system / config 分层。推荐依赖方向如下:

config  -> 提供静态配置读取
system  -> 提供日志、信号、udev 等通用系统能力

app
  -> config
  -> system
  -> ui
  -> touch
  -> video

ui
  -> config
  -> system

touch
  -> config
  -> system

video
  -> config
  -> system

更直观地看:

                +------------------+
                |       app        |
                |  装配 / 协调层     |
                +------------------+
                  |      |      |
                  v      v      v
          +----------+ +------+ +-------+
          |    ui    | |touch | | video |
          | Qt控制层 | |触摸链路| |视频链路|
          +----------+ +------+ +-------+
               \         |         /
                \        |        /
                 v       v       v
                +------------------+
                | config / system  |
                | 配置与通用系统层    |
                +------------------+

依赖规则:

  • app 是唯一允许同时看到 uitouchvideo 的装配层。
  • ui 只关心 Qt 控件、模式切换、布局应用和状态显示,不能直接控制 V4L2 / DRM 线程生命周期。
  • touch 只关心 input event、坐标映射和 HID 写入,不能直接依赖 ui 控件或 video 后端实现。
  • video 只关心 HDMI INV4L2DRM 和硬件显示后端,不能直接依赖 ui 文案、按钮或窗口对象。
  • system 只提供通用能力,不依赖业务模块。
  • config 只提供配置和共享状态,不直接访问硬件。

二、架构说明

2.1 运行期服务装配

2.1.1 app_runtime_services

app_runtime_services 是运行期服务装配层,负责“创建哪些服务对象、由谁持有、信号如何连接”。它由 main_window 创建,但内部集中创建并连接:

  • video_pipe_threadHDMI IN / V4L2 采集和硬件显示线程。
  • touch_thread:真实触摸输入读取、本机内容区事件注入和 USB Gadget HID 转发。
  • udev_thread:统一分发 udev 设备事件。
  • hdmi_pipeline_controllerHDMI IN 物理连接状态、轮询兜底和视频管线启动控制。
  • touch_input_hotplug_monitor:真实触摸屏 input event 热插拔监听。
  • usb_host_hotplug_monitorUSB Host 连接状态监听。
  • app_lifecycle_controller:后台服务启动/停止顺序控制器。

app_runtime_services 会把模块内部事件转换为 app_status_event,再交给 main_window 显示状态浮层或写日志。

2.1.2 app_lifecycle_controller

app_lifecycle_controller 只负责已经创建好的服务对象什么时候启动和停止。它不创建对象,也不做业务信号连接。

启动顺序:

  1. 启动 udev_thread
  2. 调用 hdmi_pipeline_controller::start_if_connected()
  3. 启动 touch_thread

停止顺序:

  1. 停止 udev_thread
  2. 停止 touch_thread
  3. 停止 hdmi_pipeline_controller

两者关系如下:

main_window
  -> app_runtime_services          # 创建服务对象、连接信号、转换状态事件
       -> video_pipe_thread
       -> touch_thread
       -> udev_thread
       -> hdmi_pipeline_controller
       -> touch_input_hotplug_monitor
       -> usb_host_hotplug_monitor
       -> app_lifecycle_controller # 只负责 start/stop 顺序

2.2 关键事件流

2.2.1 浏览器内容区点击链路
touchscreen /dev/input/eventX
  -> touch_thread
  -> app_runtime_services 转发本机内容区触摸信号
  -> main_window::inject_local_touch()
  -> interaction_ui::inject_local_touch()
  -> touch_injector::inject()
  -> browser_panel 持有的 QWebEngineView
  -> WebEngine 内部 DOM 命中和页面点击处理

说明:

  • touch_thread 读取真实触摸屏事件,并结合 touch_frame_routertouch_routertouch_layout_mapper 判断当前触摸点属于浏览器区还是游戏区。
  • app_runtime_services 只负责连线,不做坐标变换。
  • main_window::inject_local_touch() 只负责转发,不自己构造 Qt 鼠标事件。
  • interaction_ui 再委托 touch_injector 把逻辑坐标映射到浏览器控件局部坐标,并构造 QMouseEvent 发给 QWebEngineView
2.2.2 游戏区触摸透传链路
touchscreen /dev/input/eventX
  -> touch_thread
  -> hid_touch_report_codec::encode_multi_touch_report()
  -> hid_touch_writer
  -> /dev/hidg0
  -> game console / host

说明:

  • 这条路径完全绕过 main_windowinteraction_uiQt WebEngine
  • 浏览器区和游戏区的分流判断必须稳定,否则会出现本地内容区和主机透传串路。
2.2.3 模式切换链路
mode button clicked / idle timeout
  -> interaction_mode_controller
  -> app_runtime_state::set_interaction_mode()
  -> interaction_mode_controller::mode_applied()
  -> main_window::apply_interaction_layout()
  -> display_layout_controller::apply_layout()
  -> interaction_ui::apply_layout()
  -> display_layout_controller::sync_video_output_rect()
  -> video_pipe_thread::set_output_rect()
2.2.4 HDMI 物理状态到视频线程控制链路
extcon / hdmi_hotplug_monitor poll
  -> hdmi_pipeline_controller
  -> start_if_connected() / stop() / sync_video_rect()
  -> video_pipe_thread start or stop
  -> display_layout_controller::sync_video_output_rect()

2.3 子模块要点

2.3.1 视频架构

视频主链路不再走 Qt 绘制:

  • video_pipe_thread:线程入口,只负责 V4L2 取帧、提交当前硬件显示边界、确保缓冲区回队列。
  • v4l2_dev:自动打开 HDMI RX 设备,读取驱动实际格式,申请 MMAP 缓冲并导出 DMA-BUF
  • hardware_video_presenter:当前硬件视频显示门面,负责协调 DRM pipelineframebuffer 缓存和 plane 提交。
  • video/inc/drmvideo/src/drm:集中管理 DRM card / connector / CRTC / plane 选择、DMA-BUF framebuffer 缓存和 DRM Plane 提交。

video 模块内部建议按“采集 -> 恢复 -> 渲染 -> DRM”理解:

app / ui
  -> video_pipe_thread
       -> hdmi_capture_session
            -> v4l2_dev
       -> capture_recovery_controller
            -> frame_timeout_recovery
       -> video_presenter
            -> hardware_video_presenter
                 -> drm_device_finder
                 -> drm_fb_cache
                 -> drm_plane_presenter
  -> hdmi_hotplug_monitor
2.3.2 触摸架构

当前链路只读取 /dev/input/eventX

  • touch_thread 读取 EV_ABSEV_KEYEV_SYN
  • 多点触摸使用 ABS_MT_SLOTABS_MT_TRACKING_IDABS_MT_POSITION_X/Y
  • 内容区事件发给 main_window::inject_local_touch()
  • 游戏区事件通过 hid_touch_report_codec::encode_multi_touch_report() 写入 /dev/hidg0
2.3.3 UI 架构

ui 模块专注于可见的 Qt 内容:

  • 创建和持有浏览器内容区与模式按钮
  • 把应用布局层算好的结果应用到 Qt 控件
  • 接收本机内容区触摸事件,并把它们注入到浏览器控件

三、配置与运行

3.1 配置

业务参数只从固定配置文件读取:

config/app.conf

说明:

  • HDMI IN 分辨率、像素格式和帧率由输入信号与 HDMI RX 驱动决定,程序只读取实际值,不强制设置。
  • HDMI IN 设备节点由程序自动识别 stream_hdmirx / rk_hdmirx 对应的 /dev/video*
  • 保留的采集配置只有:
    • hdmi.buffer_count
    • hdmi.frame_timeout_ms
    • hdmi.state_poll_interval_ms
  • browser.default_url 用于配置叠加模式默认网页。
  • 视频显示固定使用硬件路径,应用固定全屏运行。

3.2 构建

推荐使用:

scripts/build.sh build

手动构建:

cmake -S . -B build
cmake --build build

依赖项:

  • Qt Widgets
  • Qt WebEngineWidgets
  • libudev
  • libdrm
  • librga / im2d
  • Qt Designer(编辑 .ui 时)

如果开发板缺少 Qt5WebEngineWidgetsConfig.cmakeQt5 系统通常需要安装:

sudo apt update
sudo apt install qtwebengine5-dev libqt5webenginewidgets5 libudev-dev libdrm-dev

librga 需要使用 RK3588 板端系统或 BSP 提供的 RGA 头文件和库。

3.3 运行

先初始化 USB Gadget 触摸屏:

sudo scripts/hid/hid_touch.sh start

启动应用:

scripts/build.sh run

或直接运行:

./build/content_interaction_device

其他脚本:

scripts/build.sh build
scripts/build.sh run
scripts/build.sh start
scripts/build.sh stop
scripts/build.sh restart
scripts/build.sh status

如果日志提示 /dev/input/eventX 权限不够,需要使用有 input 设备读取权限的用户运行,或把当前用户加入 input 组后重新登录。/dev/hidg0 不存在时,程序会继续运行但不会向游戏机转发触摸,需要先执行 sudo scripts/hid/hid_touch.sh start

3.4 USB Gadget

sudo scripts/hid/hid_touch.sh start
sudo scripts/hid/hid_touch.sh stop

当前触摸 HID 报告:

  • report_length=62
  • 第 0 字节为 Report ID,当前固定为 0x01
  • 第 1 字节为 Contact Count,表示当前报告中的触点数量
  • 后续为 10 个固定触点槽,每个触点槽 6 字节:状态、触点 ID、X 低字节、X 高字节、Y 低字节、Y 高字节

应用侧 hid_touch_report_codec::encode_multi_touch_report() 输出格式与 scripts/hid/hid_touch.sh 的描述符一致。

四、维护说明

4.1 命名规范

项目自定义类、函数、变量和文件名统一采用下划线命名,例如:

  • app_config
  • main_window
  • interaction_ui
  • touch_thread
  • udev_event_monitor
  • video_pipe_thread
  • v4l2_dev
  • hardware_video_presenter
  • drm_device_finder
  • drm_fb_cache
  • drm_plane_presenter

QtV4L2 等外部 API 保留原始命名,例如 QMainWindowshowEvent()VIDIOC_DQBUF

4.2 代码审查

架构审查、单一职责、代码复用、模块化设计和命名规范的详细建议见:

docs/code_review.md

4.3 后续方向

4K 竖屏 2160x3840@60 场景下,后续优化仍围绕硬件显示链路展开:减少 Qt 参与主视频帧搬运,保持 HDMI IN 帧沿 DMA-BUF / DRM 路径提交,并继续验证不同 RK3588 内核和显示拓扑下的 Plane 选择、缩放和恢复策略。

4.4 免费 AI 注释助手

仓库已预置一套免费的线上 AI 注释方案,使用 VS Code Continue 插件配合 OpenRouter 免费模型。