DDR Init

Всем привет!

Пост больше для истории, проблема была решена.

Мы используем один DDR контроллер, на котором установлено две микросхемы памяти MT41K512M16VRP-107 по 1ГБ. Но система видит только 1ГБ. Есть ли какие-то ограничения у контроллера DDR на объем памяти? Если нет, то хотелось бы рекомендаций для изменения инициализации контроллера DDR в загрузчике u-boot.

Ответ ЭЛВИСа был следующем: контроллеры DDR не поддерживают объем больше 1.5GB (это на 100% правда), поправьте секцию memory в dtsi (это не работает).

Правка секции dtsi не работает, ни u-boot, ни kernel. А что же работает?

В нашей плате мы используем только DDR#0. Плата сделана на базе салютов ПМ и ОМ.

Для того чтобы увидеть в u-boot и Linux объем 1.5GB (2GB вы не увидите можете не пытаться, все повиснет) требуется следующее:

  1. Исправить в файле mcom02-defconfig-src-linux-5-4/u-boot/elvees/common/board.c две строчки:

заменяем

gd->bd->bi_dram[0].size = PHYS_SDRAM_0_SIZE;

на

gd->bd->bi_dram[0].size = 0x60000000;//PHYS_SDRAM_0_SIZE;

заменяем

gd->ram_size = PHYS_SDRAM_0_SIZE;

на

gd->ram_size = 0x60000000;//PHYS_SDRAM_0_SIZE;

  1. В mcom02-defconfig-src-linux-5-4/u-boot/board/elvees/salute-pm/salute-pm.c делаем правку, а именно заменяем cfg->common.rows = 32768; на cfg->common.rows = 65536;//32768;

Компилируем u-boot, заливаем на флэшку и видим 1.5GB. Хотелось бы все два, но дареному коню насильно мил не будешь.

После этого у нас ушли еще две проблемы, стал корректно в Linux инициализироваться Ethernet и USB в части DMA.

Возможно есть более изящное решение, но нам не до него.)

Всем, спасибо!

Добрый день.

Да, захардкодить можно, и это сработает, но это действительно не очень изящное решение.

Какой .dtsi вы правили и какой образ по итогу прошивали?

Размер памяти DDR на ЭЛ24ПМ определяется тут, где первое значение (0x40000000, 0xa0000000) это base address контроллера, а второе (0x40000000) размер.

Да, именно этот файл dtsi правил. Про base address я все понимаю. Все менял, все правил. Размер не применялся, мало того, доступно было даже не 1ГБ, а около 850М. Пришлось хардкорить. Прошивал собранный руками образ u-boot.mcom, в рамках mcom02-defconfig-src.linux54.tar.gz. Перед этим возился с драйвером mtd, и вот он из dts данные читает правильно.

Вы прошивали образ mcom02-salute-el24pm1-r1.1-1.2-om1-r1.1-1.2-uboot.img из папки uboot-images?

Что имеете ввиду под “собранный руками”?

“руками“ - собранный из исходников. Нет из uboot-images ничего не прошивал. Никаких инструкций же нигде нет, точно также как и информации об ограничении в 1.5ГБ на один контроллер DDR.

Сборка u-boot выполняется командой

./docker-build.sh make -f Makefile.u-boot

Собранные образы будут находиться в папке uboot-images. прошивать нужно их.

Про ограничение в 1.5Гбайт описано в мануале на микросхему (пункт 2.1)

Я не использую докер. Для меня это не удобно. Компилировал непосредственно в каталоге u-boot.

Без докера команда аналогичная

make -f Makefile.u-boot

А если мне нужен make menuconfig или добавить свой defconfig и не один? Можно, конечно, повозиться с вашим Makefile.u-boot. Можно. Но зачем? :laughing: