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

 
 
> требуется совет по бутлоадеру
romez777
сообщение May 8 2008, 02:17
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 292
Регистрация: 9-11-04
Пользователь №: 1 077



Всем привет.

Нужен совет по организации загрузчика. Бутлоадер принимает образ приложения по USB, само фирмваре(загружаемое бутлоадером) также активно общается с хостом (посредством Windows приложения), никаких кнопок на устройстве нет.

Простой протокол загрузки фирмваре такой: бут посылает символ готовности, и после его приема Windows-приложение начинает заливать образ блоками, равными размеру страницы, приме и запись каждого блока подтверждается загрузчиком (отпавляется ack). Когда передача закончена, хост сообщает об этом бут-лоадеру и тот переходит на адрес, по которому залили приложение.

Нужно сделать как-то так, чтобы если в течение N секунд нет попытки заливать образ, лоадер сразу перескакивал на приложение. Не могу сообразить как это сделать. Может быть у вас будут какие-то соображения.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 13)
InsolentS
сообщение May 8 2008, 04:38
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 414
Регистрация: 8-06-06
Пользователь №: 17 897



Можно так: когда прибор работает в пользовательской программе (прошивке), комп посылает ему комманду, мол хочу тебя прошить, прибор понимает это и перескакивает на загрузчик. Стартует естественно с пользовательской.


--------------------
Курильщик даташитов со стажем
Go to the top of the page
 
+Quote Post
ig_z
сообщение May 8 2008, 08:16
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 437
Регистрация: 27-08-04
Пользователь №: 551



Цитата(romez777 @ May 8 2008, 05:17) *
Нужно сделать как-то так, чтобы если в течение N секунд нет попытки заливать образ, лоадер сразу перескакивал на приложение. Не могу сообразить как это сделать. Может быть у вас будут какие-то соображения.


У атмеля есть 2 апнота на тему - одно пофундаментальней, другое попрактичней. И их подход более правильный (имхо). Пример использования подобных идей - хорошо известный жлинк. Там обеспечена полная неубиваемость прибора. Хотя у меня он все же каким то образом погиб.

В двух словах идея звучит так:
-При включении бутлоадер проверяет рабочую и буферную область флеши. Здесь д.б. возможны три варианта из четырех:
1. обе области имеют правильное содержимое. Тогда буферная облать переносится бутлоадером в рабочую и стартует.
2. буферная область не валидна. Стартует рабочая область.
3. рабочая область не валидна. Бутлоадер копирует буферную част в рабочую и стартует.

Код апдейта буферной части принадлежит самому приложению и может быть сколь угодно сложным в транспортном и секретном смысле. Основная задача бутлоадера - делать правильный выбор между двумя копиями в рабочей и буферной области.
Go to the top of the page
 
+Quote Post
Vitaliy_ARM
сообщение May 8 2008, 08:47
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246



Цитата(romez777 @ May 8 2008, 06:17) *
Всем привет.

Нужен совет по организации загрузчика. Бутлоадер принимает образ приложения по USB, само фирмваре(загружаемое бутлоадером) также активно общается с хостом (посредством Windows приложения), никаких кнопок на устройстве нет.

Простой протокол загрузки фирмваре такой: бут посылает символ готовности, и после его приема Windows-приложение начинает заливать образ блоками, равными размеру страницы, приме и запись каждого блока подтверждается загрузчиком (отпавляется ack). Когда передача закончена, хост сообщает об этом бут-лоадеру и тот переходит на адрес, по которому залили приложение.

Нужно сделать как-то так, чтобы если в течение N секунд нет попытки заливать образ, лоадер сразу перескакивал на приложение. Не могу сообразить как это сделать. Может быть у вас будут какие-то соображения.


Тут смотря что за устройство. Если у вас часть инициализации вашего устройсва заложено в загрузчик, то можно сделать например так:
После включения питания запускается загрузчик и ждет команд для загрузки, в этот момент вы можете перешивать фирмваре. Потом даете некую команду запуска приложения, после которой стартует приложение и на команды загрузчика не отвечает.

Если у вас прикладная программа знать не знает про загрузчик. То надо их как-то разделить каким-то событием, например переключателем. Прибор после включения питания смотрит на этот переключатель, если режим загрузчика, грузите загрузчик, в противном случае грузится программа.

