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

 
 
> загрузчик по USB для at91sam7s256
romez777
сообщение Apr 3 2008, 11:53
Сообщение #1


Местный
***

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



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

Разбираюсь с at91, пишу простой бутлоадер по USB (без криптографии и пр.). Драйвер для USB - CDC, пример с сайта работает вполне исправно, слегка подточил для себя.

Атмеловскую доку почитал, но пока пребываю в конфузии smile.gif

1) Нужно написать простое приложение со стороны хоста (Windows) для загрузки образа на флеш - не совсем понимаю, как правильно порезать образ на равные блоки (вроде документация советует всегда записывать страницами?)
2) со стороны бутлоадера как определить, что текущий блок последний (с тем чтобы после его записи передать управление на залитое во флеш приложение). Нужно ли каждый блок предварять каким-то хедером?

Заранее благодарю за советы и замечания.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение Apr 5 2008, 12:38
Сообщение #2


Гуру
******

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



С таблицей векторов в случае SAM7 все достаточно прозрачно - можно сделать remap и расположить её в RAM, или использовать ту же таблицу, что и bootloader.

В самом загрузчике перед передачей управления следует сбросить использованную периферию и запретить прерывания.
Go to the top of the page
 
+Quote Post
romez777
сообщение Apr 7 2008, 01:12
Сообщение #3


Местный
***

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



Здравствуйте,

Цитата(aaarrr @ Apr 5 2008, 15:38) *
С таблицей векторов в случае SAM7 все достаточно прозрачно - можно сделать remap и расположить её в RAM, или использовать ту же таблицу, что и bootloader.

В самом загрузчике перед передачей управления следует сбросить использованную периферию и запретить прерывания.


наверное я что-то делаю неправильно smile.gif потому как не работает должным образом.

Вот так отключаю прерывания и сбрасываю процессор и периферию в бутлоадере ПЕРЕД передачей управления (пропустил инклюды и пр. для экономии места):
Код
typedef void (*funct)(void);

//* external functions
extern unsigned disableIRQ();

...

int main(void)
{
    AT91F_DBGU_Init();
    AT91F_DBGU_Printk("before jump\n\r");

    //Run the application
    ((funct)0x10058c)();

    disableIRQ();
    *AT91C_RSTC_RCR = 0xa500000d;    //Reset device
}


А вот здесь я получаю управление и включаю прерывания:
Код
//* external functions
extern unsigned enableIRQ();
...

int main(void)
{
   enableIRQ();

   AT91F_DBGU_Init();
   AT91F_DBGU_Printk("after jump\n\r");

   while (1)
   {
   }
}


Вот функции disableIRQ и enableIRQ:
Код
#define IRQ_MASK 0x00000080

static inline unsigned __get_cpsr(void)
{
    unsigned long retval;
    asm volatile (" mrs  %0, cpsr" : "=r" (retval) : /* no inputs */  );
    return retval;
}

static inline void __set_cpsr(unsigned val)
{
    asm volatile (" msr  cpsr, %0" : /* no outputs */ : "r" (val)  );
}

unsigned disableIRQ(void)
{
    unsigned _cpsr;
    _cpsr = __get_cpsr();
    __set_cpsr(_cpsr | IRQ_MASK);
    return _cpsr;
}

unsigned enableIRQ(void)
{
    unsigned _cpsr;

    _cpsr = __get_cpsr();
    __set_cpsr(_cpsr & ~IRQ_MASK);
    return _cpsr;
}


Все компилируется успешно, загружаю в флеш. На всякий случай проверяю SAM-BA, что образы находятся по нужным адресам (все корректно), запускаю: работает нестабильно, иногда печатается before jump, потом after jump (то есть переход происходит), а иногда в момент перехода на второей образ сыпется мусор. После пересброса платы все повторяется.

Что я делаю не так?

Благодарю за помощь!

PS. на всякий случай прикрепляю ld-скрипты.

Первое приложение, размер 1420 байт (0x58c):
Код
/* Memory Definitions */
MEMORY
{
  CODE (rx) : ORIGIN = 0x00100000, LENGTH = 0x00040000
  DATA (rw) : ORIGIN = 0x00200000, LENGTH = 0x00010000
  STACK (rw) : ORIGIN = 0x00204000,LENGTH = 0x00000000
}
...


Второе приложение (на которое передается управление):
Код
/* Memory Definitions */
MEMORY
{
  CODE (rx) : ORIGIN = 0x0010058c, LENGTH = 0x00040000
  DATA (rw) : ORIGIN = 0x00200000, LENGTH = 0x00010000
  STACK (rw) : ORIGIN = 0x00204000,LENGTH = 0x00000000
}

