|
|
  |
Загрузчик на PC для megaloader, как устроен? |
|
|
|
Oct 22 2010, 14:05
|
Участник

Группа: Участник
Сообщений: 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 элементов... Подскажите, плиз, в какую сторону двигаться.. Или может кто поделится исходником с комментариями для понимания? Заранее спасибо.
|
|
|
|
|
Oct 22 2010, 14:33
|
Участник

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

|
Цитата(rat12 @ Oct 22 2010, 18:05)  Если проект серьезный, обратите внимание на avr231, там же на сайте есть пример для PC и контроллера. Если не серьезный проект, можете глянуть функцию записи на билдере - см. прикрепленный файл.
|
|
|
|
|
Oct 22 2010, 19:30
|
Участник

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

|
Спасибо интересующимся, особое xelax и Jhohn. Вникаю. С формой хранения (hex) понятно. Появились следующие вопросы: 1. Пусть страница памяти состоит из 256 байт. Пусть одна строка в hex-файле состоит из 16 (dec) значимых восьмиразрядных значений. Значит ли это, что для записи одной страницы мы упорядоченно построчно проходим по всем значимым значениям в хексе, переносим 256 значений в некий буфер, после чего полученный буфер пишем в память микросхемы? Соответственно далее повторяем цикл со следующими 256-ю значениями... 2. Прошу помощи в комментировании функций из лоадера (исходники megaloader приложил). К сожалению, я сишник, в азме плохо ориентируюсь.  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. Насколько разложил "по полочкам" алгоритм, лоадер принимает данные в виде: а)Номер страницы б)Значимые байты в двухбайтовом аски-представлении в)Контрольная сумма Так ли это? Конечно, есть заголовок в начале сессии, и прочие символы протокола соединения/подтверждения, но не в этом суть процесса
|
|
|
|
|
Oct 22 2010, 22:23
|
Участник

Группа: Участник
Сообщений: 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 приложил). К сожалению, я сишник, в азме плохо ориентируюсь.  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(); - нет, читайте ссылку выше  а то обленитесь )) Цитата(rat12 @ Oct 22 2010, 23:30)  3. Насколько разложил "по полочкам" алгоритм, лоадер принимает данные в виде: а)Номер страницы б)Значимые байты в двухбайтовом аски-представлении в)Контрольная сумма
Так ли это? Да
Сообщение отредактировал Jhohn - Oct 22 2010, 22:24
|
|
|
|
|
Oct 25 2010, 08:40
|

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

|
Цитата(demiurg_spb @ Oct 23 2010, 12:35)  Я бы рекомндовал забить болт на изучение форматов, а просто конвертнуть hex2bin и работать с бинарным файлом - это НАМНОГО проще. А я бы не стал забивать болт, если хотите сделать универсальный загрузчик. Например такие ситуации как будете через bin обходить? 1. Разрыв в адресном пространстве. Например некоторые переменные аффтар кода разместил по фиксированным адресам, не попадающим в адресное пространство, которое линкер заполнил кодом. Передавать FF, которые будут заполнять адреса между кодом и данными? 2. Образ eeprom через бинарь как передавать? Или его отдельным файлом? Пользуюсь проприитарным загрузчиком котороый передаёт данные правда не в интеловском, а мотороловском формате, но один фик всякие хитрые программерские решения описанные выше, в формате передаются и обрабатываются корректно. Универсализм формата спасает.
|
|
|
|
|
Oct 25 2010, 14:33
|

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

|
Цитата(GDI @ Oct 25 2010, 14:24)  Почему бы тогда не взять другой бутлоадер, который написан на Си? Такие можно найти в сети и даже на сайте Атмела. Введи 2 дополнительные команды в поле команд строки 6 - конец страницы 7 - начало страницы входной Hex файл обрабатывай на PC и делай выходной с включением этих команд в контроллере все упроститься: в RAM делаешь буфер на 256 байт и заполняешь ого кодом 0xFF грузишь его из Hex файла от начала страницы до конец страницы пишешь во Flash далее в цикле до конца файла и будет тебе щастие
--------------------
Вяжешь - вой, а поедешь - песни пой. Между "хочу" и "можно" всегда есть дистанция
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|