├── .gitattributes ├── .gitignore ├── README.md ├── SPD_DDR3_spec.pdf ├── arduino └── spd │ └── spd.ino ├── dumps ├── KINGSTON-KVR13LS9S6-2-017-A00LF.SPD ├── KINGSTON-KVR16LS11S6-2-001-A00LF-800MHz.SPD ├── KINGSTON-KVR16LS11S6-2-001-A00LF.SPD ├── KINGSTON-KVR16LS11S6-2-014-A00LF.SPD └── README.md ├── scripts ├── README.md ├── spd_read.sh └── spd_write.sh └── tools ├── README.md ├── SPD.zip └── SPDTool_063.zip /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | 7 | # Standard to msysgit 8 | *.doc diff=astextplain 9 | *.DOC diff=astextplain 10 | *.docx diff=astextplain 11 | *.DOCX diff=astextplain 12 | *.dot diff=astextplain 13 | *.DOT diff=astextplain 14 | *.pdf diff=astextplain 15 | *.PDF diff=astextplain 16 | *.rtf diff=astextplain 17 | *.RTF diff=astextplain 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Windows image file caches 2 | Thumbs.db 3 | ehthumbs.db 4 | 5 | # Folder config file 6 | Desktop.ini 7 | 8 | # Recycle Bin used on file shares 9 | $RECYCLE.BIN/ 10 | 11 | # Windows Installer files 12 | *.cab 13 | *.msi 14 | *.msm 15 | *.msp 16 | 17 | # Windows shortcuts 18 | *.lnk 19 | 20 | # ========================= 21 | # Operating System Files 22 | # ========================= 23 | 24 | # OSX 25 | # ========================= 26 | 27 | .DS_Store 28 | .AppleDouble 29 | .LSOverride 30 | 31 | # Thumbnails 32 | ._* 33 | 34 | # Files that might appear in the root of a volume 35 | .DocumentRevisions-V100 36 | .fseventsd 37 | .Spotlight-V100 38 | .TemporaryItems 39 | .Trashes 40 | .VolumeIcon.icns 41 | 42 | # Directories potentially created on remote AFP share 43 | .AppleDB 44 | .AppleDesktop 45 | Network Trash Folder 46 | Temporary Items 47 | .apdisk 48 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Modifying RAM SPD Data 2 | 3 | Tools and stuff for modifying RAM SPD data. [More info here](http://blog.zakkemble.co.uk/modifying-ram-spd-data/). 4 | 5 | `arduino/` contains an Arduino sketch for reading SPD, modifying the max clock frequency, recalculating the CRC and writing back to the SPD. 6 | 7 | `dumps/` contains some SPD dumps from various RAM modules. 8 | 9 | `scripts/` contains some bash scripts for reading and writing SPD in Linux. 10 | 11 | `tools/` contains some Windows programs for SPD reading and writing. 12 | 13 | -------- 14 | 15 | [Modifying RAM SPD Data](http://blog.zakkemble.co.uk/modifying-ram-spd-data/) 16 | 17 | -------- 18 | 19 | Zak Kemble 20 | 21 | contact@zakkemble.co.uk 22 | -------------------------------------------------------------------------------- /SPD_DDR3_spec.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZakKemble/RAMSPDMod/a07a1c94dd2ddb656307a8742a059cae2db9f7c4/SPD_DDR3_spec.pdf -------------------------------------------------------------------------------- /arduino/spd/spd.ino: -------------------------------------------------------------------------------- 1 | /* 2 | * Project: Modifying RAM SPD data 3 | * Author: Zak Kemble, contact@zakkemble.co.uk 4 | * Copyright: (C) 2016 by Zak Kemble 5 | * License: GNU GPL v3 (see License.txt) 6 | * Web: http://blog.zakkemble.co.uk/modifying-ram-spd-data/ 7 | */ 8 | 9 | #include 10 | #include 11 | 12 | #define DRAM_MAX_CLK_800 0x14 13 | #define DRAM_MAX_CLK_1066 0x0F 14 | #define DRAM_MAX_CLK_1333 0x0C 15 | #define DRAM_MAX_CLK_1600 0x0A 16 | 17 | #define SPDSIZE 256 18 | #define BUFFSIZE 16 // Must be a multiple of 2, upto 256 19 | #define EEPADDR 0x50 20 | 21 | static byte spdData[SPDSIZE]; 22 | 23 | void setup() 24 | { 25 | Serial.begin(115200); 26 | 27 | byte initOK = eepInit(); 28 | if(initOK != 0) 29 | { 30 | Serial.print(F("EEPROM Init failed (")); 31 | Serial.print(initOK); 32 | Serial.println(F(")")); 33 | while(1); 34 | } 35 | 36 | // Serial.println("Init OK"); 37 | 38 | delay(2000); 39 | 40 | loadSPD(); 41 | if(!checkCRC()) 42 | { 43 | Serial.println(F("CRC failed!")); 44 | while(1); 45 | } 46 | 47 | setMaxClockSpeed(DRAM_MAX_CLK_1600); 48 | 49 | setCRC(calcCRC()); 50 | //saveSPD(); // WARNING uncomment this line at your own risk! 51 | 52 | dump(false); 53 | } 54 | 55 | void loop() 56 | { 57 | } 58 | 59 | static void loadSPD() 60 | { 61 | for(byte i=0;idump.spd` to save the data to a file. 22 | 23 | `spd_write.sh` expects the first argument to be a file with 256 hex values for writing to the RAM SPD - `spd_write.sh dump.spd`. 24 | -------------------------------------------------------------------------------- /scripts/spd_read.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Project: Modifying RAM SPD Data 4 | # Author: Zak Kemble, contact@zakkemble.co.uk 5 | # Copyright: (C) 2016 by Zak Kemble 6 | # Web: http://blog.zakkemble.co.uk/modifying-ram-spd-data/ 7 | 8 | # Licence: 9 | # Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0) 10 | # http://creativecommons.org/licenses/by-nc-sa/4.0/ 11 | 12 | ADDRESS=0x50 # RAM module address, usually 0x50 - 0x54 13 | BUS=0 # I2C bus number, usually 0 14 | #OUTFILE="dump.spd" 15 | 16 | echoErr() 17 | { 18 | echo "$1" 1>&2 19 | } 20 | 21 | #cat /dev/null > ${OUTFILE} 22 | 23 | echo "Reading..." 24 | echo "Bus: ${BUS}" 25 | echo "Address: ${ADDRESS}" 26 | 27 | SPDDATA="" 28 | 29 | for DATAADDR in {0..255} 30 | do 31 | echo -en "\rReading: ${DATAADDR}/255" 32 | HEX=$(i2cget -y ${BUS} ${ADDRESS} ${DATAADDR}) 33 | 34 | if [ $? -ne 0 ]; then 35 | echo "" 36 | echo "Error" 37 | echo "" 38 | exit 1 39 | fi 40 | 41 | SPDDATA="${SPDDATA} ${HEX}" 42 | done 43 | 44 | echo "" 45 | echo "Done" 46 | echo "" 47 | 48 | echoErr "${SPDDATA}" 49 | #echo -n "${SPDDATA}" | xxd -r -p > ${OUTFILE} 50 | -------------------------------------------------------------------------------- /scripts/spd_write.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Project: Modifying RAM SPD Data 4 | # Author: Zak Kemble, contact@zakkemble.co.uk 5 | # Copyright: (C) 2016 by Zak Kemble 6 | # Web: http://blog.zakkemble.co.uk/modifying-ram-spd-data/ 7 | 8 | # Licence: 9 | # Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0) 10 | # http://creativecommons.org/licenses/by-nc-sa/4.0/ 11 | 12 | ADDRESS=0x50 # RAM module address, usually 0x50 - 0x54 13 | BUS=0 # I2C bus number, usually 0 14 | INFILE="$1" 15 | 16 | if [ ! -f "${INFILE}" ]; then 17 | echo "Input file not found!" 18 | exit 1 19 | fi 20 | 21 | echo "Writing..." 22 | echo "Bus: ${BUS}" 23 | echo "Address: ${ADDRESS}" 24 | 25 | #SPDDATA=($(od -An -vtx1 ${INFILE} | tr -d '\n')) 26 | SPDDATA=($(cat ${INFILE} | tr -d '\n')) 27 | 28 | SPDDATALEN=${#SPDDATA[@]} 29 | 30 | if [ ${SPDDATALEN} != 256 ]; then 31 | echo "Invalid SPD data length (${SPDDATALEN}), should be 256" 32 | exit 1 33 | fi 34 | 35 | for DATAADDR in {0..255} 36 | do 37 | echo -en "\rWriting: ${DATAADDR}/255 (${SPDDATA[${DATAADDR}]})" 38 | 39 | echo -en " WARNING open this script, comment the sleep line and uncomment the i2cset line at your own risk! (No changes have been made)" 40 | sleep 0.02 41 | #$(i2cset -y ${BUS} ${ADDRESS} ${DATAADDR} ${SPDDATA[${DATAADDR}]}) 42 | 43 | if [ $? -ne 0 ]; then 44 | echo "" 45 | echo "Error" 46 | echo "" 47 | exit 1 48 | fi 49 | done 50 | 51 | echo "" 52 | echo "Done" 53 | -------------------------------------------------------------------------------- /tools/README.md: -------------------------------------------------------------------------------- 1 | # Windows programs for reading and writing SPD data 2 | 3 | ## SPD.zip 4 | This is [EVGAs SPD tool](http://www.evga.com/articles/00466/). 5 | 6 | It can read SPD on my system (ASRock P67 EXTREME4), but not write. 7 | 8 | This tool doesn't actually write to the RAM SPD; it instead writes to a separate ROM on the motherboard which is only available on EVGA X58 Classified boards. 9 | 10 | ## SPDTool_063.zip 11 | SPDTool 0.63 12 | 13 | Old, moans about incompatible SMBus driver. Can't read or write. 14 | -------------------------------------------------------------------------------- /tools/SPD.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZakKemble/RAMSPDMod/a07a1c94dd2ddb656307a8742a059cae2db9f7c4/tools/SPD.zip -------------------------------------------------------------------------------- /tools/SPDTool_063.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZakKemble/RAMSPDMod/a07a1c94dd2ddb656307a8742a059cae2db9f7c4/tools/SPDTool_063.zip --------------------------------------------------------------------------------