RK-Forge外设系列开篇 - 把板子从「能启动」变成「能用」:Ethernet/SPI/MMC 三个纯接线外设rk-forge 已经开源带你从零把一颗几乎没人理的 RK3506用主线 Linux7.1 主线 U-Boot 一路跑到rk3506 login:——可按序打上去的补丁库、诚实的差距报告、完整 bringup 教程都在这。欢迎观摩喜欢点个⭐(笔者已经在构思独特于imx-forge的项目了)仓库地址https://github.com/Awesome-Embedded-Learning-Studio/rk-forge静态网页https://awesome-embedded-learning-studio.github.io/rk-forge/有朋友反馈说希望有PDF渲染的版本您可以戳戳https://github.com/Awesome-Embedded-Learning-Studio/rk-forge/releases/tag/pdf%2F2026-06-23-1120或者有其他更新的版本。因为我怕放百度网盘会被发文平台一脚踹飞所以如果不方便上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 让板子启动到 consolerootfs 让它持久跑进 shell。到这一步你手里是一块能开机、能登录、但啥也干不了的板子——网口没通、USB 不认、WiFi 没影。外设系列就是把这块能开机的砖变成能用的板。听起来工作量不小但有个让人松一口气的前提RK3506 这些外设的主线驱动基本都已经在上游了。dwmac-rk以太网、dw_mmc-rockchipSD/eMMC、spi-rockchip、dwc2USB、pl330DMA、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/OEthernet 的 carrier DHCP pingMMC 插卡读 MBR mountUSB 枚举设备。T1T2 不依赖外部硬件就能 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.dtsi和rk3506b-aes.dtsbuild dtb、出镜像、板验。落在三个 patch0004 Ethernet gmac1RMII、0005 MMC/SD SPI0、0006 补 gmac0。Ethernet先栽在 carrier0双口才发现真相Ethernet 第一次板验gmac1 probe 得很漂亮——rk_gmac-dwmac ff4d0000RMII、Synopsys ID 0x51、PHY 探到MDIO 通eth0 在、ifconfig up也成。但carrier0udhcpc 没响应。我当时第一反应是往物理上怀疑——错了。翻案的钥匙是拿 vendor 镜像在同块板上对照。vendor 的 log 里同时 probe 了gmac0ff4c8000和 gmac1ff4d0000两个口PHY 都是 YT8512而且 vendor 的 eth0gmac0 link up 了 100M。也就是说这块 ATK 板有两个 RJ45而我之前只照着 vendor DT 里 gmac1 那段开了 gmac1——用户的网线插在 gmac0 那个口上forge 只开了 gmac1eth0gmac1自然 NO-CARRIER。修就是0006把 gmac0 补全SoC 节点ethernetff4c8000对称于 gmac1mdio0eth_rmii0pinctrl注意 gmac0 在bank2gmac1 在 bank3不一样 板级gmac0reset-gpio、phy-handle、status okayrmii_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% lossLink Up DHCP ping 0% lossEthernet T3 全绿。SPIT1T2 干净T3 没条件SPI0 没啥波折。rockchip-spi ff120000.spiprobePIO 模式——我故意删了 vendor 那套 5-cell DMA 编码主线 pl330 不认起手两条Failed to request optional TX/RX DMA channel -ENODEV是良性的——可选 DMA 没拿到驱动继续走 PIO别被吓到。/dev/spidev0.0和0.1都在。这里有两个坑要记一下。一是 spidev 子节点的compatible必须用主线白名单里的值比如rohm,dh2228fv——主线 spidev 显式拒绝rockchip,spidev这种写法。二是 configCONFIG_SPI_ROCKCHIP要ymulti_v7 默认是m我们那个最小 busybox rootfs 不 modprobe必须内置否则板上 SPI 根本不 probe。这板 SPI 没留对外接口T3 loopback 做不了T1T2 到此即收。MMC/SD-110 绕了一大圈真因是卡没插紧MMC/SD 的 DT 节点0005移植本身没问题。但前几次板验插卡全-110mmc0: error -110 whilst initialising SD cardCard stuck being busy我绕了一大圈先怀疑物理接触又怀疑主线 dw_mmc 驱动回归逐项排除了 DT/clk/pinctrl/ops 全等价于 vendor——结果真因是 SD 卡没插紧。带 debug 打印的镜像boot-sdl-202606191808在板上把卡插紧直接枚举mmc0: new high speed SDXC cardmmcblk0: ... 58.2 GiB8 分区全出来。那条 debug 打印抓到的pending0x100RTO 超时全落在 CMD5/CMD52——那是 SDIO 探测命令探一张 SD 内存卡时的正常超时不是真错。这章最值钱的教训就是前面那个方法论判断硬件好不好拿 vendor 同板对照。我们一度把 MMC 的 -110 和 Ethernet 的 carrier0 一起归给物理问题是 vendor 那张 vendor_sdcard_logvendor 从 SD 启动把同一张 64G 卡读得干干净净还从它启动一眼把我们救回来的——硬件好的是 forge 软件的事。成功长这样A1 三件套全绿Ethernet双口link up DHCP ping、SPIT1T2、MMC/SD枚举 8 分区。到这里 forge 的设备树对 net/spi/mmc 已经自足不再依赖 vendor DT。下一章我们点亮 USB——那要补一小块 USB2PHY 驱动外加一个踩了才知道的 DT 坑。我们 Ch2 见。
RK-Forge外设系列开篇 - 把板子从「能启动」变成「能用」:Ethernet/SPI/MMC 三个纯接线外设
RK-Forge外设系列开篇 - 把板子从「能启动」变成「能用」:Ethernet/SPI/MMC 三个纯接线外设rk-forge 已经开源带你从零把一颗几乎没人理的 RK3506用主线 Linux7.1 主线 U-Boot 一路跑到rk3506 login:——可按序打上去的补丁库、诚实的差距报告、完整 bringup 教程都在这。欢迎观摩喜欢点个⭐(笔者已经在构思独特于imx-forge的项目了)仓库地址https://github.com/Awesome-Embedded-Learning-Studio/rk-forge静态网页https://awesome-embedded-learning-studio.github.io/rk-forge/有朋友反馈说希望有PDF渲染的版本您可以戳戳https://github.com/Awesome-Embedded-Learning-Studio/rk-forge/releases/tag/pdf%2F2026-06-23-1120或者有其他更新的版本。因为我怕放百度网盘会被发文平台一脚踹飞所以如果不方便上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 让板子启动到 consolerootfs 让它持久跑进 shell。到这一步你手里是一块能开机、能登录、但啥也干不了的板子——网口没通、USB 不认、WiFi 没影。外设系列就是把这块能开机的砖变成能用的板。听起来工作量不小但有个让人松一口气的前提RK3506 这些外设的主线驱动基本都已经在上游了。dwmac-rk以太网、dw_mmc-rockchipSD/eMMC、spi-rockchip、dwc2USB、pl330DMA、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/OEthernet 的 carrier DHCP pingMMC 插卡读 MBR mountUSB 枚举设备。T1T2 不依赖外部硬件就能 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.dtsi和rk3506b-aes.dtsbuild dtb、出镜像、板验。落在三个 patch0004 Ethernet gmac1RMII、0005 MMC/SD SPI0、0006 补 gmac0。Ethernet先栽在 carrier0双口才发现真相Ethernet 第一次板验gmac1 probe 得很漂亮——rk_gmac-dwmac ff4d0000RMII、Synopsys ID 0x51、PHY 探到MDIO 通eth0 在、ifconfig up也成。但carrier0udhcpc 没响应。我当时第一反应是往物理上怀疑——错了。翻案的钥匙是拿 vendor 镜像在同块板上对照。vendor 的 log 里同时 probe 了gmac0ff4c8000和 gmac1ff4d0000两个口PHY 都是 YT8512而且 vendor 的 eth0gmac0 link up 了 100M。也就是说这块 ATK 板有两个 RJ45而我之前只照着 vendor DT 里 gmac1 那段开了 gmac1——用户的网线插在 gmac0 那个口上forge 只开了 gmac1eth0gmac1自然 NO-CARRIER。修就是0006把 gmac0 补全SoC 节点ethernetff4c8000对称于 gmac1mdio0eth_rmii0pinctrl注意 gmac0 在bank2gmac1 在 bank3不一样 板级gmac0reset-gpio、phy-handle、status okayrmii_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% lossLink Up DHCP ping 0% lossEthernet T3 全绿。SPIT1T2 干净T3 没条件SPI0 没啥波折。rockchip-spi ff120000.spiprobePIO 模式——我故意删了 vendor 那套 5-cell DMA 编码主线 pl330 不认起手两条Failed to request optional TX/RX DMA channel -ENODEV是良性的——可选 DMA 没拿到驱动继续走 PIO别被吓到。/dev/spidev0.0和0.1都在。这里有两个坑要记一下。一是 spidev 子节点的compatible必须用主线白名单里的值比如rohm,dh2228fv——主线 spidev 显式拒绝rockchip,spidev这种写法。二是 configCONFIG_SPI_ROCKCHIP要ymulti_v7 默认是m我们那个最小 busybox rootfs 不 modprobe必须内置否则板上 SPI 根本不 probe。这板 SPI 没留对外接口T3 loopback 做不了T1T2 到此即收。MMC/SD-110 绕了一大圈真因是卡没插紧MMC/SD 的 DT 节点0005移植本身没问题。但前几次板验插卡全-110mmc0: error -110 whilst initialising SD cardCard stuck being busy我绕了一大圈先怀疑物理接触又怀疑主线 dw_mmc 驱动回归逐项排除了 DT/clk/pinctrl/ops 全等价于 vendor——结果真因是 SD 卡没插紧。带 debug 打印的镜像boot-sdl-202606191808在板上把卡插紧直接枚举mmc0: new high speed SDXC cardmmcblk0: ... 58.2 GiB8 分区全出来。那条 debug 打印抓到的pending0x100RTO 超时全落在 CMD5/CMD52——那是 SDIO 探测命令探一张 SD 内存卡时的正常超时不是真错。这章最值钱的教训就是前面那个方法论判断硬件好不好拿 vendor 同板对照。我们一度把 MMC 的 -110 和 Ethernet 的 carrier0 一起归给物理问题是 vendor 那张 vendor_sdcard_logvendor 从 SD 启动把同一张 64G 卡读得干干净净还从它启动一眼把我们救回来的——硬件好的是 forge 软件的事。成功长这样A1 三件套全绿Ethernet双口link up DHCP ping、SPIT1T2、MMC/SD枚举 8 分区。到这里 forge 的设备树对 net/spi/mmc 已经自足不再依赖 vendor DT。下一章我们点亮 USB——那要补一小块 USB2PHY 驱动外加一个踩了才知道的 DT 坑。我们 Ch2 见。