|
Не получается прошить AES бутлодером, Пример из AVR231 |
|
|
|
Jul 16 2007, 10:51
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Решил сделать бутлодер для Mega32L. Сделал все, по-моему, как описано в AVR231: 1)Линкеру указал линкерный файл в рабочей директории; 2)В опциях поставил установки для M32, как указано в table 3-4 (avr231); 3)Создал Config.txt: PAGE_SIZE = 128 MEM_SIZE = 28672 CRC_ENABLE = YES KEY1 = 0AF5EBEB3E7A77644FDC460048CF80690CEC KEY2 = 56CFDB56AB33230816 KEY3 = FAFDA97243B3050D21 INITIAL_VECTOR = 4D5EDB8A7B5B8DB381059CA39B3AB955 SIGNATURE = A9E4781E 4)Создал BootLdr.h, AESKeys.inc : create -c Config.txt -h BootLdr.h -k AESKeys.inc 5)Скомпилировал проект bootldr32 с подключенными файлами BootLdr.h, AESKeys.inc Кварц 8 МГц, UBRRL = 25; // 19200 baud @ 8MHz, error 0.2% 6)Прошил в Mega32L bootldr32.hex с запрограммированными фьюзами BOOTSZ=0, BOOTRST=0, BLB1=0, BLB0=3, -L2 (LB2:LB1 -> 0 0); 5)Закодировал программный файл (~9k): create -c Config.txt -f pribor.hex -o Update.enc -l BLB11 BLB12 6)При нажатой кнопке PROG осуществил сброс контроллера, чтобы запустить программу загрузчика: if (!(PINA & (1 << PROG))) // Key pressed? Yes -> run the loader routine Загрузил полученный файл Update.enc в контроллер: update Update.enc -COM1 -19200 7)В итоге передача успешно завершилась. А в ответ тишина... В смысле программа не работает. Работоспособность проверяю пищалкой. В начале программы после инициализации портов вставил секундное пищание. Если загрузить напрямую (без бутлодера) , все работает. Какие будут соображения? P.S. Вообще, мне удавалось добиться работоспособности программы (по крайней мере пищания) зашифрованной программы. Но не могу добиться устойчивой работы бутлодера. Иногда после прошивки (AES-бутлодером) и после сброса программа никак не реагирует. Иногда вдруг начинает пищать спустя некоторое время . Смущает эта неопределенность. Бывало и так, что все работало сразу после загрузки. Затем повторяю те же действия (hex->encoding->update) и опять тишина. java script:emoticon(':07:', 'smid_5') Может быть причина в кварце? В апноте есть замечание по этому поводу установки скорости USART. Имеет ли смысл заменить кварц на 7,3728Мгц?
|
|
|
|
|
 |
