嵌入式开发目录

一、VisionFive 2 JH7110 + Fedora RISC-V 嵌入式开发

更新时间:2026-07-26
目标平台:StarFive VisionFive 2,SoC 为 JH7110,系统主线为 Fedora RISC-V
目标结果:从“能启动板子”提升到“能做 Linux bring-up、RISC-V 架构分析、Fedora 系统集成、Device Tree、Kernel / Driver、性能调试和嵌入式产品化”的专业嵌入式开发能力。

(一) 资料参考:

下面链接建议保存到浏览器书签。由于 Fedora RISC-V、kernel、U-Boot、StarFive SDK 都会持续更新,开始每个阶段前请重新访问对应页面确认最新版本。

类别 用途 地址
Fedora RISC-V 总入口 了解 Fedora RISC-V 的定位、镜像、hardware、build、wiki 入口 https://fedoraproject.org/wiki/Architectures/RISC-V
Fedora RISC-V hardware 页面 确认 VisionFive 2 在 Fedora RISC-V 硬件生态中的位置和 mainline kernel 支持说明 https://fedoraproject.org/wiki/Architectures/RISC-V/Hardware
Fedora VisionFive 2 安装页 完成 serial console、firmware、镜像、启动和初始登录 https://fedoraproject.org/wiki/Architectures/RISC-V/Installing#Installing_on_StarFive_VisionFive_2
StarFive / RVspace 文档库 下载 VisionFive 2 datasheet、quick start、JH7110 datasheet、JH7110 TRM、Linux SDK 文档、peripheral driver development guide https://wiki.rvspace.org/en/project/Document_Publish_Status
VisionFive 2 Quick Start Guide 板卡快速上手、接口、启动与基础配置 https://doc-en.rvspace.org/VisionFive2/Quick_Start_Guide/
VisionFive 2 Datasheet 板级硬件规格、接口、电气和 pinout 信息 https://doc-en.rvspace.org/VisionFive2/Datasheet/
JH7110 Datasheet SoC 模块、地址空间、外设能力概览 https://doc-en.rvspace.org/JH7110/Datasheet/
JH7110 TRM SoC 寄存器、外设细节、底层 driver 开发参考 https://doc-en.rvspace.org/JH7110/TRM/
RISC-V 官方规范入口 系统学习 ISA、privileged architecture、debug、SBI、psABI 等 https://docs.riscv.org/reference/
RISC-V Unprivileged ISA 学习基础指令集、扩展和用户态程序模型 https://docs.riscv.org/reference/isa/unpriv/rv32.html
RISC-V Privileged Architecture 学习 machine/supervisor/user mode、CSR、trap、interrupt、MMU https://docs.riscv.org/reference/isa/priv/
RISC-V psABI 学习 calling convention、ELF、relocation、ABI 约定 https://riscv-non-isa.github.io/riscv-elf-psabi-doc/
RISC-V SBI 理解 OpenSBI 与 supervisor mode OS 的接口 https://github.com/riscv-non-isa/riscv-sbi-doc
OpenSBI 学习 RISC-V machine mode firmware https://github.com/riscv-software-src/opensbi
U-Boot VisionFive 2 文档 学习 OpenSBI、SPL、U-Boot、firmware image 构建与启动介质关系 https://docs.u-boot.org/en/latest/board/starfive/visionfive2.html
Zephyr VisionFive 2 文档 从 RTOS / bare-metal 角度理解 VisionFive 2 与 Linux 的差异 https://docs.zephyrproject.org/latest/boards/starfive/visionfive2/doc/index.html
Linux Kernel 文档总入口 Driver、Device Tree、subsystem、debugging 的主参考入口 https://docs.kernel.org/
Linux Device Tree 文档 学习 Device Tree 使用模型与 Linux probe 机制 https://docs.kernel.org/devicetree/usage-model.html
Linux Device Tree Bindings 学习 YAML binding、compatible、外设节点规范 https://docs.kernel.org/devicetree/bindings/writing-schema.html
Linux Driver API 学习 kernel driver 基础 API 与 driver model https://docs.kernel.org/driver-api/
Fedora Packaging Guidelines 学习 Fedora RPM 打包规范 https://docs.fedoraproject.org/en-US/packaging-guidelines/
Fedora RPM 打包介绍 学习 RPM 基础概念和 Fedora 打包流程 https://developer.fedoraproject.org/deployment/rpm/about.html
Yocto Project 文档 从 Fedora 开发环境走向产品级定制 rootfs 时学习 https://docs.yoctoproject.org/
Buildroot 文档 学习轻量级 embedded Linux rootfs 构建 https://buildroot.org/docs.html
Bootlin Embedded Linux Training 系统学习嵌入式 Linux userspace、kernel、rootfs、交叉编译 https://bootlin.com/training/embedded-linux/
Bootlin Linux Kernel Training 系统学习 Linux kernel 和 driver 开发 https://bootlin.com/training/kernel/
Bootlin Yocto Training 系统学习 Yocto / OpenEmbedded 工程化 https://bootlin.com/training/yocto/

