ProMicro и bootloader

__Alexander
Offline
Зарегистрирован: 24.10.2012

Добрый день камрады.

Назрел вопросец по поводу бута в ПроМикро. Значится имеет вшитый по умолчанию usb-бут, который при замыкании reset на землю, определяется в системе как компорт через который с помощью usbasp прошиваем. Допустим прошили что-то типа hid устройства, всё красиво, при следующем подключении по usb стартует  основная программа и для следующей прошивки надо снова замыкать ресет. Так вот собсно вопрос, можно ли каким-то способом программно ресентнутся в бут? Пробовал watchdog, не помогает - стартует основной флеш. 

b707
Offline
Зарегистрирован: 26.05.2017

программно с какой целью? Бутлоадер имеет смысл запускать только в случае, если у вас есть какое-то внешнее устройство, готовое прошивать про микру. Если оно есть - пусть оно за РЕСЕТ и дергает.

__Alexander
Offline
Зарегистрирован: 24.10.2012

b707 пишет:

программно с какой целью? Бутлоадер имеет смысл запускать только в случае, если у вас есть какое-то внешнее устройство, готовое прошивать про микру. Если оно есть - пусть оно за РЕСЕТ и дергает.

Ну как с какой целью, чтобы я из своей программы смог прошить. 

Вся ж прелесть именно atmega32u4 что там аппаратный usb и бутлоадер создает по юсб виртуальный компорт, по которому и прошивается. т.е. не надо никаких внешних программаторов.

rkit
Offline
Зарегистрирован: 23.11.2016

__Alexander пишет:

 Пробовал watchdog, не помогает - стартует основной флеш. 

ну перепиши загрузчик, чтобы не стартовал

__Alexander
Offline
Зарегистрирован: 24.10.2012

rkit пишет:

ну перепиши загрузчик, чтобы не стартовал

Загрузчик трогать нельзя, эти платы ардуино идут по умолчанию с загрузчиком, который создает в системе ком-порт по которому заливается основная программа. Но загрузчик выполняется только после нажатия ресет, т.е. когда просто воткнуть в юсб, то система сброса это "нюхает" и загрузчик не вызывает, а стартует с основной программы. Для прошивки надо снова нажимать ресет или сделать это программно. Внизу картинка одной программы, которая так и делать, т.е. программно это реально, хочу только узнать куда копать. Может как-то вызвать  функцию, с указателем на адрес загрузчика. Надо попробовать.

 

b707
Offline
Зарегистрирован: 26.05.2017

как-то несколько лет назад Дракула подробно обьяснял, как сбросить статус загрузки еще до исполнения загрузчика, возможно это именно то, что вы ищете (хотя не уверен)

ща попробую найти

b707
Offline
Зарегистрирован: 26.05.2017

вот как-то так

http://arduino.ru/forum/apparatnye-voprosy/ne-mogu-vylechit-vatchdog-na-goloi-atmege328r-s-vnutr-taktirovaniem-8-mgts#comment-339435

по состоянию регистра MCUSR можно определить, что вызвало перезагрузку и, вероятно, сэмулировать реакцию загрузчика как на хард-ресет

Хотя это лучше у Дракулы спросить

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Исходники загрузчиков есть в IDE - что мешает шагнуть в нужную точку загрузчика (0x785E для Caterina)???

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

__Alexander,  IDE при прошивке не дёргает ресет. Тыц. Теоритически можно выехать в бут и из тела программы, но подозреваю, что желающий такого изврата куда то не той дорогой пошёл...)

__Alexander
Offline
Зарегистрирован: 24.10.2012

dimax пишет:

__Alexander,  IDE при прошивке не дёргает ресет. Тыц. Теоритически можно выехать в бут и из тела программы, но подозреваю, что желающий такого изврата куда то не той дорогой пошёл...)


Именно это и надо, стартонуть загрузчик из основной программы.

rkit
Offline
Зарегистрирован: 23.11.2016

__Alexander пишет:

Загрузчик трогать нельзя, эти платы ардуино идут по умолчанию с загрузчиком, который создает в системе ком-порт по которому заливается основная программа.

первое из второго никак не следует

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018
asm volatile(
		"JMP 0x785E \n\t"
    ::
);

для загрузчика Caterina

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Komandir пишет:

asm volatile(
		"JMP 0x785E \n\t"
    ::
);

для загрузчика Caterina

"святая катерина пошли мне армянина"... )))

__Alexander
Offline
Зарегистрирован: 24.10.2012

Короче получилось вызвав загрузчик как функцию по адресу.

Главный нюанс был в том, чтобы устройство переинициализировалось, надо текущее прибить.

Короче, создаем указатель на функцию, даем функции имя и адрес и вызываем.



 unsigned long res =0;  
 
typedef void (*funcPtr_t) (void);

int main(void)
{
	funcPtr_t bootloader = (void *) 0x3800;
        USB_Init();
	GlobalInterruptEnable();

  	for (;;)
	{
		HID_Device_USBTask(&Generic_HID_Interface);
		USB_USBTask();
		res++;		
		  if (res == 1000000)
		  {
	 	  USB_Disable();
                  bootloader();
                  }

Загрузчик начинается с адреса 0x7000 в байтах, поэтому в словах это 0x3800;

Если использовать асм вставку, как привел Komandir,  то адрес указывать в байтах.

asm volatile(
"JMP 0x7000 \n\t")
 
Всем спасибо, кто не поленился что либо посоветовать.