Ответов
(1 - 9)
|
Jul 16 2007, 14:28
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(alux @ Jul 16 2007, 13:51)  Если загрузить напрямую (без бутлодера) , все работает. Какие будут соображения? Загрузите программу напрямую. Считайте ее обратно программатором, сохраните файл. Зашейте загрузчик без установки битов защиты. (не указывайте -L2). Зашейте с его помощью рабочую программу. Считайте память процессора программатором. Сравните файлы. Если прошивка действительно записалась, загрузите последний .hex в AVRStudio, пройдите по шагам, убедитесь, что загрузчик считает контрольную сумму прошивки и передает ей управление. Цитата(alux @ Jul 16 2007, 13:51)  Может быть причина в кварце? В апноте есть замечание по этому поводу установки скорости USART. Имеет ли смысл заменить кварц на 7,3728Мгц? Если бы проблема была в кварце - у вас были бы сбои в обмене и процесс заливки заканчивался бы сообщением об ошибке. А есть ли у вас внешняя подтяжка на кнопке PROG? Возможно просто не хватает внутренней подтяжки и вместо вашего приложения вы иногда принудительно попадаете в загрузчик? Опять же Watchdog в вашей программе используется?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jul 16 2007, 16:25
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(Сергей Борщ @ Jul 16 2007, 17:28)  А есть ли у вас внешняя подтяжка на кнопке PROG? Возможно просто не хватает внутренней подтяжки и вместо вашего приложения вы иногда принудительно попадаете в загрузчик? Опять же Watchdog в вашей программе используется? Да! Действительно нет внешней подтяжки! Забыл про это. В бутлодере на кнопке PROG нет даже внутренней подтяжки. А достаточно ли внутренней подтяжки для бутлодера? Можно ли повредить порт микроконтроллера, закорачивая его на землю без подтяжки? По-моему, в оригинальном loader.c содержится ошибка: #if !defined(WDTCR) && !defined(__IOM8_H) #define WDTCR WDTCSR #endif #if defined(__IOM16_H) || defined(__IOM32_H) WDTCR = (7 << WDP0) | (1 << WDE); #else #if defined(__IOM8_H) >>>> WDTCR = (1 << WDTOE) | (1 << WDE); #else >>>> WDTCR = (1 << WDCE) | (1 << WDE); #endif WDTCR = (7 << WDP0) | (1 << WDE); #endif ...У меги8 нет бита WDTOE. Т.е. отмеченные строки следовало бы поменять местами. Кстати, если попытаться откомпилировать оригинальный bootldr32 компилятор (IAR 4.12A) выдаст ошибку: Error[Pe020]: identifier "WDTCSR" is undefined D:\...\AVR231\Source Code\IAR\loader.c 137 Поэтому, я просто закомментировал кусок // #if !defined(WDTCR) && !defined(__IOM8_H) // #define WDTCR WDTCSR // #endif В основной программе WatchDog не используется. А надо ли? Только что обратил внимание, AES bootloader занимает: 1 902 bytes of CODE memory 2 048 bytes of DATA memory (+ 9 absolute ) <<<< Может в этом проблема? В бутлодере в начале main функции добавил: PORTA = (1<<PA7); // Pull-Up on the PROG ... Безрезультатно
|
|
|
|
|
Jul 16 2007, 20:07
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(alux @ Jul 16 2007, 19:25)  Да! Действительно нет внешней подтяжки! Забыл про это. В бутлодере на кнопке PROG нет даже внутренней подтяжки. Возможно в описании сказано, что предполагается внешняя? Цитата(alux @ Jul 16 2007, 19:25)  А достаточно ли внутренней подтяжки для бутлодера? Я бы на это не надеялся. Цитата(alux @ Jul 16 2007, 19:25)  Можно ли повредить порт микроконтроллера, закорачивая его на землю без подтяжки? Если он настроен на вывод - можно. И подтяжка при этом совсем не при чем. Цитата(alux @ Jul 16 2007, 19:25)  По-моему, в оригинальном loader.c содержится ошибка: Возможно в вашей версии заголовочного файла этот регистр и(или) бит называется иначе. Мне кажется я тоже наталкивался на эту ошибку. Цитата(alux @ Jul 16 2007, 19:25)  В основной программе WatchDog не используется. А надо ли? Это уже вам решать. Но если не используете - проверьте фузы, вдруг он включен - тогда его надо сбрасывать, иначе сбросит он. Цитата(alux @ Jul 16 2007, 19:25)  2 048 bytes of DATA memory (+ 9 absolute ) <<<< Может в этом проблема? не вижу тут криминала. Сколько ОЗУ у вашей меге32? 2 К. вот они и заняты. И 9 SFR (указатель стека, SPMCR, PORTA, DDRA и т.д.) Цитата(alux @ Jul 16 2007, 19:25)  В бутлодере в начале main функции добавил: PORTA = (1<<PA7); // Pull-Up on the PROG ... Безрезультатно  Ну, телепатически лечить вашу систему вряд ли получится. Добавьте махание ногами в разные места программы - где она пошла на принудительный запуск загрузчика, где она пошла считать контрольную сумму, где сумма совпала и пошел запуск приложения, где сумма не совпала - и таким образом поймите, каким путем пошла программа. Если неожиданным - думайте почему, перемещайте контрольные точки
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jul 17 2007, 11:43
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(Сергей Борщ @ Jul 16 2007, 23:07)  Но если не используете - проверьте фузы, вдруг он включен - тогда его надо сбрасывать, иначе сбросит он. У Меги32 нет фузов, отвечающих за включение WatchDog. Нужно ли принудительно выключать WD в основной программе ? Цитата(Сергей Борщ @ Jul 16 2007, 17:28)  Загрузите программу напрямую. Считайте ее обратно программатором, сохраните файл. Зашейте загрузчик без установки битов защиты. (не указывайте -L2). Зашейте с его помощью рабочую программу. Считайте память процессора программатором. Сравните файлы. Если прошивка действительно записалась, загрузите последний .hex в AVRStudio, пройдите по шагам, убедитесь, что загрузчик считает контрольную сумму прошивки и передает ей управление. Программа прошивается, считывается программатором. И что мне с ним делать? hex-файл - зашифрованный. ...Третий день топчусь на месте  IgorKossak и СергейБорщ, вы говорили, что AES-bootloader (avr231) -рабочий. У меня большие сомнения по этому поводу. Я все сделал как написано в апноте... Но безрезультатно. Не понял , как можно использовать AES-bootloader без ключей(просто как загрузчик без кодирования)? При попытке создания BootLdr.h команда: create -c Config.txt -h BootLdr.h выдает ощибку: KEY parity error in 010101010101010101 java script:emoticon(':help:', 'smid_14')
|
|
|
|
|
Jul 17 2007, 12:20
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(alux @ Jul 17 2007, 14:43)  У Меги32 нет фузов, отвечающих за включение WatchDog. Нужно ли принудительно выключать WD в основной программе ? Действительно нет. Значит не нужно - по умолчанию он выключен. Цитата(alux @ Jul 17 2007, 14:43)  Программа прошивается, считывается программатором. И что мне с ним делать? hex-файл - зашифрованный. Раз он зашифрованный - разберитесь почему. Он должен расшифроваться в процессе "заливки" и программатором вы должны считать его уже в расшифрованном виде. Цитата(alux @ Jul 17 2007, 14:43)  ...Третий день топчусь на месте  IgorKossak и СергейБорщ, вы говорили, что AES-bootloader (avr231) -рабочий. У меня большие сомнения по этому поводу. Сомневаться вы можете. Заходите в гости - покажу примерно 6 устройств на меге8 в которых он работает и несколько на AT91SAM7S64, LPC2214. Вы выяснили чем занимается ваш контроллер? Т.е. он передает управление вашей программе или уходит в загрузку из-за несовпавшей CRC или уходит в загрузку потому что кнопка PROG работает или обрабатывается неправильно? Цитата(alux @ Jul 17 2007, 14:43)  Не понял , как можно использовать AES-bootloader без ключей(просто как загрузчик без кодирования)? Это не знаю, не было необходимости использовать его в таком режиме.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jul 17 2007, 14:56
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(alux @ Jul 17 2007, 16:55)  BOOTSIZE у меня был выставлен 2048, а MEM_SIZE=28672.  Я же специально смотрел даташит на 32 мегу чтобы проверить, чему соответствует Цитата 6)Прошил в Mega32L bootldr32.hex с запрограммированными фьюзами BOOTSZ=0 В таблице 100 явно сказано 2048 words, но 2048 с вашей цифрой совпало и на words я внимания не обратил. "Какой осел"  Тогда обратите внимание, что при старте управление передается на начало boot-области, и если у вас загрузчик 2К байт, то надо шить BOOTSIZ=1. Уже не мы первые натыкаемся на замечательные грабли, которые нам подолжил атмел, пронумеровав программную память в словах
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|