Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: s3c2416 начальная загрузка
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Страницы: 1, 2
Dron_Gus
День добрый.

Не работал ли кто-нибудь плотно с s3c2416/не располагает ли кто-нибудь подробной докой на начальный загрузчик? Или может даже исходниками? Есть скудная дока iROM.pdf, после чтения которой возникает больше вопросов. Не понятно, как и где должен располагаться загрузчик, чтобы встроенное ПО могло загрузить его с sd/mmc карты.

Добиться документации от самого Самсунга пока не удается. sad.gif
igorsk
Насколько я понял, он просто тупо копирует первых 8KB в 0x40000000 и туда переходит.
Dron_Gus
Вы про nand или про SD? И сигнатуры/crc никакой не требуется?

Как быть с SD картами? Там просто так не "отгрызть" 8 Кб там же ФС.
igorsk
Под линуксом можно тупо dd. Под виндой сложнее, но можно попробовать что-нибудь типа WinHex.
Dron_Gus
Спасибо. Придут платы, буду пробовать.
igorsk
Беру свои слова обратно. Ковырялся сегодня в гугле, наткнулся на новую инфу.
S3C2450 IROM Application Note
В ней есть красивые диаграммки где должен располагаться загрузчик. Т.к. 2450 и 2416 это почти одно и то же, должно сработать.

Ещё нашёлся код под винды для копирования бутлоадера на карточку. Конкретно этот вроде 6340, но можно адаптировать, поменяв пару дефайнов.
Dron_Gus
Спасибо. Пока до загрузки с sd далеко. Не хочет u-boot работать. Пока гружу через USB.
Dron_Gus
Документация у Самсунг - ОТСТОЙ. Так ее еще и нормальным путем (через сайт) не получить. И информации в ней 0.

З.Ы. уже и u-boot заработал и ядро. А как работает iROM до сих пор непонятно. Сижу расковыриваю дамп дизасемблером. ИДИОТИЗМ.
igorsk
Диаграммка не помогла?
Dron_Gus
По диаграмме не понятно что за сигнатура и какова ее структура. Да и в итоге надо научиться грузится с NAND. Нашел готовые бинарники, у них какой-то заголовок, но как его разобрать и сгенерировать подобный для своей прошивки непонятно.
igorsk
Я так понимаю что сигнатура нужна при секурной загрузке, когда в проц прошит ключ. Если это дело не включено, то по идее должно грузить без сигнатуры.
Dron_Gus
Ну хоть CRC то должна проверяться? Тем более в ап ноте есть соответствующий пункт "проверка целосности загрузчика". А вот как это происходит - загадка.
Dron_Gus
В общем разобрались. "Хитро" хранится ECC. После каждых 512 байт данных идет 13 байт ECC. Даже если NAND c 1, 2 или 4 Кб страницей. Т.е. все в кучу. Более подробно - в исходниках u-boot'а.
alexf
Я тоже начал борьбу с 2416. Конкретно модуль от "Boardcon". В основную плату втыкается модуль 2440. С ним вопросов нет - все путем.
А якобы в эту же плату можно вставить модуль на 2416. И тут проблема с загрузкой.

С фабрики в NAND есть и u-boot, и Linux. И это работает. А вот как поменять kernel пока не придумал.
С платой пришла прилада uboot-writer.exe которая записывает uboot, zImage и образ файловой системы на MMC карточку. Проверил - записано в конце и 2 сектора пустые. Но не работает. Точнее на терминал пишется ОК но он врет - ничего не ОК и больше ничего не происходит. Если не вставлять ММЦ или вставить пустую, то и ОК не напишет. Один самый первый раз u-boot сработал с MMC, но больше ни разу.

Такие вот проблемы. А теперь вопросы:
как запускать через USB?
можно ли под Linux переписать kernel? Я могу читать с форматированной MMC карты и наверное смогу сделать dd if=/mnt/sd/zImage of=/dev/mtdblock1
Но страшно, поскольку если не сработает то не знаю как его запускать.

U-boot MMC не читает. Команда mmcinit его подвешивает навсегда sad.gif
Dron_Gus
Если есть j-tag, то я не боялся бы ничего угробить. Тем более если хотите обновить только ядро. В крайнем случае будете долго и нудно лить образ по x-modem'у в убут.
alexf
Цитата(Dron_Gus @ Feb 9 2011, 08:21) *
В крайнем случае будете долго и нудно лить образ по x-modem'у в убут.


