使用 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 的步骤。
下载并解压最新的 Minnowboard MAX BIOS SPI 映像 [1]。在编写本文时,最新的映像是 v92。
安装 mtd-utils 软件包 [2]。我们需要它来擦除 SPI 串行闪存。Debian 和 Fedora 等发行版都预先打包了此软件包,名称为 “mtd-utils”。
将 “spi_intel.writeable=1” 添加到内核命令行并重新启动板卡(您也可以重新加载驱动程序,将 “writeable=1” 作为模块参数传递给 modprobe)。
一旦板卡再次启动并运行,找到正确的 MTD 分区(它被命名为 “BIOS”)
# cat /proc/mtd dev: size erasesize name mtd0: 00800000 00001000 "BIOS"这里是 /dev/mtd0,但可能会有所不同。
首先备份现有映像
# 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验证备份
# sha1sum /dev/mtd0ro bios.bak fdbb011920572ca6c991377c4b418a0502668b73 /dev/mtd0ro fdbb011920572ca6c991377c4b418a0502668b73 bios.bakSHA1 校验和必须匹配。否则,不要再继续!
擦除 SPI 串行闪存。执行此步骤后,不要重新启动板卡!否则它将无法再启动
# flash_erase /dev/mtd0 0 0 Erasing 4 Kibyte @ 7ff000 -- 100 % complete完成后没有错误,您可以写入新的 BIOS 映像
# dd if=MNW2MAX1.X64.0092.R01.1605221712.bin of=/dev/mtd0验证 SPI 串行闪存的新内容是否与新的 BIOS 映像匹配
# sha1sum /dev/mtd0ro MNW2MAX1.X64.0092.R01.1605221712.bin 9b4df9e4be2057fceec3a5529ec3d950836c87a2 /dev/mtd0ro 9b4df9e4be2057fceec3a5529ec3d950836c87a2 MNW2MAX1.X64.0092.R01.1605221712.binSHA1 校验和应该匹配。
现在您可以重新启动板卡,并观察新的 BIOS 是否正常启动。
参考资料¶
[1] https://firmware.intel.com/sites/default/files/MinnowBoard%2EMAX_%2EX64%2E92%2ER01%2Ezip