|
|
  |
bootloader в IARe 3,10, Помогите разобраться как сделать |
|
|
|
Jul 13 2006, 08:20
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(arttab @ Jul 13 2006, 10:33)  Сергей Борщ, не моглибы Вы прокоментировать мои изыскания: Постараюсь по мере возможностей. Сначала сделаю отступление: эти функции я в своей работе пока не использую, поскольку в части проектов у меня загрузчик написан на асме а в части я использую AES Loader из аппликашки Атмела. С этими функциями я баловался еще в версии 2.28 (сейчас нашел тот исходник, там судя по исходнику их прототипы были описаны в pgmspace.h. Вот тот исходник: Код #include <iom8.h> #include <inavr.h> #include <pgmspace.h>
void ErasePage (unsigned char page);
const __root __flash unsigned char TestFill[64] @ (0x10 << 6) = {1,2,3,4,5};
void main (void) { DDRC = (1<<2)|(1<<3); PORTC = 0; ErasePage(0x10); for(;;) PORTC ^= (1<<2);
}
void ErasePage(unsigned char page) @ "BLS" { _SPM_ERASE((unsigned int)page << 6); while(SPMCR & (1<<SPMEN)) PORTC |= (1<<3); __DataToR0ByteToSPMCR_SPM(0, (1<<RWWSRE)|(1<<SPMEN)); }
Сообщение отредактировал Сергей Борщ - Jul 13 2006, 08:21
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jul 14 2006, 08:24
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Цитата(arttab @ Jul 14 2006, 09:57)  Люди, подскажите - есть ли в IAR функции для самопрограмирования? Очистить буфер, занести слово в буфер, записать буфер, биты защиты выстывить.... Вот выдержка из проекта AVR109 - Self-programming с сайта Atmel: Код /***************************************************************************** * * Atmel Corporation * * File : flash.h * Compiler : IAR C 3.10C Kickstart * Revision : $Revision: 1.1 $ * Date : $Date: 2005/07/18 07:39:01 $ * Updated by : $Author: Atmel $ * * Support mail : avr@atmel.com * * Target platform : All AVRs with bootloader support * * AppNote : AVR109 - Self-programming * * Description : Flash operations for AVR109 Self-programming ****************************************************************************/
#define _GET_LOCK_BITS() __AddrToZByteToSPMCR_LPM( (void __flash *) 0x0001, 0x09 ) #define _GET_LOW_FUSES() __AddrToZByteToSPMCR_LPM( (void __flash *) 0x0000, 0x09 ) #define _GET_HIGH_FUSES() __AddrToZByteToSPMCR_LPM( (void __flash *) 0x0003, 0x09 ) #define _GET_EXTENDED_FUSES() __AddrToZByteToSPMCR_LPM( (void __flash *) 0x0002, 0x09 ) #define _SET_LOCK_BITS(data) __DataToR0ByteToSPMCR_SPM( data, 0x09 ) #define _ENABLE_RWW_SECTION() __DataToR0ByteToSPMCR_SPM( 0x00, 0x11 )
#define _WAIT_FOR_SPM() while( SPMCR_REG & (1<<SPMEN) );
#ifndef LARGE_MEMORY #define _LOAD_PROGRAM_MEMORY(addr) __load_program_memory( (const unsigned char __flash *) (addr) ) #define _FILL_TEMP_WORD(addr,data) __AddrToZWordToR1R0ByteToSPMCR_SPM( (void __flash *) (addr), data, 0x01 ) #define _PAGE_ERASE(addr) __AddrToZByteToSPMCR_SPM( (void __flash *) (addr), 0x03 ) #define _PAGE_WRITE(addr) __AddrToZByteToSPMCR_SPM( (void __flash *) (addr), 0x05 ) #else #define _LOAD_PROGRAM_MEMORY(addr) __extended_load_program_memory( (const unsigned char __farflash *) (addr) ) #define _FILL_TEMP_WORD(addr,data) __AddrToZ24WordToR1R0ByteToSPMCR_SPM( (void __farflash *) (addr), data, 0x01 ) #define _PAGE_ERASE(addr) __AddrToZ24ByteToSPMCR_SPM( (void __farflash *) (addr), 0x03 ) #define _PAGE_WRITE(addr) __AddrToZ24ByteToSPMCR_SPM( (void __farflash *) (addr), 0x05 ) #endif Как видите, всё есть.
|
|
|
|
|
Jul 14 2006, 08:32
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(arttab @ Jul 14 2006, 09:57)  Люди, подскажите - есть ли в IAR функции для самопрограмирования? Очистить буфер, занести слово в буфер, записать буфер, биты защиты выстывить.... ой мама... "На колу мочало...". В intrinsics.h есть макросы >Очистить буфер, занести слово в буфер, _SPM_FILLTEMP(Addr,Data) > записать буфер, _SPM_PAGEWRITE(Addr) >биты защиты выстывить _SPM_LOCKBITS(Data) Там же полезные _SPM_ERASE(Addr) _SPM_GET_LOCKBITS() _SPM_GET_FUSEBITS() Они вызывают "в IAR функции для самопрограмирования": Код __DataToR0ByteToSPMCR_SPM() __AddrToZByteToSPMCR_SPM() __AddrToZWordToR1R0ByteToSPMCR_SPM() Или я опять вопроса не понял?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jul 14 2006, 09:08
|

Профессионал
    
Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371

|
или я чего туплю или как.... не понимаю как ими воспользоваться. __AddrToZByteToSPMCR_SPM((void __flash*)(Addr), 0x03) сдесь понятно: номер страници и вперед А я ковырялся с /* SPM */
/* __DataToR0ByteToSPMCR_SPM, pseudo code. MOV R0,data OUT SPMCR,byte SPM */ __intrinsic void __DataToR0ByteToSPMCR_SPM(unsigned char data, unsigned char byte);
и не всегда мог понять для чего они. Получается надо смотреть, то что начинается с #define:
_SPM_LOCKBITS(Data) // где data 1 байт. установить биты защиты _SPM_ERASE(Addr) // Addr 2 Байта 11-5 биты. стереть страницу _SPM_FILLTEMP(Addr,Word) //Addr 2 Байта (4-0 биты), word 2 Байта. слово в буфер _SPM_PAGEWRITE(Addr) //Addr 2 Байта 11-5 биты. запись страници unsigned char t = _SPM_GET_LOCKBITS() //чтение байта защиты unsigned char t =_SPM_GET_FUSEBITS() // чтение байта конфигурации
А вот что за эти команды: #define _SPM_24_ERASE(Addr) и т.д. с цифрой 24? Нехватает команды очиски буфера и макроса ожидания выпоkytybz операции. Ладно, носом ткнули, буду еще смотреть аплек109. Спасибо
--------------------
OrCAD, Altium,IAR, AVR....
|
|
|
|
|
Jul 17 2006, 07:59
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(arttab @ Jul 14 2006, 12:08)  или я чего туплю или как.... не понимаю как ими воспользоваться.
__intrinsic void __DataToR0ByteToSPMCR_SPM(unsigned char data, unsigned char byte);
и не всегда мог понять для чего они. а... Я-то думал вы сначала даташит про bootloader прочитали... Setting the Boot Loader Lock Bits by SPM To set the Boot Loader Lock Bits, write the desired data to R0, write “X0001001” to SPMCR and execute SPM within four clock cycles after writing SPMCR. Интересно, что же может делать функция с загадочным названием __DataToR0ByteToSPMCR_SPM? Цитата А вот что за эти команды: #define _SPM_24_ERASE(Addr) и т.д. с цифрой 24? Не пользовался, но могу предположить что для процессоров с более 64К памяти, т.е. с адресом в 24 бита? Цитата Нехватает команды очиски буфера и макроса ожидания выпоkytybz операции. Ну нет в функциях команды SPM очистки буфера The temporary buffer will auto-erase after a page write operation or by writing the RWWSRE bit in SPMCR. А макрос может выглядеть так: while(SPMCR & (1<<SPMEN)); Цитата(arttab @ Jul 15 2006, 14:42)  2. В main #include "flash.h". Библиотеку flash.h найти в папках IAR не удалось. Согласно правилам языка высокого уровня С если имя файла в директиве #include указано в двойных кавычках то компилятор ищет его в текущей директории, т.е. в папке проекта. Если же в угловых - то в папках указанных компилятору в опциях как include path. Поэтому flash.h искать в папках IAR не имело смысла - он должен быть в исходниках от "аплекухи 910".
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jul 17 2006, 08:10
|

Профессионал
    
Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371

|
Цитата Согласно правилам языка высокого уровня С если имя файла в директиве #include указано в двойных кавычках то компилятор ищет его в текущей директории, т.е. в папке проекта. Если же в угловых - то в папках указанных компилятору в опциях как include path. Поэтому flash.h искать в папках IAR не имело смысла - он должен быть в исходниках от "аплекухи 910". Это я знаю. Но до меня не доходило такое #define _GET_LOCK_BITS() __AddrToZByteToSPMCR_LPM( (void __flash *) 0x0001, 0x09 ) т.е. функции самопрограмирования в IAR есть, но для удобства их использования делаются присвоение и вызов с параметрами. А я в хелпе IAR искал и не мог найти таких команд. Эх Си- 280 строчек- 914 Байт. Лень на асеме писать
--------------------
OrCAD, Altium,IAR, AVR....
|
|
|
|
|
Jul 17 2006, 10:26
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(arttab @ Jul 17 2006, 12:47)  Новая проблема: пытаюсь сгенерить hex а IAR ругается Fatal Error[e72]: Segment TINY_Z must be defined in a segment definition option (-Z, -b or -P) В дебагере все легло ровно, а здесь проблемы. В какой должен быть выходной формат или в экстра опциях линкера прописать чего надо? Видимо в настройках проекта стоит настройка memory model: Tiny а файл .xcl взят с "s" на конце, т.е. для модели памяти Small. Измените настройку на Small и все должно заработать. Кстати, интересно как "В дебагере все легло ровно", ведь файл для дебаггера тоже генерит линкер и с теми же самыми параметрами... Или это после переключения target с debug на release? Тогда понятно - надо сравнить модель памяти и выбранный .xcl в обоих targets.
Сообщение отредактировал Сергей Борщ - Jul 17 2006, 10:27
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jul 17 2006, 15:16
|

Частый гость
 
Группа: Свой
Сообщений: 175
Регистрация: 26-01-06
Из: Sevastopol
Пользователь №: 13 664

|
Рекомендую посмотреть на мой проект Crypto-Boot (только как reference, а не образец для подражания - см. его README) на сайте разработчика USB драйвера для AVR. Возможно, часть вопросов снимется. Там реализован USB boot loader для меги32, использующий программную реализацию USB. Загрузчик позволяет, в частности, перешивать код приложения по тому же USB интерфейсу, что и само приложение может использовать. Загрузчик использует перемещение вектора прерывания в область бута для работы бута независимо от приложения (вопросы BOOTRST, и управления переключением вектора). Загрузчик поддерживает работу с серийными номерами и версиями бута и приложения, в т.ч. чтение последних бутом из области приложения для передачи утилите на PC. Очевидно, такой же подход можно использовать и в обратном направлении - используя вызовы каких-то функций, размещенных в области загрузчика, из области приложения. Я бы для такой цели (если иного варианта не видится) использовал таблицу переходов типа rjmp на начало нужных функций в буте, размещенную по фиксированному адресу в области бута. Тогда на них можно будет ссылаться из независимо собранного приложения, прописав только их адреса (которые фиксированы и известны независимо от сборки бута. Как прописать - см. там же, как вызывается приложение по адресу 0 из бута. Тут будет обратная картина. Я бы не совмещал вектора прерываний в буте и использующее их приложение в области application, так как возможности менять таблицу векторов бута нет, а меняя IVSEL, мы автоматом теряем возможность работы функций обработки прерываний в области бута (если не продублируем вектора во второй таблице). В общем, при таком подходе проблем будет намного больше, чем при раздельной сборке того и другого. Но если очень прижмет - то можно попробовать. Проект, как там написано, без комментариев, только как reference (хотя у меня работает). На конкретный вопрос ответить смогу. На вопрос "как все это собрать, чтобы заработало" - нет. Проект искать тут, называется Crypto-Boot (с парапланом в качестве иллюстрации). Собирался под IAR 4.12.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|