JTAG то есть. Целая коллекция. В том числе кабель на пар порт от этой платы. Но еще не подключал: для 2440 было не надо.
А вот xmodem (вернее Ymodem) - идея неплохая. 3 минуты можно потерпеть. Но все же Вы писали что загружали через USB. Как?
В моем убуте есть команда "dnw" которая должна включать USB, но не похоже чтобы работала...
И неужели никто не научился писать MMC чтобы загружались? Я даже подозреваю что из за другой главной платы какие то конигурационные ножки не туда подключены. Только какие?
Dron_Gus
В у-буте вроде есть функция загрузки. Не пробовал.
Я грузил через жтаг во внутреннюю память програмку, она уже принимала файло по USB через DNW. Програмка на базе SMDK2450_2416_2451_TEST.zip.
Пины для конфигурации типа загрузки: GPC[5:7] и OM[4:0], смотрите Table 1-5. S3C2416X Operation Mode Description в User Manual'е.
Флешку должна уметь писать программа IROM_Fusing_Tool.exe . Я не пробовал толком. Но предстоит.
alexf
Цитата(Dron_Gus @ Feb 10 2011, 00:58) *
Я грузил через жтаг во внутреннюю память програмку, она уже принимала файло по USB через DNW. Програмка на базе SMDK2450_2416_2451_TEST.zip.


Попробовал через ymodem и все состоялось - свой kernel загрузил. С сожалению под линуксом NAND не пишется. dd ругается. Видимо первые два раздела определены только на чтение. А где раздобыть SMDK2450_2416_2451_TEST.zip? Может поделитесь?

Перечисленные конфигурационные ножки вроде в порядке. Стоят на все резисторы на модуле, так что не понятно каким образом у меня ровно один раз сработало...

Дополнение:
Нашел 114453SMDK2450_2416_2451_TEST.zip Но если не жалко поделиться работающей приладой, буду признателен.

Дополнение 2:
нашел программу moviNAND_Fusing_Tool-512K-boot.exe и KIT2416-uboots-zImage.rar
здесь:
http://openembed.org/wiki/KIT2416-Linux_Porting

Тот же результат sad.gif
Dron_Gus
Киньте мне письмо на dron_gus(at)mail.ru

Если у Вас все эти ноги притянуты резисторами, то надо перепаивать. sm.gif Я поставил кнопку и перетягивал пины GPC5 и GPC7 (кажется) 100-Омными резисторами.

А утилита по вашей ссылке несколько сложнее, чем та, что у меня. sm.gif
alexf
Послал.

Цитата(Dron_Gus @ Feb 10 2011, 02:58) *
А утилита по вашей ссылке несколько сложнее, чем та, что у меня. sm.gif


она записывает не только u-boot но еще и ядро и образ диска по физическим секторам на MMC.
Еще бы 2416 это читал...
Dron_Gus
Цитата(alexf @ Feb 10 2011, 14:13) *
она записывает не только u-boot но еще и ядро и образ диска по физическим секторам на MMC.

Да. Только загркзчика, чтобы это все читать я не находил. А если писать свой, то можно к нему FAT прикрутить. Чтобы проще было.
alexf
Цитата(Dron_Gus @ Feb 10 2011, 03:36) *
Да. Только загркзчика, чтобы это все читать я не находил. А если писать свой, то можно к нему FAT прикрутить. Чтобы проще было.


Должен u-boot это читать. Инструкция такая:

1. Burn the u-boot.bin, zImage, rootfs.yaffs to the sd card with the uboot_write.exe tools. The method is the same as that i told you last time.
2. Copy qt-4.6-image-ok.tar.bz2 to Sd card.
3. Insert the SD card, and then boot into uboot command mode.
4. Run the follow command in uboot command:
nand scrub
nand erase
movi read 3800000# 40000 c0000000
nand write c0000000 0 40000

movi read kernel c0000000
nand write c0000000 40000 200000

movi read 3600000# 3C65040 c0000000
nand write.yaffs c0000000 400000 3C65040

set bootcmd "movi read kernel 0xc0200000;bootm 0xc0200000"
set bootargs "noinitrd console=ttySAC0,115200 root=/dev/mtdblock2 rootfstype=yaffs2 init=/linuxrc"
saveenv

5.reboot the board, and enter the linux system command mode.

От себя добавлю что делать nand scrub и nand erase до того как все гарантировано читается с MMC - прямой путь к форсированному изучению JTAG-а.
Dron_Gus
У-бут занимает от 100 Кб. А iROM грузит во внутреннюю память 8 Кб. Так что есть еще промежуточный загрузчик.
alexf
Цитата(Dron_Gus @ Feb 10 2011, 04:22) *
У-бут занимает от 100 Кб. А iROM грузит во внутреннюю память 8 Кб. Так что есть еще промежуточный загрузчик.

Я так понял что u-boot на MMC разбит на 2 части. 8К живет на последних секторах (кроме 2х совсем последних).
Она инициализирует память и должна загружать основную часть u-boot. Не исключено (надо смотреть исходники) что у меня именно эти 8К грузятся и пишут ОК, а остальное не работает.

Теперь еще вопрос. А как собственно через jtag грузить код? Если бы я пользовался KEIL или IAR тулзами то наверное там есть опция загрузки через jtag. У меня пока установлен H-JTAG который успешно видит процессор, но дальше нужна какая то прилада.
Существует программа sjf2410 которая пишет через jtag прямо в флеш. А как в память? Может OPEN OCR надо? Или что посоветуете?
Dron_Gus
Я OpenOCD + GDB пользую. Инициализируете внешнюю память и грузите прямо туда. Примеры смотрите, например, в инит-скриптах от mini2440.
alexf
Цитата(Dron_Gus @ Feb 11 2011, 01:42) *
Я OpenOCD + GDB пользую. Инициализируете внешнюю память и грузите прямо туда. Примеры смотрите, например, в инит-скриптах от mini2440.


И я к тому же пришел. С процессором говорю через OpenOCD. load_image тоже вроде работает. Расскажу если будет полный успех. Спасибо.
Dron_Gus
Ок. Буду ждать. Меня тоже интересует загрузка с SD. Правда для s3c6410, но суть та же.
alexf
JTAG - мощное оружие в руках пролетариата умственного труда. Удалось пока установить что u-boot таки загружается в память.
Обе части - сначала 8К которые инициализируют SDRAM и прочее а потом и остальное.
Оказалось что схема приложенная к модулю не правильная и тумблер который для 2440 переключал ОМ0 здесь честно включает iROM. Как уже писал с ММС загрузкой пишет ОК и все. Но JTAG говорит что при этом в основной памяти (0xc3e0xxxx) успешно сидит U-boot, только у меня ничего кроме ОК не пишет. Буду разбираться дальше.
Ваша утилита к сожалению как есть не работает а пересобрать ее на GCC оказалось большой головняк из за ассемблера. Зато нарыл совсем простой код "vboot" который собирается легко. Буду его запускать с ММС а там посмотрим.
Dron_Gus
Цитата(alexf @ Feb 13 2011, 02:01) *
Зато нарыл совсем простой код "vboot" который собирается легко. Буду его запускать с ММС а там посмотрим.

Это что-то специализированное? Не поделитесь?

Вчера тоже добился нормальной загрузки spl и u-boot на 6410. Грабли на которые я наступал: повторная инициализация памяти в основном у-буте (вызывало падение без отладчика, под отладчиков все было ок), повторная инициализация клоков, неправильный релокэйт (это появилось в последних у-бутах).

Кстати, прошивалка rom_flush_tool просит файл (.nb0) в формате .sre. Я посмотрел, у тех файлов, что шли с различными отладками,перед началом самого образа идет небольшой заголовок. Может в этом проблема?

З.Ы. то еще развлечение. sm.gif
alexf
>>Это что-то специализированное? Не поделитесь?

Охотно. Это простая как веник программа для загрузки Линукса не задавая вопросов. Тупо читает образ из NAND, инициализирует параметры и вперед. Я думаю не составит особого труда поменять чтение образа с NAND на SD. Прога собирается по простому GCC который мы знаем и любим sm.gif Бинарник 2К так что не надо даже грузить второй части в SDRAM.
План такой:

