|
требуется совет по бутлоадеру |
|
|
|
May 8 2008, 02:17
|
Местный
  
Группа: Свой
Сообщений: 292
Регистрация: 9-11-04
Пользователь №: 1 077

|
Всем привет.
Нужен совет по организации загрузчика. Бутлоадер принимает образ приложения по USB, само фирмваре(загружаемое бутлоадером) также активно общается с хостом (посредством Windows приложения), никаких кнопок на устройстве нет.
Простой протокол загрузки фирмваре такой: бут посылает символ готовности, и после его приема Windows-приложение начинает заливать образ блоками, равными размеру страницы, приме и запись каждого блока подтверждается загрузчиком (отпавляется ack). Когда передача закончена, хост сообщает об этом бут-лоадеру и тот переходит на адрес, по которому залили приложение.
Нужно сделать как-то так, чтобы если в течение N секунд нет попытки заливать образ, лоадер сразу перескакивал на приложение. Не могу сообразить как это сделать. Может быть у вас будут какие-то соображения.
|
|
|
|
|
 |
Ответов
|
May 8 2008, 08:47
|
Знающий
   
Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246

|
Цитата(romez777 @ May 8 2008, 06:17)  Всем привет.
Нужен совет по организации загрузчика. Бутлоадер принимает образ приложения по USB, само фирмваре(загружаемое бутлоадером) также активно общается с хостом (посредством Windows приложения), никаких кнопок на устройстве нет.
Простой протокол загрузки фирмваре такой: бут посылает символ готовности, и после его приема Windows-приложение начинает заливать образ блоками, равными размеру страницы, приме и запись каждого блока подтверждается загрузчиком (отпавляется ack). Когда передача закончена, хост сообщает об этом бут-лоадеру и тот переходит на адрес, по которому залили приложение.
Нужно сделать как-то так, чтобы если в течение N секунд нет попытки заливать образ, лоадер сразу перескакивал на приложение. Не могу сообразить как это сделать. Может быть у вас будут какие-то соображения. Тут смотря что за устройство. Если у вас часть инициализации вашего устройсва заложено в загрузчик, то можно сделать например так: После включения питания запускается загрузчик и ждет команд для загрузки, в этот момент вы можете перешивать фирмваре. Потом даете некую команду запуска приложения, после которой стартует приложение и на команды загрузчика не отвечает. Если у вас прикладная программа знать не знает про загрузчик. То надо их как-то разделить каким-то событием, например переключателем. Прибор после включения питания смотрит на этот переключатель, если режим загрузчика, грузите загрузчик, в противном случае грузится программа.
Сообщение отредактировал Vitaliy_ARM - May 8 2008, 08:48
--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
|
|
|
|
|
May 9 2008, 03:09
|
Местный
  
Группа: Свой
Сообщений: 292
Регистрация: 9-11-04
Пользователь №: 1 077

|
Приветствую. Спасибо за советы, понятно в каком направлении двигаться  Теперь есть более практический вопрос: как обеспечить таймером длинные интервалы, скажем 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 */ Спасибо.
|
|
|
|
|
May 10 2008, 03:23
|
Местный
  
Группа: Свой
Сообщений: 292
Регистрация: 9-11-04
Пользователь №: 1 077

|
Цитата(romez777 @ May 9 2008, 06:09)  Спасибо за советы, понятно в каком направлении двигаться  Теперь есть более практический вопрос: как обеспечить таймером длинные интервалы, скажем 5секунд. С этим справился, но столкнулся с новой проблемой  Таймер не запускается, судя по всему. При этом, отрабатывая это на атмеловском примере из аппнота "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); }
|
|
|
|
|
May 10 2008, 05:39
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
May 10 2008, 05:52
|
Местный
  
Группа: Свой
Сообщений: 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 и ничего не печатается, просто виснет. Таки да, Вы были правы  это я прерывания включил, а клок так и висел отключенным. Посоветуйте, как правильно таймер отключить: в IDR поднять нужный бит или отключать клок?
|
|
|
|
Сообщений в этой теме
romez777 требуется совет по бутлоадеру May 8 2008, 02:17 InsolentS Можно так: когда прибор работает в пользовательско... May 8 2008, 04:38 ig_z Цитата(romez777 @ May 8 2008, 05:17) Нужн... May 8 2008, 08:16 meister Цитата(romez777 @ May 8 2008, 06:17) Нужн... May 8 2008, 09:02 Alechek Цитата(meister @ May 8 2008, 14:02) Единс... May 8 2008, 11:49 IEC Цитата(meister @ May 8 2008, 13:02) Время... May 8 2008, 13:23  meister Цитата(IEC @ May 8 2008, 17:23) Ну наприм... May 8 2008, 15:00 sergeeff А кто мешает в начале firmware предусмотреть код п... May 8 2008, 18:06
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|