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

 
 
> Стартовый загрузчик, с нуля
ДЕЙЛ
сообщение Sep 2 2014, 09:34
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ДЕЙЛ
сообщение Feb 16 2015, 12:28
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 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;
}


Прикрепленные файлы
Прикрепленный файл  __________.rar ( 439.1 килобайт ) Кол-во скачиваний: 12
 
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ДЕЙЛ   Стартовый загрузчик   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


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

 


RSS Текстовая версия Сейчас: 28th July 2025 - 23:56
Рейтинг@Mail.ru


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