Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Загрузка AT91RM9200 из SPI DataFlash
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Ruslan1
Здравствуйте!
Помогите чайнику.
Задача собственно тривиальная, но как именно к ней подступиться- не понимаю. Совсем торможу.
cranky.gif

Железо: есть плата на 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

Но не работает. sad.gif
Ken@t
Цитата(Ruslan1 @ Aug 23 2006, 13:56) *
Однако как этот файл должен быть предварительно подготовлен, чтобы при следующем ресете бутлоадер определил его как валидное приложение и загрузил его? В даташите написано, что для этого с адреса 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
Цитата(Ken@t @ Aug 23 2006, 13:05) *
[последовательность такова , что во флэш вы должны первым делом залить свой загрузчик - тобишь написать его... Этот загрузчик 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
Вот я и дополз до следующей стадии.

Сначала о том, как я понимаю процесс загрузки из внешней флешки (код исполняется из внешней 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
Цитата(Ruslan1 @ Sep 4 2006, 14:43) *
До этого момента мне все понятно. А вот дальше собственно суть.

Действия загрузчика:
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
Цитата(Ken@t @ Sep 5 2006, 12:36) *
Вопросы и действия тривиальны.


Спасибо! Ясно. Я думал, что есть какой-то один, уже описанный в куче аппнотов путь, а получается, что каждый своей дорогой идет к результату. Так и сделаю.
Костян
Вопрос по CodeWarrior (ядро ARM920T):
1. Где в настройках проекта указать запись в начало бинарника 32 valid bytes, для дальнейшего выполнения из внешней флэш ?
2. Как поместить бинарник во внутрению флэш опять же с valid bytes ?
Ruslan1
Не могу сообразить, как мне делать бинарник, который будет загружаться с помощью первичного загрузчика. Неужели ручками? Пока что я вижу, что мне придется сделать:
1. Сказать линкеру сделать сырой бинарник. В результате получаю файл размером порядка полгигабайта, так как сам проект находится в SDRAM (с адреса 0x20000000).
2. Отрезать от этого файла все, что ниже 0x20000000.
3. Дописать размер этого файла, ну и еще можно адрес расположения и контрольную сумму(которую еще нужно посчитать), в начало файла.
В результате получаю искомый бинарник, который уже можно записывать в DataFlash.

И что, эти все действия нужно выполнять самописной утилиткой (которая, правда, несложна)?
Может, это уже где-нибудь в IAR уже встроено?
Или где лежит уже такая утилитка, готовая?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.