|
Стартовый загрузчик, с нуля |
|
|
|
Sep 2 2014, 09:34
|
Местный
  
Группа: Участник
Сообщений: 234
Регистрация: 7-11-13
Пользователь №: 79 085

|
Хочется понять, как работает эта штука? В моём представлении это маленькая программа, находящаяся где-то в хвосте флеш-памяти. При старте начинается выполнение программы с нулевого адреса, где проверяется выполнение какого-то условия, например, уровень на определённой ножке. Если условие выполняется, то следует инструкция вроде JMP Bootloader, т.е. переход в область флеш, содержащей команды загрузчика, которые выполняет ЦПУ. Загрузчик принимает данные в виде файла *.bin по какому-либо интерфейсу МК, эти данные он раскладывает во флеш-памяти, затирая старую версию прошивки. Причём в новой версии программы должна быть та же самая процедура перехода в область загрузчика на случай следующего обновления. Если в этом месте мысли правильные, то дальше имеются мысли по поводу организации самопального загрузчика: 1. Пишется программа загрузчика - процедуры приёма и раскладки данных в памяти, компилируется в виде файла *.bin. 2. Пишется программа для записи полученного файла куда-нибудь в дальний угол памяти, начиная с определённого адреса, допустим 0х1000000. Всё, загрузчик находится в памяти. 3. Пишем рабочую программу, которая в самом начале содержит условие с переходом вроде JMP 0x1000000. Размер прошивки должен быть всегда такой, чтобы не затёрся код загрузчика.
Примерно такие у меня измышления. Насколько они правильные? Если правильные, то имеются попутные вопросы: 1. Как организовать запись байта по определённому адресу флеш на С в IAR? 2. В MSP430 перед изменением флеш нужно предварительно настроить контроллер флеш-памяти. Как обстоит дело в LPC1778? 3. Если в LPC1778 прошивка записывается через UART0, то там уже есть загрузчик? Если он есть, то можно ли его случайно стереть?
Где можно подробнее почитать на эту тему с самого нуля с пошаговой инструкцией создания загрузчика?
P.S Вынтернете гуглил на эту тему ровно несколько минут, попадались всякие описания загрузчиков планшетов, смартфонов и прочих девайсов.
Сообщение отредактировал ДЕЙЛ - Sep 2 2014, 09:39
|
|
|
|
|
 |
Ответов
|
Feb 16 2015, 12:28
|
Местный
  
Группа: Участник
Сообщений: 234
Регистрация: 7-11-13
Пользователь №: 79 085