(二) 能力清单

  1. 能从空白 microSD 重新启动 Fedora RISC-V。
  2. 能通过 serial console 保存完整 boot log。
  3. 能解释 OpenSBI、U-Boot、kernel、DTB、initramfs 的关系。
  4. 能编译和反汇编 RISC-V 程序,并解释 ABI。
  5. 能通过 userspace 控制 GPIO/I2C/SPI/UART。
  6. 能把外设应用做成 systemd service。
  7. 能把服务打成 RPM 并安装/卸载。
  8. 能修改 Device Tree 并安全恢复。
  9. 能构建自定义 kernel 或 kernel module。
  10. 能输出性能基线和最终项目报告。

(三) 学习目标

  1. 在 VisionFive 2 上稳定启动 Fedora RISC-V,并能通过 serial console 恢复系统。
  2. 解释 BootROM -> SPL -> OpenSBI -> U-Boot -> Linux kernel -> initramfs -> systemd 的启动链。
  3. 阅读并修改 JH7110 / VisionFive 2 的 Device Tree。
  4. 构建 OpenSBI、U-Boot、Linux kernel、kernel modules 和 DTB。
  5. 使用 Fedora 工具链完成 userspace 外设开发、systemd 服务、RPM 打包。
  6. 编写基础 Linux kernel module / platform driver,并理解 driver model。
  7. 使用 dmesgjournalctlftraceperfgdbtrace-cmdstracefioiperf3 等工具定位问题。
  8. 建立一个可复现实验仓库,沉淀 boot log、配置、patch、脚本、性能报告和恢复方案。

(四) 前置准备

1.硬件

  • VisionFive 2,建议 8 GB RAM 版本。
  • 稳定电源,优先使用官方推荐规格。
  • 高质量 microSD 卡,建议准备 2 张以上。
  • USB-UART 转接器,必须使用 3.3 V TTL,不要使用 5 V
  • 网线,建议直连路由器或开发机。
  • 可选:eMMC 模块、NVMe SSD、M.2 扩展、USB 网卡、逻辑分析仪、万用表。
  • 外设练习套件:GPIO LED / 按键、I2C 温湿度传感器、SPI ADC / OLED、UART GPS / USB 串口模块。

2.主机环境

  • Fedora x86_64 Linux 开发机。
  • 至少 100 GB 可用磁盘空间。
  • 安装基础工具:
sudo dnf install -y git gcc make cmake ninja-build ncurses-devel flex bison \
  openssl-devel bc elfutils-libelf-devel perl python3 python3-pip minicom \
  picocom screen tmux wget curl xz rsync uboot-tools dtc rpmdevtools rpmlint \
  fio iperf3 strace ltrace gdb perf trace-cmd

3. 建议仓库结构

visionfive2-fedora-lab/
  README.md
  docs/
    00-lab-setup.md
    01-fedora-bringup.md
    02-boot-chain.md
    03-riscv-architecture.md
    04-device-tree.md
    05-kernel-build.md
    06-driver-dev.md
    07-debug-performance.md
    08-productization.md
  logs/
    serial/
    dmesg/
    journal/
  scripts/
    flash/
    serial/
    benchmark/
  apps/
    gpio-demo/
    i2c-demo/
    spi-demo/
    uart-demo/
    sensor-agent/
  rpm/
    sensor-agent/
  kernel/
    configs/
    patches/
    dts/
  reports/
    boot-report.md
    performance-baseline.md
    compatibility-matrix.md


二、一年路线图

阶段 时间 核心能力 VisionFive 2 实战 达标产物
0. 实验台搭建 第 0–1 周 硬件安全、串口、供电、镜像烧录、日志习惯 准备 VisionFive 2、USB-UART、microSD / NVMe、网线、电源、逻辑分析仪 lab-notes.md、串口 boot log、硬件连接图
1. Fedora RISC-V 启动 第 1–2 周 Fedora 镜像、firmware、U-Boot、serial console、SSH 按Fedora 文档启动系统,完成网络、用户、dnf update、备份 boot log 可重复安装流程、故障恢复清单
2. RISC-V 架构基础 第 3–6 周 RV64GC、ABI、CSR、trap、MMU、SBI、atomic、memory model 编写C / assembly 小实验,对比 native 与 cross compile riscv-labs/、ELF/反汇编笔记、异常/系统调用实验
3. Fedora Embedded Userspace 第 7–10 周 systemd、udev、RPM、SELinux、NetworkManager、GPIO/I2C/SPI/UART 用 libgpiod、i2c-tools、spidev、UART 接传感器和外设 一个 RPM 打包的 sensor daemon
4. Bootloader 与 Kernel 第 11–16 周 ROM → SPL → OpenSBI → U-Boot → Kernel → initramfs →systemd 构建 OpenSBI、U-Boot、Linux kernel,修改 DTS,理解 SPI flash / SD / NVMe 启动 自定义 kernel、DTS 修改、恢复手册
5. Linux Driver 开发 第 17–28 周 platform driver、Device Tree binding、GPIO、IRQ、I2C、SPI、DMA、regmap、IIO、hwmon 写一个真实 I2C/SPI 外设 driver,带 DTS binding、错误处理和测试 upstream-style driver、dt_binding_check 记录
6. Debug / 性能 / 实时 第 29–36 周 ftrace、perf、dynamic_debug、trace-cmd、gdb、latency、IRQ affinity 做 fio、iperf3、cyclictest、boot time、CPU/thermal profiling 性能基线报告、RT/latency调优报告
7. Multimedia / Edge Vision 第 37–44 周 DRM/KMS、V4L2、GStreamer、MIPI CSI、HDMI、GPU/VPU 支持边界 比较 Fedora mainline 与 StarFive SDK/vendor kernel 的视频、摄像头、显示能力 兼容矩阵、camera/video demo
8. 产品化与上游贡献 第 45–52 周 CI、硬件在环、OTA、RPM repo、Yocto/Buildroot、security、upstream patch 建立 QEMU + VF2 hardware-in-loop 测试;向 Fedora/RISC-V 或 kernel/U-Boot 提交小patch 可发布 image、CI 报告、至少 1 个上游贡献尝试