1. вместо загрузки ядра вставить примитивный "монитор" чтобы убедиться что загрузка работает.
2. добавить инициализацию SDRAM -почему то там нет. Сделано для какой то системы со статической памятью похоже.

Добавление: сделал. Работает. Т.е. кладу слегка поправленый vboot на SD карточку с помощью uboot_writer.exe и оно грузится
при холодном старте и инициализирует SDRAM и пишет на консоль.

Может будет полезно в окончательном варианте в качестве максимально быстрого загрузчика. А пока наверное наиболее продуктивно будет разобраться с jtag+gdb почему u-boot умирает.

А KIT6410 у меня тоже есть но еще руки не дошли. Сначала 2416. Может хватит пока скорости.

Нажмите для просмотра прикрепленного файла

Кстати поставил CrossWorks который собрал Ваш код, естественно, только в нем нет симулятора. Или его надо где то отдельно искать? Жаловался на отсуствие DLL в targets.

Из всем моей коллекции JTAG коробочек ни одну он не поддерживает. Заказал еще J-LINK до кучи...




>>то еще развлечение.
Ага. Особенно в выходной sm.gif
alexf
Dron_Gus: можно чуть подробнее что Вы обнаружили с повторной инициализацией?
У меня похоже от главного блока BL2 правильно загружается совсем маленький кусочек и проц застревает в коде в IROM который должен загружать все остальное. Uboot только задает параметры (похоже правильные) и вызывает встроенную функцию копирования из MMC/SD.
Dron_Gus
По поводу повторной инициализации: в у-буте используется один файл start.S и для SPL и для основного u-boot'а. И вызывает одну и ту же ф-ю lowlevel_init. А эта функция без разбора инициализирует все подряд. Для большей части повторная инициализация ничем страшным не грозит, но вот память похоже теряет/искажает содержимое при повторной инициализации, а т.к. основной u-boot исполняется из нее, то это приводит к печальным последствиям. Аналогично и с клоками/pll.

Из-под кросс-студии отлаживался с помошью j-link'а. (не могу окончательно переползти на линукс, нравится мне сборка-загрузка-отладка одной кнопкой, особенно на начальной стадии).

За код большое спасибо!

У меня к Вам тоже вопрос, что за uboot_writer.exe и откуда его берут?
alexf
Цитата(Dron_Gus @ Feb 15 2011, 00:37) *
По поводу повторной инициализации: в у-буте используется один файл start.S и для SPL и для основного u-boot'а. И вызывает одну и ту же ф-ю lowlevel_init.


Я заметил. У меня похоже другая проблема. Оказывается MMU не включается а почему то если смотреть на 0xc3е00000 то там то же что и в статической памяти на 0х40000000. Это меня и сбило с толку - вижу там "правильный" код, но только часть. А оказывается туда же отображается статическая память.
Китайцы вернулись с нового года и обещали прислать рабочии MMC карточки... А пока пытаюсь разобраться с MMU.

uboot_writer.exe это тот же moviNAND_Fusing_Tool-512K-boot.exe на который я давал ссылку. Так его назвали на CD от платы.
Могу скинуть на почту если надо.

Дополнение: MMU не включается поскольку должен включаться после конца копирования кода из SD а он не копируется ни байта.
А застрявает он в системной области IROM от которой сорса нет. Лениво разбираться.

Такой вопрос: а можно U-boot загрузить самим же Uboot через Y-modem? Или через JTAG? Наверное можно...
Dron_Gus
Скиньте, если не сложно. Все мои утилиты результата не дают.

А зачем Вам MMU в загрузчике? Только чтобы включить кэши?
alexf
Цитата(Dron_Gus @ Feb 15 2011, 02:02) *
Скиньте, если не сложно. Все мои утилиты результата не дают.

А зачем Вам MMU в загрузчике? Только чтобы включить кэши?


Послал. Мне MMU в загрузчике ни к чему. Я просто теперь только понял что ничего не грузилось а э думал что грузился кусок.

Залил U-boot своей сборки через JTAG и он работает! Больше я ничего не боюсь sm.gif

