使用 spi-intel 升级 BIOS

许多英特尔 CPU,如 Baytrail 和 Braswell,都包含 SPI 串行闪存主机控制器,用于保存 BIOS 和其他平台特定数据。由于 SPI 串行闪存的内容对于机器运行至关重要,因此通常通过不同的硬件保护机制来保护它,以避免意外(或故意)覆盖内容。

并非所有制造商都保护 SPI 串行闪存,主要是因为它允许直接从操作系统升级 BIOS 映像。

如果未设置和锁定某些保护位,spi-intel 驱动程序可以读取和写入 SPI 串行闪存。如果发现设置了任何保护位,则整个 MTD 设备将变为只读,以防止部分覆盖。默认情况下,驱动程序将 SPI 串行闪存内容公开为只读,但可以通过内核命令行更改,传递“spi_intel.writeable=1”。

请记住,覆盖 SPI 串行闪存上的 BIOS 映像可能会导致机器无法启动,并且需要 Dediprog 等特殊设备才能恢复。已经警告过你了!

以下是如何直接从 Linux 升级 MinnowBoard MAX BIOS 的步骤。

  1. 下载并解压最新的 Minnowboard MAX BIOS SPI 映像 [1]。在编写本文时,最新的映像是 v92。

  2. 安装 mtd-utils 软件包 [2]。我们需要它来擦除 SPI 串行闪存。Debian 和 Fedora 等发行版都预先打包了此软件包,名称为 “mtd-utils”。

  3. 将 “spi_intel.writeable=1” 添加到内核命令行并重新启动板卡(您也可以重新加载驱动程序,将 “writeable=1” 作为模块参数传递给 modprobe)。

  4. 一旦板卡再次启动并运行,找到正确的 MTD 分区(它被命名为 “BIOS”)

    # cat /proc/mtd
    dev:    size   erasesize  name
    mtd0: 00800000 00001000 "BIOS"
    

    这里是 /dev/mtd0,但可能会有所不同。

  5. 首先备份现有映像

    # dd if=/dev/mtd0ro of=bios.bak
    16384+0 records in
    16384+0 records out
    8388608 bytes (8.4 MB) copied, 10.0269 s, 837 kB/s
    
  6. 验证备份

    # sha1sum /dev/mtd0ro bios.bak
    fdbb011920572ca6c991377c4b418a0502668b73  /dev/mtd0ro
    fdbb011920572ca6c991377c4b418a0502668b73  bios.bak
    

    SHA1 校验和必须匹配。否则,不要再继续!

  7. 擦除 SPI 串行闪存。执行此步骤后,不要重新启动板卡!否则它将无法再启动

    # flash_erase /dev/mtd0 0 0
    Erasing 4 Kibyte @ 7ff000 -- 100 % complete
    
  8. 完成后没有错误,您可以写入新的 BIOS 映像

    # dd if=MNW2MAX1.X64.0092.R01.1605221712.bin of=/dev/mtd0
    
  9. 验证 SPI 串行闪存的新内容是否与新的 BIOS 映像匹配

    # sha1sum /dev/mtd0ro MNW2MAX1.X64.0092.R01.1605221712.bin
    9b4df9e4be2057fceec3a5529ec3d950836c87a2  /dev/mtd0ro
    9b4df9e4be2057fceec3a5529ec3d950836c87a2 MNW2MAX1.X64.0092.R01.1605221712.bin
    

    SHA1 校验和应该匹配。

  10. 现在您可以重新启动板卡,并观察新的 BIOS 是否正常启动。

参考资料

[1] https://firmware.intel.com/sites/default/files/MinnowBoard%2EMAX_%2EX64%2E92%2ER01%2Ezip

[2] http://www.linux-mtd.infradead.org/