三、阶段进展:

第 1 阶段:先把板子稳定跑起来

  • 硬件准备:VisionFive 2 建议选 8 GB 版本;准备可靠电源、高质量 microSD、USB-UART、网线、备用启动
    介质、万用表、逻辑分析仪。
  • 串口接线:按 Fedora VisionFive 2 文档使用 40-pin header,常用参数为 115200 8N1;注意 USB-UART 必
    须使用 3.3 V TTL,不要接 5 V。
  • Fedora 启动:先不要追求桌面,先做 headless boot、serial console、SSH、网络、dnf update、时间同
    步、用户权限、安全密码。
  • Firmware 安全:Fedora 文档提示需要替换 firmware;你应先保存原始 boot log 和 SPI flash 状态,再按
    官方步骤操作,避免把板子刷到不可恢复。
  • 最小产物:写出一份 VisionFive2-Fedora-Bringup.md,记录 board revision、镜像版本、firmware 版本、
    启动介质、串口日志、网络配置、失败恢复办法。

SivionFive 2-JH7110开发板子和刻录Fedora-riscv镜像


第 2 阶段:吃透 RISC-V,而不是只会 Linux

  • 必读:RISC-V 官方规范页面包含 unprivileged ISA、privileged architecture、debug、psABI、vector、
    crypto、SBI 等文档入口;你至少要掌握 RV64GC、lp64d ABI、CSR、trap、interrupt、Sv39、SBI。
    citeturn8view0
  • 实验 1:写 hello.S,用 riscv64-linux-gnu-gcc 或板上 native GCC 编译,使用 objdump -d 看函数调
    用、栈、寄存器保存。
  • 实验 2:写一个触发非法指令或除零的程序,观察 Linux signal、kernel log 和异常路径。
  • 实验 3:对比 syscall、SBI call、U-Boot command、Linux userspace API 的边界。
  • 实验 4:用 qemu-system-riscv64 启动最小 kernel/rootfs,理解 QEMU 与真实 VF2 的差异。
  • 达标标准:你能解释 M-mode / S-mode / U-mode、OpenSBI 的位置、Linux 为什么运行在 S-mode、设备中断
    如何进入 kernel。

第 3 阶段:把 Fedora 当嵌入式系统来用

  • 系统管理:掌握 systemd service、udev rule、journald、NetworkManager、firewalld/nftables、
    SELinux、tmpfiles.d、logrotate、chrony。
  • 外设访问:用 libgpiod 替代旧的 sysfs GPIO;用 i2c-tools、spidev_test、pyserial、gpsd 等做用户态
    外设原型。
  • 打包能力:学习 RPM spec、rpmbuild、Fedora Packaging Guidelines、systemd service packaging,把自
    己的 daemon 打成 RPM。Fedora packaging 文档是后续把工程交付成系统组件的基础。citeturn10view0
  • 实战项目:做一个 vf2-sensor-agent,读取 I2C 温湿度传感器、GPIO 按键、UART GPS 或 SPI 小屏,通过
    REST/MQTT 输出数据,并用 RPM 安装成 systemd 服务。
  • 达标标准:拔电重启后服务自动恢复;外设异常时不会崩溃;日志可追踪;RPM 可卸载、升级、回滚。

第 4 阶段:掌握启动链与 Kernel

  • 启动链必须会画出来:BootROM → SPL → OpenSBI → U-Boot → EFI/GRUB/extlinux → Linux kernel →
    initramfs → systemd。
  • U-Boot 实战:按官方 VisionFive 2 U-Boot 文档构建 OpenSBI、visionfive2_defconfig、u-boot.itb、
    spl/u-boot-spl.bin.normal.out,理解每个文件烧到哪里、谁加载谁。citeturn4view3
  • Kernel 实战:拉取 mainline kernel,找到 arch/riscv/boot/dts/starfive/,阅读 jh7110 相关 DTS/
    DTSI,构建 kernel、modules、DTB,更新 Fedora 的启动项。
  • Device Tree:重点学习 compatible、reg、interrupts、clocks、resets、pinctrl、status、aliases、
    chosen。
  • Initramfs:学习 dracut、kernel command line、rootfs UUID、early userspace、emergency shell。
  • 达标标准:你能从源码构建并启动自定义 kernel;能修复一个 DTS 外设节点;能从坏 kernel 恢复回可启动
    系统。

