Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Загрузчик на PC для megaloader
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
rat12
Товарищи, подскажите, в каком формате поступают страницы прошивки (hex файл) в бутлоадер пусть для определенности megaloader v 7.4 ?

Хочу переписать PC загрузчик, разбираюсь с форматом.

Код записи хекса в самом бутлоадере таков:
Код
unsigned int i;
  unsigned int TempInt;
  unsigned char FlashCheckSum = 0;
  unsigned char CheckSum = 0;
  unsigned char Left;
  unsigned char Right;

  for (i=0;i<PageByte;i+=2)
  {
   Right = RxChar();
   Left = RxChar();
   TempInt = (unsigned int)Right + ((unsigned int)Left<<8);
   CheckSum += (Right + Left);
   fill_temp_buffer(TempInt,i);      //call asm routine.
  }

  if (CheckSum != RxChar()) return 0;

  write_page(PageAddress,0x03);     //Perform page ERASE
  write_page(PageAddress,0x05);     //Perform page write
  enableRWW();
  for (i=0;i<PageByte;i+=2)
  {
    TempInt = read_program_memory(PageAddress + i,0x00);
    FlashCheckSum += (char)(TempInt & 0x00ff) + (char)(TempInt >> 8);
  }
  if (CheckSum != FlashCheckSum) return 0;
  
  return 1;


Где PageByte=256, т.е. 256 байт в странице. А как страница закодирована в хексе?

Кусочек хекса:
Код
:060000000C9443060C9471
:100006005F110C9460110C9400000C9400000C9489
:1000160061110C9400000C9400000C9400000C94E8
:1000260000000C94E1100C9400000C9400000C9459
:1000360000000C9400000C947B0D0C9400000C94B2
:1000460000000C947C110C9400000C9400000C949D
...


Начало каждой строки сильно напоминает номер (строки? страницы?), но дальнейшее содержимое ну никак не равно 256 элементов... Подскажите, плиз, в какую сторону двигаться.. Или может кто поделится исходником с комментариями для понимания? Заранее спасибо.
xelax
описание hex формата

Страницы никак не заданы. Адресация в файле линейная.
Jhohn
Цитата(rat12 @ Oct 22 2010, 18:05) *


Если проект серьезный, обратите внимание на avr231, там же на сайте есть пример для PC и контроллера.

Если не серьезный проект, можете глянуть функцию записи на билдере - см. прикрепленный файл.
rat12
Спасибо интересующимся, особое xelax и Jhohn. Вникаю.

С формой хранения (hex) понятно. Появились следующие вопросы:

1. Пусть страница памяти состоит из 256 байт. Пусть одна строка в hex-файле состоит из 16 (dec) значимых восьмиразрядных значений. Значит ли это, что для записи одной страницы мы упорядоченно построчно проходим по всем значимым значениям в хексе, переносим 256 значений в некий буфер, после чего полученный буфер пишем в память микросхемы? Соответственно далее повторяем цикл со следующими 256-ю значениями...

2. Прошу помощи в комментировании функций из лоадера (исходники megaloader приложил). К сожалению, я сишник, в азме плохо ориентируюсь. sad.gif

fill_temp_buffer(TempInt,i); //call asm routine. - Сохраняет пришедшие значимые байты во временный буфер?
write_page(PageAddress,0x03); //Perform page ERASE - Команда на очистку страницы памяти?
write_page(PageAddress,0x05); //Perform page write - Команда на подготовку к записи в страницу памяти?
enableRWW(); - Есть соображение, что это как раз запись временного буфера в память кристалла?
read_program_memory(PageAddress + i,0x00); - Чтение (верификация) записанной в кристалл страницы?

3. Насколько разложил "по полочкам" алгоритм, лоадер принимает данные в виде:
а)Номер страницы
б)Значимые байты в двухбайтовом аски-представлении
в)Контрольная сумма

Так ли это?

Конечно, есть заголовок в начале сессии, и прочие символы протокола соединения/подтверждения, но не в этом суть процессаsmile.gif
Jhohn
Цитата(rat12 @ Oct 22 2010, 23:30) *
1. Пусть страница памяти состоит из 256 байт. Пусть одна строка в hex-файле состоит из 16 (dec) значимых восьмиразрядных значений. Значит ли это, что для записи одной страницы мы упорядоченно построчно проходим по всем значимым значениям в хексе, переносим 256 значений в некий буфер, после чего полученный буфер пишем в память микросхемы? Соответственно далее повторяем цикл со следующими 256-ю значениями...

