romez777 0 8 мая, 2008 Опубликовано 8 мая, 2008 · Жалоба Всем привет. Нужен совет по организации загрузчика. Бутлоадер принимает образ приложения по USB, само фирмваре(загружаемое бутлоадером) также активно общается с хостом (посредством Windows приложения), никаких кнопок на устройстве нет. Простой протокол загрузки фирмваре такой: бут посылает символ готовности, и после его приема Windows-приложение начинает заливать образ блоками, равными размеру страницы, приме и запись каждого блока подтверждается загрузчиком (отпавляется ack). Когда передача закончена, хост сообщает об этом бут-лоадеру и тот переходит на адрес, по которому залили приложение. Нужно сделать как-то так, чтобы если в течение N секунд нет попытки заливать образ, лоадер сразу перескакивал на приложение. Не могу сообразить как это сделать. Может быть у вас будут какие-то соображения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
InsolentS 0 8 мая, 2008 Опубликовано 8 мая, 2008 · Жалоба Можно так: когда прибор работает в пользовательской программе (прошивке), комп посылает ему комманду, мол хочу тебя прошить, прибор понимает это и перескакивает на загрузчик. Стартует естественно с пользовательской. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ig_z 0 8 мая, 2008 Опубликовано 8 мая, 2008 · Жалоба Нужно сделать как-то так, чтобы если в течение N секунд нет попытки заливать образ, лоадер сразу перескакивал на приложение. Не могу сообразить как это сделать. Может быть у вас будут какие-то соображения. У атмеля есть 2 апнота на тему - одно пофундаментальней, другое попрактичней. И их подход более правильный (имхо). Пример использования подобных идей - хорошо известный жлинк. Там обеспечена полная неубиваемость прибора. Хотя у меня он все же каким то образом погиб. В двух словах идея звучит так: -При включении бутлоадер проверяет рабочую и буферную область флеши. Здесь д.б. возможны три варианта из четырех: 1. обе области имеют правильное содержимое. Тогда буферная облать переносится бутлоадером в рабочую и стартует. 2. буферная область не валидна. Стартует рабочая область. 3. рабочая область не валидна. Бутлоадер копирует буферную част в рабочую и стартует. Код апдейта буферной части принадлежит самому приложению и может быть сколь угодно сложным в транспортном и секретном смысле. Основная задача бутлоадера - делать правильный выбор между двумя копиями в рабочей и буферной области. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vitaliy_ARM 0 8 мая, 2008 Опубликовано 8 мая, 2008 (изменено) · Жалоба Всем привет. Нужен совет по организации загрузчика. Бутлоадер принимает образ приложения по USB, само фирмваре(загружаемое бутлоадером) также активно общается с хостом (посредством Windows приложения), никаких кнопок на устройстве нет. Простой протокол загрузки фирмваре такой: бут посылает символ готовности, и после его приема Windows-приложение начинает заливать образ блоками, равными размеру страницы, приме и запись каждого блока подтверждается загрузчиком (отпавляется ack). Когда передача закончена, хост сообщает об этом бут-лоадеру и тот переходит на адрес, по которому залили приложение. Нужно сделать как-то так, чтобы если в течение N секунд нет попытки заливать образ, лоадер сразу перескакивал на приложение. Не могу сообразить как это сделать. Может быть у вас будут какие-то соображения. Тут смотря что за устройство. Если у вас часть инициализации вашего устройсва заложено в загрузчик, то можно сделать например так: После включения питания запускается загрузчик и ждет команд для загрузки, в этот момент вы можете перешивать фирмваре. Потом даете некую команду запуска приложения, после которой стартует приложение и на команды загрузчика не отвечает. Если у вас прикладная программа знать не знает про загрузчик. То надо их как-то разделить каким-то событием, например переключателем. Прибор после включения питания смотрит на этот переключатель, если режим загрузчика, грузите загрузчик, в противном случае грузится программа. Изменено 8 мая, 2008 пользователем Vitaliy_ARM Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
meister 0 8 мая, 2008 Опубликовано 8 мая, 2008 (изменено) · Жалоба Нужно сделать как-то так, чтобы если в течение N секунд нет попытки заливать образ, лоадер сразу перескакивал на приложение. Не могу сообразить как это сделать. Может быть у вас будут какие-то соображения. Время измеряется таймером :) или в чем проблема? У меня общение и обновление идет по уарту, кнопок тоже нет. Есть специальная ветка в протоколе - "вход в обновление прошивки". После подачи питания запускается основная прошивка (если она корректна) и из нее можно вернуться в обновление. Единственная проблема, если бутлоадер распознает прошивку как "корректную", а вернуться к бутлоадеру из нее будет невозможно. Изменено 8 мая, 2008 пользователем meister Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alechek 0 8 мая, 2008 Опубликовано 8 мая, 2008 · Жалоба Единственная проблема, если бутлоадер распознает прошивку как "корректную", а вернуться к бутлоадеру из нее будет невозможно. Ага, у меня так и сделано. Только для подстраховки есть еще на плате "переключатель". Загрузчик смотрит на него и думает, а запускать ли основную. Пока еще ни разу не пришлось этим воспользоватся. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IEC 1 8 мая, 2008 Опубликовано 8 мая, 2008 · Жалоба Время измеряется таймером :) или в чем проблема? У меня общение и обновление идет по уарту, кнопок тоже нет. Есть специальная ветка в протоколе - "вход в обновление прошивки". После подачи питания запускается основная прошивка (если она корректна) и из нее можно вернуться в обновление. Единственная проблема, если бутлоадер распознает прошивку как "корректную", а вернуться к бутлоадеру из нее будет невозможно. Ну например загрузчик может проверять код программы по контрольной сумме. При прошивке контрольная сумма прошивается последней:-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
meister 0 8 мая, 2008 Опубликовано 8 мая, 2008 · Жалоба Ну например загрузчик может проверять код программы по контрольной сумме. При прошивке контрольная сумма прошивается последней:-) Я вот об этом: если прошить вот такое обновление с правильной контрольной суммой int main() { выкл(); } будет оцень грустно. У меня на столе случился другой вариант: было несколько версий плат с разной разводкой и разными кварцами и я перепутал файл. CRC, естественно, сошлась. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 8 мая, 2008 Опубликовано 8 мая, 2008 · Жалоба А кто мешает в начале firmware предусмотреть код прошивки или версию прошивки (кому как нравится)? И если он для платы версии XXX - заливать, а если от YYY - нет. Мы так много лет делаем в серийном производстве. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
romez777 0 9 мая, 2008 Опубликовано 9 мая, 2008 · Жалоба Приветствую. Спасибо за советы, понятно в каком направлении двигаться :) Теперь есть более практический вопрос: как обеспечить таймером длинные интервалы, скажем 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 */ Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
romez777 0 10 мая, 2008 Опубликовано 10 мая, 2008 · Жалоба Спасибо за советы, понятно в каком направлении двигаться :) Теперь есть более практический вопрос: как обеспечить таймером длинные интервалы, скажем 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); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 10 мая, 2008 Опубликовано 10 мая, 2008 · Жалоба /* Disable the clock and the interrupts */ AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKDIS; А Enable clock где-то потерялось... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
romez777 0 10 мая, 2008 Опубликовано 10 мая, 2008 · Жалоба А Enable clock где-то потерялось... Так вот он: AT91C_BASE_TC0->TC_IER = AT91C_TC_CPCS; Но IMHO дело где-то глубже. Ибо ставлю print-ы в configure_tc и ничего не печатается, просто виснет. Таки да, Вы были правы :) это я прерывания включил, а клок так и висел отключенным. Посоветуйте, как правильно таймер отключить: в IDR поднять нужный бит или отключать клок? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 10 мая, 2008 Опубликовано 10 мая, 2008 · Жалоба Посоветуйте, как правильно таймер отключить: в IDR поднять нужный бит или отключать клок?Смотря чего вы хотите - чтобы таймер стоял отключайте тактирование, чтобы просто чтобы прерывания с него не сыпались - запрещайте прерывания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться