RK-Forge外设系列开篇 - 把板子从「能启动」变成「能用」:Ethernet/SPI/MMC 三个纯接线外设

0 阅读7分钟

RK-Forge外设系列开篇 - 把板子从「能启动」变成「能用」:Ethernet/SPI/MMC 三个纯接线外设

rk-forge 已经开源!带你从零把一颗几乎没人理的 RK3506,用主线 Linux(7.1)+ 主线 U-Boot 一路跑到 rk3506 login:——可按序打上去的补丁库、诚实的差距报告、完整 bringup 教程都在这。欢迎观摩,喜欢点个⭐!(笔者已经在构思独特于imx-forge的项目了!)

仓库地址:github.com/Awesome-Emb…

静态网页:awesome-embedded-learning-studio.github.io/rk-forge/

有朋友反馈说希望有PDF渲染的版本,您可以戳戳: github.com/Awesome-Emb… 因为我怕放百度网盘会被发文平台一脚踹飞,所以如果不方便上Github的朋友,可以私信我要一下百度网盘链接!

外设系列第一章,先把三个"纯 DT、零驱动 patch"的外设点亮:Ethernet、SPI、MMC/SD。它们的主线驱动一个不缺(dwmac-rk、spi-rockchip、dw_mmc-rockchip),所以这一章基本就是接线 + 板验。Ethernet 双口通网是亮点,MMC 中途 -110 绕了一大圈(真因出乎意料),SPI 干净利落。完整记录见 notes/21

开干之前,先用两小节把这个系列后面反复要用到的两把"尺子"交代清楚:一套三层验证(T1/T2/T3)——外设"确实在工作"到底怎么算数;一条拿 vendor 同板对照的方法论——判断"硬件到底好不好"时别轻易往物理接触上瞎归因。这两条是本章 Ethernet/SPI/MMC 几次翻案的依据,也是整个外设系列的底色。交代完它们,我们再回到这一章的主角:Ethernet、SPI、MMC/SD 这三个"纯接线"外设。

核心通了,外设还白着

boot 让板子启动到 console,rootfs 让它持久跑进 shell。到这一步,你手里是一块"能开机、能登录、但啥也干不了"的板子——网口没通、USB 不认、WiFi 没影。外设系列就是把这块"能开机的砖"变成"能用的板"。

听起来工作量不小,但有个让人松一口气的前提:RK3506 这些外设的主线驱动,基本都已经在上游了。dwmac-rk(以太网)、dw_mmc-rockchip(SD/eMMC)、spi-rockchip、dwc2(USB)、pl330(DMA)、ES8328(音频 codec)……一个都不缺。所以外设 bringup 的主体是"接线活"——把这些驱动用设备树接到板子的引脚上、在 config 里打开、再上板验证。绝大多数不用写驱动。

三层验证:T1 / T2 / T3

外设"确实在工作"不能只看 dmesg 蹦一行 probe,我们分三层逐级坐实,每层都有硬证据:

  • T1 驱动 probe——dmesg 有 probe 行,/sys/bus/.../drivers/... 绑了节点。
  • T2 设备就绪——总线枚举到:/sys/class/net/eth0/dev/mmcblk0/dev/spidev0.*
  • T3 功能——真 I/O:Ethernet 的 carrier + DHCP + ping,MMC 插卡读 MBR + mount,USB 枚举设备。

T1+T2 不依赖外部硬件就能 100% 坐实"DT + 驱动正确";T3 要网线/卡/U盘,有就验、没有就诚实标 needs <gear>,不装假通过。

一个值钱的方法论:拿 vendor 同板对照

判断"这块板的硬件到底好不好",别只盯 forge 自己的 log——把 vendor 镜像跑在同一块板、同一个 SPI-NAND 上对照。vendor 能读出来的东西,硬件就是好的;forge 读不出,那就是 forge 软件问题,别轻易往"物理/接触"上归因。我们在 MMC 上栽过这个跟头(下面 MMC 一节细讲),后来靠 vendor 同板 log 一眼翻案。这条方法论后面每章都会用到。

A1 这批为什么是"纯接线"

按外设 bringup 的难易分档,Ethernet / SPI / MMC/SD 属于最干净的那一档——主线驱动全在、config 也都 =y,预期就是把 vendor DT 的节点抄进我们的 rk3506.dtsirk3506b-aes.dts,build dtb、出镜像、板验。落在三个 patch:0004 Ethernet gmac1(RMII)、0005 MMC/SD + SPI0、0006 补 gmac0。

