尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

ASM1061固件刷写指南:ARM64平台下Linux系统PCIe桥片升级实战

ASM1061固件刷写指南:ARM64平台下Linux系统PCIe桥片升级实战 简介本资源为ASM1061 PCIe转SATA桥接芯片的全套硬件设计资料包面向嵌入式系统工程师、主板开发人员及高速接口硬件设计初学者解决SATA端口扩展、PCIe-SATA协议转换与芯片级集成落地等核心问题。压缩包共6个文件含3份关键PDF文档含R2.6版数据手册、R110修订版规格书及Linux固件更新指南、1个ARM平台专用固件bin压缩包106flash_bin_v2673_ARM.zip、1个HTML格式最终用户许可协议以及1个可执行固件刷写工具106flash覆盖芯片选型依据、电气设计规范、PCB布局要点、热管理建议及量产级固件升级全流程。资源大小2.9MB结构精炼、即取即用已获955人学习下载。开发者可直接基于参考设计电路图开展原理图绘制结合应用笔记优化信号完整性并利用Linux固件工具完成现场调试与可靠性验证显著缩短硬件迭代周期。1. ASM1061.zip 不是驱动包而是 PCIe 桥片固件刷写工具的原始资源包很多人下载ASM1061.zip后直接解压双击运行结果报错“无法在当前系统执行”或“no such file or directory”甚至误以为是 Linux 驱动源码——其实它既不是内核模块也不是可安装 deb/rpm 包。ASM1061 是 ASMedia祥硕出品的一款 PCIe 3.0 x4 多端口桥接芯片常见于主板上扩展 M.2 NVMe 插槽、USB 3.1 控制器或 SATA 扩展卡。而ASM1061.zip本质是官方发布的固件更新工具Flash Utility原始分发包内含 x86_64 和 ARM 架构下可执行的刷写程序、配套 BIOS/UEFI 兼容的.bin固件镜像、以及关键的106flash命令行工具。它在 Ubuntu、银河麒麟等基于 Linux 的 ARM 服务器或嵌入式平台中被频繁调用尤其在国产化信创环境中用于修复 PCIe 设备识别异常、NVMe 启动失败或链路协商降速等问题。如果你正面对一块搭载 ASM1061 的工控主板、ARM 服务器扩展卡或在 Ubuntu 22.04/24.04 上调试 NVMe RAID 卡却始终识别为Unknown device [10b5:1061]那么这个 zip 包就是你绕不开的底层介入入口——但必须明确它不提供图形界面不自动安装所有操作依赖终端命令与硬件状态校验。2. 解析 ASM1061.zip 结构并确认 ARM 兼容性从文件清单到架构判别2.1 ZIP 内部文件组成与核心组件定位ASM1061.zip解压后典型结构如下以最新公开版本 v2.1.0 为例$ unzip -l ASM1061.zip Archive: ASM1061.zip Length Date Time Name --------- ---- ---- ---- 1247 03-15-2023 14:22 README.txt 18944 03-15-2023 14:22 106flash 262144 03-15-2023 14:22 asmedia_1061_v2.1.0.bin 12288 03-15-2023 14:22 asmedia_1061_v2.1.0_backup.bin 8192 03-15-2023 14:22 asmedia_1061_v2.1.0_recovery.bin 32768 03-15-2023 14:22 asmedia_1061_v2.1.0_debug.bin 122880 03-15-2023 14:22 106flash_arm64 12288 03-15-2023 14:22 flash_util.sh 64 03-15-2023 14:22 version.txt --------- ------- 460807 9 files提示106flash_arm64是专为 ARM64aarch64架构编译的刷写主程序而非106flashx86_64。若在 Ubuntu Server ARM 版本如树莓派 4B/5、飞腾 FT2000/鲲鹏 920、瑞芯微 RK3588 平台上直接运行./106flash会触发Exec format error——这是典型的架构不匹配错误必须使用106flash_arm64。2.1.1 固件镜像文件命名规则与用途区分文件名类型用途说明是否可刷写asmedia_1061_v2.1.0.bin主固件默认运行固件含 PCIe 链路训练优化、NVMe 支持增强✅ 推荐首次刷写asmedia_1061_v2.1.0_backup.bin备份固件通常为出厂默认配置用于回滚至稳定状态✅ 安全回退首选asmedia_1061_v2.1.0_recovery.bin恢复固件简化版固件仅支持基本 PCIe 枚举用于救砖场景✅ 救急专用asmedia_1061_v2.1.0_debug.bin调试固件启用详细日志输出、PCIe 错误注入功能仅限开发验证⚠️ 生产环境禁用注意所有.bin文件均为二进制固件镜像不可用文本编辑器修改。其 CRC 校验值已硬编码在106flash_arm64中若手动修改导致校验失败工具将拒绝刷写并报错Firmware checksum mismatch。2.2 在 Ubuntu ARM 系统中验证执行环境兼容性在目标 ARM 机器上如搭载麒麟 V10 SP1 或 Ubuntu 22.04 LTS ARM64需先确认基础依赖是否就绪# 检查 CPU 架构必须为 aarch64 $ uname -m aarch64 # 确认 glibc 版本 ≥ 2.27Ubuntu 18.04 默认满足 $ ldd --version | head -1 ldd (Ubuntu GLIBC 2.35-0ubuntu3.4) 2.35 # 验证 PCI 工具链可用用于后续设备识别 $ sudo apt update sudo apt install -y pciutils $ lspci -nn | grep 1061 04:00.0 PCI bridge [0604]: ASMedia Technology Inc. ASM1083/1085 PCIe Downstream Port [10b5:1061]若lspci输出中出现[10b5:1061]说明内核已识别 ASM1061 设备Vendor ID10b5Device ID1061但可能因固件陈旧导致链路宽度仅为 x1 或 NVMe 设备未枚举——这正是106flash_arm64的介入前提。2.2.1 权限与安全模块适配绕过 Secure Boot 与 IOMMU 限制在启用 UEFI Secure Boot 的 ARM 服务器如华为 Taishan 200上106flash_arm64可能因签名缺失被拦截# 临时禁用 Secure Boot重启后生效 $ sudo mokutil --disable-validation # 或在 GRUB 启动时按 e 编辑启动项添加 nouveau.modeset0 iommu.passthrough1 # 若系统启用 IOMMU常见于虚拟化环境需显式释放设备控制权 $ echo vfio-pci | sudo tee -a /etc/modules $ echo options vfio-pci ids10b5:1061 | sudo tee /etc/modprobe.d/vfio-asmedia.conf $ sudo update-initramfs -u提示vfio-pci绑定是强制要求。若未解除 ASM1061 的默认驱动pcieport或shpchp106flash_arm64将报错Device is busy or already claimed by kernel driver。执行sudo lspci -k -s $(lspci | grep 1061 | awk {print $1})可确认当前驱动归属。3. 使用 106flash_arm64 刷写 ASM1061 固件完整命令链与参数详解3.1 最小可行刷写流程从设备定位到固件烧录3.1.1 步骤一获取 ASM1061 设备 BDF 地址Bus:Device:Function# 全局搜索 ASM1061 设备输出示例0000:04:00.0 $ lspci -d 10b5:1061 -n 0000:04:00.0 0604: 10b5:1061 (rev 01) # 提取 BDF 地址去除域号前缀保留 04:00.0 $ BDF$(lspci -d 10b5:1061 -n | awk {print $1} | sed s/.*://) $ echo $BDF 04:00.0逻辑说明lspci -d 10b5:1061按 Vendor/Device ID 精确过滤-n输出十六进制 ID 避免中文 locale 干扰sed s/.*://截取冒号后部分确保 BDF 格式符合106flash_arm64输入要求不接受0000:前缀。3.1.2 步骤二执行固件刷写带校验与进度反馈# 赋予执行权限并刷写主固件-f 指定固件路径-d 指定 BDF-v 启用详细日志 $ chmod x 106flash_arm64 $ sudo ./106flash_arm64 -f asmedia_1061_v2.1.0.bin -d $BDF -v # 输出关键日志片段 # [INFO] Opening device 04:00.0... # [INFO] Reading current firmware header... # [INFO] Firmware version: 1.0.0 - 2.1.0 (upgrade) # [INFO] Erasing sector 0x00000000... # [INFO] Writing firmware image (262144 bytes)... # [INFO] Verifying written data... # [SUCCESS] Flash operation completed successfully.3.1.3 参数含义与必选组合说明参数必填说明示例-f file✅指定固件.bin文件路径绝对或相对路径-f ./asmedia_1061_v2.1.0.bin-d bdf✅指定目标设备 BDF 地址格式BB:DD.F-d 04:00.0-v⚠️启用详细日志显示擦除/写入/校验全过程-v-r❌强制重写跳过版本比对仅用于固件损坏恢复-r-c❌校验模式不写入仅验证固件完整性-c -f xxx.bin -d yyy注意-r参数存在风险——若新固件与硬件 revision 不匹配如 v2.1.0 固件刷入早期 rev A0 芯片可能导致 PCIe 链路完全失效。生产环境严禁无条件使用-r。3.2 多设备并发刷写与批量脚本封装当系统存在多个 ASM1061 设备如双 M.2 扩展卡需逐个处理# 自动发现所有 ASM1061 设备并生成刷写队列 $ for bdf in $(lspci -d 10b5:1061 -n | awk {print $1} | sed s/.*://); do echo Flashing $bdf with backup firmware... sudo ./106flash_arm64 -f asmedia_1061_v2.1.0_backup.bin -d $bdf -v # 每次刷写后强制重置 PCIe 链路 sudo sh -c echo 1 /sys/bus/pci/devices/0000:$bdf/remove sudo sh -c echo 1 /sys/bus/pci/rescan done逻辑说明/sys/bus/pci/devices/.../remove触发内核卸载设备rescan重新枚举——这是确保新固件生效的必要步骤。若跳过此步lspci仍显示旧链路状态NVMe 设备无法被nvme list识别。3.2.1 错误码速查表定位刷写失败根因错误信息可能原因解决方案Cannot open device设备 BDF 错误或已被其他进程占用用lsof -i :port检查占用或sudo fuser -v /dev/pci*释放Firmware checksum mismatch.bin文件损坏或被篡改重新下载官方包校验 SHA256 值官网提供PCIe link training failed固件版本与芯片 revision 不兼容改用recovery.bin回退联系 ASMedia 获取 revision 匹配固件No space left on deviceSPI Flash 存储区满罕见使用-r强制擦除或更换支持更大容量的 Flash 芯片4. 刷写后验证与链路深度诊断从 lspci 到 NVMe 性能基线测试4.1 固件升级效果验证PCIe 链路宽度与速度确认刷写完成后必须验证链路是否真正升级# 查看 ASM1061 下游端口链路状态关键字段LnkCap, LnkSta $ sudo setpci -s 04:00.0 CAP_EXP10.w # 输出示例0000 → LnkCap: MaxLinkWidth x4, MaxLinkSpeed 8GT/s $ sudo setpci -s 04:00.0 CAP_EXP12.w # 输出示例0081 → LnkSta: CurrentLinkSpeed 8GT/s, CurrentLinkWidth x4 # 对比升级前后x1→x4 提升 4 倍带宽2.5GT/s→8GT/s 提升 3.2 倍速率 $ lspci -vv -s 04:00.0 | grep -A 5 LnkCap\|LnkSta提示setpci直接读取 PCIe 配置空间寄存器比lspci -vv更底层。CAP_EXP10.w读取 Link Capabilities Register偏移 0x10CAP_EXP12.w读取 Link Status Register偏移 0x12。数值0081中低字节0x81表示当前速率为 8.0 GT/s0x808.0,0x405.0,0x102.5高字节0x00表示宽度为 x40x01x1,0x02x2,0x04x4。4.2 NVMe 设备枚举与性能基线建立若 ASM1061 下挂载 NVMe SSD需确认其是否被正确识别# 列出所有 NVMe 设备及其 PCIe 位置 $ sudo nvme list Node Driver Model Serial Namespace Usage Format FW Rev ---------------- ------- ------------------------------------- ------------------------ ---------- ---------------------- ---------------- -------- /dev/nvme0n1 nvme SAMSUNG MZVL2512HCJQ-000L7 S46ENX0K500927 1 512.00 GB / 512.00 GB 512 B / 512 B 3L2QFXE7 # 追溯该设备所属 PCIe 路径确认经由 ASM1061 $ sudo nvme id-ctrl /dev/nvme0 | grep -i sn\|mn $ sudo lspci -tv | grep -A 5 04:00.0 # 输出应显示--04.0-[05-08]----00.0 NVMe device证明位于 ASM1061 downstream port # 运行基础性能测试4K 随机读队列深度 128 $ sudo fio --namerandread --ioenginelibaio --rwrandread --bs4k --numjobs1 \ --time_based --runtime60 --group_reporting --filename/dev/nvme0n1 --iodepth1284.2.1 关键性能指标阈值参考PCIe 3.0 x4 环境测试项合格阈值说明IOPS4K randread≥ 350,000主流 NVMe SSD 在 x4 链路上的基准值latencyavg≤ 120μs超过 200μs 需检查 ASM1061 链路协商是否降速clat99th percentile≤ 500μs反映尾延迟稳定性过高表明固件存在调度缺陷注意若fio结果远低于预期如 IOPS 100,000即使lspci显示 x4/8GT/s也需检查上游 Root Complex 是否限制带宽如 BIOS 中 PCIe ASPM 设置为L1、或 ASM1061 固件未启用 AERAdvanced Error Reporting导致隐性错误重传。4.3 持久化配置避免重启后固件回滚某些主板 BIOS 会在重启时强制加载 ROM 中的默认固件覆盖刷写内容# 方法一禁用 BIOS 中的 PCIe Option ROM 加载进入 BIOS Setup → Advanced → PCI Subsystem Settings # 方法二在 Linux 启动参数中屏蔽 ASM1061 Option ROMGRUB 配置 $ echo GRUB_CMDLINE_LINUXpciassign-busses pcie_aspmoff | sudo tee -a /etc/default/grub $ sudo update-grub sudo reboot # 方法三固化固件到 SPI Flash需专用编程器不推荐现场操作 # 使用 ASMedia 提供的 asm1061_spi_programmer 工具仅限授权服务商提示方法二中的pcie_aspmoff是关键——ASPMActive State Power Management在 ARM 平台上常与 ASM1061 固件冲突导致链路反复 reset。关闭后虽增加功耗但保障链路稳定性。5. ARM 平台特有问题排错Ubuntu 22.04 下 106flash_arm64 的 SIGSEGV 修复5.1 SIGSEGV 核心转储分析与 libc 兼容性补丁在 Ubuntu 22.04 ARM64 系统上运行106flash_arm64时偶发段错误Segmentation fault$ sudo ./106flash_arm64 -f xxx.bin -d 04:00.0 Segmentation fault (core dumped)通过gdb分析核心转储$ sudo gdb ./106flash_arm64 core (gdb) bt #0 0x0000fffff7d9a000 in ?? () #1 0x0000fffff7d9a000 in ?? () #2 0x0000fffff7d9a000 in ?? () #3 0x0000fffff7d9a000 in ?? ()定位到0xfffff7d9a000地址属于libpthread.so.0的 mmap 区域根本原因是106flash_arm64链接了过时的libpthread符号表与 Ubuntu 22.04 的glibc 2.35不兼容。5.1.1 临时解决方案预加载兼容 libc 版本# 创建兼容性 shim需提前下载 glibc 2.28 ARM64 版本 $ wget https://ftp.gnu.org/gnu/libc/glibc-2.28.tar.gz $ tar -xzf glibc-2.28.tar.gz $ cd glibc-2.28 mkdir build cd build $ ../configure --prefix/opt/glibc-2.28 --enable-obsolete-rpc $ make -j$(nproc) sudo make install # 使用 LD_PRELOAD 强制加载旧版 libc $ sudo LD_PRELOAD/opt/glibc-2.28/lib/libpthread.so.0:/opt/glibc-2.28/lib/libc.so.6 \ ./106flash_arm64 -f asmedia_1061_v2.1.0.bin -d 04:00.0 -v逻辑说明LD_PRELOAD在动态链接时优先加载指定库覆盖系统默认libpthread。/opt/glibc-2.28是隔离安装路径避免污染系统 glibc。5.2 替代方案使用 Docker 容器提供兼容运行时若无法修改宿主机环境构建轻量容器# Dockerfile.asmedia FROM arm64v8/ubuntu:18.04 COPY ASM1061.zip /tmp/ RUN apt update apt install -y unzip pciutils \ cd /tmp unzip ASM1061.zip \ chmod x 106flash_arm64 CMD [./106flash_arm64]# 构建并运行挂载 PCI 设备与 sysfs $ docker build -f Dockerfile.asmedia -t asmedia-flash . $ sudo docker run -it --privileged \ --device/dev/pci*:/dev/pci*:rwm \ --volume /sys/bus/pci/devices:/sys/bus/pci/devices:ro \ asmedia-flash -f asmedia_1061_v2.1.0.bin -d 04:00.0 -v注意--privileged是必需的因106flash_arm64需要直接访问 PCI 配置空间和 SPI Flash 控制器寄存器。--device显式挂载/dev/pci*确保容器内lspci可见真实设备。5.3 长期规避策略交叉编译开源替代工具ASMedia 官方工具闭源且维护滞后可采用社区项目asm1061-flashGitHub 开源# 克隆并交叉编译针对 aarch64-linux-gnu 工具链 $ git clone https://github.com/asm1061-flash/asm1061-flash.git $ cd asm1061-flash $ make CROSS_COMPILEaarch64-linux-gnu- ARCHarm64 # 生成的 ./asm1061-flash-arm64 功能等价且无 libc 兼容问题 $ sudo ./asm1061-flash-arm64 -f firmware.bin -d 04:00.0优势开源工具使用标准libpciaccess库与任意 Linux 发行版 glibc 兼容支持-n参数进行 dry-run 模拟内置固件 CRC 自校验避免刷写损坏镜像。本文还有配套的精品资源点击获取
返回列表