Ruslan1 17 23 августа, 2006 Опубликовано 23 августа, 2006 · Жалоба Здравствуйте! Помогите чайнику. Задача собственно тривиальная, но как именно к ней подступиться- не понимаю. Совсем торможу. :cranky: Железо: есть плата на AT91RM9200, на которой установлена AT45DB642. Есть J-Link. Софт: IAR 4.40A. Пользователь: начинающий. умеет писать и отлаживать сишные программы в внутреннем SRAM и наплатном SDRAM. Понимает как править сишный стартап, но совершенно не разбирается в Армовском ассемблере. Документацию прочитал (как ему кажется). Задача: Их собственно две: 1. Написать программу, которая, автономно загрузившись во внутреннее SRAM, сможет оттуда работать (помигать светодиодом) 2. Написать программу, цель которой- проинициализировать SDRAM, загрузить в SDRAM основную пользовательскую программу, передать этой пользовательской программе управление. Сначала хочется разобраться с первой задачей. Насколько я понял, Flashloader (я рассматривал написанный VladislavS, огромное спасибо!) загружает подготовленный файл в dataFlash. Однако как этот файл должен быть предварительно подготовлен, чтобы при следующем ресете бутлоадер определил его как валидное приложение и загрузил его? В даташите написано, что для этого с адреса 0 первые 32 байта должны содержать строго определенную информацию, в том числе длину кода (шестой вектор, +0x14). Как мне это обеспечить? Далее, как этот файл записать? Поставил в IAR галку на Flashloader, указал где сам Flashloader находится, указал куда записать (--spi 0). Что-то еще? У меня вроде бы записывается, в лог пишет: AT45 at NPCSO searching AT45DB642 found Flash program complete Но не работает. :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ken@t 0 23 августа, 2006 Опубликовано 23 августа, 2006 · Жалоба Однако как этот файл должен быть предварительно подготовлен, чтобы при следующем ресете бутлоадер определил его как валидное приложение и загрузил его? В даташите написано, что для этого с адреса 0 первые 32 байта должны содержать строго определенную информацию, в том числе длину кода (шестой вектор, +0x14). Как мне это обеспечить? После ... нет не так последовательность такова , что во флэш вы должны первым делом залить свой загрузчик - тобишь написать его... Этот загрузчик RM9200 будет загружен в срам и отмаппирован на 0x0 и отудаже запущен. Сответственно можете просто __program_start: ldr pc,=?cstartup; Absolute jump org 0x04+ADRSTART undef_handler: ldr pc,=undef_handler org 0x08+ADRSTART swi_handler: ldr pc,=swi_handler org 0x0c+ADRSTART prefetch_handler: ldr pc,=prefetch_handler org 0x10+ADRSTART data_handler: ldr pc,=data_handler org 0x14 FLASHINFO : ; Ваше слово конфигурации org 0x18+ADRSTART ldr pc, [pc,#-0xF20] ; IRQ : read the AIC org 0x1c+ADRSTART fiq_handler: ldr pc,=fiq_handler ну а далее в вашем загрузчике - инициализируете SDRAM , переливаете образ из флэша и запускаете приложение.... просто ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 17 23 августа, 2006 Опубликовано 23 августа, 2006 · Жалоба [последовательность такова , что во флэш вы должны первым делом залить свой загрузчик - тобишь написать его... Этот загрузчик RM9200 будет загружен в срам и отмаппирован на 0x0 и отудаже запущен. .............. ну а далее в вашем загрузчике - инициализируете SDRAM , переливаете образ из флэша и запускаете приложение.... просто ? Спасибо, вроде стало проясняться. Во всех виденных мной стартапах написано что-то вроде: org 0x00 __program_start ldr pc,[pc,#24] ; Absolute jump can reach 4 GByte ; b ?cstartup ; Relative branch allows remap, limited to 32 MByte ; Vectors can be enabled by removing the comments below or by ; using #pragma vector from C code. org 0x04 ; ldr pc,[pc,#24] ; Branch to undef_handler org 0x08 ; ldr pc,[pc,#24] ; Branch to swi_handler org 0x0c ; ldr pc,[pc,#24] ; Branch to prefetch_handler org 0x10 ; ldr pc,[pc,#24] ; Branch to data_handler org 0x18 ; ldr pc,[pc,#24] ; Branch to irq_handler org 0x1c ; ldr pc,[pc,#24] ; Branch to fiq_handler Я вставил нужный код по 0x14, но эффекта не дало. Может быть, у вас есть пример такого стартапа, предназначенного для загрузки из флеша? Я еще подумал, что может быть а просто-напросто неправильно произвожу загрузку в мою AT45D642. Завтра попробую Flashloader пошагово посмотреть, может и не там я ищу. А скорее всего, у меня несколько ошибок в разных местах. Прочешу все сначала. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 17 4 сентября, 2006 Опубликовано 4 сентября, 2006 · Жалоба Вот я и дополз до следующей стадии. Сначала о том, как я понимаю процесс загрузки из внешней флешки (код исполняется из внешней SDRAM), то есть как себя ведет камень после reset: 1. Находит в DataFlash по CS0 микросхему, определяет, что в ней валидная прошивка (валидный вектор 0x14). 2. Грузит эту прошивку во внутреннее SRAM. То есть данные с нулевого адреса DataFlash попадают в нулевой адрес intRAM, и так далее, столько байт, сколько указано в векторе 0x14. Это еще не основная программа, а только загрузчик (длиной до 12 килобайт) 3. Производится remap, в результате которого intSRAM отображается на адреса с 0x00000000. 4. начинается исполнение кода загрузчика (с адреса 0x00000000) До этого момента мне все понятно. А вот дальше собственно суть. Действия загрузчика: 1. Проинициализировать периферию (для работы SDRAM) 2. Загрузить прошивку из DataFlash в SDRAM 3. передать управление основной программе, загруженной в SDRAM. Вот по шагам 2 и 3 у меня и вопросы. 1.В каком формате сохранять код в DataFlash, чтобы потом его легко можно было оттуда достать и распределить загрузчиком по указанным адресам? Ведь изначально все, что известно загрузчику- это то, что код расположен в DataFlash с адреса, скажем, 0x010000 ? Или достаточно иметь сырой бинарник? 2. Как вообще все это сделать (загрузку), чтобы потом сам бутлодер не занимал место в дефицитной intSRAM ? 3. Как это все отлаживать? У меня должен быть отдельный проект загрузчика, и отдельный проект загружаемого им приложения? Или можно как-то слинковать вместе? 4. Может, кто-нибудь поделится проектиком, где используется подобная загрузка? 5. И вообще, не изобретаю ли я велосипед? u-boot может мне помочь? Только избыточен он, все что мне нужно- это при включении загрузить прогу и передать ей управление. Что бы почитать еще на эту тему ? Вообще-то конечная цель- загрузить мой тестовый проектик юкоса из флешины. Сейчас работает в SDRAM, гружусь через J-Link. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ken@t 0 5 сентября, 2006 Опубликовано 5 сентября, 2006 · Жалоба До этого момента мне все понятно. А вот дальше собственно суть. Действия загрузчика: 1. Проинициализировать периферию (для работы SDRAM) 2. Загрузить прошивку из DataFlash в SDRAM 3. передать управление основной программе, загруженной в SDRAM. Вот по шагам 2 и 3 у меня и вопросы. 1.В каком формате сохранять код в DataFlash, чтобы потом его легко можно было оттуда достать и распределить загрузчиком по указанным адресам? Ведь изначально все, что известно загрузчику- это то, что код расположен в DataFlash с адреса, скажем, 0x010000 ? Или достаточно иметь сырой бинарник? 2. Как вообще все это сделать (загрузку), чтобы потом сам бутлодер не занимал место в дефицитной intSRAM ? 3. Как это все отлаживать? У меня должен быть отдельный проект загрузчика, и отдельный проект загружаемого им приложения? Или можно как-то слинковать вместе? 4. Может, кто-нибудь поделится проектиком, где используется подобная загрузка? 5. И вообще, не изобретаю ли я велосипед? u-boot может мне помочь? Только избыточен он, все что мне нужно- это при включении загрузить прогу и передать ей управление. Что бы почитать еще на эту тему ? Вообще-то конечная цель- загрузить мой тестовый проектик юкоса из флешины. Сейчас работает в SDRAM, гружусь через J-Link. В флэше сохранять в бинарном образе. в загрузчике сделать хедер типа int LoadAddr; // адрес загрузки int ImageSize; // размер образа int _prg_main_Addr; // адрес старта. поскольку ваш лодер занимается только перемещением образа из флэша в сдрам (пофиг в какую область ) и запуском его, вам достаточно писать проект как есть ( для sdram ) И отлаживать в среде разаработки. по сути возможен вариант следующего размещения во флэше |***************| | Boot 12K | |---------------| | uMON 240K | |---------------| |OSimage 6M zip | |***************| так поступают и WinCE и линух и VxW , вы можите не делать монитор и грузить флэш начальный загрузчик должен обеспечить 1. Инициализацию PLL 2. Инициализацию перефирии SPI 3. Инициализацию SDRAM и проверить её 4. Обеспечить загрузку с носителя 4.1 SPI 4.2 MMC/SD, но необходима реализация файлового доступа или пользовать RAW формат. Вопросы и действия тривиальны. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 17 5 сентября, 2006 Опубликовано 5 сентября, 2006 · Жалоба Вопросы и действия тривиальны. Спасибо! Ясно. Я думал, что есть какой-то один, уже описанный в куче аппнотов путь, а получается, что каждый своей дорогой идет к результату. Так и сделаю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Костян 0 13 сентября, 2006 Опубликовано 13 сентября, 2006 · Жалоба Вопрос по CodeWarrior (ядро ARM920T): 1. Где в настройках проекта указать запись в начало бинарника 32 valid bytes, для дальнейшего выполнения из внешней флэш ? 2. Как поместить бинарник во внутрению флэш опять же с valid bytes ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 17 17 сентября, 2006 Опубликовано 17 сентября, 2006 · Жалоба Не могу сообразить, как мне делать бинарник, который будет загружаться с помощью первичного загрузчика. Неужели ручками? Пока что я вижу, что мне придется сделать: 1. Сказать линкеру сделать сырой бинарник. В результате получаю файл размером порядка полгигабайта, так как сам проект находится в SDRAM (с адреса 0x20000000). 2. Отрезать от этого файла все, что ниже 0x20000000. 3. Дописать размер этого файла, ну и еще можно адрес расположения и контрольную сумму(которую еще нужно посчитать), в начало файла. В результате получаю искомый бинарник, который уже можно записывать в DataFlash. И что, эти все действия нужно выполнять самописной утилиткой (которая, правда, несложна)? Может, это уже где-нибудь в IAR уже встроено? Или где лежит уже такая утилитка, готовая? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться