diff --git a/02_HOLOMAIN_香橙派CM5开发板代码.ino b/02_HOLOMAIN_香橙派CM5开发板代码.ino index a44bf10..df90206 100644 --- a/02_HOLOMAIN_香橙派CM5开发板代码.ino +++ b/02_HOLOMAIN_香橙派CM5开发板代码.ino @@ -400,8 +400,12 @@ void TaskBTN2code(void* pvParameters) { } // 处理单条完整命令 -// 参数 resp 指向发送方串口,命令响应会回到发送方(Windows 发命令 Windows 收响应,Android 同理) -void processCommand(const String& command, Stream& resp) { +// 响应统一发到 Serial (USB CDC / Windows 调试口),不回发给 SerialLinux (Android) +// 原因:Android 高频发灯光命令(音乐律动)时,若每条命令都回响应到 UART0 TX, +// 会堵塞业务数据 SORC_xxx / SO_BTx 的发送,导致刷卡后 Android 收到延迟甚至丢失 +// 参数 src 仅用于保留调用兼容性,响应不再写入 src +void processCommand(const String& command, Stream& /*src*/) { + Stream& resp = Serial; // 所有命令响应只发 Windows 调试口 if (command.startsWith("MO_LED_")) { String modeStr = command.substring(7); int newMode = modeStr.toInt(); diff --git a/Tailscale + SSH 远程开发操作指南.md b/Tailscale + SSH 远程开发操作指南.md index 16d4b79..e896270 100644 --- a/Tailscale + SSH 远程开发操作指南.md +++ b/Tailscale + SSH 远程开发操作指南.md @@ -925,12 +925,53 @@ Host linux-vm 之后直接 `ssh linux-vm` 即可连接。 -## 4.4 VS Code Remote-SSH +## 4.4 VS Code Remote-SSH(推荐用于驱动开发) 1. VS Code 安装 Remote - SSH 扩展 2. Cmd+Shift+P → "Remote-SSH: Connect to Host" 3. 选择 linux-vm -4. 连接成功后打开文件夹 `/home/zhangwenqi/Radxa_CM5` +4. 连接成功后打开文件夹 `/home/zhangwenqi/OrangePi_CM5/Aandroid_OrangePi/merged/Android_13` + +Remote-SSH 模式下 VS Code 的后端(vscode-server、扩展、终端)都跑在虚拟机上,Mac 只负责 UI。 +编译、git、文件索引全都是虚拟机本地操作,性能和稳定性最佳。 + +## 4.5 SMB 挂载(轻量文件浏览/编辑,不适合驱动开发) + +macOS 原生支持 SMB,通过 Tailscale 直接挂载虚拟机 Samba 共享目录: + +**挂载方式**: +1. Finder → `⌘+K`(连接到服务器) +2. 输入:`smb://100.123.82.91` +3. 输入虚拟机用户名/密码 +4. 选择要挂载的共享目录,挂载点位于 `/Volumes/` + +挂载成功后 VS Code 可直接打开挂载目录,像本地文件一样编辑。 + +### 适用场景(轻量用途) + +| 用途 | 可行性 | +|------|--------| +| 临时查看/编辑几个配置文件 | ✅ | +| 快速预览源码结构 | ✅ | +| Finder 里拖文件到 Mac 备份 | ✅ | +| 打开整个 84GB SDK 做索引开发 | ⚠️ 首次索引慢 | +| 跑编译 / 烧录 / git 大仓库操作 | ❌ 必须 SSH 到虚拟机 | +| 让 Claude Code 自动编译调试 | ❌ Mac shell 无 Linux 工具链 | + +### SMB 方案关键局限 + +1. **文件访问 ≠ 执行环境**:SMB 只能让 Mac 看到文件,无法在 Mac 上跑 Android 编译(缺 Rockchip 工具链、Docker、特定 Python/libncurses5 等依赖) +2. **符号链接支持有限**:Android SDK 含大量符号链接,SMB 可能表现异常 +3. **Git 操作不稳定**:文件锁语义差异,`git status` 在 SMB 挂载目录上不可靠 +4. **文件系统大小写**:macOS 默认大小写不敏感 + Linux 大小写敏感,可能冲突 +5. **`.DS_Store` 污染**:Mac Finder 会在挂载目录留下元数据文件,进 git 会碍事 + +### 结论:两种方案如何选择 + +- **驱动开发主力**:Remote-SSH(编辑 + 编译 + 调试 + git 全部在虚拟机) +- **辅助场景**:SMB(只看几个文件、拖文件备份) + +两者不冲突,可以同时配好,按需使用。 --- @@ -1385,7 +1426,428 @@ sudo systemctl restart ssh --- -文档版本: 2.0 -最后更新: 2026-04-15 -适用系统: Ubuntu 20.04 LTS (x86_64), macOS -网络环境: 跨网络远程开发(Tailscale + ClashX Pro 共存) +--- + +# 第八部分:Android SDK Git 代码管理 + +## 8.1 方案说明 + +OrangePi CM5 Android 13 SDK 共 84GB、数十万文件,不可能全量入 Git。 +采用**白名单 `.gitignore` 方案**:在 SDK 根目录初始化 Git,默认忽略所有文件,只放行会被修改的核心目录。 + +- Git 仓库路径:`~/OrangePi_CM5/Aandroid_OrangePi/merged/Android_13/` +- 远程仓库:GitHub(`OrangePi_CM5_Project`,Private) +- 首次推送(96,602 个文件,.git 约 1.3GB)约需 30-60 分钟 + +## 8.2 追踪的核心目录 + +| 目录 | 作用 | +|------|------| +| `device/rockchip/` | 产品配置、开机画面、init.rc、权限 | +| `kernel-5.10/arch/arm64/boot/dts/` | 设备树(屏幕/LED/NFC/GPIO 等) | +| `kernel-5.10/arch/arm64/configs/` | 内核配置文件 | +| `kernel-5.10/drivers/` | 内核驱动源码 | +| `kernel-5.10/include/` | 内核头文件 | +| `hardware/rockchip/` | Rockchip 硬件 HAL | +| `hardware/interfaces/` | Android 硬件接口 | +| `hardware/libhardware/` | Android hardware 库 | +| `u-boot/arch/arm/` | U-Boot 架构相关代码 | +| `u-boot/configs/` | U-Boot 配置 | +| `u-boot/board/` | 板级支持 | +| `u-boot/drivers/` | U-Boot 驱动 | +| `u-boot/include/` | U-Boot 头文件 | +| `u-boot/dts/` | U-Boot 设备树 | +| `frameworks/base/core/res/` | 系统默认资源(开机动画等) | + +## 8.3 .gitignore 白名单内容 + +```gitignore +# 策略:根目录忽略所有,只白名单放行会改的目录 + +# 1. 默认忽略根目录所有内容 +/* + +# 2. 白名单:允许这些顶层目录/文件 +!/.gitignore +!/README.md +!/device/ +!/kernel-5.10/ +!/hardware/ +!/u-boot/ +!/frameworks/ + +# ===== device 目录:只保留 rockchip ===== +/device/* +!/device/rockchip/ +/device/rockchip/* +!/device/rockchip/common/ +!/device/rockchip/rk3588/ + +# ===== kernel-5.10:只保留驱动、设备树、配置 ===== +/kernel-5.10/* +!/kernel-5.10/arch/ +!/kernel-5.10/drivers/ +!/kernel-5.10/kernel/ +!/kernel-5.10/include/ +!/kernel-5.10/Documentation/ + +# kernel-5.10/arch 只保留 arm64 +/kernel-5.10/arch/* +!/kernel-5.10/arch/arm64/ +/kernel-5.10/arch/arm64/* +!/kernel-5.10/arch/arm64/boot/ +!/kernel-5.10/arch/arm64/configs/ +/kernel-5.10/arch/arm64/boot/* +!/kernel-5.10/arch/arm64/boot/dts/ + +# ===== hardware 只保留 rockchip ===== +/hardware/* +!/hardware/rockchip/ +!/hardware/interfaces/ +!/hardware/libhardware/ + +# ===== u-boot 只保留配置、设备树、板级代码 ===== +/u-boot/* +!/u-boot/arch/ +!/u-boot/board/ +!/u-boot/configs/ +!/u-boot/include/ +!/u-boot/drivers/ +!/u-boot/dts/ +/u-boot/arch/* +!/u-boot/arch/arm/ +/u-boot/arch/arm/* +!/u-boot/arch/arm/dts/ +!/u-boot/arch/arm/mach-rockchip/ +!/u-boot/arch/arm/include/ + +# ===== frameworks 只保留 base/core/res ===== +/frameworks/* +!/frameworks/base/ +/frameworks/base/* +!/frameworks/base/core/ +/frameworks/base/core/* +!/frameworks/base/core/res/ + +# ===== 编译产物和临时文件 ===== +out/ +*.o +*.ko +*.a +*.so +*.so.dbg +*.pyc +*.swp +*.swo +*~ +__pycache__/ +.DS_Store + +# ===== 子仓库的 .git 内部目录 ===== +**/.git/ +``` + +## 8.4 日常工作流 + +```bash +# 在 SDK 中直接改代码(例如 NFC 驱动) +cd ~/OrangePi_CM5/Aandroid_OrangePi/merged/Android_13 +vi kernel-5.10/drivers/nfc/my_nfc.c + +# 查看修改 +git status +git diff + +# 提交 +git add kernel-5.10/drivers/nfc/ +git commit -m "添加 PN532 NFC 驱动支持" +git push +``` + +## 8.5 回滚操作 + +```bash +# 查看历史 +git log --oneline + +# 回滚单个文件到上一版本 +git checkout HEAD~1 -- kernel-5.10/drivers/nfc/my_nfc.c + +# 回滚整个目录 +git checkout HEAD~1 -- kernel-5.10/drivers/nfc/ + +# 慎用:回滚全部到某个 commit +git reset --hard +``` + +## 8.6 分支管理(推荐功能分支) + +```bash +# 创建功能分支 +git checkout -b feature/nfc-pn532 + +# 开发、多次 commit 后合并回 main +git checkout main +git merge feature/nfc-pn532 + +# 废弃分支 +git branch -D feature/nfc-pn532 +``` + +## 8.7 首次推送到 GitHub(SSH 密钥方式,推荐) + +**当前仓库**: `git@github.com:Leo-z8/OrangePi_CM5_Project.git`(Private) +**认证方式**: SSH ed25519 密钥,永久免密 +**网络路径**: 虚拟机 → GitHub `ssh.github.com:443`(直连,不经 Clash 代理) + +### 为什么选 SSH 而非 HTTPS + PAT + +| 对比项 | HTTPS + PAT | SSH 密钥 | +|--------|-------------|----------| +| 有效期 | 最长 1 年,需定期更新 | 永久有效 | +| 网络路径 | 必须走 Clash 代理(HTTPS 国内慢) | 443 端口直连 GitHub | +| 稳定性 | TLS 握手依赖代理链,大文件易挂断 | SSH 原生流控,错误信息清晰 | +| 推送速度 | 受 Clash 带宽 + rwnd 限制 | 实测稳定 4-6 MiB/s | +| 首次推送 758 MiB | 多次中断重试 | 约 2-3 分钟完成 | + +### 步骤 1:虚拟机生成 SSH 密钥 + +```bash +ssh-keygen -t ed25519 -C "zhangwenqi-orangepi-vm-github" \ + -f ~/.ssh/github_ed25519 -N '' +``` + +生成后两个文件: +- `~/.ssh/github_ed25519`(私钥,权限 600) +- `~/.ssh/github_ed25519.pub`(公钥) + +### 步骤 2:配置 `~/.ssh/config` 走 443 端口 + +``` +Host github.com + HostName ssh.github.com + User git + Port 443 + IdentityFile ~/.ssh/github_ed25519 + IdentitiesOnly yes + ServerAliveInterval 30 +``` + +**关键点**: +- `HostName ssh.github.com` + `Port 443` 绕过国内对 22 端口的封锁 +- `IdentitiesOnly yes` 强制只用这个密钥,防止扔其他密钥被 GitHub 拒绝 +- 此方案不依赖 Clash 代理,虚拟机可直连 + +### 步骤 3:添加公钥到 GitHub + +```bash +cat ~/.ssh/github_ed25519.pub +``` + +复制整行内容,到 https://github.com/settings/ssh/new 添加: +- Title:`OrangePi-VM-Linux` +- Key type:Authentication Key +- Key:粘贴公钥 + +### 步骤 4:测试连通性 + +```bash +ssh -T git@github.com +# 预期输出:Hi Leo-z8! You've successfully authenticated +``` + +### 步骤 5:切换仓库 remote 到 SSH + +```bash +cd ~/OrangePi_CM5/Aandroid_OrangePi/merged/Android_13 + +# 清除旧 HTTPS 配置(如果之前用过 PAT) +rm -f ~/.git-credentials +git config --local --unset credential.helper 2>/dev/null +git config --local --unset http.proxy 2>/dev/null +git config --local --unset https.proxy 2>/dev/null + +# 改 remote 为 SSH +git remote set-url origin git@github.com:Leo-z8/OrangePi_CM5_Project.git +git remote -v + +# 推送(永久免密) +git push -u origin main +``` + +### 备选方案:HTTPS + PAT(不推荐作为长期方案) + +仅在没有 SSH 配置权限或临时应急时使用: + +```bash +# 配置 git 代理(HTTPS 必须走 Clash) +git config http.proxy http://192.168.6.57:7890 +git config https.proxy http://192.168.6.57:7890 +git config http.postBuffer 524288000 # 增大缓冲,大仓库必需 + +git remote set-url origin https://github.com/Leo-z8/OrangePi_CM5_Project.git +git config credential.helper store + +# 提示时:用户名 = GitHub 账号,密码 = PAT 令牌 +git push -u origin main +``` + +> **PAT 生成**:https://github.com/settings/tokens/new → 勾 `repo` → 生成后立即复制。 +> 推送完成后建议立即 Revoke(一次性使用),因为 PAT 明文存在 `~/.git-credentials` 有泄露风险。 + +## 8.8 推送后日常 push + +SSH 方式配置后完全免密: + +```bash +cd ~/OrangePi_CM5/Aandroid_OrangePi/merged/Android_13 + +git add kernel-5.10/drivers/nfc/ +git commit -m "添加 PN532 NFC 驱动" +git push # 免密,永久免代理 +git pull # 同理 +``` + +## 8.9 备份策略 + +| 资产 | 备份位置 | +|------|---------| +| 驱动/配置修改 | GitHub 仓库(`Leo-z8/OrangePi_CM5_Project`,Private) | +| SDK 原始源码分卷(9个 tar.gz) | Windows 电脑(永久保留,不能删) | +| Docker 镜像定义 | `~/OrangePi_CM5/docker/Dockerfile` | +| 编译产物(update.img) | 按需保留,体积大不进 Git | +| 被 `.gitignore` 排除的大文件 | 需单独备份(见 8.10) | + +## 8.10 GitHub 推送踩坑实录(2026-04-22 首次推送) + +### 踩坑 1:GitHub 单文件 100MB 硬性限制 + +**现象**:HTTPS 推送数据上传完后 "远端意外挂断了";SSH 推送明确报错: + +``` +remote: error: File device/rockchip/rk3588/rk3588m_car/preinstall/camera360.apk +is 120.48 MB; this exceeds GitHub's file size limit of 100.00 MB +remote: error: GH001: Large files detected. +! [remote rejected] main -> main (pre-receive hook declined) +``` + +**根因**:GitHub pre-receive hook 在服务端验收阶段拒绝 >100MB 单文件。HTTPS 协议表现为 TLS 连接异常终止(难诊断),SSH 协议会直接打印错误(易诊断)。 + +**教训**:**大文件推送问题要用 SSH 调试**,HTTPS 的"远端挂断"往往掩盖真实原因。 + +### 踩坑 2:扫大文件要用 `git ls-tree`,不能用 `git rev-list` + +```bash +# ❌ 错误方式:按 blob 扫描,Git 去重会掩盖多路径 +git rev-list --objects --all | \ + git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | \ + awk '$1=="blob" && $3>=100000000' + +# ✅ 正确方式:按 HEAD 中的路径扫描 +git ls-tree -r -l HEAD | awk '$4>=100000000 {printf "%.1f MB %s\n", $4/1024/1024, $5}' +``` + +**根因**:两个产品目录下存在完全相同的 `camera360.apk`(内容 hash 相同),Git 按 blob 去重存储,`rev-list` 只列出一个 blob,但 `ls-tree` 会展开所有路径。 + +**教训**:初次 `git rm --cached` 只去掉一个路径,第二次推送时另一个路径的 APK 仍会撞限,必须一次性用通配符覆盖所有。 + +### 踩坑 3:`.gitignore` 用具体路径易遗漏,通配符更健壮 + +```gitignore +# ❌ 窄规则:只管一个路径 +device/rockchip/rk3588/rk3588m_car/preinstall/camera360.apk + +# ✅ 通配符:所有产品配置下的预装 APK 一次性处理 +device/rockchip/*/*/preinstall/*.apk +``` + +**教训**:多产品配置项目中(rk3588m_car / rk3588m_s / …)类似的二进制资源可能分布在多个目录,写 `.gitignore` 规则时默认用通配符。 + +### 踩坑 4:HTTPS + Clash 代理的 TCP rwnd 瓶颈 + +推送过程 `ss -tni` 显示 **`rwnd_limited: 95.1%`** —— 95% 时间卡在 GitHub 端接收窗口,Clash 代理到 GitHub 的上行链路成瓶颈,平均速度被压到 1-2 MiB/s。 + +切到 SSH 443 直连后 **`rwnd_limited: 0.8%`**,速度稳定 4-6 MiB/s。 + +**结论**:大仓库首次推送坚决用 SSH,不要 HTTPS。 + +### 踩坑 5:凭证泄露风险 + +HTTPS + PAT 方案下,凭证明文存在 `~/.git-credentials`: + +``` +https://用户名:PAT@github.com +``` + +即使 PAT 只用一次,也要: +1. 推送完成后到 https://github.com/settings/tokens 立即 Revoke +2. `rm -f ~/.git-credentials` +3. `git config --unset credential.helper` + +**SSH 方式无此风险**:私钥只存本地 ~/.ssh/,不会经过对话或日志。 + +### 本次推送完整大文件排除流程(已落地) + +```bash +cd ~/OrangePi_CM5/Aandroid_OrangePi/merged/Android_13 + +# 1. 扫出所有 >100MB 路径 +git ls-tree -r -l HEAD | awk '$4>=100000000 {printf "%.1f MB %s\n", $4/1024/1024, $5}' + +# 2. 从索引移除(磁盘文件保留) +git rm --cached device/rockchip/rk3588/rk3588m_car/preinstall/camera360.apk +git rm --cached device/rockchip/rk3588/rk3588m_s/preinstall/camera360.apk + +# 3. .gitignore 追加通配符规则 +cat >> .gitignore << 'EOF' + +# 排除所有预装 APK(GitHub 100MB 限制 + 非驱动开发必需) +device/rockchip/*/*/preinstall/*.apk +EOF + +# 4. amend 原 commit +git add .gitignore +git commit --amend --no-edit + +# 5. 验证 HEAD 里无 >100MB 文件 +git ls-tree -r -l HEAD | awk '$4>=100000000' # 应无输出 + +# 6. 推送 +git push -u origin main +``` + +### 需要单独备份的大文件清单 + +以下文件已从 Git 历史排除,需另存(网盘/内网文件服务器): + +| 文件 | 大小 | 路径 | +|------|------|------| +| camera360.apk (rk3588m_car) | 120 MB | `device/rockchip/rk3588/rk3588m_car/preinstall/` | +| camera360.apk (rk3588m_s) | 120 MB | `device/rockchip/rk3588/rk3588m_s/preinstall/` | + +这些是产品预装 APK,不是驱动开发所需,完整 SDK 部署时再从备份恢复即可。 + +## 8.11 GitHub 推送关键数据(本次首次推送) + +| 指标 | 数值 | +|------|------| +| 本地仓库大小(`.git`) | 774 MB | +| 追踪文件总数 | 96,600 | +| 上传 pack 大小 | 约 518 MiB(移除两个 120MB APK 后) | +| 网络路径 | 虚拟机 → Tailscale(不经 Clash) → `ssh.github.com:443` | +| 实测速度 | 4-6 MiB/s(SSH 443 直连,无 rwnd 瓶颈) | +| 首次推送耗时 | 约 2-3 分钟(纯网络时间,排除多次重推) | +| 最终 commit | `c79995a30a9db560899bf0845440720edf3e5e3d` | +| 远程仓库 | https://github.com/Leo-z8/OrangePi_CM5_Project | + +--- + +文档版本: 3.1 +最后更新: 2026-04-22 +适用系统: Ubuntu 20.04/22.04 LTS (x86_64), macOS +网络环境: 跨网络远程开发(Tailscale + ClashX Pro 共存 + GitHub SSH 443) +主要变更(v3.1): +- 4.5 新增 SMB 挂载方式(Mac 端轻量文件访问方案)与 Remote-SSH 对比 +- 8.7 首次推送 GitHub 改为 SSH 密钥为主,PAT 降为备选 +- 8.10 新增首次推送踩坑实录(单文件 100MB 限制、Git 去重陷阱、rwnd 瓶颈等) +- 8.11 新增首次推送实测数据