DDR Memory Mod

Potrzeba jest matką wynalazku. :P

O co chodzi z tym DDR-Modem?

W zasadzie to potrzeba i bieda. ;) Otóż składając sobie nowego kompa (barton 2600 i te sprawy) natknąłem się na "drobne" problemy finansowe - policzyłem, że nie starczy mi kasy na pamięć. Co zrobić? Przypomniałem sobie, że jakiś czas temu znajomy (admin) mówił coś o tym, że mu padł RAM...

Trzy dni później byłem szczęśliwym posiadaczem zepsutej kostki DDR266 512MB. Co było zepsute? Któryś ze scalaków padł i w niektórych rejonach pamięci były błędy. Odpaliłem memtest86 i w parę sekund dowiedziałem się, że jest bardzo dużo uszkodzeń w okolicach 280-310MB. Przełączenie trybu testowania na 'badram patterns' w kilka sekund wyliczyło z tych wszystkich błędów jedną parę liczb - oznaczało to, że padł bufor wyjściowy na jednej linii danych w jednym ze scalaków. No i co teraz? W zasadzie mógłbym w tym momencie użyć patcha BadRAM na kernel, ale wtedy nie mógłbym zainstalować Windowsa, no i odpalanie wszelkiego rodzaju LiveCD byłoby raczej utrudnione (dopisywanie mem=256M do kernela itd.).

Postanowiłem podejść do rzeczy nieco inaczej - przerobić kostkę RAMu, żeby była widziana jako 256MB.

Przygotowania i research

Przede wszystkim trzeba było w jakiś sposób wytłumaczyć kontrolerowi pamięci, że kostka to 256MB. Początkowy pomysł z uziemieniem linii adresowej odpadł - po prostu nie tędy droga. Musiałem poszukać innego sposobu. Dalszy research przyniósł oczekiwane skutki - tak jak się spodziewałem, wszystko było zapisane w małej kosteczce zwanej SPD EEPROM:

spd eeprom closeup

Takie kostki znajdują się na wszystkich pamięciach DDR oraz na większości SDR. Zawierają one różne dane, takie jak organizacja pamięci, ilość linii adresowych, banków, a także timing pamięci (o czym dobrze wiedzą overclockerzy). Dla chętnych:

Bardzo miłą wiadomością był fakt, że używane w pamięciach SPD EEPROMy to dosyć standardowy model 24WC02. Mówię "dosyć", bo nie da się ich kupić w sklepie! Wszystkie sklepy jakie znam mają jedynie model 24C02, który zachowuje się podobnie, jeśli chodzi o jego programowanie (i kosztuje jakieś 1,50zł). W przypadku uszkodzenia kostki 24WC02 w swojej pamięci najlepszym sposobem na pozyskanie nowej jest kupno zepsutego RAMu (może być SDRAM) na giełdzie za grosze - należy upewnić się jednak, że ma on kostkę SPD (niektóre starsze modele SDRAMu jej nie posiadały).

Wykonanie

Używając modułów kernela i2c-nforce2 oraz eeprom zczytałem zawartość istniejącej kostki. Za pomocą skryptu perlowego decode-dimms.pl z programu lm_sensors-2.9.2 zdekodowałem zawartość mojej kostki.

Następnie używając hexedytora, przerobiłem plik .bin zawierający zrzut pamięci kostki. Należało przerobić dwa miejsca - ilość banków oraz sumę kontrolną (w przypadku złej sumy kontrolnej BIOS będzie protestował). Odpaliłem decode-dimms.pl na moim zmodyfikowanym pliku .bin...

Aby ukazać różnicę, oto diff wykonany między tymi dwoma plikami:

--- dimm.html 2005-11-02 23:48:30.000000000 +0100
+++ modified.html 2005-11-04 01:21:28.000000000 +0100
@@ -17,7 +17,7 @@
-<tr><td valign=top>Number of Module Rows</td><td>2</td></tr>
+<tr><td valign=top>Number of Module Rows</td><td>1</td></tr>
@@ -68,7 +68,7 @@
-<tr><td valign=top>EEPROM Checksum of bytes 0-62</td><td>OK (0x90)</td></tr>
+<tr><td valign=top>EEPROM Checksum of bytes 0-62</td><td>OK (0x8F)</td></tr>

Jak widać, operacja jak na razie się udała. Teraz pozostało już tylko przeprogramować kostkę nowym plikiem .bin i modlić się, aby zadziałało. Bez problemu wylutowałem SPD EEPROM (obudowa SO-8 to nic trudnego, tylko wygląda na ciężką do wylutowania), niszcząc przy okazji trochę ścieżek na module RAM (na szczęście udało się je zastąpić kawałkami kabelków). Do programowania użyłem zrobionego przez siebie adaptera parport/i2c, a żeby bez problemu zaprogramować EEPROM, wlutowałem go w kawałek płytki uniwersalnej. Płytkę podłączyłem do adaptera kawałkami kabelków, a EEPROM zaprogramowałem używając jednego z programów z lm_sensors. Po wlutowaniu SPD EEPROMa z powrotem na moduł RAM i włożeniu całości na nowiutką płytę główną było trochę strachu, ale radość była ogromna, kiedy BIOS radośnie wykonał test pamięci i zliczył do 256MB!

Jeśli kogoś to interesuje, zamieszczam pliki .bin z oryginalnym i zmodyfikowanym wsadem. NIE WOLNO ich stosować do innych pamięci, nawet jeśli mają pozornie podobny timing itp - trzeba ZAWSZE zrobić zrzut ze swojej pamięci i dokonać poprawek. Jeśli ktoś nie umie dokonać poprawek, to może mi przesłać swój plik .bin na maila - zrobię je dla niego.

Testowanie

To jednak jeszcze nie koniec... trzeba wykonać testy, żeby się upewnić, że wszystko jest OK. Przeszły one bez żadnych problemów - memtest86 stwierdził 100% sprawności, BIOS się nie czepiał, a Windows i Linux bootowały się i działały poprawnie. A ja byłem o 100zł do przodu...

Jest jednak pewien problem: o ile tak przerobiona kostka zachowuje się prawidłowo, kiedy siedzi na płycie głównej sama, to zaczynają się problemy, kiedy pracuje razem z inną. Po włożeniu jej razem z kostką 256MB, komputer widzi 768MB, co jest odrobinę dziwne... nie badałem tego zbyt dokładnie, ale pewnie zachowanie takich przerobionych kostek zależy od płyty głównej i kontrolera pamięci. Przy odpowiednim ułożeniu kostek w slotach, uszkodzony region leży na "górze" pamięci, więc można go ominąć dodając parametr mem=512M do kernela. Nie jest to jednak idealne rozwiązanie, i nie za bardzo mam pomysł, jak sobie z tym poradzić. Cóż... mimo wszystko jest to jakiś zysk.

Disclaimer

Wszystkich, którzy chcą się bawić w ten sposób, ostrzegam: