Macbook pro/air 2013 late -2014 使用转接卡更换NVME SSD休眠不醒问题的解决办法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/aerror/article/details/91486841

、、

1. 手上512GMBP 2013 late 差不多满了,因为穷,所以在淘宝上买了一个NVME转Macbook pcie,然后再买一个NVME 2T的硬盘

2. NVME因为需要最新的Firmware Rom支持,所以必须使用原装的硬盘(必须原装)安装Mac 14以上,我安装了14.5.要不然识别不出来新安装的NVME硬盘

3. 买之前就知道是会有休眠问题的,问了卖家推荐了一些型号说不会的,其中我是买了推荐的HP EX950 2T, 比intel足足贵了700元,结果然并卵,安装完系统测试了一下,发现也是有休眠问题的。测试办法如下:

  

pmset -a hibernatemode 25
pmset sleepnow 

   然后合上盖子,过上几分钟,发现就睡死了。根本醒不过来了。必须强行关机再开机, 确认了多次如此。 估计有人说2013 late的机子可以,可能是默认的hibernatemode 3 ,或者设置了hibernatemode 0, 要不就是插着电源。

   同时还有副作用,就是开机会黑屏过10-20秒才看到苹果和进度条,开机速度超慢。

4. 遍查了整个网络,找到了以下的资料:

Background

  • 2013-2014 MacBooks use a non-standard connector (12+16 pins) for the stock SSD that uses PCIe AHCI (OEM drives supposedly based on the Samsung XP941 or SM951)
  • Fortunately, there are a number of M.2 NVMe drives and an adapter available that allow for SSD upgrades in these MacBooks
  • macOS 10.13 “High Sierra” introduced boot support for NVMe drives that use 512 byte sectors (or LBAs) which opens up a variety of NVMe SSD upgrade options (Samsung, Intel, etc)
  • Unfortunately, the stock EFI firmware (or system ROM) in these MacBook comes with an NVMe driver that prevents the MacBook from waking up from hibernation (or deep sleep)
  • To address this hibernation issue, the system ROM can either be modified, or hibernation can be disabled on the MacBook by executing “pmset -a standby 0”
  • 2015 MacBooks can also be upgraded using this guide and do not require firmware modifications or other changes as they presumably all use PCIe NVMe SSDs (like the Samsung PM951 and newer)
  • This guide has been successfully tested with a 13” MacBook Pro Late-2013 and an 11” MacBook Air Mid-2013

      证实了,只要是2013-2014的Macbook都会有问题的,任何型号的NVME转接的SSD都有问题,没有例外,原因是固件中的NVME驱动有问题会令到无法唤醒. 

     参考URLhttps://forums.macrumors.com/threads/upgrading-2013-2014-macbook-pro-ssd-to-m-2-nvme.2034976/page-87

     解决办法也给出了,就是使用2015的固件中NVME替换2013-2014的固件驱动,GUID为51116915-C34B-4D8E-86DB-6A70F2E60DAA, 然后使用编程器去先从MX25L6406EMI这芯片读出原来的Rom, 然后从Macos的安装包找出2015的NVME替换好了,再刷回MX25L6406EMI。

    文中CH341A编程器淘宝有卖,好便宜,只需要20-30元不等,但是它是使用一个SPI to J6100 adapter,这个查了一下发现淘宝没有,只有ebay上有,韩国卖家,几百块,发货时间还要超长。。。

 

5.   既然升级系统的时候可以升级固件,那么说明使用软件来刷也是可行的,就是前几天发的文章了,

  

1. get the FirmwareUpdate.pkg file from the OS installer app's installESD.dmg
2. extract the contents using pkgutil --expand /path/to/FirmwareUpdate.pkg <path somewhere else>/FirmwareUpdate
3. in terminal, cd to the Scripts directory inside the expanded FirmwareUpdate pkg directory.
4. with Scripts as your working directory, run these 2 commands, then reboot:
sudo /usr/libexec/FirmwareUpdateLauncher -p "$PWD/Tools"
sudo /usr/libexec/efiupdater -p "$PWD/Tools/EFIPayloads"
5. at the reboot, firmware will be updated if there are any updates to be applied.

