Project

General

Profile

Feature #1233

Updated by Izerg over 4 years ago

 
 h3. *DDR DIMM SPD адаптер для Raspberry Pi* 

 Сегодня практически каждый модуль DDR памяти имеет в совоем составе небольшую I2C EEPROM память для храненияинформации о производителе, спецификации, конфигурации модуля. Наличие конфигурационной информации позволяет компьютеру определять тип памяти,настраивать интерфейс памяти на корректные значения скорости и напряжения в соответствии со спецификацией модуля памяти. Такой механизм работы основан на стандарте -JEDEC "Serial presence detection specification (SPD)"- (+Доступен для загрузки+). 
 Когда нужно изменить информацию SPD используют программные утилиты для модификаций параметров памяти в составе системы. Данные утилиты очень редко дступны разработчику для использования. 

 Для решения данной проблеммы поставим задачу разработать автономный программатор для чтения/записи SPD. 
 В качестве базовой платформы выбираем Raspberry Pi. Применение данный процессорного модуля - один из сотни возможных путей решения задачи. Причины выбора модуля: широко распространенная Linux платформа, легкая в    освоении и настройке, позволяющая инженерам реализовывать новые возможности встраиваемых ARM платформ. 

 Дополнительное требование к работе программатора: изменения в SPD должны производится таким образом, что бы ислючить повреждение модуля механически или в результате пайки. Для удовлетворения этого требования необходимо применить разъем DIMM. Такой подход позволяет быстрое подключение к SPD без риска повреждения и без паяного неразрывного соединения.  

 h2. +*Основные требования к проекту*+ 

 * Open-source проект, под управлением [[dev.xdevs.com]] и *_mercurial_* DVCS 
 * Полноразмерные DDR3/DDR4 UDIMM/RDIMM разъемы совместимые со стандартными модулями памяти 
 * Стандартный разъем для подключения к Raspberry Pi 
 * I2C EEPROM интерфейс подключен к соответствующему порту Raspberry Pi 
 * напряжение питания SPD +3.3V 
 * переключатель питания модулей памяти для замены без отключения питания Raspberry Pi 
 * переключатель выбора адреса I2C для подключения нескольких адаптеров к одной Raspberry Pi 
 * MCU    -(LPC11U37FBD64)- в составе адаптера для реализации дополнительных функций, автономного программирования без Raspberry Pi (используется для автоматизации процессов) 

 Структура проекта 
 Все проектные файлы а так же сопутствующая документация отслеживается Распределенной Системой Контроля Версий Mercurial DVCS. +Это бесплатная и хорошо поддерживаяемая система контроля версий с поддержкой синтаксиса, аналогично GIT и SVN.+ (_примечание: определение    перенести в нижнюю часть статьи, в качестве справочного уточнения_) 
 Для работы с проектом вы можете получить дерево проекта, выполнив команду:  
 <span>hg clone http://dev.xdevs.com/hg/ddr4s <span> 
 акже можно просмотреть отдельные фалы в дереве проекта [browse project tree here[https://dev.xdevs.com/projects/rpi/repository]]. 

 Разработка аппаратной части 
 Потратив несколько часов получаем схему адаптера:  
 !http://doc.xdevs.com/doc/xDevs.com/DDR4s/img/schematic.png! ([Доступен PDF формат[https://dev.xdevs.com/projects/rpi/repository/entry/sch/DDR4S.pdf]]). 
 Аснова адаптера - простой дизайн с нбольшим количеством компонентов. Часть MCU не является обязательным, не требуется для работы с RPI. 
 Рисунок печатной платы делался для 4-х слоев, материал FR4. Внутренние слои предназначены для сигналов GND и питания. Для простоты сборки шелкография компонентов наносится с обеих сторон платы. Большая часть компонентов - для CMD монтажа, исключение: разъемы, переключатели, конденсаторы. Гербер файлы доступны для загрузки. (_+ссылка на гербер внизу статьи+_) 
 Внешний вид стека платы:  
 !http://doc.xdevs.com/doc/xDevs.com/DDR4s/img/small/stackup.jpg! 
 Для отдельных приложений DIY сборка платы может быть упрощена. 
 !http://dev.xdevs.com/projects/rpi/repository/entry/doc/simple.png! 
 На схеме показаны pull-up резисторы подтяжки I2C к питанию RPI, а также переключатель питания со светод 
 Внешний вид платы адаптера (ручная сборка): 
 !http://doc.xdevs.com/doc/xDevs.com/DDR4s/img/small/top.jpg! 
 Список компонентов:  
 * Выключатель питания SW4 (двухпозиционный) 
 * I2C pull-up резисторы    R10,R9 (2.2kOhm, 0603 5%) 
 * вспомогательный резистор R7 (0-10 ohm, 0603 5%) 
 * конденсаторы развязки C3,C2 (0.1uF 0603 X7R) 
 * Конденсатор фильтра питания C4 (100-560 uF 6.3-16V 7 mm диаметр, шаг выводов 4 mm) 
 * 2.54mm 26-контактный разъем для RPI порта расширения P1. 
 * разъем DDR3 240-pin DIMM 
 * разъем DDR4 288-pin DIMM (при необходимости) 
 Все компоненты расположены на верхней строне платы. 
 На нижней стороне платы расположены декоративные светодиоды 0603. 
 !http://doc.xdevs.com/doc/xDevs.com/DDR4s/img/small/back.jpg! 
 Питание, I2C, SPI и UART подключены к 26 контактному разъему. подключение к порту расширения Rasberry Pi производится с помощью плоского кабеля. 
 !http://doc.xdevs.com/doc/xDevs.com/DDR4s/img/small/header.jpg! 
 Для подключения нескольких адаптеров необходимо установить адрес с помощью двухпозиционного    переключателя с индикацией светодиодами. Такая настройка типична для линий A0, A1, A2 выводов I2C EEPROM. 
 !http://doc.xdevs.com/doc/xDevs.com/DDR4s/img/small/addr.jpg! 
 Микроконтроллер NXP LPC11U37FBD64 оснащен интерфейсом SWD для записи и отладки программного обеспечения. Для работы интерфейсов UART и USB микроконтроллера необходим кварцевый резонатор 12.000 МГц. 
 !http://doc.xdevs.com/doc/xDevs.com/DDR4s/img/small/mcu.jpg! 
 Внешний вид комплетка для работы адаптера:  
 !http://doc.xdevs.com/doc/xDevs.com/DDR4s/img/small/kit.jpg! 
 * Модуль памяти DDR3 Corsair UDIMM 
 * DDR плата адаптера 
 * Raspberry Pi Модель B с 2GB SD card и 26-контактным 2.54 mm кабелем 
 Подключение DDR3 модуля памяти к адаптеру:  
 !http://doc.xdevs.com/doc/xDevs.com/DDR4s/img/small/ddr3_prog.jpg! 
 Подключение DDR4 модуля памяти к адаптеру: 
 !http://doc.xdevs.com/doc/xDevs.com/DDR4s/img/small/ddr4_prog.jpg! 
 Одновременное подключение обоих типов модулей памяти не рекомендуется, из-за конфликта адресации I2C шины. 

 Software design h1. *Software design* 
 Рассмотрим пошаговую инструкцию настройки Raspberry Pi для использование в данном проекте. 
 За основу возмем минимальный образ ОС, для обмена двнными с платой будем использовать сетевое подключение с поддержекой ssh. 
 Образ ОС может быть получен с http://www.linuxsystems.it/raspbian-wheezy-armhf-raspberry-pi-minimal-image/ [[http://www.linuxsystems.it/raspbian-wheezy-armhf-raspberry-pi-minimal-image/]] или    с зеркала http://dev.xdevs.com/projects/rpi/repository/entry/os/raspbian_wheezy_20130923.img.7z    [local mirror[http://dev.xdevs.com/projects/rpi/repository/entry/os/raspbian_wheezy_20130923.img.7z]]. 
 Объем образа 120MB, Для записи на SD card можно использовать например: "Win32 Disk imager" от gruemaster, tuxinator2009 или любым аналогичным ПО для записи образа на носитель. 
 Пароль root - "raspberry". 


 Настройка 

 h1. *Настройка программного обеспечения обеспечения* 
 Для подключения к RPi    по сети необходимо правильно настроить сетевой интерфейс (eth0). В случае, если длкальная сеть использует DHCP достаточно добавить строку конфигурации в    /etc/network/interfaces 
 <pre> iface eth0 inet dhcp </pre> 
 Если размер SD card    более 1GB можкт понадобится дополнительная разметка дискового пространства:  
 Создаем новые разделы используя fdisk, таблица разделов может выглядет следующим образом: 
 <pre> 
 root@raspberry-pi:/# fdisk /dev/mmcblk0 
 Command (m for help): p 
 Disk /dev/mmcblk0: 32.1 GB, 32127320064 bytes 
 ... 
         Device Boot        Start           End        Blocks     Id    System 
 /dev/mmcblk0p1              2048        104447         51200      b    W95 FAT32 
 /dev/mmcblk0p2            104448       1742847        819200     83    Linux 
 /dev/mmcblk0p3           1742848       1945599        101376     82    Linux swap / Solaris 
 /dev/mmcblk0p4           1945600      62748671      30401536     83    Linux 
 </pre> 

 Для нового раздела задаем тип файловой системы ext4. 
 <pre> 
 root@raspberry-pi:/# mkfs.ext4 /dev/mmcblk0p4 -L ummspi2 
 mke2fs 1.42.5 (29-Jul-2012) 
 Filesystem label=ummspi2 
 OS type: Linux 
 Block size=4096 (log=2) 
 Fragment size=4096 (log=2) 
 .... 
 .... 
 Creating journal (32768 blocks): done 
 Writing superblocks and filesystem accounting information: done 
 </pre> 
 Убедимся, что изменения внесены в /etc/fstab: 
 <pre> 
 root@raspberry-pi:/# cat /etc/fstab 
 # <file system> <mount point>     <type>            <options>                 <dump>    <pass> 
 proc              /proc             proc              defaults                  0         0 
 /dev/mmcblk0p1    /boot             vfat              defaults                  0         0 
 /dev/mmcblk0p3    none              swap              sw                        0         0 
 */dev/mmcblk0p4    /repo             ext4              defaults                  0         0* 
 root@raspberry-pi:/# 
 </pre> 
 Теперь у нас есть раздел /repo тип файлово системы ext4. 
 Монтируем его для использования. 
 <pre> 
 root@raspberry-pi:/# mount -a 
 </pre> 
 Диск готов к использованию. 
 <pre> 
 root@raspberry-pi:/# df -h 
 Filesystem        Size    Used Avail Use% Mounted on 
 rootfs            788M    566M    222M    72% / 
 /dev/root         788M    566M    222M    72% / 
 devtmpfs          212M       0    212M     0% /dev 
 tmpfs              44M    180K     44M     1% /run 
 tmpfs             5.0M       0    5.0M     0% /run/lock 
 tmpfs             108M       0    108M     0% /run/shm 
 /dev/mmcblk0p1     50M     19M     32M    37% /boot 
 */dev/mmcblk0p4     29G    172M     27G     1% /repo* 
 </pre> 
 Хорошим правилом считается - обновление основных пакетов ОС перед установкой нового ПО. Убедитесь в наличии достаточного количества дискогового пространства для данных обновлений.  
 <pre> 
 root@raspberry-pi:~# aptitude update 
 Get: 1 http://archive.raspbian.org wheezy Release.gpg [490 B] 
 Get: 2 http://archive.raspbian.org wheezy Release [14.4 kB] 
 Get: 3 http://archive.raspbian.org wheezy/main Sources [6262 kB] 
 70% [3 Sources 4375 kB/6262 kB 70%].....79.8 kB/s 23s 
 ... 
 Current status: 33 updates [+33], 77 new [+77]. 
 </pre> 
 Запускаем процесс обновления. Ниже предствален пример. 
 <pre> 
 root@raspberry-pi:~# aptitude dist-upgrade 
 The following packages will be upgraded: 
   apt apt-utils base-files dmsetup dpkg gnupg gpgv initscripts libapt-inst1.5 libapt-pkg-dev libapt-pkg4.12 libc-bin libc-dev-bin libc6 libc6-dev libdevmapper1.02.1 libgnutls26 
   libssl1.0.0 linux-libc-dev locales lsb-base multiarch-support openssh-client openssh-server perl perl-base perl-modules ssh sysv-rc sysvinit sysvinit-utils tzdata wget 
 The following packages are RECOMMENDED but will NOT be installed: 
   bcc gcc gcc-4.4 gcc-4.5 gcc-4.6 gcc-4.7 gnupg-curl libldap-2.4-2 manpages-dev psmisc 
 33 packages upgraded, 0 newly installed, 0 to remove and 0 not upgraded. 
 Need to get 35.5 MB of archives. After unpacking 234 kB will be freed. 
 Do you want to continue? [Y/n/?] Y 
 ... 
 ... 
 Setting up ssh (1:6.0p1-4+deb7u1) ... 
 Setting up perl (5.14.2-21+rpi2+deb7u1) ... 
 Current status: 0 updates [-33]. 
 </pre> 
 Автор статьи    предпочитает использовать в качестве системного редактора mcedit. Производим замену редактора поумолчанию nano на mcedit:  
 <pre> 
 root@raspberry-pi:/etc/mercurial# update-alternatives —config editor 
 There are 3 choices for the alternative editor (providing /usr/bin/editor). 
   Selection      Path                 Priority     Status 
   0              /bin/nano             40          auto mode 
   1              /bin/nano             40          manual mode 
   2              /usr/bin/mcedit       25          manual mode 
   3              /usr/bin/vim.tiny     10          manual mode 
 Press enter to keep the current choice[*], or type selection number: 2 
 update-alternatives: using /usr/bin/mcedit to provide /usr/bin/editor (editor) in manual mode 
 </pre> 
 Основные данные проекта хранятся в локальном репозитории. Для доступа к ним - установим Mercurial: 
 <pre> 
 apt-get install mercurial 
 root@raspberry-pi:~# apt-get install mercurial 
 Reading package lists... Done 
 Building dependency tree 
 Reading state information... Done 
 The following extra packages will be installed: 
   ca-certificates mercurial-common openssl python python-minimal 
 Suggested packages: 
   qct wish vim emacs kdiff3 kdiff3-qt kompare meld xxdiff tkcvs mgdiff python-mysqldb python-pygments python-openssl python-doc python-tk 
 The following NEW packages will be installed: 
   ca-certificates mercurial mercurial-common openssl python python-minimal 
 0 upgraded, 6 newly installed, 0 to remove and 0 not upgraded. 
 Need to get 3514 kB of archives. 
 After this operation, 10.3 MB of additional disk space will be used. 
 Do you want to continue [Y/n]? Y 
 Get:1 http://archive.raspbian.org/raspbian/ wheezy/main python-minimal all 2.7.3-4+deb7u1 [42.8 kB] 
 ... 
 ... 
 Creating config file /etc/mercurial/hgrc.d/hgext.rc with new version 
 Processing triggers for ca-certificates ... 
 Updating certificates in /etc/ssl/certs... 158 added, 0 removed; done. 
 Running hooks in /etc/ca-certificates/update.d....done. 
 </pre> 
 [Краткая статья по использованю Murcurial[https://xdevs.com/hg-intro/]], [официальная документация[http://mercurial.selenic.com/guide]]. //снести вниз статьи, в справочные материалы 

 Настраиваем доступ к аппаратному интерфейсу    I2C 
 Изменения в /etc/modules 
 <pre> 
 i2c-bcm2708  
 i2c-dev 
 </pre> 
 Если используется ядро Linux 3.18 или более новое, то в /boot/config.txt необходимо добавить параметры. 
 <pre> 
 dtparam=i2c_arm=on 
 dtparam=i2c1=on 
 dtparam=i2c0=on 
 dtparam=spi=on 
 </pre> 
 <pre> 
 2. sudo apt-get install python-smbus 

 root@raspberry-pi:~# apt-get install python-smbus 
 Reading package lists... Done 
 Building dependency tree 
 Reading state information... Done 
 The following extra packages will be installed: 
   i2c-tools 
 Suggested packages: 
   libi2c-dev 
 The following NEW packages will be installed: 
   i2c-tools python-smbus 
 0 upgraded, 2 newly installed, 0 to remove and 32 not upgraded. 
 Need to get 71.0 kB of archives. 
 After this operation, 317 kB of additional disk space will be used. 
 Do you want to continue [Y/n]? Y 
 Get:1 http://archive.raspbian.org/raspbian/ wheezy/main i2c-tools armhf 3.1.0-2 [59.5 kB] 
 Get:2 http://archive.raspbian.org/raspbian/ wheezy/main python-smbus armhf 3.1.0-2 [11.5 kB] 
 Fetched 71.0 kB in 1s (36.0 kB/s) 
 Selecting previously unselected package i2c-tools. 
 (Reading database ... 22286 files and directories currently installed.) 
 Unpacking i2c-tools (from .../i2c-tools_3.1.0-2_armhf.deb) ... 
 Selecting previously unselected package python-smbus. 
 Unpacking python-smbus (from .../python-smbus_3.1.0-2_armhf.deb) ... 
 Processing triggers for man-db ... 
 Setting up i2c-tools (3.1.0-2) ... 
 Setting up python-smbus (3.1.0-2) ... 

 3. sudo apt-get install i2c-tools 

 root@raspberry-pi:~# apt-get install i2c-tools 
 Reading package lists... Done 
 Building dependency tree 
 Reading state information... Done 
 i2c-tools is already the newest version. 
 i2c-tools set to manually installed. 
 0 upgraded, 0 newly installed, 0 to remove and 32 not upgraded. 
 </pre> 

 Теперь мы можем подключить адаптер и и проверить работу интерфейса I2C  
 <pre> 
 i2cdetect -y 1 
 </pre> 

 Если модули памяти не установлены, то устройства на шине не будут обнаружены:  
 <pre> 
 root@raspberry-pi:~# i2cdetect -y 1 
      0    1    2    3    4    5    6    7    8    9    a    b    c    d    e    f 
 00:            -- -- -- -- -- -- -- -- -- -- -- -- -- 
 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
 70: -- -- -- -- -- -- -- -- 
 </pre> 
 5. Минимальный образ linux может не иметь установленный компилятор gcc, установим компилятор перед началом использования кода программ. 
 <pre> 
 apt-get install gcc 
 apt-get install make  
 </pre> 

 В случае ошибки вида:  
 <pre> 
 sudo: unable to resolve host raspberry-pi 
 </pre> 
 Добавим строку /etc/hosts 
 <pre> 
 127.0.0.1 raspberry-pi 
 </pre> 
 Если библиотека    wiringPi library не установлена - ее необходимо установить:  

 <pre> 

 root@raspberry-pi:/rpdb/ddr4s/fw/wiringPi# ./build 
 wiringPi Build script 
 ================= 
 WiringPi Library 
 [UnInstall] 
 [Compile] wiringPi.c 
 [Compile] wiringSerial.c 
 [Compile] wiringShift.c 
 ... 
 [Compile] wiringPiSPI.c 
 [Compile] wiringPiI2C.c 
 ... 
 [Compile] drcSerial.c 
 [Link (Dynamic)] 
 [Install Headers] 
 [Install Dynamic Lib] 
 WiringPi Devices Library 
 [UnInstall] 
 [Compile] ds1302.c 
 [Compile] maxdetect.c 
 [Compile] piNes.c 
 [Compile] gertboard.c 
 [Compile] piFace.c 
 [Compile] lcd128x64.c 
 [Compile] lcd.c 
 [Compile] piGlow.c 
 [Link (Dynamic)] 
 [Install Headers] 
 [Install Dynamic Lib] 
 GPIO Utility 
 [Compile] gpio.c 
 gpio.c:85:12: warning: 'decodePin' defined but not used [-Wunused-function] 
 [Compile] extensions.c 
 [Compile] readall.c 
 [Link] 
 [Install] 
 All Done. 
 NOTE: This is wiringPi v2, and if you need to use the lcd, Piface, 
   Gertboard, MaxDetext, etc. routines then you must change your 
   compile scripts to add -lwiringPiDev 

 </pre> 

 7. Проверяем работу программ. Raspberry Pi подключена к терминалу Putty: 
 !http://doc.xdevs.com/doc/xDevs.com/DDR4s/img/small/soft.jpg!  

 8. Использование программ:  
 * /comp.sh* – скрипт запуска gcc компилятора с spd_prog_both.c для получения spd_prog main app executable (*nix) 
 * /check.sh* – скрипт запуска gcc компилятора с checksum.c для получения checksum tool executable (*nix) 
 * /spd_prog* – запуск приложения для чтения / записи DDR3/DDR4 SPD. Приложение работает только с бинарными файлами. 
 * /checksum* – запуск утилиты застчета контрольной суммы и проверки CRC16 полей в бинарногм файле DDR3/DDR4. Утилита запускается с параметром    -f [filename] 

 9. Пример расчета контрольной суммы: 
 DDR3 дамп пример: 
 <pre> 
 $:/repo/ddr4s/fw/Pi$ ./checksum -f ddr3.bin  
 /********************** xDevs.com DDR4s Project ************************/ 
  DDR3/DDR4 dump checksum check tool | calculates CRC16 for input binary   
  Usage: checksum -f [dump_filename]  
 /***********************************************************************/ 
 File DDR3 CRC16 = 600E | byte 126 = E | byte 127 = 60  
 Calculated DDR3 CRC16 = 600E | byte 126 = E | byte 127 = 60  
 CRC in dump is correct 
 </pre> 

 DDR4 дамп пример: 
 <pre> 
 $:/repo/ddr4s/fw/Pi$ ./checksum -f ddr4.bin  
 /********************** xDevs.com DDR4s Project ************************/ 
  DDR3/DDR4 dump checksum check tool | calculates CRC16 for input binary   
  Usage: checksum -f [dump_filename]  
 /***********************************************************************/ 
 -i- DDR4 mode enabled, 512 bytes parsed  
 File DDR4 CRC16 = E752 | byte 126 = 52 | byte 127 = E7  
 File vendor section DDR4 CRC16 = 0 | byte 382 = 0 | byte 383 = 0  
 Calculated DDR4 CRC16 = E752 | byte 126 = 52 | byte 127 = E7  
 CRC in dump is correct 
 tin@tin-lap:/repo/ddr4s/fw/Pi$  
 </pre> 


 Справочная литература: 

 JEDEC Standard No. 21C : Serial Presence Detect (SPD), General Standard 
 JEDEC Registration – DDR4 DIMM PTH 288 Pin Socket Outline, 0.85 mm Pitch. SKT 
 JEDEC 288 PIN DDR4 DIMM, 0.85 mm PITCH 
 JEDEC Definitions of the EE1004-v 4 Kbit Serial Presence Detect (SPD) EEPROM and TSE2004av 4 Kbit SPD EEPROM with Temperature Sensor (TS) for Memory Module Applications 
 JEDEC DDR4 UDIMM Design Specification Annex D 
 JEDEC Proposed Annex for DDR4 UDIMM, R/C B 
 JEDEC Standard No. 21C : Annex L: Serial Presence Detect (SPD) for DDR4 SDRAM Modules 
 JEDEC Standard No. 21C : Serial Presence Detect (SPD) for DDR3 SDRAM Modules DDR3 SPD Document Release 6 
 JEDEC Standard No. 21C : Memory Module Nomenclature 
 JEDEC Standard No. 21C : Definition of the TSE2002av Serial Presence Detect (SPD) EEPROM with Temperature Sensor (TS) for Memory Module Applications 
 Guide revision: 

 Rev 10, Initial release to public, added low-cost option schematics 
 Rev 11, Added extra settings for Kernel 3.18+ to enable I2C operation 








 




Back