Принесли мне в жертву для обновления старенький Macbook 13 mid 2010 для обновления. Процедура стандартная - расширяем память до 8Gb DDR3, ставим SSD и обновляем Mac OS. С последними двумя пунктами проблем не возникло, а вот с первым всё оказалось не так просто - имеющиеся у меня на руках планки отказались запускаться на этом Mac'е, не смотря на то, что они прекрасно работали в другом Macbook Pro тех же времён. В итоге выяснилось, что данный Macbook работает только с памятью на частоте 1066Mhz (PC8500) из-за встроенной видеокарты GeForce 320M, которая может работать только на частоте 1066. Это легко проверялось установкой одного старого модуля 1Gb с частотой 1066 и нового 4Gb с частотой 1600 - всё запускалось и прекрасно работало. Значит наша задача, сделать так, чтобы хотя бы одна из новых планок памяти запускалась на частотах не выше 1066Mhz.
Для этого нам потребуется другой компьютер, в котором данная память работает, и программа RWEverything. Идём в меню Access -> DIMM SPD и в выпадающем списке выбираем нужный модуль (с адресом 0xA0 или 0xA2 и т.д), после чтения данных программа сразу покажет вам расшифрованные данные модуля на вкладке Summary.
В соответствии со спецификацией SPD за максимальную частоту памяти отвечает адрес 0x0C. Значение 0А по этому адресу означает скорость 1600, нам же нужна скорость 1066, а это 0F. Но изменение этого значения не достаточно, поскольку эти значения сверяются с контрольной суммой по адресу 0x7e–0x7f. Контрольная сумма считается для байтов 0-116 в формате CRC16. Для расчёта контрольной суммы можно воспользоваться онлайн калькулятором. Пример можно увидеть на скрине ниже.
В результате получаем значение 0х8А2А
Для проверки сравним это значение с записанным в памяти. Переводим RWEverything в режим word и сверяем...
Значения совпадают, значит последовательность введена правильно и можно вносить изменения и считать новую контрольную сумму. Меняем в калькуляторе значения в позиции 0х0С на 0F и снова считаем новую контрольную сумму 0х9D32. Вводим новые значения в RWEverything и жмём Write.
После перезагрузки компьютера, если всё сделано правильно, можем увидеть в RWEverything изменённые данные при считывании SPD.
Таким же образом можно менять и другие характеристики памяти, но нужно учитывать что частота и тайминги в SPD прописаны в наносекундах с учётом множителя средней временной базы (MTB, чаще всего 1/8 - отношение адресов 0х0А/0х0В). Например, в случае с частотой DDR3-1600 имеем тактовую частоту 800Мгц, в наносекундах это 1,25 или 10 с учётом множителя MTB 1/8, а 10 в шестнадцатеричной системе это 0А, что мы и видели в изначальных значениях памяти по адресу 0х0С.
Таким же способом можно переделывать память DDR3 в DDR3L и обратно, но только в случае если используемые на планке модули памяти по спецификации поддерживают необходимые напряжения. За поддерживаемые напряжения отвечает адрес 0х06, а значения 00 - 1.5V, 02 - 1.35V/1.5V, 03 - 1.35V