Ethernet:先栽在 carrier=0,双口才发现真相

Ethernet 第一次板验,gmac1 probe 得很漂亮——rk_gmac-dwmac ff4d0000 RMII、Synopsys ID 0x51、PHY 探到(MDIO 通),eth0 在、ifconfig up 也成。但 carrier=0,udhcpc 没响应。我当时第一反应是往物理上怀疑——错了。

翻案的钥匙是拿 vendor 镜像在同块板上对照。vendor 的 log 里同时 probe 了 gmac0(ff4c8000)和 gmac1(ff4d0000)两个口,PHY 都是 YT8512,而且 vendor 的 eth0=gmac0 link up 了 100M。也就是说这块 ATK 板有两个 RJ45,而我之前只照着 vendor DT 里 gmac1 那段开了 gmac1——用户的网线插在 gmac0 那个口上,forge 只开了 gmac1,eth0(=gmac1)自然 NO-CARRIER。

修就是 0006 把 gmac0 补全:SoC 节点(ethernet@ff4c8000,对称于 gmac1)+ mdio0 + eth_rmii0 pinctrl(注意 gmac0 在 bank2,gmac1 在 bank3,不一样)+ 板级 &gmac0(reset-gpio、phy-handle、status okay)+ rmii_phy0。重烧上去,boot-sdl-2026-06191755 就是结果:

rk_gmac-dwmac ff4c8000.ethernet eth0: PHY [stmmac-0:01] driver [Generic PHY]
rk_gmac-dwmac ff4c8000.ethernet eth0: Link is Up - 100Mbps/Full
udhcpc: lease of 192.168.60.132 obtained from 192.168.60.254
# ping -c3 192.168.60.2  →  3 packets received, 0% loss

Link Up + DHCP + ping 0% loss,Ethernet T3 全绿。

SPI:T1+T2 干净,T3 没条件

SPI0 没啥波折。rockchip-spi ff120000.spi probe(PIO 模式——我故意删了 vendor 那套 5-cell DMA 编码,主线 pl330 不认),起手两条 Failed to request optional TX/RX DMA channel -ENODEV良性的——可选 DMA 没拿到,驱动继续走 PIO,别被吓到。/dev/spidev0.00.1 都在。

这里有两个坑要记一下。一是 spidev 子节点的 compatible 必须用主线白名单里的值,比如 rohm,dh2228fv——主线 spidev 显式拒绝 rockchip,spidev 这种写法。二是 config:CONFIG_SPI_ROCKCHIP=y,multi_v7 默认是 =m,我们那个最小 busybox rootfs 不 modprobe,必须内置,否则板上 SPI 根本不 probe。这板 SPI 没留对外接口,T3 loopback 做不了,T1+T2 到此即收。

MMC/SD:-110 绕了一大圈,真因是卡没插紧

MMC/SD 的 DT 节点(0005)移植本身没问题。但前几次板验插卡全 -110mmc0: error -110 whilst initialising SD card + Card stuck being busy),我绕了一大圈:先怀疑物理接触,又怀疑主线 dw_mmc 驱动回归,逐项排除了 DT/clk/pinctrl/ops 全等价于 vendor——结果真因是 SD 卡没插紧

带 debug 打印的镜像(boot-sdl-202606191808)在板上把卡插紧,直接枚举:mmc0: new high speed SDXC card + mmcblk0: ... 58.2 GiB + 8 分区全出来。那条 debug 打印抓到的 pending=0x100(RTO 超时)全落在 CMD5/CMD52——那是 SDIO 探测命令探一张 SD 内存卡时的正常超时,不是真错。

这章最值钱的教训就是前面那个方法论:判断硬件好不好,拿 vendor 同板对照。我们一度把 MMC 的 -110 和 Ethernet 的 carrier=0 一起归给"物理问题",是 vendor 那张 vendor_sdcard_log(vendor 从 SD 启动,把同一张 64G 卡读得干干净净还从它启动)一眼把我们救回来的——硬件好的,是 forge 软件的事。

成功长这样

A1 三件套全绿:Ethernet(双口,link up + DHCP + ping)、SPI(T1+T2)、MMC/SD(枚举 + 8 分区)。到这里 forge 的设备树对 net/spi/mmc 已经自足,不再依赖 vendor DT。下一章我们点亮 USB——那要补一小块 USB2PHY 驱动,外加一个踩了才知道的 DT 坑。我们 Ch2 见。