ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Marvell SDK实战指南:从环境搭建到固件调试的完整流程

Marvell SDK实战指南:从环境搭建到固件调试的完整流程 简介Marvell 6390/6190 系列芯片 SDK 是一套面向嵌入式开发者的完整软件开发工具包适用于网络设备、存储、物联网等场景帮助开发者高效调用芯片硬件功能并降低底层开发门槛。资源包以 rar 压缩共 365 个文件其中 C 源文件 180 个、头文件 135 个还包含 makefile、动态库、静态库以及 Visual Studio 工程文件等整包约 1.02MB体积小巧但内容较为系统。SDK 内提供了芯片专用驱动程序、API 接口、示例代码和项目模板覆盖端口控制、TCAM 表项、设备对象等关键模块代码层次分明便于查阅和二次开发。无论是入门学习 Marvell SDK 结构还是基于 6390/6190 进行产品级开发这套资料都能提供可直接参考的框架和范例。目前已有 1347 人学习下载具有一定的实践参考价值。 拿到一个芯片厂家的SDK和拿到一台没装系统的电脑差不多东西是真东西但能不能跑起来、跑起来之后稳不稳全看你怎么对待它。Marvell作为老牌半导体大厂产品线横跨网络交换、存储主控、PHY芯片、车载网络和定制SoC市面上能接触到Marvell SDK的人大概率都是做嵌入式底层、网络设备或存储方案开发的。这篇东西不打算做那种逐行解读文档的事我只想讲讲这些年实际摸Marvell SDK攒下来的那点经验怎么选对SDK怎么把环境搭顺编译启动会遇到哪些坑以及日志里那些看着像天书的信息到底在说什么。适用人群很明确拿到Marvell平台、准备做bring-up的工程师或者正在评估选型、想提前了解这套工具链值不值得投入的硬件/软件负责人。如果你只想做个快速原型不想被底层固件折腾这篇也能帮你判断该把精力花在哪一块。1. 内容整体设计与思路拆解Marvell SDK到底是个什么结构很多人第一次打开Marvell SDK的时候都是一脸懵原因在于这个“SDK”不是单一的东西而是一整套按芯片业务线拆分的工具链集合。Marvell的芯片业务大致分为几块每一块的SDK形态完全不同选错了方向后面的功夫基本白费。先按业务线捋一下网络交换芯片Ethernet Switch典型型号如98DX系列、Link Street系列SDK一般叫MSSMarvell Switching Software或者新版MSDK。这套东西提供的是完整的交换机管理面、数据面抽象层通常包含一坨驱动、一套API、还有模拟器可以在PC上先把控制逻辑跑通。PHY芯片以太网物理层型号如88E1512、88E2110、88Q5072这些SDK形态通常是PHY驱动源码加配置工具复杂度和交换芯片完全不是一个量级。存储主控Storage Controller比如热词里那个88SS9189属于SATA SSD主控。存储主控的SDK一般叫Firmware Development Kit里面主要是固件源码、量产工具、开卡工具。注意开卡工具和SDK是两码事开卡是产线用的SDK是开发固件用的别搞混。定制SoC如Armada系列、Octeon系列这类SDK更像传统BSP包含U-Boot、内核补丁、rootfs构建脚本、交叉编译工具链甚至会带一个基于Yocto的构建系统。所以拿到“marvell 芯片sdk”这个关键词第一步不是问“SDK怎么用”而是先确认你手上的芯片属于哪条产品线。这个判断非常重要因为Marvell官网的SDK下载入口是分产品线的而且很多SDK需要签NDA保密协议才能拿到交换芯片的MSS甚至要按license授权。比较稳妥的确认方法看芯片丝印或者完整型号去Marvell官网的Product页面查它归属的产品类别再对应找SDK入口。如果不确定手上芯片的真实型号直接用芯片表面丝印在官网检索比拆板看PCB丝印准得多。1.1 为什么同一个厂商会有这么多不同形态的SDK这里面的逻辑其实不复杂。网络交换芯片面对的是数据平面高性能转发SDK要解决的是如何在硬件转发表、TCAM、报文入口解析这些专用模块上做抽象让上层控制协议比如STP、LLDP、ACL不用直接操作寄存器。所以交换SDK天生就是重抽象层级的带硬件抽象层加API。而存储主控SDK面对的是闪存介质管理、ECC纠错、磨损均衡、FTL映射这活儿的复杂度集中在固件内部调度上和网络芯片完全是两个技术栈。SoC平台的SDK则更像板级支持包要把Linux跑起来要适配外设要调DDR训练参数。单看一个SDK的目录结构就能嗅出它的定位。网络交换SDK的目录一般有src/源码、include/头文件、tools/调试工具、docs/文档、regs/寄存器定义而SoC类SDK则会有u-boot/、kernel/、buildroot/或者yocto/这样的顶层目录。如果你拿到手的压缩包解压之后看到的是一堆Makefile外加README大概率是PHY驱动类的小SDK复杂度很低直接编依赖、调API就行。1.2 SDK版本选择里的门道选SDK版本是个容易被忽视但极其影响开发进度的环节。Marvell的SDK版本和芯片驱动版本、内核版本是强绑定的。举例来说同样是MSS SDK老版本对应的内核可能是3.x新版本则要求4.19以上。如果你板子的内核版本偏老强行编新SDK编译不过还是小事更麻烦的是deferred probe延迟探测时序不匹配导致PHY初始化失败这种问题排查起来极其耗时间。还有个实用小技巧下载SDK时留意Release Notes里的“Supported Platforms”和“Tested Kernels”两张表。不要在没验证过的内核版本上做首版移植除非你时间多到没处花。先用官方测试过的组合把系统跑起来再考虑内核升级这是我一直坚持的做法。2. 核心细节解析与实操要点从拿到SDK到跑通第一版固件不管你是哪种产品的SDK跑通第一版都绕不开三件事交叉编译环境、板卡初始化、日志输出。这三件事看起来基础实际每个都是坑密度极高的地带。2.1 交叉编译环境的搭建要点Marvell SDK大多数都指定了一套交叉编译工具链。网络交换类SDK有些甚至不需要编译内核直接用他们提供的crosstool-NG生成工具链即可。我的习惯是建一个独立的工具链目录不要放到系统全局路径里防止多个项目之间工具链版本冲突。具体来说mkdir -p /opt/marvell-toolchains cd /opt/marvell-toolchains tar xzf /path/to/marvell-toolchain.tar.gz export PATH/opt/marvell-toolchains/toolchain/bin:$PATH这里有个容易踩的坑很多SDK的顶层Makefile会用相对路径去定位工具链比如../toolchain/bin/arm-marvell-linux-gnueabi-gcc一旦你改了目录层级编译直接报command not found。这时候不要慌去看SDK根目录下的setup.sh或者environment脚本里面一般有工具链路径变量改这个变量就行。2.2 板卡初始化链路从BootROM到主程序Marvell芯片上电后的启动流程大体一致BootROM芯片内部固化代码加载第一级引导第一级引导从SPI Flash或eMMC加载U-BootU-Boot再拉起内核和根文件系统SoC类平台如果是纯交换芯片那就是BootROM加载固件镜像到内存然后跳转到主程序入口。SoC类平台这里有个关键调试技巧很多时候你拿到的新板子第一次上电根本起不来直接卡在U-Boot之前。原因五花八门DDR参数不对、时钟频率不匹配、甚至复位引脚拉不起来。这时候不要急着调SDK先用串口看BootROM是否有输出。Marvell的BootROM一般会打印一串带版本号的信息如果连这个都没有问题在硬件不在软件先把板子送回来查焊接。这里分享一个我常用的排查思路板子上电串口接好设置115200/8/N/1看有没有任何打印。如果有打印但卡死在DDR init先检查DDR容量和型号是否与board config匹配。如果U-Boot能起来但每次环境变量保存后重启就丢优先看mtdparts和env分区声明是否和实际Flash layout一致。如果SDK里的board config和你的板子内存颗粒厂家不一致DDR training大概率失败注意选型时尽量用SDK参考设计验证过的颗粒型号。2.3 PHY芯片驱动的坑如果做网络产品跑通PHY驱动是个必经环节。Marvell的PHY芯片如88E1512驱动本身很成熟但问题往往出在“MDIO总线访问不到PHY”上。排查顺序建议先确认MDIO/MDC引脚复用对不对这个要看SoC的pinmux配置。再确认PHY地址对不对很多PHY支持多地址由硬件引脚决定板子原理图上能看到。最后确认MDIO时钟分频是否满足PHY芯片的时间要求过快的MDIO时钟会导致寄存器读回来全是0xFFFF。具体怎么验证Linux下用mdio-tools读出PHY ID若能读到0x0141之类的值说明MDIO通路没问题。读不到就先别查驱动逻辑回头查硬件。2.4 固件镜像结构与编译产物辨识Marvell不同SDK编译出来的产物命名和格式差异很大。MSS SDK编出来的可能是msdk.bin而SoC BSP编出来的是u-boot.bin、uImage、dtb。存储主控SDK编译出来的是xxx_fw.bin或直接生成xxx.img用于量产开卡工具加载。拿到编译产物后第一步用hexdump或者readelfELF格式的话先看下文件头确认格式正确再烧录。我就见过有人把uImage当裸二进制直接从偏移0烧到SPI Flash的结果板子起不来回头查半天其实是烧录方式错了。烧录前先确认烧录工具需要的输入格式这个操作十秒钟能省下一天的排查时间。3. 实操过程与核心环节实现以网络交换SDK为例的完整bring-up流程虽然Marvell的SDK分好几类但可以拿网络交换MSS SDK做一个通用性较高的示例它的目录结构和编译流程在整个Marvell生态里算比较有代表性的。这套流程吃透之后再去上手其他平台的SDK思路都是相通的。3.1 拿到SDK后的目录摸底假设你已经拿到了MSS SDK的压缩包解压之后建议先看这几个东西ls -la cat README find . -maxdepth 2 -name Makefile* | headREADME里一般会写明支持芯片型号、依赖的工具链版本、已知问题这三块。这里不是走流程Marvell的README信息密度很高不少是直接从工程日志里整理出来的Known Issues部分值得逐条看完通常能帮你避开至少三个坑。3.2 编译一个最小固件的完整步骤以MSS的msdk目录为例编译流程大致如下cd msdk export ARCHarm export CROSS_COMPILEarm-marvell-linux-gnueabi- make prepare make config // 进入菜单配置选择芯片型号、板卡类型 make这里最容易懵的是make config它和Linux内核的menuconfig不一样选项更贴近交换芯片特性比如你选的是SerDes模式3.125G/6.25G/10.3125G、是否启用SyncE、端口速率等。关键是SerDes模式一定要和硬件原理图一致不然PHY协商永远不成功交换机端口起不来。配置完编译如果一切顺利在build/目录下会生成一个固件文件。但“编译过了”和“能跑起来”之间还有一道坎——地址映射。MSS SDK编译时默认的加载地址是给参考板设的如果你的板子内存映射不同固件可能加载到一半就崩。这时候需要在配置里调整DDR mapping甚至需要改boot parameters切记不要直接用参考板的默认值。3.3 板级适配参考板与你的板子的差异检查我见过太多新手拿着参考板的配置直接往自己板子上烧然后百思不得其解为什么跑不起来。SDK里的参考板配置只是为了验证SDK本身不是给你量产板用的。你必须逐项检查以下几处内存颗粒型号和容量DDR training参数是否一致。Flash型号和分区SPI Flash的兼容列表里有你的型号吗没有就自己加。时钟源主晶振频率是否匹配SDK里设定的core clock。复位逻辑板子上的复位芯片上电延迟时间是否满足芯片要求。为了省事我习惯先画一张差异表把参考板和自研板的这些参数一一列出来对比着改SDK配置哪里不一致改哪里才不会漏。说白了参考板是起点自己的板子才是终点。3.4 日志怎么读到关键信息Marvell SDK的日志体系比较统一一般会输出带模块前缀的打印信息。比如MSS会打印[MSS INIT]这样的标签存储固件则会有FTL_DEBUG、NAND_PROBE之类的标记。调试的时候有个技巧先把所有日志级别调到最高跑一遍正常流程抓一份正常日志作为基准。之后如果出现问题对比正常基准日志差异点就是故障点。这个方法比看代码定位快得多尤其适合调试启动卡死、中断风暴这些难啃的问题。4. 常见问题与排查技巧实录这部分是把这些年遇到的、看的、帮别人排查的高频问题做个整理。这些问题看起来各不相同但背后都有一个共性Marvell SDK提供的是框架而不是成品的答案很多参数必须结合硬件才能确定。4.1 “SDK tools里没有haxm”这类环境类问题的本质很多人把SDK和环境混为一谈比如热词里有“sdk tools里没有haxm”这种搜索其实指的是Android SDK的HAXM硬件加速执行管理器组件缺失和Marvell半毛钱关系没有。这提醒我一件事上搜索引擎找问题之前先确认关键词没跑偏。Marvell SDK的环境问题通常只有两种一是工具链版本和SDK需求不匹配二是内核头文件不完整导致编译不过。前者查Release Notes后者确认make kernel_prepare之类的步骤有没有执行。4.2 “编译时找不到头文件”的深层原因编译报fatal error: xxx.h: No such file or directory如果头文件确实存在十有八九是include路径没配对。Marvell SDK的include路径分两类一类是SDK自带的比如$(SDK_ROOT)/include另一类是依赖内核导出的头文件比如linux/autoconf.h。编译SDK自带模块时缺头文件多半是路径变量没设对检查Makefile里的INCLUDE_PATH。编译需要依赖内核的模块时缺头文件多半是你编译SDK时用的内核版本和解压出来的linux-headers版本不一致。解决办法回归到SDK官方文档推荐的“干净环境”步骤从解压开始重来一遍不要在原目录上反复打补丁。4.3 固件能加载但完全无输出的排查清单这个场景在交付出货前期特别常见烧录工具显示成功上电串口却什么都没有。我建议按以下优先级排查串口方向和接线有没有错位TX/RX是否交叉。拨码开关/跳线是否选择了正确的启动介质。BootROM是否成功执行如果有第二级引导二级引导是否损坏用烧录器读出对比。电源轨是否稳定用示波器测量每个电源轨的波形是否满足时序要求。这步要沉住气硬件问题比软件问题更隐蔽而且往往“看起来软件没问题”。4.4 如何判断一个报错是不是SDK的Bug判断是不是SDK本身的Bug有个相对高效的方法在Marvell官方支持论坛或者Release Notes里搜相同报错。如果找到相同案例且官方已修复升级版本即可。如果找不到再去怀疑自己的配置问题。另外Marvell有时会提供Patch包比如MSS的patches/目录里可能有一些未合入主干的修复。养成看patches目录的习惯很多你苦思冥想的问题其实官方早就修了只是没合进正式发布。5. 写在最后一点个人实践体会玩了这些年Marvell平台最大的体会是SDK只是一个起点真正决定项目成败的是你对硬件细节的把控程度。参考板能跑的配置不代表你的板子能跑编译通过也不代表固件能稳定运行。很多时候一个看似遥远的“配置项”在硬件上就是一个必须对齐的电阻电容值。如果你要在项目里用Marvell芯片早期花点时间把SDK的目录结构、编译流程、配置选项吃透后面能省很多事。一开始慢一点没关系把基础打牢比你后面反复回头看踩过的坑要划算得多。最后分享一个能保命的习惯每次给板子烧新固件前先把当前固件的完整日志存一份标注好板号、固件版本、配置变更说明。万一后续出问题这份存档能帮你快速锁定是软件变更还是硬件老化导致的问题。这个习惯我保持了八年救了我无数次。本文还有配套的精品资源点击获取
返回列表