使用 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/