...
// все остальное по умолчанию
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 7 2008, 05:18
Сообщение #4


Гуру
******

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



Цитата(romez777 @ Apr 7 2008, 05:12) *
...
Вот так отключаю прерывания и сбрасываю процессор и периферию в бутлоадере ПЕРЕД передачей управления (пропустил инклюды и пр. для экономии места):
Код
typedef void (*funct)(void);

//* external functions
extern unsigned disableIRQ();

...

int main(void)
{
    AT91F_DBGU_Init();
    AT91F_DBGU_Printk("before jump\n\r");

    //Run the application
    ((funct)0x10058c)();

    disableIRQ();
    *AT91C_RSTC_RCR = 0xa500000d;    //Reset device
}

А в исходнике они отключаются ПОСЛЕ.
Это -
Код
*AT91C_RSTC_RCR = 0xa500000d;    //Reset device

- сбросит вообще все, а не только периферию.

Симулятором пройдитесь - может что прояснится.
Go to the top of the page
 
+Quote Post
romez777
сообщение Apr 7 2008, 06:09
Сообщение #5


Местный
***

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



Цитата(aaarrr @ Apr 7 2008, 08:18) *
А в исходнике они отключаются ПОСЛЕ.
Это -
Код
*AT91C_RSTC_RCR = 0xa500000d;    //Reset device

- сбросит вообще все, а не только периферию.


Переделал:
Код
disableIRQ();
*AT91C_RSTC_RCR = 0xa5000004;  // reset only peripherals

((funct)0x10058c)();


Не помогает, такое впечатление, что вообще не передает управление.

Цитата
Симулятором пройдитесь - может что прояснится.

О каком симуляторе речь? У меня Gnu-ARM тулчейн, в комплекте ничего похожего на симулятор нет.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 7 2008, 06:36
Сообщение #6


Гуру
******

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



Цитата(romez777 @ Apr 7 2008, 10:09) *
О каком симуляторе речь? У меня Gnu-ARM тулчейн, в комплекте ничего похожего на симулятор нет.

Печально. Ну, подсуньте бинарник симулятору из какого-нибудь другого пакета.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- romez777   загрузчик по USB для at91sam7s256   Apr 3 2008, 11:53
- - KAlex   Цитата(romez777 @ Apr 3 2008, 14:53) 1) Н...   Apr 3 2008, 12:20
|- - romez777   Цитата(KAlex @ Apr 3 2008, 15:20) Из PC л...   Apr 4 2008, 00:05
|- - aaarrr   Цитата(romez777 @ Apr 4 2008, 04:05) По 6...   Apr 4 2008, 06:11
|- - romez777   Цитата(aaarrr @ Apr 4 2008, 09:11) То ест...   Apr 4 2008, 07:37
|- - aaarrr   Цитата(romez777 @ Apr 4 2008, 11:37) что-...   Apr 4 2008, 07:43
|- - romez777   Цитата(aaarrr @ Apr 4 2008, 10:43) 1. Гов...   Apr 4 2008, 11:18
- - aaarrr   Размер и так будет известен, но лучше снабдить каж...   Apr 4 2008, 11:22
|- - romez777   Ага, таки хедер нужен - туда же можно и CRC помест...   Apr 4 2008, 13:28
|- - romez777   Еще такой вопрос: приложение, которое будет загруж...   Apr 5 2008, 04:06
- - aaarrr   Приложение должно быть собрано и слинковано: 1. Дл...   Apr 5 2008, 09:39
|- - romez777   ЦитатаПриложение должно быть собрано и слинковано:...   Apr 5 2008, 12:20
- - romez777   Цитата(aaarrr @ Apr 5 2008, 15:38) В само...   Apr 5 2008, 13:10
|- - aaarrr   Цитата(romez777 @ Apr 5 2008, 17:10) А в ...   Apr 5 2008, 13:17
||- - romez777   Цитата(aaarrr @ Apr 5 2008, 16:17) Да. В...   Apr 6 2008, 08:30
|- - KAlex   Цитата(romez777 @ Apr 5 2008, 16:10) А с ...   Apr 7 2008, 07:57
|- - romez777   Цитата(KAlex @ Apr 7 2008, 10:57) Ну на м...   Apr 7 2008, 23:25
|- - aaarrr   Цитата(KAlex @ Apr 7 2008, 11:57) Ну на м...   Apr 8 2008, 07:56


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

 


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


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