ARTICLE DETAIL

资讯详情

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

Marvell 88E6390x No-CPU模式配置与烧录实战

Marvell 88E6390x No-CPU模式配置与烧录实战 做交换芯片这一行的人大概率都有过类似的经历主控CPU还没起来或者干脆不想用CPU但板子上的交换芯片必须先把流量跑通。这时候Marvell 88E6390x系列就派上大用场了。这颗芯片在企业级和工业级交换方案里出镜率极高尤其是它的No-CPU模式本质上是让芯片脱离外部主控通过内部自举逻辑完成端口初始化、转发配置和地址学习独立把数据面撑起来。我这两年经手了好几块基于88E6390x的板卡从底板画完到Bringup再到后面为了省成本砍掉CPUNo-CPU模式的配置和烧录这条路算是踩了个遍。这篇文章就把我从零开始配置、烧录到联调的全过程整理出来包括硬件上要注意的strap引脚、EEPROM布局、烧录工具选型以及几个特别容易翻车的坑。文章里涉及的具体寄存器偏移和配置取值基于88E6390x公开的datasheet和Marvell官方SDK里的默认模板同时结合了我实际调板时的修改记录你可以直接拿去做参考。1. 先搞懂No-CPU模式它到底解决了什么问题1.1 为什么需要No-CPU模式先说一下典型场景。很多交换机、路由器、工业网关的硬件架构里交换芯片是数据面核心而控制面由一颗独立的CPU可能是x86、ARM SoC或者MIPS来承担。CPU通过MDIO、I2C或者PCIe去配置交换芯片的寄存器维护路由表、MAC地址表处理各种协议报文。这套方案很成熟但问题也很现实成本高。一颗能跑完整协议栈的CPU物料成本少则几十块多则几百块。功耗高。CPU一跑起来散热、电源都得跟着升级。可靠性要求。在某些工业场景或纯二层透传场景里根本不需要CPU只需要把报文按VLAN和端口策略不落地转发就行。No-CPU模式就是专门解决这个问题的。它让88E6390x在上电后不依赖任何外部处理器直接从片外的EEPROM读取配置信息然后自动完成交换核心的初始化。配置内容包括端口速率、双工模式、VLAN划分、端口镜像、QoS策略等等。配置加载完成之后这颗芯片就成了一台完整的二层交换机报文转发的活它自己全包了。我打个比方这就好比一台电脑没装操作系统但BIOS里已经写好了所有硬件的驱动参数开机就能直接跑一个固定功能的程序。88E6390x在这个模式下EEPROM就是它的“BIOS”而交换核心就是那个“固定程序”。1.2 与传统CPU管理模式的本质区别这里要强调一点No-CPU模式并不是“阉割版”的交换芯片它只是把配置来源从“外部CPU动态下发”变成了“内部逻辑上电自举读取”。从硬件角度看88E6390x的交换核心、SerDes、MAC全部都在能力没有任何削减。区别主要体现在三点可编程性不同。CPU模式下协议栈和业务逻辑可以在Linux或RTOS里动态控制随时改表项No-CPU模式下所有配置在烧录时就定死了运行中想改只能靠EEPROM重烧或者通过内部的间接访问接口去改但这就回到需要主控的路子了。管理通道不同。CPU模式通常有完善的OAM、SNMP、CLI管理No-CPU模式最多预留一个串口或者I2C接口用于调试不上业务管理面。故障恢复能力不同。CPU模式下CPU宕机可能导致交换芯片部分功能失效No-CPU模式下没有CPU这个单点芯片自己跑反而更皮实。实际我带过的一款42口千兆工业交换机最初设计是外接一颗ARM A7核心板做管理后面客户说不需要网管功能只要端口隔离和静态VLAN我就直接把核心板去掉改成了No-CPU模式。整板功耗从原来的6W降到了3W不到BOM成本砍掉了接近一半。2. 硬件准备上电之前必须确认的引脚和连接2.1 核心依赖最小系统88E6390x要跑起来其实外围硬件非常精简。数据手册里给出的最小系统就是一颗25MHz参考时钟晶振部分封装也可以用差分时钟输入一组SerDes参考时钟通常也是25MHz或者125MHz取决于端口模式片选和复位信号一颗I2C接口的EEPROM这里很多第一次做No-CPU模式的人会犯一个错误以为EEPROM是“选配”实际不是。88E6390x在没有任何外部配置源的情况下默认配置只能让某些端口以固定的方式工作而且不同批次、不同封装默认值可能还不一样根本没法保证行为一致。所以No-CPU模式的先决条件就是板上必须有一颗EEPROM而且地址必须和芯片的I2C地址访问约定匹配。2.2 strap引脚就是硬件的“初始密码”在芯片上电硬复位释放之后、内部逻辑开始读EEPROM之前芯片会采样一组配置引脚这些引脚在手册里叫strap pin或者config pin。它们决定了三件事芯片的I2C从机地址用于后续调试访问EEPROM的I2C地址和位宽16位地址还是8位地址加载模式的选择No-CPU自举模式 / 外部CPU模式这块必须仔细对着原理图查。我遇到过一块板子原理图上strap引脚画成了内部下拉结果上电后芯片一直进不去自举模式读I2C总线发现芯片根本没去访问EEPROM。最后逐根pin量电平发现是某颗电阻贴错位把本该拉高的引脚拉低了。硬件上的一个小错能让你在软件层排查三天。建议拿到板子先做三件事查原理图确认所有strap pin的上下拉电阻都按datasheet推荐值来。用万用表量上电瞬间的电平最好用示波器抓因为这些引脚只在复位释放后的很短时间内被采样。确认EEPROM的A0/A1/A2地址引脚不要和板上其他I2C设备冲突。2.3 I2C EEPROM的选型与连接88E6390x加载配置走的是标准I2C接口EEPROM容量从16Kbit到512Kbit都行主要看你要存多少配置。我自己的经验是端口数量多、VLAN划分多、还想带一些静态MAC表项的直接上256Kbit32KB起步别抠这点成本。EEPROM选用上注意几点支持标准I2C速率400kHz以内足够芯片读配置时通常不会跑高速最好选Atmel/Microchip的AT24系列或者ON Semi的CAT24系列兼容性最稳地址引脚要硬连接到确定的电平不要悬空连接上就是标准的I2C上拉1.8V或者3.3V电平根据芯片IO供电决定别把不同电平域的I2C直接搭在一起要有电平转换。3. 配置生成的完整逻辑EEPROM里到底写的是什么3.1 配置模板从哪来Marvell官方SDK里通常会附带一个叫做mvSwitch或者类似的工具包里面有一堆XML或者文本格式的配置文件模板对应不同的芯片型号。88E6390x的模板文件名大概长这样MV88E6390_X.xml。我第一次用的时候对着那个几百行的XML一脸懵里面铺天盖地的寄存器地址和值根本不知道从哪改起。后来才摸到门道这些模板是按功能块组织的不需要全改只需要关注几个大项端口全局使能端口模式SerDes速率/介质类型默认VLAN和端口VLAN成员关系静态MAC地址表可选QoS默认优先级镜像和ACL可选3.2 用官方工具生成二进制SDK提供的工具链里有一个叫mv_switch_config_gen或者类似的命令行程序作用就是把XML配置文件编译成可以直接烧进EEPROM的二进制镜像。这个工具处理的事情包括把人类可读的配置转换成寄存器地址映射计算并填入校验和按照芯片加载顺序排列数据块命令大概是这个风格./mv_switch_config_gen -i MV88E6390_X.xml -o eeprom_image.bin -chip 88E6390X生成完之后别急着烧先用十六进制工具打开看一眼。正常情况下文件开头应该有一段特定的魔数Magic Number不同版本的芯片可能不一样主要是用于芯片加载时识别配置格式。如果你看到的是全0或者明显乱码说明XML解析没成功。3.3 关键配置项实战解读我挑几个在No-CPU模式里最常改的配置项配合实际意义说清楚。端口使能和速率port id0 enabletrue/enable speed1000/speed fduplextrue/fduplex /port这段的意思是0号端口启用速率千兆全双工。No-CPU模式下端口默认是自协商还是强制定死完全取决于这个配置。如果你连的是交换机上联口建议开自协商如果是点对点背板连接直接强制千兆全双工更省事避免协商失败。VLAN配置vlan id1 member ports0,1,2,3,4,5/ untag ports0,1,2,3,4/ /vlan这段定义了VLAN 1的成员端口。注意untag和tag的区别接PC的口要untag接交换机 trunk 的口要tag。很多人在这里栽跟头配完之后PC能ping通但接上联交换机死活不通多半就是untag/tag搞反了。静态MAC表fdb entry mac00:11:22:33:44:55 vlan1 port2/ /fdb静态MAC表项在某些场景下很有用。比如做端口安全只允许特定MAC访问特定端口No-CPU模式下没有CPU去跑认证协议静态MAC就是最简单粗暴的黑白名单。3.4 配置文件校验和不能忽略的细节EEPROM镜像末尾的校验和字段是芯片加载时用来判断配置是否完整的。如果校验和不对芯片会认为EEPROM里没有有效配置直接按默认值启动。我自己遇到过一次很奇怪的现象功能配置全都正常但只要一断电重启端口就全部变成默认行为。查了一圈发现是我用第三方烧录器改镜像的时候改了中间某个字节但没有重新计算末尾的校验和。芯片加载时校验失败直接放弃了整份配置。所以无论你用官方工具还是自己改二进制最后一定要重新计算校验和。官方生成工具一般会自动算但如果手动patch过就得自己来。校验和算法很简单一般是对整份镜像做累加和取反具体参考datasheet里的描述。4. 烧录实战三种方案和完整步骤4.1 方案对比EEPROM烧录的方式主要有三种我按推荐程度排个序方案工具适用场景灵活性离线烧录器街边的CH341A或者正品BeeProg小批量生产、研发初期低板级I2C烧录I2C转接板 脚本样机调试、变更频繁高芯片内建烧写接口通过88E6390x自身的I2C slave去写EEPROM批量生产、产测高如果你只是做几块样板验证用CH341A就能搞定便宜而且够用。但如果你后面要小批量产建议直接用板级I2C烧录把固件镜像通过I2C写进EEPROM比拆芯片下来烧效率高得多。4.2 方案一离线烧录器操作实录这个方案最简单把EEPROM芯片从板上拆下来或者预留了烧录座夹到烧录器上选好型号加载镜像点烧录。完整步骤用镊子或者热风枪把EEPROM拆下来注意别把焊盘搞掉了。把EEPROM放到烧录器的适配座里注意方向1脚对准。打开烧录软件选择芯片厂商和型号比如Atmel AT24C256。加载之前生成好的eeprom_image.bin。点“擦除”等完成后再点“编程”或者“写入”。写入完成后点“校验”确认数据和文件一致。用热风枪或烙铁把EEPROM焊回板上。这里有个细节有些烧录器软件默认会在写入前自动擦除整个芯片但如果你用的是二手芯片建议手动做一次全片擦除再写避免残留数据干扰。4.3 方案二板级I2C直接烧录这个方案是我比较推荐在调试阶段用的不用反复拆芯片节省大量时间。你需要一个USB转I2C的适配器我用过FTDI的FT2232H也用过国产的CH341都能干这活。接线就是I2C的四根线SCL、SDA、GND有时还要接VCC做电平参考。烧录脚本我一般用Python配上smbus或者pyftdi库。下面是一个最简单的写入流程示例import smbus import time bus smbus.SMBus(1) # 适配器对应的I2C总线号 eeprom_addr 0x50 # EEPROM的7位I2C地址 def write_eeprom(offset, data): # AT24C256是16位地址所以先发高字节地址再发低字节地址 addr_hi (offset 8) 0xFF addr_lo offset 0xFF # 一次最多写32字节AT24C256页大小 for i in range(0, len(data), 32): chunk data[i:i32] bus.write_i2c_block_data(eeprom_addr, addr_hi, [addr_lo] list(chunk)) time.sleep(0.01) # 等待写周期完成写入完成后还要读出来验证一遍。读比写简单def read_eeprom(offset, length): addr_hi (offset 8) 0xFF addr_lo offset 0xFF bus.write_i2c_block_data(eeprom_addr, addr_hi, [addr_lo]) data bus.read_i2c_block_data(eeprom_addr, 0, length) return bytes(data)读出来之后和原文件做比对不一致就重新写。字节级别的差异很多时候是地址对齐问题不是烧录器坏了。4.4 方案三通过88E6390x自带的I2C slave接口去烧录第三种方案适合产线思路是这样的芯片上电后进入No-CPU模式失败比如EEPROM为空这时芯片会退化成I2C slave设备外部可以通过I2C访问芯片内部的寄存器然后借助芯片内部的EEPROM控制器去写EEPROM。具体的调节流程一般是用Marvell的debug工具通过I2C向芯片发命令让芯片进入一个特殊模式再由芯片代写EEPROM。这个流程在量产时非常实用因为不需要拆机也不需要外部烧录器产线只需要一个I2C夹具就能完成固件注入。但这个方案依赖Marvell提供的工具链和文档不是所有版本的SDK都开放这部分能力要看你拿到的NDA文档级别。如果你只是在做自己的项目用前两种方案就够了。5. 从Marvell 88q5152看同类芯片的No-CPU设计思路5.1 88q5152是什么做车载以太网或者工业确定性网络的同行最近可能注意到了Marvell的另一颗芯片88Q5152。它属于Marvell的车规级以太网交换芯片系列定位和88E6390x不大一样但在No-CPU/无主控自举的设计思路上有很强的参考价值。88Q5152主要面向车载骨干网络支持1000BASE-T1、100BASE-T1等车载以太网物理层标准同时集成了安全功能。它的工作模式里也有类似的自举机制可以从外部存储加载配置从而在没有主控的情况下独立完成交换任务。5.2 两颗芯片No-CPU思路的异同相同点都支持通过外部存储如EEPROM/SPI Flash加载静态配置都强调在无主控情况下的独立转发能力配置加载失败时都有默认兜底行为都支持通过调试接口I2C/SPI在运行时做有限度的寄存器级访问不同点物理层不同。88E6390x的SerDes一般是XFI/SGMII/RGMII用于标准以太网88Q5152走的是车载以太网特有的BASE-T1物理层链路建立机制和自协商流程差异很大。配置管理粒度不同。88Q5152由于面向功能安全场景配置里往往还要带上安全相关的参数比如安全启动的密钥、CRC校验策略。生态不同。88E6390x的SDK和No-CPU工具链相对成熟资料多88Q5152的很多细节要签NDA才能拿到自己做自举开发难度更大。5.3 对做No-CPU方案的人的启发如果你之前只玩过88E6390x突然换到88Q5152不要慌底层的思路是一样的先查strap、再理存储、再调配置模板、最后验证加载。不同之处在于物理层和安全机制的配置项更多你需要在配置里多加些耐心去逐项核对。反过来说如果你是从88Q5152入门回头再玩88E6390x会觉得88E6390x的No-CPU模式清爽很多至少没有那么多功能安全相关的死规定。6. 常见问题与排查技巧实录6.1 芯片上电后完全没有转发行为这是最常见的现象。先别急着查软件按这个顺序来示波器抓I2C总线的SCL/SDA确认芯片有没有发起读EEPROM的操作。如果发现有读操作但数据都是0xFF或者0x00说明EEPROM里没烧进去或者地址不对。确认EEPROM的地址引脚A0/A1/A2的组合必须和芯片预期的地址匹配。确认strap引脚采样值。如果芯片采样到的是外部CPU模式它根本不会去读EEPROM。6.2 端口link up了但报文不通端口能link up说明SerDes和MAC层的协商是好的不通大概率在VLAN或者端口隔离配置上。优先检查:端口的PVID是否设置正确端口是否在对应的VLAN成员列表里是否误开了端口隔离port isolation导致同VLAN端口之间无法互访6.3 上电加载配置时而成功时而失败这个问题比较妖通常的原因是EEPROM的I2C时序不满足要求。88E6390x在加载配置时如果它在读EEPROM的过程中遇到了NACK或者总线冲突它不会重试而是直接跳过去。这就导致每次上电的行为可能不一致。排查手段:用示波器看EEPROM的SCL频率如果芯片跑的是400kHz但EEPROM只支持100kHz就会出现这种随机失败检查I2C上拉电阻上拉太弱比如10k在快速翻转时可能拉不上去导致时序违规考虑EEPROM写入时的等待时间烧录器写完之后立刻读可能读出来是旧的数6.4 配置烧录成功但事实和期望不一致我遇到过一种情况配置模板里写的端口速度是千兆但实际link起来只有百兆。最后发现是SerDes参考时钟配置不对导致MAC和PHY之间速度协商出问题。这种情况下不要只盯着交换芯片的配置还要检查和你对接的PHY或者对端设备的配置。No-CPU模式下芯片不会自动做速度协商的补偿所有速度配置都得在两边同时匹配好。6.5 快速定位三板斧调试No-CPU模式我总结了三板斧看I2C波形。用逻辑分析仪抓上电后1秒内的I2C通信能直观看到芯片有没有在访问EEPROM、访问的地址对不对、读到的数据是什么。读芯片寄存器。如果芯片带了调试串口或者外部CPU可以通过I2C访问内部寄存器优先读全局状态寄存器看芯片当前处于什么模式、加载有没有成功。对比默认行为。在没接EEPROM的情况下上电记录芯片的默认端口行为再接上EEPROM对比差异就能暴露配置有没有生效。7. 最后分享一个省事的调试技巧配置和烧录整个流程跑通之后后续每次改配置都重新拆芯片烧录实在太痛苦。我后来养成一个习惯在板上预留一个4pin的I2C调试座直接把SCL、SDA、GND、VCC引出来。改配置的时候只需要用USB转I2C适配器插上去跑一小段Python脚本就能完成擦写全程不用动芯片。另外EEPROM烧录完成后在第一次上电测试前我强烈建议先做一次完整的I2C读取校验把整个EEPROM内容dump出来和源文件对比。不要嫌麻烦这一步能挡掉至少一半的“玄学问题”。No-CPU模式调试的难点不在于某一个环节有多难而是链路长任何一环出问题都会表现为交换机不工作。硬件引脚、EEPROM、配置模板、烧录时序、校验和——每个环节都留一点验证手段真正出了问题才能快速定位。希望这次实战记录能帮你少走点弯路。
返回列表