Broadcom RAID卡开发避坑指南:storelibtest工具编译与使用全解析

张开发
2026/5/13 4:34:29 15 分钟阅读

分享文章

Broadcom RAID卡开发避坑指南:storelibtest工具编译与使用全解析
Broadcom RAID卡开发避坑指南storelibtest工具编译与使用全解析在服务器硬件开发领域Broadcom RAID卡因其高性能和可靠性被广泛应用于企业级存储解决方案。对于需要在AST2500/AST2600平台BMC中集成存储功能的开发者而言storelib代码库的运用是不可或缺的一环。然而当面临新功能开发而AMI官方代码尚未支持的尴尬局面时storelibtest工具便成为了功能验证的利器。本文将深入剖析这一工具的编译技巧、使用场景以及实战中的避坑策略帮助开发者提升开发效率规避常见陷阱。1. 开发环境准备与工具链配置在开始storelibtest工具的编译前确保开发环境配置正确是避免后续问题的关键第一步。AST2600平台通常采用ARM架构处理器因此需要准备对应的交叉编译工具链。1.1 交叉编译工具链验证首先确认您的交叉编译工具链是否完整且版本匹配。可以通过以下命令检查工具链的基本信息arm-openbmc-linux-gnueabi-gcc --version典型的输出应类似于arm-openbmc-linux-gnueabi-gcc (GCC) 8.3.0 Copyright (C) 2018 Free Software Foundation, Inc.注意不同BMC固件版本可能要求特定的工具链版本建议与您的BMC固件编译环境保持一致。1.2 源代码结构分析以SAS35_MRStoreLibTest_GIT_7.30-2.96-DCSG01698732版本为例典型的storelibtest源代码目录结构如下common_storelib_unf_test_rel/ ├── StoreLibTest │ ├── StoreLibTest │ │ ├── Source │ │ │ ├── app_util │ │ │ │ ├── common_storelib_unf_test │ │ │ │ │ ├── build │ │ │ │ │ │ ├── ARM │ │ │ │ │ │ │ └── Makefile │ │ │ │ │ ├── src │ │ │ │ │ │ └── storelibtest.c理解这一结构有助于后续的Makefile修改和编译问题排查。2. 关键代码修改与编译实战2.1 Makefile针对性调整原始Makefile通常需要针对特定开发环境进行修改。以下是关键修改点编译器路径修正 定位到SAS35_MRStoreLibTest_GIT_7.30-2.96-DCSG01698732/common_storelib_unf_test_rel/StoreLibTest/StoreLibTest/Source/app_util/common_storelib_unf_test/build/ARM/Makefile将CXX工具路径替换为您的交叉编译工具路径CXX $(YOUR_WORKSPACE_PATH)/toolchains/arm-openbmc-linux-gnueabi/bin/arm-openbmc-linux-gnueabi-g编译选项优化 根据目标平台特性建议添加以下编译选项CXXFLAGS -mcpucortex-a7 -mfpuneon-vfpv4 -mfloat-abihard2.2 动态库路径修正storelibtest工具运行时需要加载BMC系统中的libstorelib.so库必须确保路径配置正确首先确定BMC系统中库文件的实际路径find / -name libstorelib.so 2/dev/null修改storelibtest.c中的库加载路径#define STORELIB_PATH /usr/lib/libstorelib.so // 根据实际查找结果修改提示在开发阶段可以先将库文件临时放置到工具同级目录进行测试避免权限问题。2.3 编译命令详解完整的编译命令应包含以下关键参数make cfgdebug modei2c archarm -j$(nproc)参数说明参数作用可选值cfg构建配置debug/releasemode通信模式i2c/pciearch目标架构arm/x86编译成功后使用file命令验证生成的可执行文件file storelibtest预期输出应包含ARM和ELF关键字确认是ARM架构的可执行文件。3. 工具部署与基础功能验证3.1 BMC系统文件准备将编译好的storelibtest工具部署到BMC系统有多种方式推荐采用NFS挂载方式提高开发效率# 在开发机上设置NFS共享 sudo exportfs -o rw,no_root_squash 192.168.1.*:/path/to/your/workspace # 在BMC上挂载 mount -o nolock -t nfs 192.168.1.100:/path/to/your/workspace/Build/output/ImageTree/usr /usr3.2 RAID卡总线扫描技巧使用i2cdetect扫描总线时有几个实用技巧批量扫描所有总线for bus in {0..20}; do i2cdetect -y $bus; done识别Broadcom RAID卡特征地址7位地址0x1c (对应8位地址0x38)典型响应模式00: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- 1c -- -- --3.3 单卡与多卡测试场景单卡测试命令./storelibtest bus address示例./storelibtest 17 28 # bus17, 7位地址0x1c(十进制28)双卡并行测试命令./storelibtest bus1 addr1 bus2 addr2示例./storelibtest 16 28 17 28常见响应模式分析正常响应StoreLibTest: Initialization successful Adapter Count: 1常见错误ERROR: Failed to initialize storelib (Error code: 0x5)通常表示库路径错误或权限问题4. 高级应用与故障排查4.1 OEM功能开发接口storelibtest提供了丰富的底层接口可用于开发自定义OEM功能。主要API调用流程初始化流程MR_InitializeLibrary(); MR_GetAdapterCount(adapterCount); MR_OpenAdapter(adapterIndex, adapterHandle);常用功能调用获取RAID卡信息MR_GetControllerInfo(adapterHandle, controllerInfo);读取物理磁盘状态MR_GetPhyDrvList(adapterHandle, drvList);4.2 典型问题解决方案问题1库版本不兼容症状undefined symbol: MR_GetControllerInfoEx解决方案确认BMC系统中的libstorelib.so版本在代码中添加版本检查MR_GetLibraryVersion(libVersion); printf(StoreLib version: %d.%d.%d\n, libVersion.Major, libVersion.Minor, libVersion.Revision);问题2I2C通信不稳定优化建议在Makefile中添加重试机制CXXFLAGS -DMAX_RETRY_COUNT3调整I2C时钟频率devmem 0x1e78a084 32 0x00000C0C # AST2600 I2C16配置问题3权限不足典型错误open /dev/i2c-16: Permission denied解决方法chmod 666 /dev/i2c-* # 临时方案 # 或永久方案 echo SUBSYSTEMi2c-dev, MODE0666 /etc/udev/rules.d/90-i2c.rules4.3 性能优化技巧批量操作优化MR_SetBatchMode(adapterHandle, TRUE); // 执行系列操作 MR_SetBatchMode(adapterHandle, FALSE);缓存利用MR_EnableCache(adapterHandle, CACHE_TYPE_PD_LIST, TRUE);异步操作示例MR_SetAsyncMode(adapterHandle, TRUE); MR_GetBackgroundStatus(adapterHandle, status);通过storelibtest工具验证新功能后可将成熟的代码逻辑移植到BMC的完整storelib集成环境中。在实际项目中建议建立自动化测试框架将关键功能的验证过程脚本化例如使用expect工具自动化交互测试#!/usr/bin/expect -f spawn ./storelibtest 16 28 expect Adapter Count: {send q\r}这种开发模式不仅能提高效率还能确保代码质量。在Broadcom RAID卡开发过程中遇到的许多问题往往与特定硬件配置相关因此保持详细的测试记录和版本对应关系至关重要。

更多文章