ARTICLE DETAIL

资讯详情

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

Broadcom Robo SDK解包与bring-up实战:从TFFS库到VLAN转发

Broadcom Robo SDK解包与bring-up实战:从TFFS库到VLAN转发 简介Broadcom Robo系列芯片的软件开发工具包SDK以RAR压缩包形式提供面向机器人、自动化设备等底层软硬件开发者用于完成芯片外设驱动、板级支持包BSP移植和应用层控制程序编写。包内共2882个文件以C源码1317个和头文件1068个为主另含makefile构建脚本、汇编文件、SOC配置、静态库、PDF文档等覆盖从寄存器配置到应用程序接口调用的完整开发链路压缩包仅19.08MB结构紧凑。已有284人浏览学习适合需要深入研究Robo系列芯片驱动实现、BSP定制或进行二次开发的嵌入式工程师。借助这些源码、示例、配置和文档可以快速定位芯片初始化流程、理解各外设接口定义及编译链接规则配合开发工具链能有效缩短驱动调试与系统集成周期对开发或维护机器人控制系统的团队有直接参考价值。1. 解压 sdk-xgs-robo-5.xx.x.rar 之后你会看到什么解压这个 rar 包看到的不是一堆 .c 源码而是 editline.3、pkt.64 和几个 libTFFS*.a 静态库。这不是残缺的发布包而是 Broadcom Robo 系列交换芯片 SDK 最典型的交付形态预编译库加最小调试工具等你把它们链接进自己的 BSP板级支持包里。它针对的是 BCM531xx 这类 Robo 交换芯片用在 ONU、企业级路由器、工业交换机的二层交换功能上而不是机器人控制。版本从 5.xx.x 一路走到 6.5.7、6.5.9每个版本对应不同的功能集和芯片支持表。适合正在做交换板卡 bring-up、或者打算把旧项目从 5.x 升级到 6.x 的人读。2. 拆包libTFFS、editline 与 pkt.64 背后的工程含义2.1 先认清 TFFS 是什么包里躺着 libTFFS.a、libTFFS54.a、libTFFS55.a、libTFFS62.aTFFS 全称 Tornado Flash File System是 VxWorks 下管理 NOR flash 的经典文件系统。交换设备的配置文件、固件备份都放在 NOR flash 上SDK 跑起来后需要读写这些数据libTFFS 就是替你封装好 flash 擦写和坏块管理的库。文件名里的 54、55、62 不是版本号而是芯片内部 flash 控制器索引Robo 系列里 FTS54 和 FTS55 是两代不同的 flash controller IP62 通常对应 BCM53162 这类更新型号。用 ar 命令可以查看库里到底有什么符号确认它是不是你预期的 TFFS 库。在 Linux 主机上直接操作ar t libTFFS54le.a | head -20 ar t libTFFS55le.a | grep -i tffs | head -10第一条命令列出 libTFFS54le.a 中的目标文件名head -20 只取前 20 个第二条用 grep 过滤出包含 tffs 字符的符号用于确认库的用途。ar 是 GNU binutils 自带的静态库管理工具读 SDK 库文件不需要特殊工具链Linux 发行版自带的 binutils 就能完成。2.2 字节序与芯片型号的对应关系libTFFS54.a 和 libTFFS54le.a 同时存在le 后缀是 little-endian。Robo 系列芯片的 CPU 核分大端和小端两套BCM53134 系列用 ARM 核多数 BSP 走小端老的 BCM5325 等型号用 MIPS 核跑大端。选错字节序的库链接能过运行必挂。这种事我在 bring-up 第一天就遇到过现象是 sdkInit 之后读寄存器全是 0xFFFFFFFF排查半天才发现是库选错了端。用 file 命令可以直接看到库的编译目标file libTFFS54.a libTFFS54le.a输出里会出现 ELF 32-bit LSB 或 MSB 字样LSB 就是小端MSB 是大端。拿到一个陌生板子先跑 file 确认字节序再选库这一步能省掉后面抓瞎的时间。不同版本 SDK 里库的命名也有变化5.xx.x 的包通常是 libTFFS54.a 配 libTFFS55.a 两份6.5.x 加了 le 后缀的变体是因为 6.x 主要面向小端 ARM 核平台大端库被移到了 legacy 目录。下表是常见对应关系具体以 BSP 里定义的 flash 控制器为准库文件字节序常见适用芯片说明libTFFS54.a大端BCM5325 系列老 MIPS 核平台libTFFS54le.a小端BCM53134 系列ARM 核平台最常用libTFFS55.a大端BCM53314 系列大端部署较少见libTFFS55le.a小端BCM53134M带管理口型号这张表的用途是选库不是查芯片手册。如果你的板子上 flash 挂在 controller 0还要看 BSP 源码里定义的 TFFS_CTRL_ID 是否和库一致不一致时 sdkInit 后 flash 挂载会失败错误码通常是 -1 或者 timeout。2.3 editline 与 pkt.64 的调试定位editline.3 不是源码是一个行编辑库的说明文件。editline 在 SDK 里承担 sdk shell 的命令行处理支持历史命令、光标移动。Robo SDK 没有独立 IDE所有调试都在串口 shell 里做没有 editline在串口输错命令只能退格重来调试效率会低很多。这个文件本身不用单独编译它已经静态链进了 libsdk 库把 editline 单独拿出来放在发布包里是为了让 BSP 里复用同一套行编辑实现。pkt.64 是一个 64 字节的以太网帧模板64 字节恰好是以太网帧最小长度里面填充了规范的 MAC 地址和 payload。调试二层交换时用这个文件做回环测试最干净因为帧长刚好在临界值如果交换芯片的 FIFO 或包缓冲配置有问题64 字节帧最容易暴露出来。有的 SDK 版本里还附带 pkt.64.raw 之类变体这些都来自 SDK 的 example 代码目录被单独抽出来放到发布包里方便做 packet generator 测试时直接引用。2.4 为什么包里没有源码这个 rar 里没有 common driver 源码是因为 Broadcom 对 SDK-XGS-ROBO 系列按二进制库授权libTFFS、libsoc、libbcm 等以 .a 形式分发只把 sal 层抽象头文件和少量示例代码以源码形式给出。这意味着你不能修改库内部的算法只能通过配置文件控制行为。常见做法是把库目录加入 BSP 的 lib 路径在 usrConfig.c 里调用 tffsInit 和 sdkInit 完成挂载具体调用顺序参考 SDK 里自带的 example 目录不同板子差异很大直接抄不一定行。这一点在决定 SDK 版本时要提前确认因为不同版本对核内 CPU 型号、endian 模式、甚至编译器的支持都不一样选错了版本后面所有工作都得推倒重来。3. 编译链接把预编译库嵌进你的系统镜像3.1 先确认工具链与 ABI拿到 libTFFS*.a 后第一件事不是写代码而是确认工具链能读懂它。Broadcom SDK 在 5.x 时期给的库通常用 GCC 4.x 编译6.x 时期有的库在 GCC 5 或更高版本下编译交叉编译器版本差太远会出现 rlib 格式不认识的问题链接器直接报 malformed archive。先用 readelf 检查库的 ABI 信息readelf -h libTFFS54le.a | grep -E Class|Machine|Flags输出里 Class: ELF32 说明是 32 位库Machine: ARM 说明目标 CPU 是 ARM 核Flags 行会带软浮点或硬浮点标记。如果 BSP 里的工具链是 hard-float 而库是 soft-float链接阶段会报 eabi conflicts 错误。遇到这个错误别改库去换 BSP 的编译选项-mfloat-abisoftfp这是最省事的解法。3.2 头文件路径与编译参数Robo SDK 的头文件分两类通用接口头文件和芯片私有头文件。通用头文件在 include 目录芯片私有的按芯片型号放在 bcm53134 子目录。编译自家驱动时典型参数如下arm-linux-gnueabi-gcc -marcharmv7-a -mfloat-abisoftfp \ -I$(SDK_DIR)/include -I$(SDK_DIR)/include/bcm53134 \ -DENDIAN_MODE1 -DBOARD_BCM953134 \ -c sdk_port.c -o sdk_port.o-march 指定 ARM 架构-mfloat-abisoftfp 避免硬浮点 ABI 冲突-DENDIAN_MODE1 表示小端模式-DBOARD_BCM953134 指定参考板型号会触发配置头文件里的引脚复用和 phy 地址映射。这三个宏是 SDK 代码里最常见的条件编译开关改错任何一个调用 sdkInit 时芯片寄存器读写方向都会反表现出来就是丢包率 100%但代码逻辑看起来完全正常。3.3 链接顺序与符号冲突静态库的链接顺序有讲究。libTFFS54le.a 内部依赖 libc、libeditline所以链接命令里 SDK 库要在系统库之前。还要注意有些 BSP 已经带了内核级 flash 驱动再链 libTFFS 会出现 tffsXXX 符号重复定义。常见做法是编译整个镜像时用如下顺序arm-linux-gnueabi-ld -T vxWorks.ld \ -o vxWorks \ $(OBJS) \ -L$(SDK_DIR)/lib \ -lTFFS54le -leditline -lbcm \ -lc-L 告诉链接器 SDK 库目录-lTFFS54le 链接小端 TFFS 库-leditline 提供 shell 行编辑能力-lbcm 链接芯片驱动库-lc 最后补系统库。右侧依赖左侧这是 GNU ld 的规则被依赖的库要放在依赖者的右边。老是 undefined reference 时大概率是库顺序反了先把 -lTFFS54le 挪到 OBJS 后面问题通常就消失了。如果还报错用 nm -u 查看未定义符号列表确认 libTFFS 到底依赖哪些库。3.4 在 Linux 用户态模拟 SDK 环境不是每次都能拿到板子。SDK 自带一套 bdeBoard Development Environment用户态模拟层在 Linux 上编译 bde 库后sdkInit 会访问用户态模拟的寄存器空间而不是真实的 PCI/MMIO。这一层对做协议分析、跑回环测试非常有用。启动方式是在 Linux 主机上直接运行 sdk shell 可执行文件参数指向板型文件./sdk_shell -b bcm53134_sim.bde -c config_53134.txt-b 指定 bde 模拟器配置-c 指定芯片配置文件。配置文件和真实 BSP 用的格式相同寄存器地址和 phy 映射都声明在里面。这个模式验证逻辑没问题但不能验证时序和信号完整性该上板还得上板。另外模拟模式不支持 TFFS因为 TFFS 依赖真实 flash 控制器在模拟环境里 flash 读写会直接返回错误这是正常的别当成 bug 去查。4. 上板 bring-up从串口到第一个 VLAN 转发4.1 串口参数与启动网络Robo 板卡的调试口通常是 UART速率按 BSP 默认多数为 115200 8-N-1。上电后先在串口终端确认 bootloader 能运行、内存检测通过。加载镜像常用 TFTP在 bootloader 命令行里执行tftp 0x80000000 vxWorks_53134.bin go 0x800000000x80000000 是常见 DRAM 加载地址具体值要看 BSP 里的 RAM_BASE_ADRS有的板子是 0x88000000。TFTP 服务器 IP 和板子 IP 要同网段这个阶段报错大多是网络问题而不是 SDK 问题先 ping 通再查其他。还有一点TFTP 传输的镜像大小如果超过 flash 分区下载过程会卡在最后几个包上这时用 tftp 的 binary 模式重传即可。4.2 sdk shell 初始化序列镜像起来后进入 VxWorks shell先执行 sdk shell 初始化。有些 BSP 把初始化放在 usrAppInit 里自动执行有些需要手动输入。第一次进 shell 建议逐条敲看到返回状态再继续。典型命令序列如下- sdkInit Init board ... Done - sdkReset - sdkPortModeSet 1 0 0 Port 1 mode set: 1GsdkInit 完成芯片复位和寄存器初始映射sdkReset 把交换核心复位到已知状态sdkPortModeSet 的三个参数分别是端口号、速率模式、双工模式0 通常表示自动协商。端口编号从 1 开始不是 0这一点经常搞混导致配置的总是错位端口。如果在 sdkInit 阶段看到错误码 0xFFFF先查芯片型号是否匹配、endian 宏是否一致这两个问题占了初始化失败的大半。4.3 新建 VLAN 和端口放行二层交换最核心的操作是建 VLAN 并把端口加进去。SDK shell 里操作如下- sdkVlanCreate 100 Vlan 100 created - sdkVlanPortAdd 100 1 2 3 - sdkVlanPortUntag 100 1sdkVlanCreate 只创建 VLAN id不带任何端口sdkVlanPortAdd 把端口 1、2、3 加入 VLAN 100sdkVlanPortUntag 设置端口 1 在该 VLAN 里为 untag 模式接入侧交换机常用 untag级联口用 tag。参数顺序错一个数据流就从一个口进不去另一个口。很多 5.x 的老代码里没有 sdkVlanPortUntag 这个调用升级到 6.5.7 之后补上即可。命令参数作用sdkVlanCreatevlan_id创建 VLANsdkVlanPortAddvlan_id port...批量放行端口sdkVlanPortUntagvlan_id port设置 untag 口sdkPortModeSetport speed duplex端口速率模式4.4 pkt.64 回环验证配置完成后用 pkt.64 做回环测试。在 shell 里输入如下命令把 64 字节的帧从端口 1 发到端口 2- sdkPktTx 1 pkt.64 Tx packet from port 1, 64 bytes, done - sdkPktRx 2 count 1 timeout 1000 Rx packet on port 2, 64 bytessdkPktTx 第二个参数是包文件路径如果 shell 当前目录不对要用绝对路径sdkPktRx 的 count 指定抓包数量timeout 单位是毫秒1000 表示最多等 1 秒。如果超时优先查 phy link 是否为 up再看 untag 配置。这一步能确认 MAC 学习和转发路径都正常。如果端口 2 收不到帧但端口 1 发出成功八成是 VLAN 配置里端口 2 没被加进去或者端口模式不对。5. 从 5.xx.x 迁移到 6.5.7 的兼容性检查与回退技巧5.1 版本升级重点看什么6.5.7 相比 5.xx.x最明显的变化是接口签名调整和配置方式改变。以端口速率设置为例5.x 的 sdkPortSpeedSet 只传 speed 一个参数6.5.7 改成 sdkPortSpeedSetEx多了一个 autoneg 参数用来单独控制自动协商开关。如果你在 5.x 代码里直接改库升级编译会直接报参数个数不匹配这个错误比行为错误好处理但别忽略那些编译能过、行为已变的接口。建议对照 SDK 自带的 release note 里的 API migration 章节过一遍。5.2 兼容性检查清单检查项5.xx.x6.5.7影响程度编译器 GCC 版本GCC 4.xGCC 5 推荐库 ABI 变化链接报错端口速率设置sdkPortSpeedSetsdkPortSpeedSetEx编译报错显式修复字节序宏ENDIAN_MODE 手动定义头文件自动推导配置错误减少pkt.64 回环手动发包内置 PktGen 模块测试方式更简单TFFS 库名libTFFS54.alibTFFS54le.a选错直接挂5.3 保留旧库做回退升级不是只能往前滚。把 libTFFS54.a、libTFFS54le.a 和旧版配置文件单独放在一个目录升级后如果出现端口不亮或 VLAN 不通先别急着查硬件用旧库编一个回退镜像验证。具体做法是在 Makefile 里加一个变量SDK_LIB_DIR : $(SDK_DIR)/lib_legacy_5xx LDLIBS -L$(SDK_LIB_DIR) -lTFFS54leSDK_LIB_DIR 指向旧库目录LDLIBS 里先指定 -L 搜索路径再指定 -lTFFS54le。只改这一行重编镜像就能切换回旧库不用动任何源码。这个回退验证能帮你快速区分是 SDK 新版本问题还是自己的代码问题省得在板上反复查 log。我的习惯是每个板卡项目都保留一个能用的 5.xx.x 基线版本在 6.5.7 或 6.5.9 的迁移过程中随时能做 A/B 对比效率会高很多。本文还有配套的精品资源点击获取
返回列表