Meretas DDR3 SPD

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 bermasalah

Berhati-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 Pro

Sebelum: 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! ↑

Source: https://habr.com/ru/post/id431128/


All Articles