Перейти к содержанию
    

Загрузка AT91RM9200 из SPI DataFlash

Здравствуйте!

Помогите чайнику.

Задача собственно тривиальная, но как именно к ней подступиться- не понимаю. Совсем торможу.

: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

 

Но не работает. :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Однако как этот файл должен быть предварительно подготовлен, чтобы при следующем ресете бутлоадер определил его как валидное приложение и загрузил его? В даташите написано, что для этого с адреса 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 , переливаете образ из флэша и запускаете приложение.... просто ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

[последовательность такова , что во флэш вы должны первым делом залить свой загрузчик - тобишь написать его... Этот загрузчик 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 пошагово посмотреть, может и не там я ищу.

 

А скорее всего, у меня несколько ошибок в разных местах. Прочешу все сначала.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот я и дополз до следующей стадии.

 

Сначала о том, как я понимаю процесс загрузки из внешней флешки (код исполняется из внешней 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

До этого момента мне все понятно. А вот дальше собственно суть.

 

Действия загрузчика:

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 формат.

 

Вопросы и действия тривиальны.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопросы и действия тривиальны.

 

Спасибо! Ясно. Я думал, что есть какой-то один, уже описанный в куче аппнотов путь, а получается, что каждый своей дорогой идет к результату. Так и сделаю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопрос по CodeWarrior (ядро ARM920T):

1. Где в настройках проекта указать запись в начало бинарника 32 valid bytes, для дальнейшего выполнения из внешней флэш ?

2. Как поместить бинарник во внутрению флэш опять же с valid bytes ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не могу сообразить, как мне делать бинарник, который будет загружаться с помощью первичного загрузчика. Неужели ручками? Пока что я вижу, что мне придется сделать:

1. Сказать линкеру сделать сырой бинарник. В результате получаю файл размером порядка полгигабайта, так как сам проект находится в SDRAM (с адреса 0x20000000).

2. Отрезать от этого файла все, что ниже 0x20000000.

3. Дописать размер этого файла, ну и еще можно адрес расположения и контрольную сумму(которую еще нужно посчитать), в начало файла.

В результате получаю искомый бинарник, который уже можно записывать в DataFlash.

 

И что, эти все действия нужно выполнять самописной утилиткой (которая, правда, несложна)?

Может, это уже где-нибудь в IAR уже встроено?

Или где лежит уже такая утилитка, готовая?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...