第 5 阶段:进入真正的 Driver 开发

  • 先写简单 driver:miscdevice 或 platform_driver,通过 Device Tree 匹配,暴露 ioctl / sysfs /
    debugfs / character device。
  • 再写总线 driver:I2C 温度传感器、SPI ADC、GPIO interrupt button、PWM fan、IIO sensor、hwmon 设
    备。
  • 必学 kernel 子系统:driver model、Device Tree binding YAML、pinctrl、clk、reset、regmap、
    irqchip、DMA、runtime PM、IIO、hwmon、netdev、V4L2 入门。
  • 调试工具:dmesg -w、dynamic_debug、ftrace、trace-cmd、perf、lockdep、kmemleak、gdb vmlinux、
    addr2line。
  • 代码质量:driver 必须处理 probe defer、资源释放、错误路径、并发、用户输入校验、设备断开、
    timeout。
  • 达标标准:你的 driver 能通过 checkpatch.pl、有 DTS binding、能解释每条错误路径,并能写一封接近
    upstream 质量的 patch mail。

第 6 阶段:性能、实时性和可靠性

  • Benchmark:用 fio 测 microSD / eMMC / NVMe;用 iperf3 测以太网;用 stress-ng 测稳定性;用 perf
    stat/top/record 找热点。
  • 实时性:学习 PREEMPT_RT、cyclictest、IRQ affinity、CPU isolation、scheduler policy、timer
    latency。
  • 启动速度:分析 systemd-analyze blame、kernel initcall、U-Boot delay、network wait、服务依赖。
  • 稳定性:加入 watchdog、只读根分区方案、断电保护、日志限额、自动恢复、健康检查。
  • 安全性:最少权限 systemd service、SELinux policy 初步、firewall、禁用默认密码、SSH key、SBOM/CVE
    追踪。
  • 达标标准:你能提交一份工程级 performance-and-reliability-report.md,包含数据、图表、配置和可复现
    实验命令。

第 7 阶段:多媒体和视觉方向要现实评估

  • JH7110 硬件有 GPU、VPU、ISP、MIPI CSI/DSI、HDMI 等能力,但 Fedora RISC-V 文档提示 mainline
    Fedora 镜像偏 headless,GPU 支持通常不是默认重点;所以这阶段要区分“硬件能力”“vendor SDK 能
    力”“Fedora mainline 能力”。citeturn2view1
  • 学习路线:DRM/KMS → Mesa → framebuffer → V4L2 → GStreamer → camera sensor → MIPI CSI → hardware
    codec。
  • 实战项目:做一个 camera capture + GStreamer pipeline;如果 Fedora 上缺驱动或用户态组件,就记录缺
    口并切换 StarFive SDK/vendor kernel 做对照。
  • 达标标准:你能输出一张 compatibility matrix,明确 HDMI、camera、VPU、GPU、OpenGL/Vulkan、
    GStreamer 在 Fedora mainline 与 vendor SDK 下分别能不能用、怎么用、缺什么。

第 8 阶段:产品化能力

  • Fedora 路线:掌握 RPM packaging、私有 dnf repo、系统镜像定制、systemd hardening、SELinux、日志、
    升级、回滚。
  • Embedded product 路线:学习 Yocto / OpenEmbedded 和 Buildroot;Fedora 适合开发、验证、服务器型边
    缘设备,Yocto/Buildroot 更适合强约束产品镜像。
  • CI 路线:QEMU riscv64 做快速测试;VisionFive 2 做 hardware-in-loop,自动上电、串口抓 log、SSH 跑
    测试、收集 benchmark。
  • 上游路线:至少尝试给 Fedora RISC-V、U-Boot、Linux kernel、StarFive 文档或开源 driver 提一个小
    patch。
  • 达标标准:你能从零生成一个可交付 image,包含 bootloader、kernel、rootfs、应用、服务、升级策略、
    测试报告、故障恢复方案。

四、12周计划

第 1 周:实验台搭建与 Fedora RISC-V 初次启动

1.1 目标

  • 完成 VisionFive 2 硬件连接。
  • 建立 serial console。
  • 启动 Fedora RISC-V。
  • 保存完整 boot log。

1.2 阅读

  • Fedora RISC-V 总入口。
  • Fedora RISC-V hardware 页面。
  • Fedora VisionFive 2 安装页。
  • VisionFive 2 Quick Start Guide。
  • VisionFive 2 Datasheet 的接口和启动相关部分。

1.3 实验

  1. 记录板卡信息:
    • board revision;
    • RAM 容量;
    • 电源规格;
    • microSD / eMMC / NVMe 型号;
    • 当前 firmware / bootloader 状态。
  2. 连接 USB-UART:
    • 确认 GNDTXRX
    • 使用 115200 8N1
    • 保存第一次上电日志。
  3. 下载 Fedora RISC-V image,并写入 microSD。
  4. 按 Fedora VisionFive 2 文档处理 firmware / bootloader 要求。
  5. 启动系统,完成初始登录。
  6. 配置网络、SSH、用户、时间同步。

推荐命令

lsblk
sudo dmesg -w
picocom -b 115200 /dev/ttyUSB0
ssh user@<board-ip>
uname -a
cat /etc/os-release
lscpu
lsblk -f
ip addr
journalctl -b > logs/journal/first-boot.log
dmesg > logs/dmesg/first-boot.dmesg

交付物

  • docs/00-lab-setup.md
  • docs/01-fedora-bringup.md
  • logs/serial/first-boot.log
  • logs/dmesg/first-boot.dmesg
  • logs/journal/first-boot.log

