MKdemiurg 0 March 17 Posted March 17 · Report post Здравствуйте. Может ктото подасказать, как правильно перепрошить бутлоадер? Мне приходит прошивка под БУТ, я её копирую в отдельную область флеша. А теперь как то надо из под БУТа прошить самого себя. Я правильно понимаю, что для начала мне надо создать прошивку, которая будет лежать где то в конце флеша и заниматься только копированием данных из области А в Б. А потом просто в случае обновления бутлоадера прыгнуть туда из бутлоадера ? Quote Share this post Link to post Share on other sites More sharing options...
jcxz 82 March 17 Posted March 17 · Report post 35 минут назад, MKdemiurg сказал: Я правильно понимаю, что для начала мне надо создать прошивку Для начала вам надо озаботиться тем, чтобы узнать: какой именно микроконтроллер вы собрались шить. Так как они бывают разные. А также объяснить всем: что такое "под БУТ"? как именно вам приходит некая прошивка? Голубиной почтой или как? Куда приходит? и т.д. PS: Если вы искали форум телепатов, то очевидно ошиблись адресом. Quote Share this post Link to post Share on other sites More sharing options...
Forger 15 March 17 Posted March 17 · Report post 44 minutes ago, MKdemiurg said: А теперь как то надо из под БУТа прошить самого себя. Сами загрузчики как правило не перешивают, а сразу делают как надо. Но если очень нужно, то я бы сделал специальную прошивку, которую заливаем через текущий загрузчик как рабочую прошивку, бут запускает эту новую прошивку, которая перетирает старый загрузчик на новый, зашитый в ней в виде массива кода, а потом блокирует запуск прошивки и перезапускается, сразу заходя в уже новый загрузчик. Короче, новый загрузчик вшит внутрь новой прошивки. Ибо сам загрузчик по понятной причине блокирует запись данных по адресам, где он сам расположен. Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 56 March 17 Posted March 17 · Report post Для безопасного обновления загрузчика (я хз что под загрузчиком имеется в виду, но пусть это будет некое ПО, которое принимает по какому-то интерфейсу прошивку и прошивает его вместо старой), загрузчиков должно быть несколько. Один активный, другой - не активный. При запуске стартует код выбора активного загрузчика. Этот код наитупейший, глюков тут быть не должно. Пусть он выбирает активный загрузчик по неким признакам целостности и актуальности (например, смотрит на версию). Этому загрузчику передается управление. А перешить можно только не активный загрузчик. Таким образом исключается возможность потерять загрузчик и превратить устройство в кирпич при любых мракобесиях (даже сбое питания) во время прошивки. Либо другой вариант (но так или иначе все они будут примерно похожими друг на друга). Пишется начальный загрузчик, максимально простой, и его работа отлаживается до дыр. Этот загрузчик будет передавать управление другому загрузчику, который планируется быть обновляемым. Если при включении целостность обновляемого загрузчика нарушена, остаемся в начальном, сигнализируем ахтунгом и ждем нормальный загрузчик. Если же начальный загрузчик видит, что второй цел и невредим, отдает тому управление. Второй уже занимается своими делами, в результате либо ожидая прошивку рабочего ПО, либо передавая ему управление. 1 Quote Share this post Link to post Share on other sites More sharing options...
MKdemiurg 0 March 17 Posted March 17 · Report post 1 hour ago, jcxz said: Для начала вам надо озаботиться тем, чтобы узнать: какой именно микроконтроллер вы собрались шить. Так как они бывают разные. А также объяснить всем: что такое "под БУТ"? как именно вам приходит некая прошивка? Голубиной почтой или как? Куда приходит? и т.д. PS: Если вы искали форум телепатов, то очевидно ошиблись адресом. GD32F303 CortexM4 Приходят по SPI. Я не думаю, что это принципиально важно. В общем если конкретизировать вопрос - как перепрошить область памяти, в которой уже находишься. 3 minutes ago, Arlleex said: Для безопасного обновления загрузчика (я хз что под загрузчиком имеется в виду, но пусть это будет некое ПО, которое принимает по какому-то интерфейсу прошивку и прошивает его вместо старой), загрузчиков должно быть несколько. Один активный, другой - не активный. При запуске стартует код выбора активного загрузчика. Этот код наитупейший, глюков тут быть не должно. Пусть он выбирает активный загрузчик по неким признакам целостности и актуальности (например, смотрит на версию). Этому загрузчику передается управление. А перешить можно только не активный загрузчик. Таким образом исключается возможность потерять загрузчик и превратить устройство в кирпич при любых мракобесиях (даже сбое питания) во время прошивки. два одинаковых загрузчика? Quote Share this post Link to post Share on other sites More sharing options...
jcxz 82 March 17 Posted March 17 · Report post 1 минуту назад, MKdemiurg сказал: В общем если конкретизировать вопрос - как перепрошить область памяти, в которой уже находишься. В общем случае: переместить перепрошивающий код в другую область памяти (хоть в ОЗУ) и выполнить его оттуда. Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 56 March 17 Posted March 17 · Report post 6 минут назад, MKdemiurg сказал: два одинаковых загрузчика? Ну если так получится, что у Вас два одинаковых окажется - то будет два одинаковых. Это не важно. Важно то, что один из них будет активным, а другой нет. И тот, который не активный можно смело перешивать, т.к. если что активным можно будет все исправить. Quote Share this post Link to post Share on other sites More sharing options...
MKdemiurg 0 March 17 Posted March 17 · Report post 1 hour ago, Forger said: Сами загрузчики как правило не перешивают, а сразу делают как надо. Но если очень нужно, то я бы сделал специальную прошивку, которую заливаем через текущий загрузчик как рабочую прошивку, бут запускает эту новую прошивку, которая перетирает старый загрузчик на новый, зашитый в ней в виде массива кода, а потом блокирует запуск прошивки и перезапускается, сразу заходя в уже новый загрузчик. Короче, новый загрузчик вшит внутрь новой прошивки. Ибо сам загрузчик по понятной причине блокирует запись данных по адресам, где он сам расположен. а что если часть загрузчика и HALа, связанного с Flash Memory Controller засунуть в RAM ? Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 56 March 17 Posted March 17 · Report post 3 минуты назад, MKdemiurg сказал: а что если часть загрузчика и HALа, связанного с Flash Memory Controller засунуть в RAM ? Я так и делаю, например. Однако, Вы не уточнили, насколько безопасным должно быть обновление загрузчика. Если процесс обновления загрузчика проходит с завешенными окнами, заженной свечой и расставленными иконами, то копируйте старый загрузчик в RAM, запускайтесь оттуда и обновляйтесь. Quote Share this post Link to post Share on other sites More sharing options...
Forger 15 March 17 Posted March 17 · Report post 22 minutes ago, MKdemiurg said: а что если часть загрузчика и HALа, связанного с Flash Memory Controller засунуть в RAM ? Нет разницы откуда запускается код, главное не из области загрузчика. Операция должна быть достаточно обратимой, чтобы в случае неожиданного ее прерывания не окирпичить девайс. Поэтому я и предложил, чтобы бут обновлялся из очередной рабочей прошивки, т.е. после отключения девайса от загрузочного порта. Это будет происходить максимально быстро независимо от скорости загрузки прошивки по порту, ведь прошивка загрузчика уже загружена в тело прошивки и зашита где-то там в ней. Задача состоит по сути в копировании одного куска флэши в другой. Quote Share this post Link to post Share on other sites More sharing options...
MKdemiurg 0 March 17 Posted March 17 · Report post 58 minutes ago, Arlleex said: Я так и делаю, например. Однако, Вы не уточнили, насколько безопасным должно быть обновление загрузчика. Если процесс обновления загрузчика проходит с завешенными окнами, заженной свечой и расставленными иконами, то копируйте старый загрузчик в RAM, запускайтесь оттуда и обновляйтесь. Максимально безопасным. Копировать или сразу слинковать? Я пытаюсь слинковать часть кода сразу Но , тогда придётся переписывать ХАЛ под эту область или писать на регистрах. Не могу найти мануал как прямо объектный фаил запихнуть в линкер скрипт? идея в том, что сразу добавить gd32f30x_fmc.o ... целиком. Как это правильно сделать с помощью линкера? 37 minutes ago, Forger said: Нет разницы откуда запускается код, главное не из области загрузчика. Операция должна быть достаточно обратимой, чтобы в случае неожиданного ее прерывания не окирпичить девайс. Поэтому я и предложил, чтобы бут обновлялся из очередной рабочей прошивки, т.е. после отключения девайса от загрузочного порта. Это будет происходить максимально быстро независимо от скорости загрузки прошивки по порту, ведь прошивка загрузчика уже загружена в тело прошивки и зашита где-то там в ней. Задача состоит по сути в копировании одного куска флэши в другой. Наверно этот способ самый простой и надёжный. Quote Share this post Link to post Share on other sites More sharing options...
jcxz 82 March 17 Posted March 17 · Report post 10 минут назад, MKdemiurg сказал: Я пытаюсь слинковать часть кода сразу Бессмысленно использовать для этого .ramfunc. Если хотите что-то куда-то копировать (в памяти) и там запускать, то надо создавать отдельное приложение. Которое потом можно в том числе и включить в образ другой программы как бинарный файл. Quote Share this post Link to post Share on other sites More sharing options...
MKdemiurg 0 March 17 Posted March 17 · Report post 1 minute ago, jcxz said: .ramfunc вам никак не поможет. Почему - подумайте сами. Если хотите что-то куда-то копировать (в памяти) и там запускать, то надо создавать отдельное приложение. Которое потом можно в том числе и включить в образ другой программы как бинарный файл. Вот тут не понял - я же буду копировать из под RAM ? Вернутся из нее я уже не смогу, но смогу вызвать сброс... Quote Share this post Link to post Share on other sites More sharing options...
Forger 15 March 17 Posted March 17 · Report post 22 minutes ago, MKdemiurg said: Вернутся из нее я уже не смогу, но смогу вызвать сброс... Ну, так обычно и делают после обновления прошивки - soft reset )) Quote Share this post Link to post Share on other sites More sharing options...
x893 6 March 17 Posted March 17 · Report post 27 minutes ago, MKdemiurg said: Вот тут не понял - я же буду копировать из под RAM ? Вернутся из нее я уже не смогу, но смогу вызвать сброс... Скопировать не проблема, А вот что делать если у Вас половина запишется и произойдёт сброс ? Получите кирпич. От этой ситации и пляшите. Когда придумаете - всё остальное будет мелочью. Расписывать лень, но сейчас набегут гуру программирования и накидают советов на вентилятор. Quote Share this post Link to post Share on other sites More sharing options...