尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

全志D1s RISC-V开发板实战:硬件设计与Linux启动全流程解析

发布时间:2026/9/29 17:44:41

资讯中心
01
ARTICLE

全志D1s RISC-V开发板实战:硬件设计与Linux启动全流程解析

全志D1s RISC-V开发板实战:硬件设计与Linux启动全流程解析
1. 为什么全志D1s值得单独拿出来聊第一次拿到全志D1s这块板子的时候我其实没抱太大期望。RISC-V喊了这么多年市面上能买到的、资料相对齐全的、价格又能让个人开发者接受的开发板掰着手指头数也就那么几块。D1s算是其中一个比较特殊的存在——它是全志D1的精简版本去掉了DDR内存把DRAM集成到了芯片内部封装更小外围电路更简单但核心的那颗C906 RISC-V处理器还在主频依然是1GHz左右支持RV64GC指令集。这意味着什么意味着你可以用一块比名片还小的板子跑完整的Linux系统而且从硬件设计到系统启动的每一个环节你都有机会自己掌控。不是那种买回来插上电就能用的成品而是需要你理解电源树、理解DDR初始化、理解SPL和U-Boot的跳转逻辑、理解设备树怎么描述硬件。对于想真正搞明白“一块开发板从通电到跑起Linux到底经历了什么”的人来说D1s是一个非常好的学习载体。这篇文章我打算把两件事串起来讲一是硬件设计层面D1s的最小系统需要哪些东西电源怎么规划存储怎么选调试接口怎么留二是软件层面从芯片上电的第一条指令开始到Linux内核挂载根文件系统为止中间到底发生了什么。我会尽量把每个环节的“为什么”讲清楚而不是只告诉你“照着画就行”。适合谁看如果你有单片机基础想往Linux嵌入式方向走或者你已经在做ARM平台的开发想了解一下RISC-V生态到底走到哪一步了再或者你纯粹是对硬件设计感兴趣想知道一块核心板是怎么从原理图变成能跑系统的实物那这篇内容应该能给你一些参考。2. 全志D1s硬件设计拆解从芯片到最小系统2.1 D1s芯片的核心规格与选型逻辑全志D1s的官方型号是F133和D1F133-A最大的区别在于内存。D1需要外挂DDR3或DDR4颗粒而D1s直接把64MB DDR2封装进了芯片内部。这个设计取舍非常关键好处是PCB面积大幅缩小不需要做DDR等长布线硬件设计门槛直线下降代价是内存容量固定没法扩展跑一些内存占用大的应用会比较吃力。对于硬件设计来说D1s的外围电路可以做到非常精简。核心供电只需要几路核心电压、DDR电压、IO电压、模拟电压。具体来说D1s的电源域大致分为以下几类电源域典型电压用途注意事项VCC-CORE0.9VCPU核心供电需要大电流LDO或DCDC纹波要求高VCC-DRAM1.8V内置DDR供电对电源噪声敏感建议单独LDOVCC-IO3.3V通用IO供电可以和外围3.3V共用VCC-PLL1.8VPLL模拟供电需要LC滤波远离数字信号VCC-USB3.3VUSB PHY供电如果不用USB可以省略我实际画板子的时候VCC-CORE用的是AXP173电源管理芯片这颗芯片在全志生态里很常见集成度高支持锂电池充放电管理适合做便携设备。如果你只是做桌面开发板也可以用独立的DCDC加LDO方案成本更低但要注意上电时序。注意D1s对上电时序有要求核心电压一般要早于IO电压建立否则可能出现闩锁效应。具体时序建议参考官方数据手册的Power-Up Sequence章节不同批次芯片可能有细微差异。2.2 最小系统的必备电路与外围扩展一个能跑Linux的D1s最小系统除了芯片本身还需要以下几样东西晶振电路。D1s需要一颗24MHz的无源晶振作为系统主时钟源另外还有一颗32.768kHz的晶振用于RTC。24MHz晶振的负载电容需要根据晶振规格书来选一般是12pF到20pF之间。我遇到过因为负载电容选错导致系统起振困难的情况表现是串口没有任何输出排查了很久才发现是晶振问题。复位电路。D1s的复位引脚是低电平有效需要一个RC延时电路或者专用的复位芯片。RC电路成本低但复位时间受温度和电压影响较大。如果板子工作环境温度变化大建议用MAX809这类专用复位芯片输出稳定可靠。存储电路。D1s支持SPI NAND、SPI NOR、SD卡等多种启动方式。我建议至少留一个SPI NOR Flash焊盘和一个SD卡座。SPI NOR用于存放Bootloader和内核SD卡用于存放根文件系统和用户数据。SPI NOR选型上Winbond的W25Q128或者GD的GD25Q128都可以容量16MB足够放SPL、U-Boot和精简版内核。调试串口。这是最重要的调试手段没有之一。D1s的UART0默认作为调试串口波特率115200。你需要在PCB上留出TX、RX、GND三个测试点或者焊一个排针。我习惯用CH340G做USB转串口便宜好用Linux和Windows下驱动都很成熟。USB OTG接口。D1s支持USB 2.0 OTG可以用来烧录固件也可以作为从设备被PC识别。如果你打算用FEL模式烧录这个接口是必须的。电路上需要注意VBUS检测和ID引脚的处理具体参考官方原理图。以太网接口。D1s没有内置以太网MAC需要通过RMII接口外接PHY芯片。常见的方案是RTL8201或者YT8512。如果你不需要有线网络可以省略这部分用USB WiFi模块代替。不过RTL8723DU这类WiFi模块的硬件设计也有不少坑天线匹配和电源滤波都要注意。2.3 PCB布局布线的实战经验D1s虽然是QFN封装引脚间距不算太密但有几个地方需要特别注意。电源分割。核心电压和DDR电压的电源平面要尽量完整不要被信号线割裂。如果板子层数有限至少保证电源走线足够宽1A电流对应至少20mil线宽。DCDC的反馈引脚要远离电感否则会引入开关噪声。晶振布局。24MHz晶振要尽量靠近芯片的晶振引脚走线短而直下方不要走其他信号线周围包地处理。负载电容的地要直接连到芯片的GND引脚不要经过过孔绕远路。DDR部分。虽然D1s的DDR是内置的但芯片内部DDR的电源引脚还是需要外部供电。这些引脚对噪声很敏感建议用单独的LDO供电输出电容用低ESR的陶瓷电容容值组合一般是10uF加0.1uF加0.01uF。散热处理。D1s在满负荷运行时会有一定发热芯片底部的散热焊盘一定要充分接地PCB上对应位置要多打过孔连接到背面的大面积铜皮。如果空间允许可以加一块小散热片。我画第一版D1s板子的时候犯了一个低级错误把调试串口的TX和RX接反了。板子回来之后串口一直没输出查了半天以为是芯片没启动后来用示波器看TX引脚发现有波形才意识到是接反了。这种问题看起来很简单但实际调试的时候很容易被忽略。3. Linux启动全流程从上电到根文件系统3.1 BootROM阶段芯片出厂固化的第一段代码D1s上电之后第一段执行的代码是芯片内部固化的BootROM。这段代码是出厂就烧录好的用户无法修改。BootROM做的事情很有限初始化最基本的时钟和电源然后根据启动引脚的电平状态决定从哪个介质加载下一阶段代码。D1s支持的启动介质包括SPI NOR、SPI NAND、SD卡、USB FEL模式等。启动顺序由芯片的BOOT_SEL引脚决定具体组合参考数据手册。如果所有介质都没有找到有效的启动代码芯片会进入FEL模式等待通过USB接口接收主机发送的代码。FEL模式是一个非常有用的调试手段。即使你的板子上没有任何可启动的存储介质只要USB接口正常就可以通过全志提供的工具把代码直接加载到芯片的SRAM里运行。SRAM容量有限一般只能加载SPL这样的小程序但足够用来测试基本的硬件功能比如串口输出、DDR初始化等。提示FEL模式下芯片的USB VID/PID是固定的Linux下可以用lsusb命令查看是否识别到设备。如果识别不到检查USB电路和晶振是否正常工作。3.2 SPL阶段DDR初始化的关键一步SPL是Second Program Loader的缩写中文一般叫“二次程序加载器”。它的核心任务只有一个初始化DDR内存然后把U-Boot从存储介质加载到DDR里运行。为什么需要SPL因为DDR内存上电之后是不能直接使用的需要经过一系列初始化流程配置DDR控制器、设置时序参数、执行训练算法、校准延迟等。这些操作需要一定的代码空间和运行环境而芯片内部的SRAM容量太小放不下完整的U-Boot所以需要一个精简的SPL来先完成DDR初始化。D1s的SPL代码在U-Boot源码的arch/riscv目录下编译时会生成一个SPL二进制文件。这个文件需要被烧录到存储介质的特定偏移位置通常是8KB偏移处。BootROM会从存储介质的起始位置读取头部信息然后跳转到SPL的入口地址。SPL的DDR初始化参数非常关键。D1s内置的DDR2颗粒有固定的时序要求这些参数在全志的SDK里通常以头文件的形式提供。如果你自己从零开始移植需要仔细阅读DDR控制器的寄存器手册理解每个参数的含义。我见过有人因为tRFC参数设置不当导致系统运行一段时间后随机死机排查了很久才定位到DDR时序问题。3.3 U-Boot阶段硬件描述与内核加载SPL完成DDR初始化之后会把U-Boot proper加载到DDR里并跳转执行。U-Boot阶段做的事情就多了初始化各种外设、解析设备树、加载内核镜像、传递启动参数。D1s的U-Boot移植主要涉及几个方面时钟树配置、引脚复用配置、存储驱动、网络驱动、USB驱动等。全志的SDK里已经提供了比较完整的BSP但如果你用的是主线U-Boot可能需要自己补充一些驱动。设备树是U-Boot和Linux内核之间的桥梁。D1s的设备树文件一般放在arch/riscv/boot/dts/allwinner/目录下文件名类似sun20i-d1s-xxx.dts。设备树里描述了芯片的所有硬件资源内存地址、中断号、时钟、引脚复用、外设寄存器基地址等。内核启动时会解析设备树根据里面的描述来加载对应的驱动。我实际调试的时候遇到过设备树里串口引脚复用配置错误导致控制台没有输出的情况。表现是U-Boot阶段串口正常但内核启动到一半就没输出了。后来对比原理图和设备树发现是UART的TX引脚被配置成了普通GPIO模式。这种问题在设备树里改一个属性就能解决但定位过程需要你对硬件和软件都有了解。3.4 内核启动与根文件系统挂载U-Boot把内核镜像和设备树加载到DDR之后会跳转到内核入口地址。Linux内核启动过程大致分为几个阶段解压缩、早期初始化、驱动探测、挂载根文件系统、启动init进程。D1s的内核配置需要注意几点首先是CPU架构要选RISC-V具体是RV64GC其次是中断控制器和定时器的驱动要选对D1s用的是SiFive的PLIC和CLINT然后是串口驱动8250系列通用串口驱动一般都能用最后是存储驱动SPI NOR需要MTD驱动SD卡需要MMC驱动。根文件系统的制作方式有很多种。我习惯用BusyBox加Buildroot的方式生成一个精简的根文件系统大小可以控制在几MB以内。如果你需要更完整的功能可以用Debian或Ubuntu的RISC-V移植版但要注意D1s的内存只有64MB跑桌面环境基本不现实跑命令行还是可以的。挂载根文件系统的时候内核需要知道根文件系统在哪个设备上。这通过U-Boot传递给内核的bootargs参数来指定比如root/dev/mmcblk0p2表示从SD卡的第二个分区挂载。如果根文件系统是initramfs则不需要指定root设备内核会直接从内存里解压运行。注意D1s的SPI NOR如果用作根文件系统需要配置MTD分区表并且内核要支持JFFS2或UBIFS文件系统。SD卡则简单得多格式化成ext4就能用。4. 实操过程中踩过的坑与排查技巧4.1 串口无输出问题的排查思路串口无输出是调试D1s时最常见的问题可能的原因非常多。我一般按照以下顺序排查第一步确认电源是否正常。用万用表测量各路电压特别是核心电压和IO电压。如果电压不对先解决电源问题。第二步确认晶振是否起振。用示波器探头靠近晶振引脚看是否有24MHz的正弦波。如果没有检查负载电容和晶振本身。第三步确认复位信号是否正常。D1s的复位引脚在上电后应该有一个从低到高的跳变如果一直保持低电平芯片不会启动。第四步确认启动介质是否烧录了正确的固件。用编程器读取SPI NOR的内容对比烧录文件确认没有烧录错误。第五步确认串口线序是否正确。TX接RXRX接TXGND对接。这个看似简单但我至少犯过两次这样的错误。第六步确认串口工具的参数设置。波特率115200数据位8停止位1无校验无流控。如果以上都确认无误可以尝试进入FEL模式用全志的工具直接加载SPL到SRAM运行看串口是否有输出。如果有说明芯片本身没问题问题出在存储介质或烧录环节。4.2 DDR初始化失败的典型表现DDR初始化失败的表现通常是SPL阶段串口输出一些信息后卡住或者输出乱码。D1s的DDR是内置的理论上初始化参数应该比较固定但实际调试中还是可能遇到问题。一种情况是电源噪声导致DDR训练失败。DDR对电源纹波很敏感如果LDO的输出电容选型不当或者PCB布局不合理可能导致训练算法无法收敛。解决方法是优化电源滤波增加去耦电容或者降低DDR频率试试。另一种情况是SPL里的DDR参数和实际芯片不匹配。不同批次的D1s芯片内置DDR的时序参数可能有细微差异。如果遇到这种情况需要联系芯片供应商获取对应的参数文件或者尝试调整tRFC、tRAS等关键参数。还有一种情况是温度影响。DDR的时序参数会随温度变化如果板子工作在极端温度下可能需要做温度补偿。不过对于一般开发板来说这个问题不太常见。4.3 根文件系统挂载失败的常见原因内核启动到最后阶段如果提示“VFS: Cannot open root device”或者“Kernel panic - not syncing: VFS: Unable to mount root fs”说明根文件系统挂载失败。首先检查bootargs参数是否正确。在U-Boot命令行里用printenv查看bootargs确认root后面的设备路径和实际存储设备一致。SD卡一般是/dev/mmcblk0p1或p2SPI NOR一般是/dev/mtdblockX。其次检查存储驱动是否加载。在内核启动日志里搜索mmc或mtd相关的信息看驱动是否探测到了设备。如果驱动没有加载可能是设备树里没有使能对应的节点或者内核配置里没有编译对应的驱动。然后检查文件系统类型是否支持。如果根文件系统是ext4内核需要配置CONFIG_EXT4_FSy如果是UBIFS需要配置CONFIG_UBIFS_FSy。这些配置在make menuconfig里都能找到。最后检查存储介质本身是否正常。把SD卡插到电脑上看能否正常读写。如果SD卡本身有问题换一张试试。4.4 常见问题速查表现象可能原因排查方法解决方案串口无输出电源异常万用表测各路电压修复电源电路串口无输出晶振未起振示波器测晶振引脚更换晶振或负载电容串口无输出固件未烧录编程器读取SPI NOR重新烧录固件串口乱码波特率不对确认串口工具设置改为115200SPL卡住DDR初始化失败检查电源纹波优化滤波或降频内核panic根文件系统挂载失败查看bootargs修正root设备路径网络不通PHY驱动未加载查看内核日志使能PHY驱动USB不识别VBUS检测异常测量VBUS电压检查USB电路5. 关于RISC-V开发板的一些个人体会D1s这块板子我前前后后折腾了大概两个月从画原理图到打样回来调试再到把Linux跑起来中间踩了不少坑但也确实学到了很多东西。RISC-V生态现在还在快速发展的阶段工具链、内核支持、驱动完善度都在不断进步但和ARM相比确实还有差距。比如有些外设的驱动在主线内核里还没有需要自己从厂商SDK里移植再比如调试工具不如ARM那么丰富JTAG调试的体验还有提升空间。不过话说回来正是因为有这些不完善的地方才更有折腾的价值。当你自己把SPL的DDR参数调通看到串口输出第一行U-Boot信息的时候那种成就感是很实在的。而且RISC-V的指令集是开放的你可以深入到汇编层面去理解每一条指令的执行过程这在ARM平台上是很难做到的。如果你也想入手D1s我的建议是先从FEL模式开始用全志的工具把SPL加载到SRAM里跑通串口输出确认芯片和基本电路没问题然后再去折腾SPI NOR烧录和U-Boot移植。这样一步步来遇到问题也容易定位。硬件设计方面第一版板子不要追求功能大而全先把最小系统跑通后面再慢慢加外设。我见过太多人第一版就想把所有接口都做上去结果板子回来一堆问题根本无从下手。最后分享一个小技巧D1s的调试串口在FEL模式下也会输出一些信息如果你在FEL模式下能看到串口有规律的数据输出说明芯片的时钟和串口基本正常问题大概率出在存储介质或固件烧录环节。这个技巧帮我省了不少排查时间。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。