验收标准

  • 能通过 serial console 看到完整启动日志。
  • 能通过 SSH 登录 Fedora RISC-V。
  • 能说明当前系统的 kernel version、Fedora version、启动介质。
  • 能在启动失败时回到 serial console 排查。

第 2 周:启动链、Firmware、OpenSBI 与 U-Boot

2.1 目标

  • 理解 VisionFive 2 从上电到 Linux 的完整启动链。
  • 能解释 OpenSBI 和 U-Boot 的角色。
  • 能查看和备份 U-Boot environment。

2.2 阅读

  • U-Boot VisionFive 2 官方文档。
  • Fedora VisionFive 2 安装页中的 firmware 说明。
  • OpenSBI 项目文档。
  • StarFive / RVspace JH7110 启动相关资料。

2.3 实验

  1. 画出启动链:
    • BootROM
    • SPL
    • OpenSBI
    • U-Boot
    • kernel
    • initramfs
    • systemd
  2. 在 serial console 中进入 U-Boot。
  3. 查看 U-Boot environment:
printenv
bdinfo
help
version
  1. 记录启动命令、boot target、kernel command line。
  2. 对比正常启动和故意拔掉启动介质时的日志差异。
  3. 尝试从 U-Boot 手动列出启动分区。

推荐命令

journalctl -b -k
cat /proc/cmdline
ls /boot
ls /boot/dtb* 2>/dev/null || true
find /boot -maxdepth 3 -type f | sort
systemd-analyze
systemd-analyze blame

交付物

  • docs/02-boot-chain.md
  • logs/serial/uboot-env.log
  • logs/serial/failed-boot-no-media.log
  • 一张启动链图,可以用 Mermaid:
flowchart LR A[BootROM] --> B[SPL] B --> C[OpenSBI] C --> D[U-Boot] D --> E[Linux kernel] E --> F[initramfs] F --> G[systemd]

验收标准

  • 能解释 OpenSBI 为什么运行在 RISC-V machine mode。
  • 能解释 Linux 为什么通常运行在 supervisor mode。
  • 能从 boot log 中指出 OpenSBI、U-Boot、kernel 三个阶段。
  • 能说明 firmware、bootloader、kernel、rootfs 分别存在哪里。

第 3 周:RISC-V RV64GC、ABI、ELF 与基础汇编

3.1 目标

  • 理解 VisionFive 2 上运行的 RISC-V 64-bit Linux 程序。
  • 掌握 RV64GClp64d ABI、寄存器、函数调用约定、ELF 基础。

3.2 阅读

  • RISC-V Unprivileged ISA 相关章节。
  • RISC-V psABI 文档。
  • Fedora RISC-V 架构页面中关于架构、构建和包的说明。

3.3 实验

  1. 编译 C 程序并反汇编:
cat > hello.c <<'EOF'
#include <stdio.h>

int add(int a, int b) {
    return a + b;
}

int main(void) {
    printf("add=%d\n", add(1, 2));
    return 0;
}
EOF

gcc -O0 -g hello.c -o hello-O0
gcc -O2 -g hello.c -o hello-O2
readelf -h hello-O0
objdump -d hello-O0 > hello-O0.S
objdump -d hello-O2 > hello-O2.S
  1. 观察:
    • a0a7 参数寄存器;
    • sp 栈指针;
    • ra 返回地址;
    • 函数 prologue / epilogue;
    • callretldsd 等指令。
  2. 写一个最小 assembly 程序。
  3. gdb 单步调试。
  4. 比较 native compile 和 cross compile 的结果。

3.4 推荐命令

gcc -v
file hello-O0
readelf -h hello-O0
readelf -A hello-O0
objdump -d hello-O0 | less
gdb ./hello-O0
strace ./hello-O0

3.5 交付物

  • docs/03-riscv-architecture.md
  • apps/riscv-elf-labs/
  • apps/riscv-elf-labs/hello-O0.S
  • apps/riscv-elf-labs/hello-O2.S

3.6 验收标准

  • 能解释 RV64GCI/M/A/F/D/C 的含义。
  • 能解释 lp64d ABI。
  • 能根据反汇编指出函数参数、返回值和栈帧。
  • 能用 gdb 单步调试 RISC-V 程序。

第 4 周:Linux Userspace 外设访问:GPIO、I2C、SPI、UART

4.1 目标

  • 在 Fedora RISC-V 上完成基础外设访问。
  • 使用 userspace API 快速验证硬件。
  • 建立外设 bring-up 方法论。

4.2 阅读

  • VisionFive 2 pinout / datasheet。
  • Linux GPIO userspace 文档。
  • libgpiod 文档。
  • Linux I2C / SPI userspace 相关文档。

4.3 实验

  1. GPIO:
    • 接 LED 和按键;
    • 使用 gpioinfogpiosetgpioget 测试;
    • 写 C 或 Python demo。
  2. I2C:
    • 接一个温湿度传感器;
    • i2cdetect 确认地址;
    • 写读取程序。
  3. SPI:
    • 接 SPI loopback 或 SPI OLED / ADC;
    • 使用 spidev_test
  4. UART:
    • 接另一个串口设备;
    • minicom / picocom / Python pyserial 通信。

4.4 推荐命令

