Saya memutakhirkan laptop lama saya dengan dua modul memori DDR3-1333 4GB, tetapi ternyata laptop tersebut kompatibel dengan maksimum DDR3-1066. Apa yang akan dilakukan pria sejati? Tentu saja, itu akan memutakhirkan EEPROM untuk mengubah DDR3 menjadi model yang lebih lambat!
Tempat kerja. Di sebelah kanan adalah Thinkpad untuk flashing, dan di sebelah kiri adalah MacBook Pro yang bermasalahBerhati-hatilah. Jelas, Anda dapat merusak atau memblokir perekaman secara permanen pada DIMM Anda. Kemungkinan masalah yang lebih halus, termasuk kegagalan rangkaian logika baterai, atau motherboard akan berubah menjadi batu bata .Bagaimana semuanya dimulai
Saya memiliki MacBook Pro 13 inci pertengahan 2010. Sistem file rusak selama reboot biasa, dan utilitas disk (dari partisi pemulihan) tidak dapat berbuat apa-apa. Yah, saya sudah lama menunggu ini: saatnya untuk meletakkan SSD dan menambahkan beberapa RAM.
Saya membeli SSD dan saya beruntung menemukan beberapa laptop rusak dengan modul RAM yang sesuai di tumpukan sampah elektronik. Kami memasukkan SSD dan dua modul 4 GB, meluncurkan Internet Recovery - dan dalam satu jam kita harus memiliki sistem yang berfungsi. Tapi tidak. Unduh dibekukan saja. Karena apa? Kecurigaan terbesar disebabkan oleh modul-modul RAM ini, setelah semua, mereka berasal dari sampah. Karena itu, kami melakukan apa yang akan dilakukan siapa pun: membuat USB flash drive dengan memtest86 dan menjalankannya dalam semalam. Hebat, memori baik-baik saja. Setelah berjam-jam mencoba metode instalasi yang berbeda untuk versi macOS yang berbeda, penemuan akhirnya datang bahwa semuanya bekerja dengan baik jika Anda hanya memasukkan memori lama kembali.
1 Alasan yang benar
Menyadari masalah ini, saya segera mengetahui bahwa
MacBook 2009-2010 tidak benar-benar bekerja dengan memori lebih cepat daripada PC3-8500 , dan bahwa
Anda dapat mengatasi masalah tersebut dengan memodifikasi metadata RAM menggunakan program Windows yang disebut Thaiphoon Burner .
Penyebab sebenarnya dari kegagalan adalah prosesor grafis terintegrasi GeForce 320M, yang menggunakan memori bersama, yaitu, RAM biasa. Ini dapat bekerja dengan maksimum PC3-8500 (alias DDR3-1066, yaitu, dengan frekuensi clock 533 MHz DRAM), tetapi pengontrol memori sistem tidak mengetahui hal ini dan meningkatkan kecepatan maksimum yang tersedia hingga 667 MHz (mis. PC3-10600 alias DDR3 -1333). Komponen yang tersisa tidak memiliki masalah dengan ini, sama seperti GPU dalam mode VESA (saya pikir).
Saya belum pernah mendengar ada peralatan lain yang gagal dalam operasi RAM yang
mampu kecepatan lebih tinggi dari yang dapat digunakan oleh peralatan. Tentu saja, ketika membeli modul memori di pasaran, penjual pasti sudah memperingatkan tentang nuansa ini. Ini masih jauh lebih baik daripada RAM yang disolder, seperti pada laptop Apple sejak 2012.
Pengaturan firmware
Setelah membahas alasannya, saya memasang satu modul PC3-8500 asli pada 2 GB dan satu modul 4 GB baru, dan itu berhasil. Tapi rebinning DDR3 sepertinya proyek yang bagus, jadi saya memutuskan untuk mencobanya.
Tentu saja, saya tidak akan menginstal Windows hanya untuk firmware EEPROM dan saya tidak akan membeli perangkat lunak mewah, jika semuanya dapat dilakukan secara manual. Saya pikir tugas itu jelas harus dilakukan di Linux, mungkin dengan beberapa alat tambahan. Saya juga tidak ingin menginstal Linux pada macbook hanya untuk itu. Oleh karena itu, Thinkpad X220 lama yang andal dengan
NixOS telah menjadi platform yang ideal untuk bekerja. Butuh sedikit waktu untuk memperbaruinya, karena saya tidak memuat mobil selama setahun atau lebih.
Kemudian giliran untuk memilih modul mana yang akan dicoba terlebih dahulu. Thinkpad sudah memiliki masing-masing 4 GB, dan saya menemukan empat modul 4 GB, jadi saya punya banyak pilihan. Saya memutuskan untuk memulai dengan produksi Micron yang paling aneh. Yang lainnya adalah Samsung. Ada yang punya stiker Lenovo.
Baca SPD
Modul memori dilengkapi dengan chip EEPROM yang berisi metadata tentang modul
Serial Presence Detect (SPD). Formatnya sendiri sederhana, dan akses ke EEPROM dapat diatur melalui bus
SMBus , yang pada dasarnya sama dengan
I²C .
2 Untungnya, ada driver kernel dan perangkat lunak siap pakai untuk berinteraksi dengan SMBus dan bahkan membaca EEPROM DDR3.
Pertama, untuk melihat perangkat di bus
i2c-tools
dan beberapa modul kernel diperlukan.
$ nix-shell -p i2c-tools
$ modprobe i2c-dev
$ modprobe i2c-i801
$ i2cdetect -l
i2c-0 unknown i915 gmbus ssc N/A
i2c-1 unknown i915 gmbus vga N/A
i2c-2 unknown i915 gmbus panel N/A
i2c-3 unknown i915 gmbus dpc N/A
i2c-4 unknown i915 gmbus dpb N/A
i2c-5 unknown i915 gmbus dpd N/A
i2c-6 unknown DPDDC-B N/A
i2c-7 unknown DPDDC-C N/A
i2c-8 unknown DPDDC-D N/A
i2c-9 unknown SMBus I801 adapter at efa0 N/A
Adaptor SMBus menarik di sini, dalam kasus saya
i2c-9
.
Paket
i2c-tools
bahkan dilengkapi dengan alat
decode-dimms
untuk membaca informasi RAM dalam format yang dapat dibaca. Ini membutuhkan modul kernel
eeprom
.
$ modprobe eeprom
$ decode-dimms
$ modprobe -r eeprom
Ini adalah output untuk satu modul memori:
Memory Serial Presence Detect Decoder
Oleh Philip Edelbrock, Christian Zuckschwerdt, Burkart Lingner,
Jean Delvare, Trent Piepho dan lainnya
Decoding EEPROM: / sys / bus / i2c / driver / eeprom / 9-0050
Tebak dimm ada di bank 1
--- === Informasi EEPROM SPD === ---
EEPROM CRC dari byte 0-116 OK (0xAEA4)
# byte yang ditulis ke SDRAM EEPROM 176
Total jumlah byte di EEPROM 256
Jenis Memori Dasar DDR3 SDRAM
Tipe Modul SO-DIMM
--- === Karakteristik Memori === ---
Kecepatan modul maksimum 1333 MHz (PC3-10600)
Ukuran 4096 MB
Bank x Baris x Kolom x Bit 8 x 15 x 10 x 64
Peringkat 2
Lebar Perangkat SDRAM 8 bit
Ekstensi Lebar Bus 0 bit
tCL-tRCD-tRP-tRAS 9-9-9-24
Latensi CAS yang Didukung (tCL) 10T, 9T, 8T, 7T, 6T, 5T
--- === Waktu pada Kecepatan Standar === ---
tCL-tRCD-tRP-tRAS sebagai DDR3-1333 9-9-9-24
tCL-tRCD-tRP-tRAS sebagai DDR3-1066 7-7-7-20
tCL-tRCD-tRP-tRAS sebagai DDR3-800 6-6-6-15
--- === Parameter Pengaturan Waktu === ---
Waktu Siklus Minimum (tCK) 1,500 ns
Minimum CAS Latency Time (tAA) 13.125 ns
Minimum Write Recovery time (tWR) 15.000 ns
Minimum RAS # ke CAS # Delay (tRCD) 13.125 ns
Minimum Row Aktif ke Row Active Delay (tRRD) 6.000 ns
Minimum Row Precharge Delay (tRP) 13.125 ns
Minimum Aktif ke Keterlambatan Precharge (tRAS) 36.000 ns
Minimum Aktif ke Penundaan Refresh Otomatis (tRC) 49,125 ns
Minimum Recovery Delay (tRFC) 160.000 ns
Minimum Write to Read CMD Delay (tWTR) 7,500 ns
Minimum Read to Pre-charge CMD Delay (tRTP) 7.500 ns
Minimum Four Activate Window Delay (tFAW) 30.000 ns
--- === Fitur Opsional === ---
Tegangan yang dapat dioperasikan 1.5V
RZQ / 6 didukung? Tidak
RZQ / 7 didukung? Ya
Mode DLL-Off yang didukung? Ya
Kisaran suhu pengoperasian 0-95 derajat C
Refresh Rate dalam rentang temp diperpanjang 2X
Penyegaran Otomatis Otomatis? Ya
Pembacaan Sensor Thermal On-Die? Tidak
Partial Array Self-Refresh? Tidak
Modul Sensor Termal Ya
Jenis Perangkat SDRAM Standar Monolitik
--- === Karakteristik Fisik === ---
Modul Tinggi 30 mm
Tebal Modul depan 2 mm, belakang 2 mm
Lebar Modul 67,6 mm
Modul Referensi Kartu F revisi 0
Peringkat 1 Standar Pemetaan
--- === Data Pabrikan === ---
Modul Produsen Teknologi Mikron
DRAM Produsen Teknologi Mikron
Kode Lokasi Pabrikan 0x0F
Tanggal Pembuatan 2011-W23
Nomor Seri Perakitan 0xFB5C7F1A
Nomor Bagian 16JSF51264HZ-1G4D1
Kode Revisi 0x4431
Cukup banyak data. Bagian dari informasi yang ditampilkan dihitung dari data. Misalnya, penentuan waktu pada kecepatan standar (mis., Jumlah siklus) dihitung berdasarkan parameter waktu dalam resolusi nanodetik. Bahkan mereka disimpan sebagai kelipatan dari unit basis waktu yang dipasang di tempat lain di EEPROM, tetapi ini tidak berlaku untuk topik artikel. Modul RAM ini menghadirkan 7-7-7-20 ke DDR3-1066, yang sesuai dengan standar JEDEC DDR3-1066F. Jangan tanya saya apa itu JEDEC, tapi ini lebih cepat daripada DDR3-1066G termurah.
Saya menghabiskan banyak waktu untuk mengkonfirmasi kesimpulan saya: ketika mencoba untuk me-rebin memori, satu-satunya nomor penting adalah waktu siklus minimum (tCK). Ini dia 1,5 ns, mis. 667 MHz.
Mari kita lihat sumber datanya.
$ i2cdump 9 0x50
Tidak ada ukuran yang ditentukan (menggunakan akses data-byte)
PERINGATAN! Program ini dapat membingungkan bus I2C Anda, menyebabkan kehilangan data dan lebih buruk!
Saya akan menyelidiki file / dev / i2c-9, alamat 0x50, mode byte
Lanjutkan? [Y / n]
0 1 2 3 4 5 6 7 8 9 abcdef 0123456789abcdef
00: 92 10 0b 03 03 19 00 09 03 52 01 08 0c 00 7e 00 ??????. ?? R ???. ~.
10: 69 78 69 30 69 11 20 89 00 05 3c 3c 00 f0 82 05 ixi0i? ?.? <<. ???
20: 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00? ...............
30:00 00 00 00 00 00 00 00 00 00 00 00 00 0f 11 05 00 ............ ???.
40:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
50:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
60:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
70: 00 00 00 00 00 80 2c 0f 11 23 fb 5c 7f 1a a4 ae .....?, ?? #? \ ????
80: 31 36 4a 53 46 35 31 32 36 34 48 5a 2d 31 47 34 16JSF51264HZ-1G4
90: 44 31 44 31 80 2c 00 00 00 00 00 00 00 00 00 00 00 D1D1 ?, ..........
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
Spesifikasi mengatakan bahwa waktu minimum ditunjukkan pada 0x0c. Mari kita lihat, ini ada di baris pertama (
00:
, di kolom
c
. Omong-omong, nilainya juga 0x0c atau 12. Ini adalah kelipatan dari basis waktu rata-rata (MTB), yang merupakan hasil bagi dari membagi nilai dalam 0x0a dengan nilai dalam 0x0b (dalam nanodetik). Di sini 1ā8 ns. Jadi 12 MTB sesuai dengan 1,5 ns.
Ubah perencanaan
Untuk turun ke DDR3-1066, kita perlu 533 MHz, yaitu 1,875 ns atau 15 MTB, atau 0x0f. Yaitu, kami ingin menulis 0x0f pada 0x0c.
Tapi tunggu, jelas ada perbaikan bug. CRC dari 116 byte pertama disimpan di 0x7e-7f. Saya melihat ke sana dan melihat
a4 ae
, lalu pergi mencari kalkulator untuk perhitungan. Butuh waktu lama bagi saya untuk menemukan kalkulator CRC yang bisa diterapkan. Saya mencoba beberapa alat baris perintah, tetapi masih menetapkan kalkulator online
http://crccalc.com/ . Kemudian saya menemukan bahwa varian CRC-16 / XMODEM digunakan di sini, dan checksum sebenarnya 0xAEA4. Urutan byte dan semua itu. Ini harus dicatat dalam penerbitan
decode-dimms
.
Oleh karena itu, Anda perlu menulis waktu siklus minimum baru (0x0f) pada 0x0c dan checksum baru di 0x7e sebagai kata.
Catatan SPD
Sekarang saya tahu apa yang harus ditulis, dan akhirnya berani mencoba. Dengan tangan gemetar, aku mengetik
y
, tekan Enter untuk konfirmasi akhir dan ...
$ i2cset 9 0x50 0x0c 0x0f
PERINGATAN! Program ini dapat membingungkan bus I2C Anda, menyebabkan kehilangan data dan lebih buruk!
BERBAHAYA! Menulis ke EEPROM seri pada DIMM memori
dapat membuat memori Anda TIDAK BERMANFAAT dan membuat sistem Anda TIDAK DAPAT DIUBAH!
Saya akan menulis ke file perangkat / dev / i2c-9, alamat chip 0x50, alamat data
0x0c, data 0x0f, mode byte.
Lanjutkan? [y / T] y
Kesalahan: Menulis gagal
Kesalahannya. Tunggu apa?
Sebagai seorang pria yang bertele-tele, saya mulai mempelajari sumber-sumber i2cset, serta modul-modul kernel yang sesuai. Pada titik tertentu, saya menyadari bahwa ini bisa disebabkan oleh perlindungan penulisan.
Saya mengeluarkan modul memori, melihatnya dan mengenali chip EEPROM. Dikatakan
97B
,
321
dan beberapa hal lainnya. Googling, saya mengetahui bahwa ini adalah chip
SE97B . Saya melihat tabel data dan hati-hati membaca bagian proteksi tulis beberapa kali. Dengan bantuan program, saya melakukan beberapa upaya untuk menghapus perlindungan penulisan sementara, tetapi gagal. Perlindungan penulisan mungkin konstan, jadi saya memutuskan untuk mencari modul yang tidak memiliki perlindungan penulisan.
Fakta yang lucu, omong-omong, adalah bahwa perlindungan penulisan waktu nyata dimungkinkan dengan menulis sesuatu ke alamat tertentu. Saya tidak berpikir bahwa
i2cdetect
melakukan hal ini secara normal, tetapi menjalankan
i2cget 9 0x30 <any-address>
mungkin akan menetapkan perlindungan penulisan waktu-nyata, yang benar-benar konstan. Saya belum mencoba melakukan ini.
Saya mengambil modul berikut dan tidak ada pesan kesalahan di sana. EEPROM tidak berubah.
Akhirnya sukses!
Dengan modul ketiga, operasi akhirnya berubah. Saya menghitung CRC dan menulisnya bersamaan dengan waktu siklus. Setelah memuat modul kernel
eeprom
dan memulai
decode-dimms
modul tersebut terlihat seperti PC3-8500 4GB biasa. Ketika saya menginstalnya di MacBook Pro saya, saya akhirnya mem-boot sistem dengan memori 8 GB.
DDR3 SODIMM setelah rebinning siap bekerja di MacBook ProSebelum: DDR3-1333 Asli
0 1 2 3 4 5 6 7 8 9 abcdef 0123456789abcdef
00: 92 10 0b 03 03 19 00 09 03 52 01 08 0c 00 3e 00 ??????. ?? R ???.>.
10: 69 78 69 30 69 11 20 89 00 05 3c 3c 00 f0 83 01 ixi0i? ?.? <<. ???
20:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
30:00 00 00 00 00 00 00 00 00 00 00 00 00 0f 11 45 00 ............ ?? E.
40:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
50:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
60:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
70: 00 00 00 00 00 80 ce 02 11 30 b1 5b 13 a1 0e 59 ..... ???? 0? [??? Y
80: 4d 34 37 31 42 35 32 37 33 43 48 30 2d 43 48 39 M471B5273CH0-CH9
90: 20 20 00 00 80 ce 00 00 00 53 31 42 4e 30 30 30 .. ?? ... S1BN000
a0: 01 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 03?.? ............?
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 32 59 00 ............. 2Y.
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .......... ............
Setelah: terlihat seperti DDR3-1066
0 1 2 3 4 5 6 7 8 9 abcdef 0123456789abcdef
00: 92 10 0b 03 03 19 00 09 03 52 01 08 0f 00 3e 00 ??????. ?? R ???.>.
10: 69 78 69 30 69 11 20 89 00 05 3c 3c 00 f0 83 01 ixi0i? ?.? <<. ???
20:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
30:00 00 00 00 00 00 00 00 00 00 00 00 00 0f 11 45 00 ............ ?? E.
40:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
50:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
60:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
70:00 00 00 00 00 80 ce 02 11 30 b1 5b 13 a1 06 54 ..... ???? 0? [??? T
80: 4d 34 37 31 42 35 32 37 33 43 48 30 2d 43 48 39 M471B5273CH0-CH9
90: 20 20 00 00 80 ce 00 00 00 53 31 42 4e 30 30 30 .. ?? ... S1BN000
a0: 01 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 03?.? ............?
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 32 59 00 ............. 2Y.
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .......... ............
Jika Anda tidak segera melihat perbedaannya, maka Anda belum menggali ke tempat pembuangan sampah ini selama saya lakukan.
Pikiran Anda
Apakah layak untuk dilakukan? Secara finansial, tentu saja tidak!
Tapi itu menyenangkan dan saya belajar banyak. Saya tidak tahu di
mana tepatnya pengetahuan ini dapat diterapkan, tetapi saya merasa bahwa pada suatu saat mereka akan dibutuhkan. Dan hanya perasaan bahwa Anda dapat menyelesaikan masalah dengan benar sangat bagus dan memberikan kepercayaan diri.
1. Asumsi saya bahwa RAM akan bekerja pada peralatan ini jika melewati memtest86 jelas salah. Meski begitu, meski menoleh ke belakang, anggapan itu tidak tampak konyol. Dari pengalaman, kombinasi perangkat keras yang aneh bukanlah hal yang tidak biasa, karena itu tes standar jatuh.
ā2. Saya baru-baru ini belajar tentang menggunakan I²C di proyek lain. Saya pikir saya dapat membaca dan menulis EEPROM pada mikrokontroler Cortex-M menggunakan program saya sendiri, tetapi dalam praktiknya, menyolder konektor akan sangat sulit, dan menulis kode terlalu banyak pekerjaan bagi saya untuk tertarik. Meskipun demikian, saya benar-benar senang bahwa secara teori saya mampu melakukan hal seperti itu!
ā