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

 
 
> AT90USB647 - вызов flash Bootloader из программы
Mty
сообщение Feb 10 2016, 11:27
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 151
Регистрация: 19-12-04
Из: Москва
Пользователь №: 1 560



Привет!

Хочу по команде вызывать штатный бутлоадер в at90usb647 для перепрошивки через FLIP программатор новой firmware по USB.
Делаю так -

Код
typedef void (*pt2Function)(void);    // BootLoader call

pt2Function BootCall = (pt2Function)0x7800;  // bootloader address at90usb64 = 0x7800
BootCall(); // переход


В результате вроде проц сбрасывается, внешние порты переходят в Z состояние, но USB порт как был подключен как CDC устройство к компу, так и остается.
Видимо надо как то отключать USB контроллер перед переходом на bootloader, или как?

D.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
controller_m30
сообщение Feb 10 2016, 13:03
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 24-02-09
Пользователь №: 45 309



Попробуйте так.
Чтоб для компьютера сымитировать переподключение USB устройства не вынимая его из гнезда USB - надо на несколько секунд выключить подтягивающий резистор на линии D+ или D-, а затем снова этот резистор включить. Комп воспримет это как отключение одного устройства и подключение другого, и начнёт энумерацию по новой.

В AT90USB647 за откл\вкл резистора отвечает бит DETACH, в регистре UDCON. 0-резистор выкл. 1-резистор вкл. По сбросу этот бит =1 (т.е. резистор подключен к шине USB), поэтому несмотря на сброс контроллера, комп не видит никаких изменений на шине, и продолжает показывать в диспетчере старые данные об устройстве.

Приведёт ли это к запуску бутлоадера не знаю (пробуйте), но комп точно начнёт определение свойств вновь подключенного устройства.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 10 2016, 13:42
Сообщение #3


Гуру
******

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



Цитата(Mty @ Feb 10 2016, 13:27) *
Код
// bootloader address at90usb64 = 0x7800
Неа. Это адрес в словах, а компилятор хочет в байтах. Умножьте на два "и сразу польется вода".


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Mty
сообщение Feb 10 2016, 16:05
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 151
Регистрация: 19-12-04
Из: Москва
Пользователь №: 1 560



Цитата(Сергей Борщ @ Feb 10 2016, 16:42) *
Неа. Это адрес в словах, а компилятор хочет в байтах. Умножьте на два "и сразу польется вода".


Опа! Спасибо - попробую!
Go to the top of the page
 
+Quote Post
Mty
сообщение Feb 15 2016, 10:31
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 151
Регистрация: 19-12-04
Из: Москва
Пользователь №: 1 560



Привет!

Попробовал - результат тот же.
Код
pt2Function BootCall = (pt2Function)0xF000;  // bootloader address at90usb64 = 0x7800 words
BootCall(); // переход


При переходе CDC девайс не отключается, если выдернуть провод и подключить - определяется как неизвестное устройство.
FLIP не видит девайс.
Ума не приложу в чем дело
В мане написано
http://www.atmel.com/images/doc7593.pdf
Цитата
29.5 Entering the Boot Loader program
The boot loader can be executed
with three different conditions:
29.5.1 Regular application conditions.
A jump or call from the application program. This may be initiated by a trigger such as a com-
mand received via USART, SPI or USB.


Что бутлоадер вызывать из проги можно, дефолтные bootsz указывают на адрес 0x7800 в words, вроде все правильно, а не работает.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 19:51
Рейтинг@Mail.ru


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