简介:本资源为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是专为 ARM64(aarch64)架构编译的刷写主程序,而非106flash(x86_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.27(Ubuntu 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 ID10b5,Device 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.modeset=0 iommu.passthrough=1' # 若系统启用 IOMMU(常见于虚拟化环境),需显式释放设备控制权 $ echo 'vfio-pci' | sudo tee -a /etc/modules $ echo 'options vfio-pci ids=10b5:1061' | sudo tee /etc/modprobe.d/vfio-asmedia.conf $ sudo update-initramfs -u提示:
vfio-pci绑定是强制要求。若未解除 ASM1061 的默认驱动(pcieport或shpchp),106flash_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 device | SPI Flash 存储区满(罕见) | 使用-r强制擦除,或更换支持更大容量的 Flash 芯片 |
4. 刷写后验证与链路深度诊断:从 lspci 到 NVMe 性能基线测试
4.1 固件升级效果验证:PCIe 链路宽度与速度确认
刷写完成后,必须验证链路是否真正升级:
# 查看 ASM1061 下游端口链路状态(关键字段:LnkCap, LnkSta) $ sudo setpci -s 04:00.0 CAP_EXP+10.w # 输出示例:0000 → LnkCap: MaxLinkWidth x4, MaxLinkSpeed 8GT/s $ sudo setpci -s 04:00.0 CAP_EXP+12.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_EXP+10.w读取 Link Capabilities Register(偏移 0x10),CAP_EXP+12.w读取 Link Status Register(偏移 0x12)。数值0081中低字节0x81表示当前速率为 8.0 GT/s(0x80=8.0,0x40=5.0,0x10=2.5),高字节0x00表示宽度为 x4(0x01=x1,0x02=x2,0x04=x4)。
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 --name=randread --ioengine=libaio --rw=randread --bs=4k --numjobs=1 \ --time_based --runtime=60 --group_reporting --filename=/dev/nvme0n1 --iodepth=1284.2.1 关键性能指标阈值参考(PCIe 3.0 x4 环境)
| 测试项 | 合格阈值 | 说明 |
|---|---|---|
IOPS(4K randread) | ≥ 350,000 | 主流 NVMe SSD 在 x4 链路上的基准值 |
latency(avg) | ≤ 120μs | 超过 200μs 需检查 ASM1061 链路协商是否降速 |
clat(99th percentile) | ≤ 500μs | 反映尾延迟稳定性,过高表明固件存在调度缺陷 |
注意:若
fio结果远低于预期(如 IOPS < 100,000),即使lspci显示 x4/8GT/s,也需检查上游 Root Complex 是否限制带宽(如 BIOS 中 PCIe ASPM 设置为L1)、或 ASM1061 固件未启用 AER(Advanced Error Reporting)导致隐性错误重传。
4.3 持久化配置:避免重启后固件回滚
某些主板 BIOS 会在重启时强制加载 ROM 中的默认固件,覆盖刷写内容:
# 方法一:禁用 BIOS 中的 "PCIe Option ROM" 加载(进入 BIOS Setup → Advanced → PCI Subsystem Settings) # 方法二:在 Linux 启动参数中屏蔽 ASM1061 Option ROM(GRUB 配置) $ echo 'GRUB_CMDLINE_LINUX="pci=assign-busses pcie_aspm=off"' | sudo tee -a /etc/default/grub $ sudo update-grub && sudo reboot # 方法三:固化固件到 SPI Flash(需专用编程器,不推荐现场操作) # 使用 ASMedia 提供的 `asm1061_spi_programmer` 工具(仅限授权服务商)提示:方法二中的
pcie_aspm=off是关键——ASPM(Active 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-flash(GitHub 开源):
# 克隆并交叉编译(针对 aarch64-linux-gnu 工具链) $ git clone https://github.com/asm1061-flash/asm1061-flash.git $ cd asm1061-flash $ make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 # 生成的 ./asm1061-flash-arm64 功能等价,且无 libc 兼容问题 $ sudo ./asm1061-flash-arm64 -f firmware.bin -d 04:00.0优势:开源工具使用标准
libpciaccess库,与任意 Linux 发行版 glibc 兼容;支持-n参数进行 dry-run 模拟;内置固件 CRC 自校验,避免刷写损坏镜像。
本文还有配套的精品资源,点击获取