Сообщение отредактировал Vitaliy_ARM - May 8 2008, 08:48


--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
Go to the top of the page
 
+Quote Post
meister
сообщение May 8 2008, 09:02
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484



Цитата(romez777 @ May 8 2008, 06:17) *
Нужно сделать как-то так, чтобы если в течение N секунд нет попытки заливать образ, лоадер сразу перескакивал на приложение. Не могу сообразить как это сделать. Может быть у вас будут какие-то соображения.


Время измеряется таймером smile.gif или в чем проблема? У меня общение и обновление идет по уарту, кнопок тоже нет. Есть специальная ветка в протоколе - "вход в обновление прошивки".

После подачи питания запускается основная прошивка (если она корректна) и из нее можно вернуться в обновление. Единственная проблема, если бутлоадер распознает прошивку как "корректную", а вернуться к бутлоадеру из нее будет невозможно.

Сообщение отредактировал meister - May 8 2008, 09:05
Go to the top of the page
 
+Quote Post
Alechek
сообщение May 8 2008, 11:49
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Цитата(meister @ May 8 2008, 14:02) *
Единственная проблема, если бутлоадер распознает прошивку как "корректную", а вернуться к бутлоадеру из нее будет невозможно.

Ага, у меня так и сделано.
Только для подстраховки есть еще на плате "переключатель". Загрузчик смотрит на него и думает, а запускать ли основную. Пока еще ни разу не пришлось этим воспользоватся.
Go to the top of the page
 
+Quote Post
IEC
сообщение May 8 2008, 13:23
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 22-03-05
Из: г. Харьков, Украина
Пользователь №: 3 598



Цитата(meister @ May 8 2008, 13:02) *
Время измеряется таймером smile.gif или в чем проблема? У меня общение и обновление идет по уарту, кнопок тоже нет. Есть специальная ветка в протоколе - "вход в обновление прошивки".

После подачи питания запускается основная прошивка (если она корректна) и из нее можно вернуться в обновление. Единственная проблема, если бутлоадер распознает прошивку как "корректную", а вернуться к бутлоадеру из нее будет невозможно.


Ну например загрузчик может проверять код программы по контрольной сумме. При прошивке контрольная сумма прошивается последней:-)
Go to the top of the page
 
+Quote Post
meister
сообщение May 8 2008, 15:00
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484



Цитата(IEC @ May 8 2008, 17:23) *
Ну например загрузчик может проверять код программы по контрольной сумме. При прошивке контрольная сумма прошивается последней:-)


Я вот об этом: если прошить вот такое обновление с правильной контрольной суммой

Код
int main()
{
    выкл();
}


будет оцень грустно. У меня на столе случился другой вариант: было несколько версий плат с разной разводкой и разными кварцами и я перепутал файл. CRC, естественно, сошлась.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение May 8 2008, 18:06
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



А кто мешает в начале firmware предусмотреть код прошивки или версию прошивки (кому как нравится)? И если он для платы версии XXX - заливать, а если от YYY - нет. Мы так много лет делаем в серийном производстве.
Go to the top of the page
 
+Quote Post
romez777
сообщение May 9 2008, 03:09
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 292
Регистрация: 9-11-04
Пользователь №: 1 077



Приветствую.

Спасибо за советы, понятно в каком направлении двигаться smile.gif Теперь есть более практический вопрос: как обеспечить таймером длинные интервалы, скажем 5секунд.

Сейчас читаю аппнот "Getting started with at91sam7", как я понял чем больше prescale factor, тем дольше будет задержка. Но как определяется этот самый prescaler factor, как его рассчитать?

Например, при частоте чипа 48Mhz, как будет выглядеть значение в регистре С? В примере аппнота формируют задержку в 250ms вот так, но я не совсем понимаю как это получили:

Код
AT91C_BASE_TC0->TC_RC = AT91B_MASTER_CLOCK >> 12;  /* MCKR divided by 1024 * 4 */


Спасибо.
Go to the top of the page
 
+Quote Post
romez777
сообщение May 10 2008, 03:23
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 292
Регистрация: 9-11-04
Пользователь №: 1 077