Процедура такая: записываем на SD карточку образ u-boot.bin (не для ММС), zImage и filesystem с их CD.
Инициализируем SDRAM например моей версией vboot , JTAGом грузим u-boot собраный MMC/SD и стартуем с 0x33e00000
Он сам берет с MMC все образы и прожигает в NAND. После этого u-boot стартует с NAND. Правда он и с самого начала это делал но я его случайно затер.
Dron_Gus
У меня сейчас задача автоматизировать прошивку устройств после сборки. Для этого надо научиться грузится с mmc. Вроде как с Вашим флешером SD получается правильным. Только теперь следующая проблема - при старте с SD скорость уарта в два раза меньше. Хотя из-под отладчика все стартует нормально.
bvvlab
Присоединяюсь к обсуждению, у меня схожая задача поставить линукс на китайскую плату с S3C2416, изначально установлена wince.
Скиньте мне тоже, пжалуйста, утилиту uboot_writer.exe , пробовал заливать с помощью moviNAND_Fusing_Tool-512K-boot.exe , в результате "OK" в терминалке.
У кого нибудь загрузился u-boot с sd/mmc?
Сейчас прикручиваю jtag, буду разбираться...
Dron_Gus
Куда слать? sm.gif
bvvlab
bvvlab на yandex.ru , не знал что мой ящик закрыт для других.
bvvlab
Результат тот же "OK" значит дело в бинарнике, брал от kit2416, будем разбираться...
Dron_Gus
А исходников этих бинарей ни у кого нет? Никак не могу разобраться с использованием "встроенной" в iROM функции чтения сектора с SD карты. Читается только нулевой сектор. Можно написать свое, но лень. sm.gif
alexf
Цитата(bvvlab @ Feb 15 2011, 10:59) *
Результат тот же "OK" значит дело в бинарнике, брал от kit2416, будем разбираться...


Так и у меня этот же ОК. На самом деле ничего магического в uboot_writer.exe нет. Она просто записывает uboot в последние сектора MMC карточки и остальные образы (ядро и filesystem) по другим физическим адресам (3600000, и т.д.).
Это нетрудно сделать например DD.

У меня судя по всему проблема в том что встроеный код в 2416 не хочет вообще читать с MMC после первых 8К.
Китайцы сказали что не все карточки работают и посоветовали Kingston 2 GB.

Надо попробовать но не очень верю что поможет. Может правда перетащить процедуру чтения с MMC из основной части uboot в первые 8К и пользоваться ей.
bvvlab
Я испытывал утилиту на разных трех 2 гиговых картах, SD ADATA, MicroSD Kingston и Transcend, результат тот же.
Вначале предположил что отличие от kit2416 в подключении памяти ddr, ведь проц поддерживает 2 банка( 2 пина чип селект).
Подкорректил исходники убута, вместо 0x30000000 перевел на 0x38000000, перекомпилил- результат тот же -"ОК".
Далее решил что дело скорее всего в сигнатуре BL1.
В документе 896554S3C2450_IROM_ApplicationNote_Rev003 есть flow chart что делает BL0 IROM'а, Verify integrity of BL1
Success? типа проверяет сигнатуру, независимо откуда бутится с nand или sd. И неясно отрубается как либо эта проверка или нет.
В комплекте с платой идет диск, там есть утилита заливки образа винды на sd, решил проверить делает ли она подпись в предпоследнем секторе,
но программа не запускается вообще ни на xp ни на убунте, так что проверить не могу.
Могу проверить через отладчик пишет ли туда moviNAND_Fusing_Tool-512K-boot, но думаю что нет.
В доке на иром еще написано, что если есть ошибки ECC или integrity то на линии GPC5 появятся импульсы, может ли кто это проверить?
Мне нужно проц поднять чтоб это проверить.
Dron_Gus
Цитата(alexf @ Feb 16 2011, 00:06) *
У меня судя по всему проблема в том что встроеный код в 2416 не хочет вообще читать с MMC после первых 8К.

У меня та же проблема. Пытаюсь выпилить драйвер из u-boot'а.

Цитата(bvvlab @ Feb 16 2011, 12:28) *
Подкорректил исходники убута, вместо 0x30000000 перевел на 0x38000000, перекомпилил- результат тот же -"ОК".
Далее решил что дело скорее всего в сигнатуре BL1.

Если есть "OK" значит iROM грузит 8 Кб (BL1) с карты и передает туда управление. На этом все функции iROM заканчиваются. Значит надо разбираться с дальнейшими этапами загрузки.
alexf
Точно установлено что (у меня) BL1 успешно загружается и выполняется. Никакой проверки нет. А вот уже код из BL1 - первые 8К от uboot - пытается вызвать встроенную в iROM функцию Copymovitomem указатель на которую лежит в 0х40004008
И тут все глухо зависает.
Поскольку у вас тот же результат ОК то видимо происходит тоже самое. Можно JTAGом прочитать код который отвечает за загрузку и разбираться с ним но лениво и пока некогда. Может проще написать альтернативную процедуру загрузки BL2 не вызывая встроенной функции.
Dron_Gus
Да вот я тем и знанимаюсь. Еще хочу FATFS прикрутить, чтобы грузить u-boot прямо с первого раздела.
alexf
Может вот на что посмотреть: чтобы загрузка работала надо правильно выставить делители PLL. Стр. 15 документа.
Если uboot делает это не правильно, то будут проблемы.


Может даже угадал: проверил и clock 50 МГц, а надо 25. Попробую поменять константы в u-boot.
alexf
Цитата(Dron_Gus @ Feb 15 2011, 04:24) *
Только теперь следующая проблема - при старте с SD скорость уарта в два раза меньше. Хотя из-под отладчика все стартует нормально.


Еще один аргумент в пользу моей теории: uboot слишком рано переключает EPLL и клок на SD становится слишком быстрым.
Попробую проверить эту теорию.

ОК, с вас виртуальное пиво. Решил проблему.

В u-boot есть lowlevel_init для каждой платы. У меня SMDK2416.
Закоментировал инициализацию EPLL и сразу стало все грузиться с SD карточки. Если кому надо пришлю рабочий u-boot-movi.bin
но лучше соберите сами под свои параметры.


system_clock_init:

ldr r0, =ELFIN_CLOCK_POWER_BASE

ldr r1, [r0, #CLKDIV0CON_OFFSET]
bic r1, r1, #0x37 /* clear HCLKDIV, PREDIV, PCLKDIV */
bic r1, r1, #(0xf<<9) /* clear ARMCLKDIV */
ldr r2, =CLK_DIV_VAL
orr r1, r1, r2
str r1, [r0, #CLKDIV0CON_OFFSET]

/*Set MPLL Locktime*/
ldr r1, =0xe10
str r1, [r0, #LOCKCON0_OFFSET]

ldr r1, =MPLL_VAL
str r1, [r0, #MPLLCON_OFFSET]

#if 0 /*avf was 1*/
ldr r1, =0x1780
str r1, [r0, #LOCKCON1_OFFSET]

ldr r1, =EPLL_VAL /*Set EPLL*/
str r1, [r0, #EPLLCON_OFFSET]

ldr r1, [r0, #CLKSRCCON_OFFSET]
orr r1, r1, #0x40
str r1, [r0, #CLKSRCCON_OFFSET]

#endif
bvvlab
Вчера настроил H-JTAG и его флешер под свою плату( 2 гига samsung K9GAG08), сегодня загрузил убут в нанд от kit2416, результат тот же "OK" sm.gif

Отлично, alexf, мой опыт в подтверждение вашей теории! Будете в Нижнем, угощю и невиртуально!
Скиньте мне на почту бинарник протестировать, не могу щас перекомпилить, только дома, bvvlab(at)yandex.ru
alexf
Цитата(bvvlab @ Feb 17 2011, 02:08) *
Скиньте мне на почту бинарник протестировать, не могу щас перекомпилить, только дома, bvvlab(at)yandex.ru


Послал вместе с приладой "uboot_writer.exe".
Если не остановить процесс то он автоматом считывает ядро, uboot для NAND и root_EM2416.yaffs2 с ММС, стирает NAND
и пишет в него.
Естественно если образов на ММС нет, то сотрет NAND и ничего не запишет толкового. Но раз загружается с ММС, то все легко поправимо.

Кстати я собрал kernel с драйвером DM9000 и теперь монтирую root на NFS. Самое что надо для отладки.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.