I-Nex SPD DDR2 DDR3

Serial Presence Detect, w skrócie SPD. Element pamięci RAM, typu eeprom, zawierający dane o jej typie, opóźnieniach, producencie oraz wielu innych danych opisanych przez organizację JEDEC, zajmującą się jej standaryzacją. Najbardziej znane dane dla przeciętnego użytkownika komputera to opóźnienia, przedstawiane jako CL. Gdzie w sklepach jest on podawany najczęściej jako CL-9, CL-10 itd. Wraz ze wzrostem opóźnień pamięci ram, wzrasta także taktowanie pamięci, jednak nie zawsze idzie to w parze. Nie należy kupować pamięci o wysokim współczynniku CL oraz niskim taktowaniu. Jednak jak najbardziej można, jeśli taktowanie pamięci jest dosyć duże względem opóźnień.

Wracając SPD jest to mała pamięć typu EEPROM znajdująca się na każdej pamięci ram, zawiera ona dane o rozmiarze 256 bajtów, gdzie każdy z bajtów zawiera poszczególne informacje.

W przypadku pamięci DDR2, DDR3 jak i DDR4, drugi bajt mówi o typie pamięci, gdzie:

  • 08h = DDR2
  • 0Bh = DDR3
  • 0Ch = DDR4

Najlepiej opisuje to strona simmtester. Na której zostało dokładnie opisane znaczenie każdego z bajtów dla:

Ważne: Przy wykrywaniu parametrów pamięci, nie tylko dany bajt jest ważny by określić parametr, poszczególny bajt oprócz postaci hex, powinniśmy także zamienić na postać binarną. Mamy wtedy dostęp do ciągu 7 liczb, poczynając od 0. By te dane zrozumieć i przekształcić na zrozumiałą dla człowieka wartość, musimy zarejestrować się na stronie jedec.org i pobrać dokument opisujący znaczenie każdego bajtu w pliku i każdego bitu w bajcie.

Dany bajt możemy wydobyć wykorzystując program hexdump. Jednak by pod linuksem uzyskać dostęp do pliku z zawartością EEPROM. potrzebujemy podnieść odpowiednie moduły w kernelu. Pierwszy moduł jest zawsze oczywisty,

modporbe eeprom

Zaś drugi moduł to sterownik SMBus, aby określić jaki dokładnie moduł kernela jest odpowiedni dla nas, możemy wykorzystać program sensors-detect lub uruchomić i-nex, wersję z repo daily z przełącznikiem „(tutaj są dwa myślniki)–smbus”. Zmienna zwróci odpowiednie dane, które musimy odpowiednio zinterpretować. Innym sposobem jest użycie pliku dla udev, który po wykryciu urządzenia podniesie podczas startu systemu dany moduł kernela.

Plik znajdziecie tutaj, należy go umieścić w:

Dla Ubuntu: /etc/udev/rules.d/

Dla Arch/Manjaro: /lib/udev/rules.d/

W Manjaro moduł dla SMBus jest u mnie podnoszony bez potrzeby użycia podsystemu udev, jednak w Ubuntu już ta sprawa wygląda inaczej (Nie jest podnoszony)

Posiadam głównie sprzęt Intela, także dla płyt D425KT, DN2800MTE jest to i2c-i801.

Jeśli wszystkie moduły mamy podniesione, w katalogu /sys/bus/i2c/drivers/eeprom/

Powinniśmy zobaczyć coś na wzór tego:
0-0050@ 0-0051@ 2-0050@ bind module@ uevent unbind
Prawdopodobnie mamy dostępne 2 banki na pamięć ram, gdzie jedną z pamięci eeprom jest EDID naszego monitora podpiętego pod złącze analogowe bądź cyfrowe.

Dla EDID zawartość danych w pliku jest dynamiczna, rozmiar pliku zawsze jest taki sam dla eeprom i wynosi 256 Bajtów.

ls -lh /sys/bus/i2c/drivers/eeprom/*-*/
/sys/bus/i2c/drivers/eeprom/0-0050/:
razem 0
drwxr-xr-x 2 root root 0 05.09.2014 14:04 power/
lrwxrwxrwx 1 root root 0 05.09.2014 09:34 driver -> ../../../../../bus/i2c/drivers/eeprom/
-r–r–r– 1 root root 256 05.09.2014 14:03 eeprom
-r–r–r– 1 root root 4,0K 05.09.2014 14:03 modalias
-r–r–r– 1 root root 4,0K 05.09.2014 14:03 name
lrwxrwxrwx 1 root root 0 05.09.2014 09:35 subsystem -> ../../../../../bus/i2c/
-rw-r–r– 1 root root 4,0K 05.09.2014 14:03 uevent

/sys/bus/i2c/drivers/eeprom/0-0051/:
razem 0
drwxr-xr-x 2 root root 0 05.09.2014 14:04 power/
lrwxrwxrwx 1 root root 0 05.09.2014 09:34 driver -> ../../../../../bus/i2c/drivers/eeprom/
-r–r–r– 1 root root 256 05.09.2014 14:03 eeprom
-r–r–r– 1 root root 4,0K 05.09.2014 14:03 modalias
-r–r–r– 1 root root 4,0K 05.09.2014 14:03 name
lrwxrwxrwx 1 root root 0 05.09.2014 09:35 subsystem -> ../../../../../bus/i2c/
-rw-r–r– 1 root root 4,0K 05.09.2014 14:03 uevent

/sys/bus/i2c/drivers/eeprom/2-0050/:
razem 0
drwxr-xr-x 2 root root 0 05.09.2014 14:04 power/
lrwxrwxrwx 1 root root 0 05.09.2014 09:34 driver -> ../../../../../bus/i2c/drivers/eeprom/
-r–r–r– 1 root root 256 05.09.2014 14:03 eeprom
-r–r–r– 1 root root 4,0K 05.09.2014 14:03 modalias
-r–r–r– 1 root root 4,0K 05.09.2014 14:03 name
lrwxrwxrwx 1 root root 0 05.09.2014 09:35 subsystem -> ../../../../../bus/i2c/
-rw-r–r– 1 root root 4,0K 05.09.2014 14:03 uevent

Można wywnioskować, odgadnąć które katalogi to nasze banki pamięci. Moje to 0-0050 oraz 0-0051 a 2-0050 jest zawartością EDID.

W celu wydobycia pojedynczych bajtów używamy programu hexdump.

hexdump -C -v /sys/bus/i2c/drivers/eeprom/0-0051/eeprom

Aby uzyskać dostęp za pomocą sed -n ‚Xp’, gdzie X jest Bajtem opisanym w standardzie JEDEC, należy użyć takiego oto sposobu:

Byte 2 = sed -n '2p' + 1 = -n '3p'
export DEVICERAM=0-0051
hexdump -C -v /sys/bus/i2c/drivers/eeprom/$DEVICERAM/eeprom | awk '{for(i=2;i<=17;i++)printf "%s\n",$i;}' | sed -n '3p'

Otrzymamy w ten sposób wartość „0b”, która oznacza pamięć DDR3.

export DEVICERAM=0-0051
export HEXDUMP=`hexdump -C -v /sys/bus/i2c/drivers/eeprom/$DEVICERAM/eeprom | awk '{for(i=2;i<=17;i++)printf "%s ",$i;}'`

Hex to Binary
for j in $HEXDUMP; do BIN=$(echo "obase=2; ibase=16; $j" | bc );echo $BIN; done

A tak to przedstawia się w I-Nex obecnie:

09052014142032711

Share this...Share on Facebook4Share on Google+4Tweet about this on TwitterShare on Tumblr0Share on Reddit0Pin on Pinterest0Email this to someone