Цитата(romez777 @ May 9 2008, 06:09) *
Спасибо за советы, понятно в каком направлении двигаться smile.gif Теперь есть более практический вопрос: как обеспечить таймером длинные интервалы, скажем 5секунд.

С этим справился, но столкнулся с новой проблемой smile.gif Таймер не запускается, судя по всему.
При этом, отрабатывая это на атмеловском примере из аппнота "Getting started with at91sam7 microcontrollers", все работает, таймер отсчитывает нужный интервал и пр.

В моем проекте не работает, я подозреваю, что дело в стартапе, в аппноте делается ремап, у меня нет - это может как-то влиять на работу таймера?

На всякий случай привожу код инициализаци таймера и обработчика прерывания:

Код
void timer_handler(void)
{
  volatile unsigned long dummy;
  /* Clear status bit */
  dummy = AT91C_BASE_TC0->TC_SR;
  ....
}


Код
static void configure_tc(void)
{
    volatile unsigned long dummy;

    /* Enable periph clock for the PIO controller */
    AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_TC0);

    /* Enable the periph */
    /* Disable the clock and the interrupts */
    AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKDIS;
    AT91C_BASE_TC0->TC_IDR = 0xFFFFFFFF;

    /* Clear status bit */
    dummy = AT91C_BASE_TC0->TC_SR;

    /* Set the Mode of the Timer Counter */
    AT91C_BASE_TC0->TC_CMR = AT91C_TC_CLKS_TIMER_DIV5_CLOCK | AT91C_TC_CPCTRG;
    AT91C_BASE_TC0->TC_RC = AT91B_MASTER_CLOCK >> 12;  /* MCKR divided by 1024 * 4 */

    /* Enable interrupts */
    /* Disable the interrupt on the interrupt controller */
    AT91C_BASE_AIC->AIC_IDCR = (1 << AT91C_ID_TC0);
    /* Save the interrupt handler routine pointer and the interrupt priority */
    AT91C_BASE_AIC->AIC_SVR[AT91C_ID_TC0] = (unsigned long) timer_handler;
    /* Store the Source Mode Register */
    AT91C_BASE_AIC->AIC_SMR[AT91C_ID_TC0] = AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | AT91C_AIC_PRIOR_LOWEST;
    /* Clear the interrupt on the interrupt controller */
    AT91C_BASE_AIC->AIC_ICCR = (1 << AT91C_ID_TC0);

    AT91C_BASE_TC0->TC_IER = AT91C_TC_CPCS;

    /* Enable the interrupt on the interrupt controller */
    AT91C_BASE_AIC->AIC_IECR = (1 << AT91C_ID_TC0);
}
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 10 2008, 05:39
Сообщение #12


Гуру
******

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



Цитата(romez777 @ May 10 2008, 06:23) *
Код
    /* Disable the clock and the interrupts */
    AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKDIS;
А Enable clock где-то потерялось...


--------------------
На любой вопрос даю любой ответ
"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
romez777
сообщение May 10 2008, 05:52
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 292
Регистрация: 9-11-04
Пользователь №: 1 077



Цитата(Сергей Борщ @ May 10 2008, 08:39) *
А Enable clock где-то потерялось...

Так вот он:

Код
AT91C_BASE_TC0->TC_IER = AT91C_TC_CPCS;


Но IMHO дело где-то глубже. Ибо ставлю print-ы в configure_tc и ничего не печатается, просто виснет.

Таки да, Вы были правы smile.gif это я прерывания включил, а клок так и висел отключенным.
Посоветуйте, как правильно таймер отключить: в IDR поднять нужный бит или отключать клок?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 10 2008, 09:33
Сообщение #14


Гуру
******

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



Цитата(romez777 @ May 10 2008, 08:52) *
Посоветуйте, как правильно таймер отключить: в IDR поднять нужный бит или отключать клок?
Смотря чего вы хотите - чтобы таймер стоял отключайте тактирование, чтобы просто чтобы прерывания с него не сыпались - запрещайте прерывания.


--------------------
На любой вопрос даю любой ответ
"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

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 09:46
Рейтинг@Mail.ru


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