# BIG8K **Repository Path**: hufz_admin/XLL ## Basic Information - **Project Name**: BIG8K - **Description**: 新4K底板、电源板、软件代码上位机 - **Primary Language**: C# - **License**: BSD-3-Clause - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 6 - **Forks**: 4 - **Created**: 2024-06-14 - **Last Updated**: 2026-09-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # BIG8K 新8K点灯平台、OLED模组点屏测试平台 ## 项目简介 BIG8K是一个新8K点灯平台、OLED模组点屏测试平台,包含4K底板、电源板、软件代码上位机。 ## 硬件架构 新8K点灯平台由以下组件组成: - **8K底板**:核心承载板卡,集成多种显示接口( MIPI DSI、HDMI、DisplayPort) - **电源板**:宽电压输入,支持多种电压输出,具多重安全保护 - **接口板**:适配不同规格的FPC柔性电路板 **支持的显示规格:** - 4K@120Hz - 8K@30Hz **功能特点:** - 自带按键以及USB接口 - USB接口可用于连接鼠标、USB网卡、U盘等 - 支持通过鼠标或按键控制8K平台读取U盘的图片或内部存储的图片 - 实现图片显示以及视频播放功能 - 支持开机自动播放U盘内容功能 ## 软件架构 - **Linux + Python** - **RK3588核心板**:ARM架构八核处理器,支持8K视频编解码 ## 通信方式 通过C#编写的上位机通过ADB或者网口与8K平台通信: - **网络地址默认配置**:192.168.1.100 或 192.168.137.100 ## 软件操作 上位机(`Big8K.exe`)通过 **USB ADB** 或 **网口**(`192.168.1.100` / `192.168.137.100`)与 8K 平台(RK3588)通信。启动后自动进行 VID_2207 USB 探测与连接检测,状态栏随连接状态变色(绿=已连接 / 红=断开),左下方日志窗(`txtBoxShow`)实时输出操作记录(自动存档到 `LOG\log.txt`)。 ### 主界面布局 - **菜单栏**:文件(&F)(打开/保存 LCD 配置)、MIPI(&M)(载入/保存 DDIC Code)、工具(8K图片管理 / 代码转换)、IP地址设定、海思窗口、外观(&A)(配色切换)、更新(&U)(检查更新) - **Tab 页**(共 6 个): | Tab | 名称 | 用途 | |-----|------|------| | tabPage1 | 显示参数 | 点屏与 Pattern 操作、连接方式切换 | | tabPageCMDX | 多窗口命令 | MIPI/脚本指令逐行发送(Form_CMDX) | | tabPage2 | 电源设定 | 电源相关操作 | | tabPage4 | 脚本编辑 | Python 脚本树 + 编辑/运行/设开机运行 | | tabPage3 | 开发工具箱 | 一键装机、Install App/Tools、内核升级等 | | tabPublic1 | 动态容器 | 嵌入海思IC控制 / 图片管理 / 代码转换子窗体 | - 底部 `tabControl_light51`:DBV / Tcon / KEY 三个快捷页 ### 1. 连接与设备管理 - **接口切换**:选择「USB ADB」或「网口」(`rdoInterfaceADB` / `rdoInterfaceETH`)。程序自动探测:优先尝试 `adb connect 192.168.1.100` → `192.168.137.100`,超时回落到 USB ADB。 - **连接检测**(`adb_link_detect`):连接成功后自动同步板端时间、读取 IP、校验内核版本(5.10.209-rk3588),并启动网络心跳(断开自动提示)。 - **IP 地址设定**:菜单中一键设置开发板静态 IP(192.168.1.100 / 192.168.137.100),通过 netplan yaml 下发并 `apply`。 - **断开**:`btnNetDisconnect` 执行 `adb disconnect`;「Reset」按钮复位 MIPI 寄存器并重启板端。 ### 2. 纯色画面点屏(显示参数页) | 按钮 | 功能 | 底层动作 | |------|------|----------| | R / G / B / W | 点亮对应纯色画面 | `fbShowPattern "255000000"` / `"000255000"` / `"000000255"` / `"255255255"` | | Gray 切换 | 显示当前 R/G/B 值调出的颜色 | `fbShowPattern "RRRGGGBBB"` | | 灰度三通道(numPatternR/G/B + 联锁) | 分别设定 R/G/B 灰度值,联锁时三通道同步 | 调 `ShowGrayPattern(...)` | | 写入Pattern参数(btnPatternW) | 将三通道数值组色上屏 | `fbShowPattern` | | **Set default pattern L128**(btn_self_turn_on_pure) | 推送 `fb_RunApp\default\` 开机刷白/刷灰脚本并立即运行 | `ADB_AutorunApp_Setup` → `chenfeng-service.service` 拉起 | ### 3. 图片显示 1. **浏览目录**:点击载入画面文件夹(`btnBrowsePic`),递归加载该目录下所有 `.bmp` 到图片列表(路径记忆于 `others\Picaddr.txt`)。 2. **双击送图**(`listBox3_BMPFile_DoubleClick`):双击列表中的图片即显示。程序将图片上传至板端 `/vismm/fbshow/bmp_online/`,再执行 `python3 show_resize_bmp.py <图片> fit` **等比缩放适配屏幕**(异尺寸图片自动居中+黑边,不再歪斜)。 3. **自动播放**(`btnAutoShow`):按设定间隔(`numPlayDelayTime` 秒)逐张遍历列表显示。 4. **截屏上屏**(`btn_Bmp_show`):截取电脑主屏幕 → 旋转/适配规格 → 存入 `screenshot_8k.bmp` → 推送并 `fbShowBmp` 显示。 5. **抓图**(`btn_Pull_pic`):从板端 `adb pull /vismm/fbshow/image` 到桌面 `8K_image`。 6. **Web 页面上传**:`btnCreatWebService` 推送内置 `web_server`(server.py + 上传页面 + systemd 服务),浏览器访问板端网页即可上传图片/视频到板端目录。 ### 4. 视频播放 1. 通过「Upload / 上传文件到」上传视频到板端 `/vismm/fbshow/movie_online/`。 2. 选中视频后点击 **PLAY**(`btnVideoPlay`):执行 `python3 /vismm/fbshow/videoPlay.py <视频> zoomMode showframerate` 播放。 3. 支持 **暂停 / 停止**(写 `/dev/shm/pause_signal` / `/dev/shm/stop_signal`)。 4. **Demo视频播放**(`btn_graphical_target`):推送 `fb_RunApp\default_movie\` 的播放脚本,设为开机自动播放循环。 ### 5. 脚本执行 - **脚本编辑页(tabPage4)**:左侧树形工程目录(双击节点打开代码),右侧代码编辑区;支持 Open / Save / Clear,右键菜单「运行」发送脚本到板端。 - **运行选中脚本**(`btnRunScript`):`python3 /vismm/fbshow/<脚本名>` 远程执行;脚本可直接操作 framebuffer 实现点屏。 - **设为开机运行**(`btnSetscriptAutorun`):将脚本复制为 `/vismm/autorun.py` 并重启 `chenfeng-service` 服务。 - **开发工具箱**:`Install App`(推送 vismpwr、fbShowBmp/Pattern/Movie、xdotool、repack_initrd.sh 等 20+ 板端工具到 `/usr/local/bin` 与 `/vismm`);`Install tools`(安装 dist-packages 下的 Python 库与依赖)。 ### 6. MIPI 指令调试 - 通过菜单 **MIPI(&M)** 载入 DDIC Code,或在使用 `Form_CMDX` 多窗口命令页逐行发送。 - 支持命令:`MIPI_WRITE/REGW/REGW29`(写寄存器,走 `vismpwr -hs`)、`MIPI_READ/REGR`(读寄存器,走 `vismpwr -r`)。 - 底层工具 `vismpwr` 完整用法见下文「MIPI指令调试」章节与板端执行文件。 ### 7. 烧录与系统升级 | 按钮 | 功能 | 动作 | |------|------|------| | **1 Step Install**(btn_One_key_Intsall_System) | 一键装机 7 步流水线 | 修复 ADB Shell → 安装 Python Lib → 安装刷图 App → 释放 `/vismm` 权限 → 开机自启刷 L128 → 更新 IP → 切换 multi-user 模式 | | **新版内核升级**(btn_updateImage) | 升级内核镜像 | 选择 file → push 到 `/boot/Image-5.10.209-rk3588` → `sync` | | CMD line:multi-user / 图形界面切换 | 切换启动模式 | `systemctl set-default multi-user.target` / `set-default graphical.target` + reboot | | Reset | 重启平台 | 复位 MIPI 寄存器(旧版 `/proc/chenfeng_mipi`) + `reboot` | ### 8. 开机自动播放(U盘/内部存储) - **循环播放图片**(`btn_self_turn_on`):推送 `fb_RunApp\default_bmp\`(autorun.py + show_resize_bmp.py)到板端设为开机自启。 - **Set default pattern**(`btn_self_turn_on_pure`):开机刷白/刷灰。 - **Demo视频播放**(`btn_graphical_target`):开机循环播放指定视频。 - 三者统一走 `ADB_AutorunApp_Setup`:同时拷贝 `autorun.py` 到 `/vismm/fbshow/autorun.py` 与 `/vismm/autorun.py`(chmod 444),并将 `chenfeng-service.service` 安装为 systemd 服务(enable + restart),开机自动拉起。 - **导图**(`btn_Send_pic`):推送整个图片工程到 `/vismm/fbshow/image/<文件夹>`,替换 autorun 模板中的路径占位符并重启播放。 ### 9. 工具子窗体 - **8K图片管理**(Form_pictureManage):图片浏览、无线/有线/网络三种 adb 连接(`-s ip:5555`)、上传。 - **海思IC控制**(Form_Hisi):DBV 读写(0x51 亮度寄存器)。 - **代码转换**(Form_txtProcess):DDIC 代码格式转换(海思 Code 转换)。 - **写参考**(Form_wrefer):简单文本参考窗。 ## 板端核心命令 上位机通过 ADB Shell 调用板端工具(位于 `/vismm/fbshow/` 或 `/usr/local/bin/`): | 工具 | 用途 | |------|------| | `fbShowBmp` | 图片显示 | | `fbShowPattern` | 纯色 / 灰阶显示 | | `fbShowMovie` | 视频播放 | | `show_resize_bmp.py` | 图片等比缩放适配屏幕(fit 居中+黑边) | | `videoPlay.py` | 视频播放(zoomMode / showframerate) | | `vismpwr` | MIPI DSI 寄存器读写 | | `xdotool` | 板端鼠标/按键模拟 | | `repack_initrd.sh` | initrd 重打包(点屏参数注入) | **上位机调用命令示例:** ```bash # 显示图片 adb shell /vismm/fbshow/fbShowBmp /vismm/fbshow/bmp_online/xxx.bmp # 显示纯色灰阶画面(RRRGGGBBB) adb shell /vismm/fbshow/fbShowPattern "000255000" # 图片等比缩放适配后显示 adb shell python3 /vismm/fbshow/show_resize_bmp.py /vismm/fbshow/bmp_online/xxx.bmp fit # 播放视频 adb shell /usr/bin/python3 /vismm/fbshow/videoPlay.py /vismm/fbshow/movie_online/xxx.mp4 zoomMode showframerate ``` ## MIPI指令调试 平台支持 MIPI DSI 接口屏幕的指令调试功能,通过 `vismpwr` 工具(新版固件)或 proc 文件系统(旧版固件)实现。 > `vismpwr` 为 ARM aarch64 平台可执行文件,随上位机 `fb_operate` 目录分发,由上位机自动推送至板端 `/usr/local/bin/vismpwr`;也可手动 `adb push fb_operate/vismpwr /usr/local/bin/vismpwr` 后使用。 ### vismpwr 语法 ``` vismpwr [-0|-1|-b] [-lp|-hs] (写模式) vismpwr -r [-0|-1] [-lp|-hs] (读模式) vismpwr -h | --help (帮助) vismpwr -v | --version (版本) ``` ### 选项 | 选项 | 说明 | |------|------| | `-0` | 操作 `/dev/mipi_dsi0`(**默认**) | | `-1` | 操作 `/dev/mipi_dsi1` | | `-b`, `--both` | **同时写入** DSI0 和 DSI1 两条通道(仅写模式) | | `-lp`, `--lp` | 使用 **LP(Low Power)模式**(**默认**) | | `-hs`, `--hs` | 使用 **HS(High Speed)模式**,用于 video mode 面板 | | `-r` | **读模式**,读取寄存器值 | | `-h`, `--help` | 显示帮助信息 | | `-v`, `--version` | 显示版本信息 | > ⚠️ 读模式不支持 `-b` / `--both` 选项(同时读取两条通道无意义)。 ### 写模式 ``` vismpwr [-0|-1|-b] [-lp|-hs] ``` | 参数 | 类型 | 说明 | |------|------|------| | `data_type` | hex (1 字节) | DCS 命令类型 | | `delay` | hex (1 字节) | 命令间延时(毫秒级) | | `payload_len` | hex (1 字节) | payload 字节数 | | `payload...` | hex (n 字节) | 实际载荷数据 | ```bash # LP 模式(默认)写入 3 字节数据到寄存器 0x51 vismpwr 29 00 03 51 12 34 # HS 模式写入 vismpwr -hs 29 00 03 51 12 34 # 同时写入两条 DSI 通道 vismpwr -b -hs 29 00 03 51 12 34 # 只写 DSI1 vismpwr -1 29 00 03 51 12 34 ``` ### 读模式 ``` vismpwr -r [-0|-1] [-lp|-hs] ``` | 参数 | 类型 | 说明 | |------|------|------| | `-r` | 标志 | 指定为读模式 | | `read_len` | hex (1 字节) | 期望读取的字节数 | | `read_reg` | hex (1 字节) | 目标寄存器地址 | 返回的字节以十六进制形式打印到 stdout,空格分隔。 ```bash # LP 模式读取寄存器 0x51(亮度),读 2 字节 vismpwr -r 02 51 # HS 模式读取(video mode 面板) vismpwr -r -hs 02 51 # 从 DSI1 读取 vismpwr -r -1 02 09 ``` ### 协议细节 **写操作数据封装:** ``` LP 模式: [data_type][delay][payload_len][payload...] ← 3 字节头部 HS 模式: [data_type][delay][payload_len][0x00][payload...] ← 4 字节头部 ``` **读操作流程:** 1. 发送 `set_max_pkt` 命令(dt=0x37),设定读取长度 2. 发送 `read_cmd` 命令(dt=0x06),携带寄存器地址 3. 从设备文件 `read()` 取回数据 **重试策略:** 写操作失败后最多重试 5 次,每次间隔 1ms。 ### 常见 DCS 命令参考 | data_type | 名称 | 说明 | |-----------|------|------| | `05` | DCS Short Write | 无参数短写 | | `15` | DCS Short Write 1P | 带 1 参数短写 | | `29` | DCS Long Write | 长写(本工具主要使用) | | `06` | DCS Read | 读请求 | | `37` | Set Maximum Return Packet Size | 设定读取长度 | | `11` | Sleep Out | 退出休眠 | | `28` | Display Off | 关显示 | > 注:payload 中第一个字节通常为 DCS 命令码(如 `51` = Write Brightness, `11` = Sleep Out)。 ### 典型应用场景 1. **调试屏幕初始化序列** — 逐条验证 MIPI DSI DCS 命令 2. **读取面板状态寄存器** — 例如 `0x51` 亮度、`0x09` 显示状态、`0x0A` 电源模式、`0xDA` 制造商 ID 3. **验证 DSI 通道连通性** — 读写测试确认硬件链路正常 4. **生产环境配置注入** — 批量烧录同型号屏幕参数 5. **HS/LP 模式切换验证** — 确认 video mode 面板的 HS 通信正常 ### 注意事项 - 写模式 payload 参数个数必须与 `payload_len` 指定的值一致 - 所有数值参数均为 **十六进制**(不含 `0x` 前缀),单字符如 `1` 解析为 `0x01` - 上位机已封装 vismpwr 调用(写:`shell vismpwr [-hs] ...`,读:`shell vismpwr -r {len:X2} {reg:X2}`),详见 `API/CommonControl.cs`;命令行直接调试时在板端 shell 中执行上述命令 ### 旧版固件 旧版固件通过 proc 文件系统下发 MIPI 指令: ```bash echo "data" > /proc/chenfeng_mipi/chenfeng_mipi ``` ## Python脚本开发 开发板端Python脚本可直接操作FrameBuffer实现自定义显示功能: ### FrameBuffer操作基础 ```python import mmap import cv2 import numpy as np class FrameBuffer: def __init__(self): self.fb_path = '/dev/fb0' # 获取分辨率 # self.screen_width, self.screen_height = ... self.fb_size = self.screen_height * self.screen_width * 4 def update(self, image): with open(self.fb_path, 'r+b') as fb: mm = mmap.mmap(fb.fileno(), self.fb_size) # RGB转BGRA image = cv2.cvtColor(image, cv2.COLOR_RGB2BGRA) mm.write(image.tobytes()) mm.close() ``` ### 鼠标交互 USB鼠标事件通过Linux输入子系统读取: - 事件类型1:按钮事件(左键272,右键273) - 事件类型2:移动事件(X轴0,Y轴1,滚轮8) ### 按键控制 系统按键通过ADC读取: ```python # 读取按键值 result = subprocess.run("cat /proc/chenfeng_adckey/chenfeng_adckey", shell=True, capture_output=True, text=True) key_value = result.stdout.strip() ``` ## 文件目录说明 ### 上位机(`8K_software/PC-SW`) | 目录/文件 | 说明 | |------|------| | `MainForm.cs` + `MainForm_*.Designer.cs` | 上位机主窗体(点屏、图片、脚本、烧录等核心逻辑) | | `API/` | 通信与板端控制封装(`CommonControl.cs` 执行 adb/shell、`AdbAPI.cs` 设备操作、`NetBaseRemoteOperations.cs` 网络连接池) | | `others/` | DeviceMonitor(WMI USB 探测 + 心跳)、Picaddr/Movieaddr 路径记忆、uEnv 配置 | | `ToolForm/` | 子窗体:Form_CMDX(多窗口命令)、Form_Hisi(海思IC)、Form_pictureManage(图片管理)、Form_txtProcess(代码转换)等 | | `fb_operate/` | 板端画面工具与脚本:`fbShowBmp`/`fbShowPattern`/`fbShowMovie`(画面/视频)、`show_resize_bmp.py`(等比缩放送图)、`videoPlay.py`、`vismpwr`(MIPI读写)、`xdotool`、`repack_initrd.sh` 等 | | `fb_RunApp/` | 开机自启脚本:`default`(刷白/刷灰)、`default_bmp`(循环图片)、`default_movie`(循环视频)、`web_server`(上传服务)、`video_play` | | `Resources/` | adb.exe + AdbWinApi、netplan IP 配置 yaml、调试脚本 | | `Python_lib/` / `dist-packages/` | 板端 Python 依赖(Pillow whl、pyserial 等),运行时推送到板端 | | `bin/8Big8K/` | 编译输出 = 发布物(绿色部署目录,被 gitignore) | | `update/` | 运行时数据(UITheme 主题、更新源覆盖文件等) | ### 仓库根 | 目录/文件 | 说明 | |------|------| | `build/` | 打包工具:`installer.nsi`(NSIS 安装包)、`publish-update.ps1`(打包+发布脚本) | | `release/` | 发布产物:`Big8K-<版本>.zip`(绿色版/更新包)、`Big8K-Setup-1.0.0.exe`(安装包)、`latest.json`(更新清单);被 gitignore | | `Linux/` | 底层系统固件 | | `8K_Hardware/` | 硬件资料(FPC、接口板) | | `DOC/` | 文档资料 | | `DEMO/` | DEMO 制作相关资料(含 `autorunUSB.py` 综合显示脚本范例) | | `readme/` | 补充文档(VESA DSC 参数详解、点屏调试、硬件架构) | | `BIG8K技术文档.md` / `快速上手SOP.pdf` / `Python脚本开发指南.md` | 技术文档 / 上手手册 / Python 脚本开发指南 | ### 板端(8K 平台) | 路径 | 说明 | |------|------| | `/vismm/fbshow/` | 上位机推送的画面工具、脚本与图片目录(bmp_online/、movie_online/、image/) | | `/vismm/autorun.py` + `/vismm/fbshow/autorun.py` | 开机自启脚本(systemd `chenfeng-service.service` 拉起) | | `/usr/local/bin/vismpwr` | MIPI DSI 寄存器读写工具 | | `/etc/systemd/system/chenfeng-service.service` | 开机自启服务 | ## 发布说明 ### 发布产物 每次发布生成两类产物,存放于仓库根 `release/` 目录(已被 `.gitignore` 忽略,不入库): | 产物 | 命名 | 用途 | |------|------|------| | **绿色压缩包** | `Big8K-<版本>.zip` | 免安装版,解压即用;也是自动更新的更新包 | | **NSIS 安装包** | `Big8K-Setup-<版本>.exe` | 安装版,安装到 `%LOCALAPPDATA%\Programs\Big8K` | | **更新清单** | `latest.json` | 自动更新用,记录最新版本号 / 更新说明 / 压缩包 URL / SHA256 / 大小 | > 版本号 = 编译产物 `Big8K.exe` 的文件时间戳,格式 `yyyy.MM.dd.HHmm`(如 `2026.09.04.0928`),天然单调递增、可直接比较。 ### 两种部署方式 #### 1. 绿色压缩包(免安装) - 解压 `Big8K-<版本>.zip` 到任意目录,运行 `Big8K.exe` 即可。 - 依赖同目录的 `Python_lib`、`fb_RunApp`、`Resources` 等子目录,请整体解压、勿单拷 exe。 - 程序内置自动更新,首次启动后后台检查共享盘更新源,有新版本会弹窗提示。 #### 2. NSIS 安装包(推荐) - 运行 `Big8K-Setup-<版本>.exe`,默认安装到 `%LOCALAPPDATA%\Programs\Big8K`(无需管理员权限)。 - 安装后自动创建桌面快捷方式与开始菜单项,注册 HKCU 卸载项(控制面板可卸载)。 - 安装器会写注册表 `InstallLocation`,自更新器据此定位安装目录完成文件替换。 ### 自动更新机制 程序内置自动更新(`AppUpdater` + `UpdateEngine` + `SelfUpdater`): - **检查时机**:启动后延迟 10s 首检,之后每 6 小时检查一次;也可通过菜单「更新(U) → 检查更新(C)」手动触发。 - **更新源**:默认 `\\10.71.48.8\File_Light\00_2K_8K_Vis-whale\8K\release`;可在程序目录下创建 `update\update_source.txt` 覆盖(内容为更新源路径;置空或删除则禁用自动更新)。 - **更新流程**:发现新版本弹窗确认 → 下载更新包 → SHA256 校验 → 解压到临时目录 → 自更新器替换文件 → 自动重启。 - **安全**:校验失败即中止,不替换任何文件。 ### 点屏配置同步(OLEDConfig) 上位机支持从共享盘**按需同步 OLED 点屏配置**(`.bin` 配置文件),便于多人协作共享屏体配置库: - **菜单入口**:「更新(U) → 点屏配置同步(&L)...」 - **远端配置库**:`\\10.71.48.8\File_Light\00_2K_8K_Vis-whale\8K\OLEDConfig\`,含 `config-index.json` 清单(每个 .bin 的相对路径 / 大小 / SHA256)+ 按屏体型号分目录的 `.bin` 文件。 - **本地存储**:`%APPDATA%\8Kcfg\LCDConfig\`(与最近配置记录 Lastlog.inf 同族,卸载/升级不丢)。 - **使用流程**:打开同步窗体 → 自动拉取远端清单(文件名/目录/大小/本地状态)→ 勾选需要同步的配置 → 点「同步选中」按需下载 → SHA256 校验后存入本地 → 之后用「文件 → 打开LCD配置」浏览到该目录即可加载。 - **配置库发布**(管理员):`powershell -ExecutionPolicy Bypass -File build\publish-oledconfig.ps1`,将仓库 `点屏配置及参考文件\` 下所有 .bin 同步到共享盘 OLEDConfig 并更新清单。 - **安全**:下载前校验 SHA256,与清单不一致则中止,不写入本地。 - **状态标记**:窗体中「已同步 / 未下载」区分本地已有配置与可下载配置,已同步项重复下载会被跳过(校验一致)。 ### 发布流程 发布新版(绿色压缩包 + 更新清单): ```powershell # 1. 先编译上位机(生成最新 Big8K.exe) # 用 Visual Studio 或 MSBuild 编译 Big8K.csproj (Debug 或 Release) # 2. 打包 + 发布(在仓库根目录执行) powershell -ExecutionPolicy Bypass -File build\publish-update.ps1 -Notes "本次更新说明" ``` 该脚本会自动: 1. 将 `8K_software\PC-SW\bin\8Big8K\` 打包为 `Big8K-<版本>.zip` 2. 生成 `latest.json`(含版本 / 说明 / SHA256 / 大小) 3. 拷贝 zip + latest.json 到共享盘更新源目录(不可达时保留本地并提示) 发布 NSIS 安装包(可选,新电脑首次安装用): ```powershell # ⚠️ makensis 的相对路径基准是「脚本所在目录」,不是当前工作目录。 # 直接跑 build\installer.nsi 会把 8K_software\... 解析成 build\8K_software\... # → 报 "File: ... Big8K.exe -> no files found"。必须把脚本临时复制到仓库根编译: cd E:\Resource\8Big8K Copy-Item build\installer.nsi .tmp-installer.nsi makensis /V2 /DAPP_VERSION=2026.09.07 .tmp-installer.nsi Remove-Item .tmp-installer.nsi # 产物: release\Big8K-Setup-2026.09.07.exe ``` > **APP_VERSION 只能传 3 段**(如 `2026.09.07`):脚本里 `VIProductVersion "${APP_VERSION}.0"` 要求 4 段, > 传 4 段时间戳(`2026.09.07.1322`)会变成 5 段导致编译失败。 > 因此**安装包名是日期级、zip 是分钟级**(如 zip 为 `2026.09.07.1322`,Setup 为 `2026.09.07`)。 > **makensis 从哪来(本机未装 NSIS 时)**:sourceforge / chocolatey / winget 在本网络均不通(000/502), > 可用 nuget 获取完整 NSIS 3.11 Unicode 版: > ```powershell > curl -L -o nsis.nupkg https://api.nuget.org/v3-flatcontainer/avaloniaui.parcel.deps.nsis/3.11.0-rc1/avaloniaui.parcel.deps.nsis.3.11.0-rc1.nupkg > # nupkg 是 zip,解压后 tools\net8.0\win-x86\Bin\makensis.exe 即可用(含 MUI2 / Stubs / Plugins) > ``` > 若共享盘不可达,zip 与 latest.json 会保留在 `release/` 目录,可手动拷贝到更新源目录后供客户端自动更新。 ### 共享盘发布目录 当前发布目录:`\\10.71.48.8\File_Light\00_2K_8K_Vis-whale\8K\release` - `Big8K-<版本>.zip` — 更新包 / 绿色版 - `Big8K-Setup-<版本>.exe` — NSIS 安装包 - `latest.json` — 更新清单(始终指向最新版本) ### 发布打包踩坑 以下为实际踩过的坑,发布打包前务必核对: 1. **NSIS `File /r "dir\*"` 会平铺子目录**(最大坑) - `File /r "Resources\*"` 会把 `Resources\` 下的文件**全部平铺到安装根目录**,丢目录名。 - 结果:`adb.exe` 被装到根目录,而程序按 `Application.StartupPath\Resources\adb.exe` 查找 → **找不到 adb → 新电脑装完连不上开发板**(提示"设备未连接!")。`fb_operate\vismpwr`、`fb_RunApp\default\autorun.py` 等也会平铺,板端推送逻辑同样失效。 - **正确写法**:`File /r "Resources"`(不带 `\*`),NSIS 会保留目录结构。 - 排查:打包后用 7-Zip 打开安装包核对 `Resources\adb.exe`、`fb_operate\vismpwr` 是否在正确子目录。 2. **Windows `core.autocrlf=true` 把板端脚本转成 CRLF** - git 检出时把所有文本文件转 CRLF,板端 shell 执行报 `repack_initrd.sh: /bin/bash^M: bad interpreter`。 - **根治**:仓库根 `.gitattributes` 强制 `*.sh` / `*.py` / `*.service` / `*.yaml` / `uEnv*.txt` / `fbShow*` / `vismpwr` / `xdotool` 保持 `eol=lf`。 - 仓库 blob 本身是 LF,但**工作区副本和 `bin\8Big8K\`(被 gitignore)会是 CRLF**,直接打进 zip/安装包就坏。打包前用 `grep -rlP "\r$" bin\8Big8K --include="*.sh"` 检查,或统一转 LF 后再打包。 - **⚠️ 不要删除 `.gitattributes`**:它与 `.gitignore` **职责不同、不重复**—— - `.gitignore` 管"哪些文件**不进**版本控制"(`bin/`、`release/`、`*.zip`),对已跟踪文件**无**行尾效果; - `.gitattributes` 管"已跟踪文件**如何被 git 处理**",`*.sh text eol=lf` 是逐文件强制规则,**优先级高于**全局 `core.autocrlf`。 - 删掉 `.gitattributes` 后,Windows 检出→打包→装到其他电脑,CRLF/`bad interpreter` 问题会**原样复发**(本坑即由此发布两轮修复而来)。 - 验证规则是否生效:`git check-attr text eol -- <文件>`。 3. **版本号 = `Big8K.exe` 文件时间戳,不新版本号客户端不更新** - `publish-update.ps1` 用 exe 时间戳(`yyyy.MM.dd.HHmm`)作版本号。若只改脚本没重编译 exe,版本号不变,客户端检测不到更新。 - 需要"重打包但不想重编译"时,先 `touch Big8K.exe` 刷新时间戳再跑发布脚本。 4. **发布后自检(3 项,1 分钟内可完成)** - **SHA256 / Size 对齐**:`Get-FileHash <共享盘上的 zip> -Algorithm SHA256` 必须与 `latest.json` 的 `Asset.SHA256`、`Size` 一致——不一致客户端会 fail-closed 拒绝更新(这是设计内的保护)。 - **zip 内 exe 时间戳 == 清单 Version**:客户端更新后 `CurrentVersion` 取自 exe 的 `LastWriteTime`, 二者必须相等(如均为 `2026.09.07.1322`)。否则客户端会反复弹更新提示,或永远检测不到新版本。 检查:`(7z l zip | findstr Big8K.exe)`,或用 C# `ZipFile.OpenRead(...).Entries[...].LastWriteTime`。 - **latest.json 带 BOM 属正常**:PS 5.1 的 `Out-File -Encoding utf8` 会写 UTF-8 **with BOM** (前 3 字节 `239,187,191`),客户端 `File.ReadAllText` 会自动剥离,`System.Text.Json` 解析正常,无需处理。 4. **~~`publish-update.ps1` 的 zip/latest.json 生成在仓库根目录,需移入 `release/`~~** — 已修复:脚本现按 `build/` 定位项目根,产物统一输出到 `release/`(被 gitignore),不再写仓库根。 ### 网络文件夹(共享盘)访问踩坑 发布目标 `\\10.71.48.8\File_Light\00_2K_8K_Vis-whale\8K\release` 相关: 1. **bash/PowerShell 传 UNC 路径时反斜杠被吃**(最大坑) - `\\\\10.71.48.8\\...` 在 bash 双引号里被转义成 `\\`,再传 Python/其他工具只剩**单反斜杠** `\10.71.48.8\...` → 报 `WinError 3 找不到网络名`、`Test-Path False`,**但这不代表共享盘不可达**! - 用**正斜杠** `//10.71.48.8/File_Light/...` 即可正常访问。 - 排查:`Python 里 repr 路径` 看是不是单反斜杠;`Test-Path False` 先怀疑路径被转义,别急着下"共享盘挂了"结论。 2. **`net use` / `net view` 报错 67 / 1702**(找不到网络名 / 绑定句柄无效)—— 多为会话或路径问题,先确认 UNC 路径正确、SMB 会话已建立(`net use` 查看 `IPC$`),再试正斜杠访问。 3. **bash 子进程可能没有已建立的 SMB 凭据会话** —— 用户在资源管理器手动连接后,bash/Python 子进程**不一定继承**该会话。稳妥做法:Python 用正斜杠路径直接访问(走 Windows API,不经 bash 转义);或显式 `net use \\10.71.48.8\File_Light` 建会话。 4. **`publish-update.ps1` 脚本内部的 `$SharePath` 是 PowerShell 字面量,不受 bash 转义影响**,可直接运行;但**通过 bash 传 `-SharePath` 参数**会踩反斜杠被吃的坑,避免这样做。 5. **发布产物校验**:上传后重新 `os.listdir` + 解包 zip 核对脚本行尾(`grep -rlP "\r$"`),确保客户端拿到的更新包/安装包路径与行尾都正确。 ## RK3588核心板代码烧录 待补充 ## 开源许可 BSD 3-Clause License ## 项目统计 - Stars: 5 - Watch: 7 - Fork: 4 ## 编程语言占比 - Python: 54.8% - C: 39.0% - C#: 3.8% - JavaScript: 1.4% - CSS: 0.5% - Other: 0.5%