|
Оставлю тут свой код загрузчика на всякий случай, а то на домашнем компе ненадёжно. Программа принимает файл от прикреплённой программы, написанной на DELPHI. Успеть отправить надо в течение минуты после сброса. Код #include "iolpc1778.h" #include "LPC17xx.h"
#define IAP_LOCATION 0x1fff1ff1 //точка входа в IAP (страница 896 мануала) unsigned int command[5]; unsigned int result[2]; typedef void (*IAP)(unsigned int[], unsigned int[]);
unsigned char DATA[30000]; unsigned int command[5]; unsigned int result[2]; unsigned char RX; unsigned int index_RX; unsigned char RX_PAKET[18]; unsigned char CHSUM, FlagRX; unsigned int indexM, pauza, i; unsigned int adr_copy, stek; unsigned int *adres_stek; unsigned char OutPortByte; int sektor;
void Out_UART0(); //otpravka paketa po UART0
void main(void) { { //INIT
{ //init UART0 IOCON_P1_25 = 0; //PIO FIO1DIR = 0x2200000; //Выходы PIN1_25, PIN1_11 PCONP |= 0x8; IOCON_P0_02 = 0x1; IOCON_P0_03 = 0x1; }
FIO0DIR = 0x4+0x8; SCS |= 0x20; //подключение осциллятора while(!(SCS&0x40)){} //ожидание запуска PLL0CON |= 0x01; PLL0CFG |= 0x09; PLL0FEED = 0xAA; PLL0FEED = 0x55; CCLKSEL |= 0x100;
PCLKSEL = 1; CLKSRCSEL |= 1; U0LCR |= 0x83; //razrecchenie dostupa k delitely U0DLL = 0xC8; //0xF0;//0xA0; //0x14; //0x4E; //nastrojka delitelya U0LCR &=~0x80; //zapret dostupa k delitely U0IER |= 0x1+0x4;//Разрешение прерываний UART0
//__enable_irq(); //Разрешение //__set_FAULTMASK(0); //всех прерываний //__set_BASEPRI(0); //Отключение маскирования //__set_CONTROL(0); AIRCR = 0x05FA0200; IP1 = 0x00000800; } NVIC_EnableIRQ(UART0_IRQn); //Enable IRQ UART0 (ISER0=32) indexM = 0; index_RX = 1;
while(1) { if (index_RX>5) { if ((DATA[index_RX-1]==0x11)&(DATA[index_RX-2]==0x22)&(DATA[index_RX-3]==0x33)&(DATA[index_RX-4]==0x44)) самопальный признак конца файла HEX { FlagRX = 0; //COPY_FLASH adr_copy = (unsigned int)&DATA[4096]; IAP iap_entry; iap_entry = (IAP) IAP_LOCATION;
for (sektor=1; sektor<5; sektor++) { //_______ПОДГОТОВИТЬ СЕКТОР К ЗАПИСИ_______// {
command[0] = 50; //код команды command[1] = sektor; //начальный номер сектора command[2] = sektor; //конечный номер сектора iap_entry (command, result); } //_______ПОДГОТОВИЛИ СЕКТОР К ЗАПИСИ______//
//_______СТЕРЕТЬ СЕКТОР_______// {
command[0] = 52; //код команды command[1] = sektor; //начальный номер сектора command[2] = sektor; //конечный номер сектора command[3] = 120000; //системная тактовая частота в кГц iap_entry (command, result); } //_______СТЁРЛИ СЕКТОР______// //_______ПОДГОТОВИТЬ СЕКТОР К ЗАПИСИ_______// {
command[0] = 50; //код команды command[1] = sektor; //начальный номер сектора command[2] = sektor; //конечный номер сектора iap_entry (command, result); } //_______ПОДГОТОВИЛИ СЕКТОР К ЗАПИСИ______//
//_______КОПИРОВАТЬ ОПЕРАТИВНУЮ ПАМЯТЬ ВО ФЛЕШ_______// {
command[0] = 51; //код команды command[1] = 0x1000*sektor; //начальный адрес перезаписываемой флеш command[2] = adr_copy+4096*(sektor-1); //начальный адрес оперативной памяти, откуда нужно копировать command[3] = 4096; //число байт для копирования command[4] = 120000; //системная тактовая частота в кГц iap_entry (command, result);
} //_______СКОПИРОВАЛИ СЕКТОР______//
//END_FLASH }
VTOR = 0x1000; adres_stek = (unsigned int*)0x1000; stek = (unsigned int)*adres_stek; __set_MSP(stek);
asm("mov R1, #0x1004"); asm("ldr R2, [R1]"); asm("BX R2");
} } }
}
void Out_UART0() { while (!(U0LSR&0x20)); U0THR=0xA0; //признак ответа для программы на ПК }
void UART0_IRQHandler(void)
{ DATA[index_RX] = U0RBR; index_RX++; NVIC_ClearPendingIRQ(UART0_IRQn); return; }
|
|
|
|
Сообщений в этой теме
ДЕЙЛ Стартовый загрузчик Sep 2 2014, 09:34 smalcom Цитатанаходящаяся где-то в хвосте флеш-памяти
нет.... Sep 2 2014, 10:40 ДЕЙЛ Цитата(smalcom @ Sep 2 2014, 14:40) нет. ... Sep 2 2014, 11:43  adnega Цитата(ДЕЙЛ @ Sep 2 2014, 15:43) В начале... Sep 2 2014, 12:22 Lagman А если загрузчик и программа используют одно преры... Sep 2 2014, 11:47 ДЕЙЛ Цитата(Lagman @ Sep 2 2014, 15:47) А если... Sep 3 2014, 06:25  adnega Цитата(ДЕЙЛ @ Sep 3 2014, 10:25) Думаю, ч... Sep 3 2014, 06:29 AlexandrY Цитата(ДЕЙЛ @ Sep 2 2014, 12:34) 3. Если ... Sep 2 2014, 12:37 esaulenka Цитата(AlexandrY @ Sep 2 2014, 16:37) LPC... Sep 8 2014, 12:46 Сергей Борщ Справа вверху кнопка "Поиск", в выпадающ... Sep 2 2014, 13:10 ДЕЙЛ Цитата(Сергей Борщ @ Sep 2 2014, 17:10) В... Sep 3 2014, 06:47  adnega Цитата(ДЕЙЛ @ Sep 3 2014, 10:47) я свои и... Sep 3 2014, 07:53   ДЕЙЛ Цитата(adnega @ Sep 3 2014, 11:21) Дык, в... Sep 3 2014, 08:09 Сергей Борщ Цитата(ДЕЙЛ @ Sep 3 2014, 09:25) Думаю, ч... Sep 3 2014, 07:56 ДЕЙЛ Есть ещё вопрос по безусловному переходу.
если на... Sep 3 2014, 10:34 menzoda ЦитатаУже интереснее. Как это сделать в IAR?
Есть ... Sep 4 2014, 05:33  ДЕЙЛ Цитата(menzoda @ Sep 4 2014, 09:33) 2. Ес... Sep 5 2014, 10:08   menzoda Цитата(ДЕЙЛ @ Sep 5 2014, 14:08) А если у... Sep 5 2014, 10:45    ДЕЙЛ Цитата(menzoda @ Sep 5 2014, 14:45) Может... Sep 5 2014, 11:09     menzoda В кратце опишу, как я это вижу. Подробности поведе... Sep 5 2014, 13:25      ДЕЙЛ Покопался в настройках линкера, нашёл настройки ли... Oct 6 2014, 21:21       menzoda ЦитатаВ каком известном векторе прерывания находит... Oct 8 2014, 05:17        ДЕЙЛ Цитата(menzoda @ Oct 8 2014, 09:17) Во-пе... Oct 8 2014, 18:57 ДЕЙЛ Цитата(ДЕЙЛ @ Sep 3 2014, 14:34) Есть ещё... Sep 5 2014, 07:49 andrewlekar Вот исходники загрузчика для LPC178X. Практически ... Sep 8 2014, 06:39 ДЕЙЛ Пока в исходник загрузчика глубоко не влазил. Хочу... Sep 30 2014, 10:35 Сергей Борщ Цитата(ДЕЙЛ @ Sep 30 2014, 13:35) В мануа... Sep 30 2014, 11:36  ДЕЙЛ Цитата(Сергей Борщ @ Sep 30 2014, 15:36) ... Sep 30 2014, 12:50   Lagman Цитата(ДЕЙЛ @ Sep 30 2014, 16:50) Но ведь... Sep 30 2014, 14:00 toweroff ДЕЙЛ, я, конечно, ничего против не имею, но такая ... Oct 8 2014, 14:52 menzoda Не надо ничего сдвигать на 7 битов! Прочитай в... Oct 8 2014, 19:17 ДЕЙЛ Цитата(menzoda @ Oct 8 2014, 23:17) Не на... Oct 8 2014, 19:42 ДЕЙЛ Почему-то в пашаговом режиме после перехода по адр... Oct 8 2014, 20:55 menzoda Не так считаешь. Векторов прерываний 51, в байтах ... Oct 9 2014, 04:54 ДЕЙЛ насчёт перескока на 2кб на какой странице мануала ... Oct 9 2014, 06:47  menzoda Цитатанасчёт перескока на 2кб на какой странице ма... Oct 9 2014, 07:30   ДЕЙЛ Цитата(menzoda @ Oct 9 2014, 11:30) То ес... Oct 9 2014, 08:53 menzoda ЦитатаМошть ещё нужно указатель стека на нужное ме... Oct 9 2014, 10:15 ДЕЙЛ Железно заработало
дело было ещё и в указателе ... Oct 9 2014, 19:26 menzoda ЦитатаЖелезно заработало
Наконец! Всем миром з... Oct 10 2014, 04:59
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|