gpioinfo
gpiodetect
gpioset <chip> <line>=1
gpioget <chip> <line>
i2cdetect -l
i2cdetect -y <bus>
i2cdump -y <bus> <addr>
ls -l /dev/spidev*
ls -l /dev/ttyS* /dev/ttyUSB*

4.5 交付物

  • apps/gpio-demo/
  • apps/i2c-demo/
  • apps/spi-demo/
  • apps/uart-demo/
  • docs/04-userspace-peripherals.md

4.6 验收标准

  • 能在不改 kernel 的情况下验证 GPIO/I2C/SPI/UART 是否工作。
  • 能区分硬件接线错误、Device Tree 未启用、driver 未加载、权限不足。
  • 能写出一份外设 bring-up checklist。


第 5 周:systemd 服务、日志、udev、权限和守护进程

5.1 目标

  • 把外设 demo 变成可靠的 Fedora 服务。
  • 掌握嵌入式 Linux 常见 userspace 工程化方法。

5.2 阅读

  • Fedora systemd 相关文档。
  • systemd service unit 文档。
  • udev rule 基础。
  • Fedora 安全和服务权限相关资料。

5.3 实验

  1. 编写 vf2-sensor-agent
    • 周期读取 I2C 传感器;
    • 读取 GPIO 按键;
    • 输出 JSON 日志;
    • 提供简单 HTTP 或 MQTT 接口,二选一即可。
  2. 编写 systemd service:
    • Restart=on-failure
    • User=
    • Group=
    • NoNewPrivileges=true
    • ProtectSystem=
    • PrivateTmp=true
  3. 配置 udev rule,让服务用户拥有必要设备访问权限。
  4. 模拟外设断开、总线错误、进程崩溃,观察服务恢复。

5.4 推荐命令

systemctl daemon-reload
systemctl enable --now vf2-sensor-agent.service
systemctl status vf2-sensor-agent.service
journalctl -u vf2-sensor-agent.service -f
systemd-analyze security vf2-sensor-agent.service
udevadm info --attribute-walk --name /dev/i2c-<bus>
udevadm control --reload

5.5 交付物

  • apps/sensor-agent/
  • apps/sensor-agent/vf2-sensor-agent.service
  • apps/sensor-agent/README.md
  • docs/05-systemd-daemon.md

5.6 验收标准

  • 服务开机自动启动。
  • 外设错误不会导致系统失控。
  • journalctl 能看到结构化日志。
  • systemd-analyze security 输出已被记录,并能解释主要风险。

第 6 周:RPM 打包与 Fedora 系统集成

6.1 目标

  • 把 userspace 服务打包成 RPM。
  • 掌握 Fedora/RPM 工程交付基本流程。

6.2 阅读

  • Fedora Packaging Guidelines。
  • Fedora Developer Portal RPM 打包介绍。
  • RPM spec 文件基础。

6.3 实验

  1. 创建 RPM 打包目录。
  2. vf2-sensor-agent 编写 .spec
  3. 打包:
rpmdev-setuptree
rpmbuild -ba vf2-sensor-agent.spec
rpmlint vf2-sensor-agent.spec
rpmlint ~/rpmbuild/RPMS/*/*.rpm
  1. 安装、升级、卸载、回滚测试:
sudo dnf install ./vf2-sensor-agent-*.rpm
rpm -ql vf2-sensor-agent
rpm -qi vf2-sensor-agent
sudo dnf remove vf2-sensor-agent
  1. 可选:建立本地 RPM repo:
createrepo_c /path/to/repo

6.4 交付物

  • rpm/sensor-agent/vf2-sensor-agent.spec
  • rpm/sensor-agent/README.md
  • docs/06-rpm-packaging.md
  • 可安装的 RPM 包。

6.5 验收标准

  • RPM 安装后自动部署二进制、配置、systemd unit。
  • RPM 卸载后系统干净。
  • spec 文件能解释 %prep%build%install%files、scriptlets。
  • 能说明 Fedora 包与普通手动复制文件的工程差异。


第 7 周:Device Tree 与 JH7110 外设描述

目标

  • 能阅读并修改 VisionFive 2 / JH7110 Device Tree。
  • 理解 kernel 如何通过 Device Tree 创建 platform device。

阅读

  • Linux Kernel Device Tree 文档。
  • Documentation/devicetree/bindings/
  • mainline kernel 中 arch/riscv/boot/dts/starfive/
  • StarFive JH7110 datasheet / TRM 的外设章节。

实验

  1. 找到板级 DTS / DTSI:
find arch/riscv/boot/dts -iname '*jh7110*' -o -iname '*visionfive*'
  1. 阅读关键节点:
    • cpus
    • memory
    • chosen
    • aliases
    • soc
    • uart
    • gpio
    • i2c
    • spi
    • ethernet
    • sdio/mmc
  2. 修改一个安全的节点,例如启用某个 I2C/SPI 控制器或调整别名。
  3. 重新编译 DTB 并启动。
  4. /proc/device-treedmesgls /sys/bus/platform/devices 验证。

推荐命令

dtc -I dtb -O dts -o running.dts /boot/<your-dtb>.dtb
find /proc/device-tree -maxdepth 3 -type d | sort | less
ls /sys/firmware/devicetree/base
ls /sys/bus/platform/devices
dmesg | grep -Ei 'of:|device tree|i2c|spi|gpio|uart'

交付物

  • docs/04-device-tree.md
  • kernel/dts/
  • kernel/patches/0001-vf2-dts-lab.patch
  • 修改前后的 DTB / DTS 对比。

验收标准

  • 能解释 compatiblereginterruptsclocksresetspinctrlstatus
  • 能从 DTS 找到某个外设对应的 MMIO 地址。
  • 能说明 Device Tree 与 driver probe 的关系。
  • 能安全恢复到旧 DTB。

第 8 周:构建 Linux Kernel、Modules 与 DTB

目标

  • 从源码构建适用于 VisionFive 2 的 kernel、modules 和 DTB。
  • 能维护自己的 kernel config 和 patch。

阅读

  • Linux Kernel build 文档。
  • Fedora kernel / initramfs / boot loader 相关资料。
  • U-Boot 启动 kernel 的方式。

实验

  1. 拉取 kernel 源码:
git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux
  1. 建立配置:
make ARCH=riscv defconfig
make ARCH=riscv menuconfig
  1. 构建:
make ARCH=riscv -j$(nproc) Image modules dtbs
  1. 安装 modules 到测试 rootfs 或板上。
  2. 更新 /boot 中 kernel、DTB 和启动配置。
  3. 记录新旧 kernel 的启动差异。

推荐命令

uname -a
zcat /proc/config.gz > running.config 2>/dev/null || true
lsmod
modinfo <module>
dmesg -w
journalctl -b -k

交付物

  • docs/05-kernel-build.md
  • kernel/configs/vf2-lab.config
  • kernel/patches/
  • logs/serial/custom-kernel-boot.log

验收标准

  • 能启动自己构建的 kernel。
  • 能恢复到 Fedora 原 kernel。
  • 能解释 Imagemodulesdtbs 的作用。
  • 能说明 kernel config 与硬件支持的关系。

第 9 周:Kernel Module 与 Platform Driver 入门

目标

  • 编写第一个 kernel module。
  • 编写一个最小 platform driver,通过 Device Tree 匹配。
  • 理解 probe / remove / resource management。

阅读

  • Linux Kernel driver model 文档。
  • Platform driver 相关示例。
  • Device Tree binding 示例。
  • Kernel coding style。

实验

  1. 编写 hello_vf2.ko
    • module_init
    • module_exit
    • pr_info
  2. 编写最小 platform driver:
    • of_match_table
    • platform_driver
    • probe
    • devm_* resource management
  3. 在 DTS 中添加实验节点。
  4. 加载模块并观察 probe。

推荐命令

make -C /lib/modules/$(uname -r)/build M=$PWD modules
sudo insmod hello_vf2.ko
lsmod | grep hello
dmesg -w
sudo rmmod hello_vf2
modinfo hello_vf2.ko

交付物

  • kernel/modules/hello_vf2/
  • kernel/modules/vf2_platform_lab/
  • docs/06-driver-dev.md
  • logs/dmesg/platform-driver-probe.log

验收标准

  • 能解释 module 生命周期。
  • 能解释 platform driver 如何通过 compatible 匹配。
  • 能正确处理 probe 失败路径。
  • 能说明 devm_kzallocplatform_get_resourcedevm_ioremap_resource 的作用。

第 10 周:I2C / SPI / GPIO Interrupt Driver 实战

目标

  • 从 userspace 外设 demo 过渡到 kernel driver。
  • 掌握一个真实外设 driver 的基本结构。

阅读

  • Linux I2C driver 文档。
  • Linux SPI driver 文档。
  • GPIO descriptor API。
  • Interrupt handling 文档。
  • IIO 或 hwmon 子系统入门。

实验

选择一个方向:

方向 A:I2C 传感器 driver

  • 使用 i2c_driver
  • 通过 Device Tree 匹配。
  • 读取寄存器。
  • 通过 hwmonIIO 暴露数据。

方向 B:SPI 外设 driver

  • 使用 spi_driver
  • 实现基本读写。
  • 处理 mode、speed、bits-per-word。

方向 C:GPIO interrupt button driver

  • 使用 gpiod_get
  • 使用 gpiod_to_irq
  • 注册 threaded IRQ。
  • 通过 input subsystem 或 sysfs/debugfs 暴露事件。

推荐命令

dmesg -w
cat /proc/interrupts
ls /sys/bus/i2c/devices
ls /sys/bus/spi/devices
ls /sys/bus/platform/devices
trace-cmd record -e irq -e gpio sleep 5
trace-cmd report

交付物

  • kernel/drivers/vf2_<device>_lab/
  • kernel/dts/<device>-overlay-or-patch.dts
  • docs/06-driver-dev.md 更新真实 driver 章节。
  • logs/dmesg/real-driver.log

验收标准

  • driver 能稳定 probe。
  • 外设不存在时 driver 能优雅失败。
  • 错误路径不泄漏资源。
  • 能解释 driver 属于哪个 kernel subsystem。
  • 能说明为何某些功能应该放在 userspace,某些功能应该放在 kernel。

第 11 周:Debug、Tracing、性能与稳定性

目标

  • 建立嵌入式 Linux 调试工具箱。
  • 对 VisionFive 2 + Fedora RISC-V 做基础性能基线。
  • 能定位 boot、CPU、I/O、network、driver 问题。

阅读

  • Linux Kernel debugging 文档。
  • ftraceperfdynamic_debugtrace-cmd 文档。
  • systemd boot performance 文档。

实验

  1. Boot time:
systemd-analyze
systemd-analyze blame
systemd-analyze critical-chain
  1. CPU:
stress-ng --cpu 4 --timeout 60s --metrics-brief
perf stat stress-ng --cpu 4 --timeout 30s
perf top
  1. Storage:
fio --name=randread --filename=/tmp/fio.test --size=512M \
  --rw=randread --bs=4k --iodepth=16 --numjobs=1 --runtime=60 --time_based
  1. Network:
iperf3 -s
iperf3 -c <server-ip>
  1. Kernel tracing:
trace-cmd record -e sched_switch -e irq_handler_entry -e irq_handler_exit sleep 10
trace-cmd report
  1. Driver debug:
echo 'file <driver-file>.c +p' | sudo tee /sys/kernel/debug/dynamic_debug/control

交付物

  • docs/07-debug-performance.md
  • reports/performance-baseline.md
  • scripts/benchmark/
  • logs/trace/

验收标准

  • 能给出 CPU、storage、network、boot time 的基线数据。
  • 能用 tracing 工具分析一次中断或调度事件。
  • 能打开和关闭某个 driver 的 dynamic debug。
  • 能区分 userspace 慢、kernel 慢、I/O 慢、网络慢。

第 12 周:综合项目、产品化与后续路线

目标

  • 做一个完整小项目,串起系统启动、外设、服务、打包、监控、性能和文档。
  • 明确接下来 3–6 个月的进阶路线。

综合项目建议

项目名:vf2-edge-monitor

功能:

  1. 读取 I2C 温湿度传感器。
  2. 读取 GPIO 按键或中断事件。
  3. 可选读取 SPI 外设。
  4. systemd service 后台运行。
  5. 输出 JSON log。
  6. 提供 HTTP /metrics 或 MQTT 数据上报。
  7. RPM 打包。
  8. 提供 benchmark 脚本。
  9. 提供恢复文档。
  10. 提供一份 kernel / Device Tree 支持说明。

实验

  1. 整合前 11 周代码。
  2. 做一次从空白系统到完整部署的重装演练。
  3. 制作 release checklist。
  4. 做一次异常测试:
    • 外设断开;
    • 网络断开;
    • 服务崩溃;
    • 重启;
    • 磁盘空间不足;
    • 错误配置。
  5. 输出最终报告。

交付物

  • apps/vf2-edge-monitor/
  • rpm/vf2-edge-monitor/
  • docs/08-productization.md
  • reports/final-12week-report.md
  • reports/compatibility-matrix.md
  • scripts/install-from-scratch.sh

验收标准

  • 能在新刷 Fedora RISC-V 系统上按文档部署项目。
  • 服务能开机自启,并能自动恢复。
  • RPM 能安装、升级、卸载。
  • 报告包含硬件信息、系统版本、kernel version、测试命令、测试结果、已知限制。
  • 能清楚说明下一步应进入 kernel driver 深水区、Yocto/Buildroot 产品化,还是 multimedia / AI / vision 方向。

五、进阶路线

---------------------------------------------------------------------------------------------------------------------------
路线 A:Linux Kernel / Driver 专家
---------------------------------------------------------------------------------------------------------------------------
- interrupt controller;
- pinctrl / clock / reset;
- DMA;
- regmap;
- IIO;
- hwmon;
- netdev;
- V4L2;
- DRM/KMS;
- power management;
- upstream patch workflow。

目标产物:

- 写一个接近 upstream 质量的 driver。
- 给 Linux kernel、U-Boot、Fedora RISC-V 或 StarFive 相关项目提交 patch。



---------------------------------------------------------------------------------------------------------------------------
路线 B:Fedora / Linux 系统集成专家
---------------------------------------------------------------------------------------------------------------------------
- RPM packaging;
- private dnf repo;
- systemd hardening;
- SELinux policy;
- image build;
- secure update;
- observability;
- hardware-in-loop CI。

目标产物:

- 做一个可交付的 Fedora RISC-V edge image。

---------------------------------------------------------------------------------------------------------------------------
路线 C:Yocto / Buildroot 产品化专家
---------------------------------------------------------------------------------------------------------------------------
继续学习:
- Yocto layers;
- recipes;
- machine configuration;
- kernel / bootloader recipes;
- SDK;
- reproducible build;
- OTA;
- license compliance。

目标产物:

- 为 VisionFive 2 做一个最小产品 rootfs。

---------------------------------------------------------------------------------------------------------------------------
路线 D:Multimedia / Edge Vision 专家
---------------------------------------------------------------------------------------------------------------------------

继续学习:

- DRM/KMS;
- Mesa;
- V4L2;
- GStreamer;
- MIPI CSI;
- HDMI;
- hardware codec;
- camera sensor driver;
- ISP pipeline。

目标产物:

- 输出 Fedora mainline、StarFive vendor SDK、Yocto 三种环境下的 camera / display / codec 兼容矩阵。

posted @ 2026-07-26 14:38  游翔  阅读(25)  评论(0)    收藏  举报