реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Загрузчик на PC для megaloader, как устроен?
rat12
сообщение Oct 22 2010, 14:05
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 9-09-10
Из: Симферополь
Пользователь №: 59 396



Товарищи, подскажите, в каком формате поступают страницы прошивки (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 элементов... Подскажите, плиз, в какую сторону двигаться.. Или может кто поделится исходником с комментариями для понимания? Заранее спасибо.
Go to the top of the page
 
+Quote Post
xelax
сообщение Oct 22 2010, 14:15
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



описание hex формата

Страницы никак не заданы. Адресация в файле линейная.
Go to the top of the page
 
+Quote Post
Jhohn
сообщение Oct 22 2010, 14:33
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 12-11-08
Пользователь №: 41 579



Цитата(rat12 @ Oct 22 2010, 18:05) *


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

Если не серьезный проект, можете глянуть функцию записи на билдере - см. прикрепленный файл.
Прикрепленные файлы
Прикрепленный файл  ______________.txt ( 2.17 килобайт ) Кол-во скачиваний: 64
 
Go to the top of the page
 
+Quote Post
rat12
сообщение Oct 22 2010, 19:30
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 9-09-10
Из: Симферополь
Пользователь №: 59 396



Спасибо интересующимся, особое 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
Прикрепленные файлы
Прикрепленный файл  Loader_cv.zip ( 7.12 килобайт ) Кол-во скачиваний: 19
 
Go to the top of the page
 
+Quote Post
Jhohn
сообщение Oct 22 2010, 22:23
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 12-11-08
Пользователь №: 41 579



Цитата(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. Насколько разложил "по полочкам" алгоритм, лоадер принимает данные в виде:
а)Номер страницы
б)Значимые байты в двухбайтовом аски-представлении
в)Контрольная сумма

Так ли это?

Да

Сообщение отредактировал Jhohn - Oct 22 2010, 22:24
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 23 2010, 08:35
Сообщение #6


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



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


Я бы рекомндовал забить болт на изучение форматов, а просто конвертнуть hex2bin и работать с бинарным файлом - это НАМНОГО проще.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
rat12
сообщение Oct 23 2010, 10:38
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 9-09-10
Из: Симферополь
Пользователь №: 59 396



demiurg_spb, спасибо за совет! Как раз раздумывал над механизмом набора байт в страницу. С бинарником попроще smile.gif
Go to the top of the page
 
+Quote Post
xelax
сообщение Oct 25 2010, 08:40
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



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


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

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

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

Пользуюсь проприитарным загрузчиком котороый передаёт данные правда не в интеловском, а мотороловском формате, но один фик всякие хитрые программерские решения описанные выше, в формате передаются и обрабатываются корректно. Универсализм формата спасает.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 25 2010, 09:00
Сообщение #9


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(xelax @ Oct 25 2010, 12:40) *
Универсализм формата спасает.
С этим не спорю! Но время то уходит...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
GDI
сообщение Oct 25 2010, 10:24
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Цитата(rat12 @ Oct 22 2010, 23:30) *
К сожалению, я сишник, в азме плохо ориентируюсь. sad.gif

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


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
IJAR
сообщение Oct 25 2010, 14:33
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 232
Регистрация: 26-02-07
Из: г. Зеленоград
Пользователь №: 25 669



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


Введи 2 дополнительные команды в поле команд строки
6 - конец страницы
7 - начало страницы
входной Hex файл обрабатывай на PC
и делай выходной
с включением этих команд
в контроллере все упроститься:
в RAM делаешь буфер на 256 байт и заполняешь ого кодом 0xFF
грузишь его из Hex файла от начала страницы до конец страницы
пишешь во Flash далее в цикле до конца файла
и будет тебе щастие


--------------------
Вяжешь - вой, а поедешь - песни пой.
Между "хочу" и "можно" всегда есть дистанция
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th June 2025 - 17:02
Рейтинг@Mail.ru


Страница сгенерированна за 0.01458 секунд с 7
ELECTRONIX ©2004-2016