Ваш вопрос сводится к следующему: последовательно ли расположены данные в hex файле?
- В зависимости от того как вы располагаете данные в памяти программ. Как правило данные располагаются последовательно. Вы это можете видеть по адресам: у следующей строчки .hex инкрементируются адреса на 16.
Цитата(rat12 @ Oct 22 2010, 23:30) *
2. Прошу помощи в комментировании функций из лоадера (исходники megaloader приложил). К сожалению, я сишник, в азме плохо ориентируюсь. sad.gif

fill_temp_buffer(TempInt,i); //call asm routine. - Сохраняет пришедшие значимые байты во временный буфер?
write_page(PageAddress,0x03); //Perform page ERASE - Команда на очистку страницы памяти?
write_page(PageAddress,0x05); //Perform page write - Команда на подготовку к записи в страницу памяти?
enableRWW(); - Есть соображение, что это как раз запись временного буфера в память кристалла?
read_program_memory(PageAddress + i,0x00); - Чтение (верификация) записанной в кристалл страницы?

AVR109 - Самопрограммирование
write_page(PageAddress,0x03) пишет в SPMCR 0b00000011 - что соответствует очистке страницы
из ссылки выше:
"Запись страницы
Данные после того, как они были загружены в буфер страниц, должны быть записаны во Flash память. Для выполнения этого необходимо, как это было описано выше в пункте описания алгоритма стирании страницы, установить Z регистр. Затем устанавливаются биты PGERS и SPMEN в регистре SPMCR, а потом в течение четырех циклов необходимо запустить SPM команду.
"

write_page(PageAddress,0x05) пишет в SPMCR 0b00000101 - запись непосредственно

enableRWW(); - нет, читайте ссылку выше biggrin.gif а то обленитесь ))

Цитата(rat12 @ Oct 22 2010, 23:30) *
3. Насколько разложил "по полочкам" алгоритм, лоадер принимает данные в виде:
а)Номер страницы
б)Значимые байты в двухбайтовом аски-представлении
в)Контрольная сумма

Так ли это?

Да
demiurg_spb
Цитата(xelax @ Oct 22 2010, 18:15) *


Я бы рекомндовал забить болт на изучение форматов, а просто конвертнуть hex2bin и работать с бинарным файлом - это НАМНОГО проще.
rat12
demiurg_spb, спасибо за совет! Как раз раздумывал над механизмом набора байт в страницу. С бинарником попроще smile.gif
xelax
Цитата(demiurg_spb @ Oct 23 2010, 12:35) *
Я бы рекомндовал забить болт на изучение форматов, а просто конвертнуть hex2bin и работать с бинарным файлом - это НАМНОГО проще.


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

Например такие ситуации как будете через bin обходить?

1. Разрыв в адресном пространстве. Например некоторые переменные аффтар кода разместил по фиксированным адресам, не попадающим в адресное пространство, которое линкер заполнил кодом. Передавать FF, которые будут заполнять адреса между кодом и данными?
2. Образ eeprom через бинарь как передавать? Или его отдельным файлом?

Пользуюсь проприитарным загрузчиком котороый передаёт данные правда не в интеловском, а мотороловском формате, но один фик всякие хитрые программерские решения описанные выше, в формате передаются и обрабатываются корректно. Универсализм формата спасает.
demiurg_spb
Цитата(xelax @ Oct 25 2010, 12:40) *
Универсализм формата спасает.
С этим не спорю! Но время то уходит...
GDI
Цитата(rat12 @ Oct 22 2010, 23:30) *
К сожалению, я сишник, в азме плохо ориентируюсь. sad.gif

Почему бы тогда не взять другой бутлоадер, который написан на Си? Такие можно найти в сети и даже на сайте Атмела.
IJAR
Цитата(GDI @ Oct 25 2010, 14:24) *
Почему бы тогда не взять другой бутлоадер, который написан на Си? Такие можно найти в сети и даже на сайте Атмела.


Введи 2 дополнительные команды в поле команд строки
6 - конец страницы
7 - начало страницы
входной Hex файл обрабатывай на PC
и делай выходной
с включением этих команд
в контроллере все упроститься:
в RAM делаешь буфер на 256 байт и заполняешь ого кодом 0xFF
грузишь его из Hex файла от начала страницы до конец страницы
пишешь во Flash далее в цикле до конца файла
и будет тебе щастие
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.