测试了一下,固件是可以刷的,但是必须满足以下所有条件:

1. 使用原装的硬盘

2. 原装的固件

3.固件版本必须大于等于当前的固件的版本

efiupdate只是把文件复制到efi分,然后设置了一些nvram的参数,然后是固件启动的时候从efi的指定地方来更新,但是很明显上面的测试表明了,这个固件的更新之前是有校验的上面三个条件都满足才给刷的,修改了的固件刷不了。

https://apple.stackexchange.com/questions/287644/do-macbooks-support-nvme-ssd-drives-via-the-use-of-a-sintech-adapter

 这里人下 Y.H. wong说

 

hat guide on MacRumors is really useful. I recently upgraded a 2014 MBPr board using most of its instructions, and it still works. Changes made: 1. No need for kapton tape. 2. I used a Sintech ST-NGFF2013-B. 3. I didn't turn off hibernation with pmset, I didn't buy a CH341A programmer either. I just looked up the MBP112 and MBP114 firmwares, transplanted the NVMe driver from MBP114 to MBP112, and flashed my Mac with /usr/libexec/efiupdater -p /path/to/EFIPayloads --force-update. Wakeup problem completely gone. – Y.H Wong Nov 4 '18 at 13:00
@Y.HWong: Sounds like the easiest way to flash the firmware. Can you tell in more detail how you proceeded? May be even join the discussion at MacRumors. Thanks a lot! – Bernhard Fürst Feb 6 at 19:20

不知道他是怎么做到的,始终无法把修改后的固件成功刷上去,有点怀疑他可能是没有测试清楚 。

 

6.  没有办法了,看到intel是有一个fpt.efi(Flash proramming tool)的,可以在Uefi的shell下执行来刷UEFI的BIOS/固件,但是只是对于PC的,工具和文档参考https://github.com/holoto/efi_shell_flash_bios/

     于是安装了refind,然后从clover那里找了一个shellx64.efi放到/EFI/tools/shell.efi下,然后下载了fpt.efi也放到这里,然后运气并不好,fpt.efi无法识别SPI的设备. 

     但是发现安装refind解决了一些问题:

      1.启动不会黑屏20秒左右了,马上就可以启动看到启动菜单,把超时设置为0的话,马上就可以看到苹果和进度条了。

     2.唤醒虽然还是有问题,但是表现有些不一样,唤醒的时候不会直接黑屏卡死,而是可以看到refind的启动菜单,然后自动重启,然后再重启开机,这个其实也还好,至少不需要手动长按关机再开机那么烦了。

       这个两个问题的解决,我认为问题应该不只是固件的问题,还和启动的efi有关系,然后翻查了一下refind的文档,发现它在原装的硬件中唤醒表现竟然是和我的机器的表现是一致的,就是唤醒变成了自动重启两次。

       新的希望又有了,看来唤醒这个只是refind没有做好,在白苹果还有一个选择就是refit这个工具,虽然很久没有更新了,但是工作方式有些不同,它是直接安装在系统盘的根目录的,而不是EFI的分区中,也没有使用nvram的变量。 据查在白苹里使用它是没有休眼唤醒的问题的。于是把refind删除了,安装了refit,  然而也是没有走到狗屎运. :(

7. 好好的查了一下mx25L6406EMI-12G的datasheet, 知道它是8 SOP封装的,问了做硬件的朋友,他说其实可以焊几条线来用刷,但是不想动手电烙铁,上次拆硬盘的bios是拆得满头大汗,折腾许久,最后竟然还没有成功,所以有点信心不足. 于是在淘宝上再试试找那个连接线,也是没有找到,但是发现有一个sop 8的夹子,研究一下买家的评论图片,都是用来刷路由器,刷笔记本的,看来是一个可行,价格便宜又可以快速达成的办法。 于是拍了ch341a+夹子+一堆转接1.8v之类的一整套回来,花了50元左右,第二天就收到了。

8. 买ch341a没有说明书, 我汗,看到有一个跳线写着3.3V5V的,从https://static6.arrow.com/aropdfconversion/cb5c77c505104f4e4cad1b3667abe88327b4ee44/mx25l6406e203v2064mb20v1.9.pdf

先下载datasheet确认了这个mx25L6406EMI是3.3V的,然后小心翼翼用万用表量了一个8号脚是3.3V的, 然后把跳线插在编程那个两个脚上(板上好在有提示),

夹子夹了第一次没有夹好,读不出来,夹第二次好了,测试一下,可以读, 一切正常. 如图:

 

 

按上面的https://forums.macrumors.com/threads/upgrading-2013-2014-macbook-pro-ssd-to-m-2-nvme.2034976/page-87

一步一步都做,最后成功刷入固件。 开机问题好了,使用pmset -a hibernatemode 25来测试,唤醒问题也好了。

一切完美解决。

 

应要求补充一下翻译过来的操作步骤:

1. 打开后盖,主板上找mx25L6406EMI-12G这个芯片,是8只脚的,写了mx25L6406EMI这些字在上面的, 照图夹好BIOS, 红线对齐第一只脚(芯片上有一个圆点标记的)

 

2. 安装flash rom 工具,使用brew安装 

   

 brew install flashrom  

3. 开始读出原来的 bios ROM ,这个大小是8M的。输入以下命令:

 

flashrom -p ch341a_spi -r dump1.bin -c "MX25L6406E/MX25L6408E"

保险起见,执行3次,每次改改名,如下:

flashrom -p ch341a_spi -r dump2.bin -c "MX25L6406E/MX25L6408E"
flashrom -p ch341a_spi -r dump3.bin -c "MX25L6406E/MX25L6408E"

然后可以md5看看hash是不是一致的

 

md5 *.bin

要是读不出,或者是三次不一致,应该是没有夹好,重新夹一下。

在读数据的时候,这个ch341a的红灯会亮起来

 

4. 从升级/安装包解压出2015的MBP固件中的NVME驱动

    2013-2014 MacBook Pro (MacBookPro11,1),  用MacBookPro11,4 的 firmware

    2013-2014 MacBook Air (MacBookAir6,1),用 MacBookAir7,1的 firmware

 

 4.1 双击装载 InstallESD.dmg , 在macOS安装包的Contents/SharedSupport目录下.

    4.2 在InstallESD.dmg image, 找到 Packages/FirmwareUpdate.pkg 这个安装包

 

   4.3 用Pacifist或The Archive Browser 打开 the FirmwareUpdate.pkg 

 4.4 打开Scripts

  

4.5  从Tools/EFIPayloads 这里解压合适的firmware. 

MBA71_0177_B00.fd  是2015 MacBook Air   

MBP114_0183_B00.fd  是 2015 MacBook Pro

  4.6 上面的操作使用命令行也是可以,我是使用命令行来操作的

  

xar -x Packages/FirmwareUpdate.pkg
cat Scripts | cpio -i 

5. 修改dump1.bin 中的NVME驱动

    5.1 用UEFITool 打开2015的固件,找到这个驱动,有查找菜单的,找GUID为 51116915-C34B-4D8E-86DB-6A70F2E60DAA 的就是了。   

5.2 右键  “Extract as is…” 把2015的驱动保存下来.

5.3 使用5.2这时保存下来的驱动去替换dump下来的rom里的nvme驱动,也是定位那个GUID,然后右键 "replace aS IS ...."

5.4 替换的动作可以在UEFITool的界面如下图看到,保存这个文件为MBA71_0117_B00-Mod.rom ,

5.5 可以再次打开这个修改后的文件,可以对比一下这个rom的驱动和2015的firmware中的驱动的信息是不是一致的。

如果一致的,那么你这一步成功修改了你机器定制的rom了。

 

6. 使用flashrom 把修改后的rom写入bios芯片里, flashrom写完之后会自己校验的。

 flashrom -p ch341a_spi -w MBA71_0117_B00-Mod.rom -c "MX25L6406E/MX25L6408E"

 

写完之后,拔出USB的ch341a编程,夹子松开移走,开机,应该一切都是完美的了,可以看到开机马上就看到进度条了,而不是原来的卡上个几十秒,可以使用上面说的方法测试休眠唤醒。

祝好运.

展开阅读全文

没有更多推荐了,返回首页