Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Пример AVR231. AES шифрование для bootloader
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Jhohn
Использую пример AVR231: AES Bootloader

1) создал файл gentemp.exe Config.txt

Код
PAGE_SIZE      = [FILL IN: Target AVR page size in bytes]
MEM_SIZE       = [FILL IN: Application Section size in bytes]
CRC_ENABLE     = [FILL IN: YES/NO]
KEY1           = FE6807733E9702E34D6759A56A8D4A46078E
KEY2           = 1F555D210E89036971
KEY3           = FE0EE7FD837569EFE4
INITIAL_VECTOR = 789280B50E473F2303EB08E795D5A72F
SIGNATURE      = 8FB5DF40


Подправил для AT90usb647 и для размера данных в файле flash.hex:
Код
PAGE_SIZE      = 256
MEM_SIZE       = 256
CRC_ENABLE     = YES


2) закинул в папку файл flash.hex и использовал команду create -c Config.txt -f flash.hex -o update.enc и... в ответ тишина, заветный файл update.enc не создается
flash.hex:
Код
:100000000C946500000000000000000000000000EB
:1000100000000000000000000000000000000000E0
:1000200000000000000000000000000000000000D0
:1000300000000000000000000000000000000000C0
:1000400000000000000000000000000000000000B0
:1000500000000000000000000000000000000000A0
:100060000000000000000000000000000000000090
:100070000000000000000000000000000000000080
:100080000000000000000000000000000000000070
:100090000000000000000000249A2C9A0FEF12E5E7
:1000A00027E0015010402040E1F700C000002C98EC
:1000B0000FEF12E527E0015010402040E1F700C0AB
:1000C0000000EBCF00008895FECF0FE30DBF01E0ED
:1000D0000EBFC0E4D3E00E9473000E944C000E9457
:1000E00062000C94620001E008950000000000002E
:1000F0000000000000000000000000000000000000


Но если уменьшить размер данных flash.hex на 2 байта

Код
:100000000C946500000000000000000000000000EB
:1000100000000000000000000000000000000000E0
:1000200000000000000000000000000000000000D0
:1000300000000000000000000000000000000000C0
:1000400000000000000000000000000000000000B0
:1000500000000000000000000000000000000000A0
:100060000000000000000000000000000000000090
:100070000000000000000000000000000000000080
:100080000000000000000000000000000000000070
:100090000000000000000000249A2C9A0FEF12E5E7
:1000A00027E0015010402040E1F700C000002C98EC
:1000B0000FEF12E527E0015010402040E1F700C0AB
:1000C0000000EBCF00008895FECF0FE30DBF01E0ED
:1000D0000EBFC0E4D3E00E9473000E944C000E9457
:1000E00062000C94620001E008950000000000002E
:0E00F000000000000000000000000000000002


или увеличить MEM_SIZE = 258 на 2 байта
ТО файл создается.

Что-то я недопонимаю: что я не так делаю? Эти махинации с данными и отсутствие логики меня напрягают.
MrYuran
Цитата
PAGE_SIZE = 256
MEM_SIZE = 256
CRC_ENABLE = YES

Ну и куда прикажете CRC пихать?
Как раз 2 байта.
Может, я и не прав, но в глаза бросается.
Alekseeey
Цитата(Jhohn @ Nov 11 2010, 14:09) *
Использую пример AVR231: AES Bootloader

1) создал файл gentemp.exe Config.txt

Код
PAGE_SIZE      = [FILL IN: Target AVR page size in bytes]
MEM_SIZE       = [FILL IN: Application Section size in bytes]
CRC_ENABLE     = [FILL IN: YES/NO]
KEY1           = FE6807733E9702E34D6759A56A8D4A46078E
KEY2           = 1F555D210E89036971
KEY3           = FE0EE7FD837569EFE4
INITIAL_VECTOR = 789280B50E473F2303EB08E795D5A72F
SIGNATURE      = 8FB5DF40


Подправил для AT90usb647 и для размера данных в файле flash.hex:
Код
PAGE_SIZE      = 256
MEM_SIZE       = 256
CRC_ENABLE     = YES



Что-то я недопонимаю: что я не так делаю? Эти махинации с данными и отсутствие логики меня напрягают.


MEM_SIZE задан не правильно. Например, для atmega16 он должен быть 14336 байт.

В документе doc2541.pdf есть таблица 4 на стр. 10. Значение MEM_SIZE нужно брать оттуда. Для 64К он должен быть 57344.

Файл *.enc - это не просто данные, там сырец для вывода в бутлоадер. Там могут быть фейковые данные для затруднения расшифровки, команды и т. д.
Jhohn
Цитата(Alekseeey @ Nov 11 2010, 14:19) *
MEM_SIZE задан не правильно. Например, для atmega16 он должен быть 14336 байт.
В документе doc2541.pdf есть таблица 4 на стр. 10. Значение MEM_SIZE нужно брать оттуда. Для 64К он должен быть 57344.

Config.txt:
Код
PAGE_SIZE      = 256
MEM_SIZE       = 57344
CRC_ENABLE     = YES
KEY1           = FE6807733E9702E34D6759A56A8D4A46078E
KEY2           = 1F555D210E89036971
KEY3           = FE0EE7FD837569EFE4
INITIAL_VECTOR = 789280B50E473F2303EB08E795D5A72F
SIGNATURE      = 8FB5DF40


- результат тот же: файл update.enc не создается

Цитата(Alekseeey @ Nov 11 2010, 14:19) *
Файл *.enc - это не просто данные


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

Код
CRC_ENABLE     = NO


и заветный файл создался.

Спасибо!
Alekseeey
Цитата(Jhohn @ Nov 11 2010, 15:12) *
Вы правы, я думал, что он должен был создавать файл без вставки CRC, и что при создании файла CRC не учитывается. В этом была ошибка, при создании шифрованного файла он подсчитывает CRC, я отключил CRC:

Код
CRC_ENABLE     = NO


и заветный файл создался.

Спасибо!



Хм.

Опишу собственный опыт применения решения Atmel для реализации бутлоадера с шифрованием AES для микроконтроллера atmega16 (я думаю, что atmel не стал придумывать новых сущностей для других контроллеров и нижеследующее поможет топикстартеру):

1. Сначала создаем config.txt с ключами:
gentemp.exe config.txt

2. Редактируем config.txt, где задаем параметры PAGE_SIZE, MEM_SIZE, по даташиту для своего микроконтроллера.

3. Создаем файлы для проекта бутлоадера, который впоследствии будем прошивать в микроконтроллер:
create.exe -c config.txt -h bootldr.h -k AESkeys.inc

(Если CRC_ENABLE = YES, то в файле bootldr.h появится строка #define CRC_CHECK)

4. Компилируем проект бутлоадера, способного принять наш файл *.enc, закодированный ключами из созданного в п. 1 config.txt, вставив туда сгенерированные в п. 3 файлы.
Если в проекте была определено CRC_CHECK, то бутлоадер при старте будет проверять контрольную сумму всей прошивки в памяти, и, при несовпадении, переходить в цикл ожидания данных.
Вот кусок кода из bootldr.c:

Код
        #ifdef CRC_CHECK
        // Check that the Application Section contents is undamaged
        // by calculating the CRC of the whole memory.
        {
            unsigned int crc = 0;
            unsigned char APPFLASH *p = (unsigned char APPFLASH *)0x000000;
            unsigned char APPFLASH *n = (unsigned char APPFLASH *)MEM_SIZE;
    
            do
            {
                crc = CRC(crc, *p++);
            }
            while (--n);
    
            // Application Section damaged
            //   -> do not jump to Reset Vector of the Application Section
            if (crc)
                continue;
        }



5. Прошиваем проект бутлоадера в микроконтроллер, выставив фьюзы запуска бутлоадера после сброса.

6. Генерируем файл *.enc для последующей загрузки его бутлоадером
create.exe -c config.txt -f test.hex -o update.enc

7. Включаем отладочную плату и обновляем прошивку:
update.exe update.enc -COM1 -115200

Все.

Сейчас лезть в код бутлоадера мне недосуг, но помнится, что контрольную сумму бутлоадер вычисляет и записывает сам. Т. е. параметр CRC_ENABLE не должен влиять на создание файла *.enc.



Цитата(Jhohn @ Nov 11 2010, 15:12) *
Config.txt:
Код
PAGE_SIZE      = 256
MEM_SIZE       = 57344
CRC_ENABLE     = YES
KEY1           = FE6807733E9702E34D6759A56A8D4A46078E
KEY2           = 1F555D210E89036971
KEY3           = FE0EE7FD837569EFE4
INITIAL_VECTOR = 789280B50E473F2303EB08E795D5A72F
SIGNATURE      = 8FB5DF40


- результат тот же: файл update.enc не создается


Я проверил у себя с этими параметрами и файл создался .

Загадка...

На всякий случай: файл create.exe из примера avr230, размер 208 КБ (213 809 байт), создан 15 января 2007 г.

Может atmel в примере 231 все кардинально поменял? Не верится.



Кстати, проверил у себя. Вот ответ программы create.exe:


D:\Test>create.exe -c config.txt -f flash.hex -o update.enc

create v1.0AES - Copyright © 2005 Atmel Corporation

Using the following arguments:
Config filename: config.txt
Flash filename: flash.hex
Output filename: update.enc


The following configuration will be used:
Encryption = 256-bit AES, cipher block chaining mode
KEY1 = FE6807733E9702E34D6759A56A8D4A46078E
KEY2 = 1F555D210E89036971
KEY3 = FE0EE7FD837569EFE4
INITIAL_VECTOR = 789280B50E473F2303EB08E795D5A72F
SIGNATURE = 8FB5DF40
PAGE_SIZE = 256
MEM_SIZE = 256
CRC_ENABLE = YES

Read flash.hex!
Error: Overlapping memory assignments in file .

Type "create <enter>" for usage.


Что-то не так с вашим файлом flash.hex, по-моему.

Откуда вы его взяли, такой короткий (кстати)? smile.gif






Извиняюсь, файл flash.hex тут ни при чем.

У меня создать update.enc получилось, изменив MEM_SIZE = 57344,
вот ответ программы create.exe:

D:\Test>create.exe -c config.txt -f flash.hex -o update.enc

create v1.0AES - Copyright © 2005 Atmel Corporation

Using the following arguments:
Config filename: config.txt
Flash filename: flash.hex
Output filename: update.enc


The following configuration will be used:
Encryption = 256-bit AES, cipher block chaining mode
KEY1 = FE6807733E9702E34D6759A56A8D4A46078E
KEY2 = 1F555D210E89036971
KEY3 = FE0EE7FD837569EFE4
INITIAL_VECTOR = 789280B50E473F2303EB08E795D5A72F
SIGNATURE = 8FB5DF40
PAGE_SIZE = 256
MEM_SIZE = 57344
CRC_ENABLE = YES

Read flash.hex!
Wrote update.enc!

Create finished successfully.
D:\Test>pause
Для продолжения нажмите любую клавишу . . .



Результат выслать? smile.gif
Jhohn
Спасибо за помощь, Alekseeey

Код
        #ifdef CRC_CHECK
        // Check that the Application Section contents is undamaged
        // by calculating the CRC of the whole memory.
        {
            unsigned int crc = 0;
            unsigned char APPFLASH *p = (unsigned char APPFLASH *)0x000000;
            unsigned char APPFLASH *n = (unsigned char APPFLASH *)MEM_SIZE;
    
            do
            {
                crc = CRC(crc, *p++);
            }
            while (--n);
    
            // Application Section damaged
            //   -> do not jump to Reset Vector of the Application Section
            if (crc)
                continue;
        }



В этом коде я не увидел сравнения рассчитанной и переданной CRC, поэтому создал следующую (уже проверенную) функцию заменяющую вышеописанное:

CODE
typedef unsigned int uint16_t;
typedef unsigned char uint8_t;

uint16_t crc_xmodem_update (uint16_t crc, uint8_t data)
{
crc = crc ^ ((uint16_t)data << 8);
for (uint16_t i = 0; i < 8; i++)
{
if (crc & 0x8000)
crc = (crc << 1) ^ 0x1021;
else
crc <<= 1;
}
return crc;
}
//==============================================
void TestChecksum()
{
uint16_t crc = 0;
uint8_t APPFLASH *p = (uint8_t APPFLASH *)0x0000;
for(uint16_t j = 0; j < 16; j++) // test
{
crc = crc_xmodem_update(crc, *p++);
}

busReplyByte(crc >> 8);
busReplyByte(crc & 0xFF);

//37FE-37FF
p = (uint8_t APPFLASH *)0x37FF;
uint16_t crcFlash = (*p << 8);
p = (uint8_t APPFLASH *)0x37FE;
crcFlash |= (*p);

busReplyByte(crcFlash >> 8);
busReplyByte(crcFlash & 0xFF);

if (crc != crcFlash)
{
do {
PORTB ^= (1 << PB4);
__delay_cycles( 7000000 );
} while(1);
}
else
{
do {
PORTB ^= (1 << PB4);
__delay_cycles( 700000 );
} while(1);
}
}




Цитата(Alekseeey @ Nov 11 2010, 21:12) *
Сейчас лезть в код бутлоадера мне недосуг, но помнится, что контрольную сумму бутлоадер вычисляет и записывает сам. Т. е. параметр CRC_ENABLE не должен влиять на создание файла *.enc.


Как я понял это дело: CRC должен прописываться в конец .hex файла и, как вы подметили, не должен влиять на создание шифрованной Прикладной программы, поэтому я не спешил запихнуть реальное значение CRC в .hex. Думая, что для него что 00 00, что реальное значение CRC - без разницы. Но это почему-то не так.

Тестировал я следующим образом (см. прикрепленный файл) :
1) Config.txt: CRC_ENABLE = YES

затем, команда create -c Config.txt -f flash.hex -o update.enc
- не создается файл update.enc
Код
D:\test aes>create -c Config.txt -f flash.hex -o update.enc

create v1.0AES - Copyright (C) 2005 Atmel Corporation

Using the following arguments:
  Config filename: Config.txt
  Flash filename:  flash.hex
  Output filename: update.enc


The following configuration will be used:
  Encryption      = 256-bit AES, cipher block chaining mode
    KEY1          = 0AB4D1381586C8A569D05984D93521440EA1
    KEY2          = 15203DB3CFAECA5793
    KEY3          = 87D069CA109F6E2522
  INITIAL_VECTOR  = 301FEBB0153B76AB8CD9D430645D646F
  SIGNATURE       = 1C1BB801
  PAGE_SIZE       = 256
  MEM_SIZE        = 57344
  CRC_ENABLE      = YES

Read flash.hex!
Error: Overlapping memory assignments in file .

Ошибка: Перекрывающиеся присвоения памяти в файле.

Почему перекрываются?


затем, команда без 2-х байт файл flash_.hex create -c Config.txt -f flash_.hex -o update.enc
- создался файл.

2) Config.txt: CRC_ENABLE = NO
затем, команда create -c Config.txt -f flash.hex -o update.enc
- файл создался




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



И еще, созданный файл update.enc без CRC пишет только одну страницу, и то, пишет ее только в том случае, если данные прикладной программы менее 256 байт (сам .hex файл): 240 байт пишется, 256 байт - уже не пишется.
При размере .hex файла 512 или 57344 в память не пишется вообще ничего. Почему так? основной файл ниже:

CODE
__C_task void loader(void)
{

#if KEY_COUNT > 0
unsigned char chainCipherBlock[16]; // Buffer for Cipher Block
// Unchaining

// Copy Initial Vector to start the cipher block unchaining
{
unsigned char *p = chainCipherBlock;
unsigned char BOOTFLASH *q = initialVector;
unsigned char n = 16;

do
{
*p++ = *q++;
}
while (--n);
}

aesInit( tempbuf ); // Init AES algorithm.
#endif

// Prepare bus for incoming frames...
busPrepare();

// Start the Watchdog Timer (sorry for the mess, there is a bug in
// iom8.h (in version 2.28A) which is informed to IAR).
#if 1
#if !defined(WDTCR) && !defined(__IOM8_H)
#define WDTCR WDTCSR
#endif

#if defined(__IOM16_H) || defined(__IOM32_H)
WDTCR = (7 << WDP0) | (1 << WDE);
#else
#if defined(__IOM8_H)
WDTCR = (1 << WDTOE) | (1 << WDE);
#else
WDTCR = (1 << WDCE) | (1 << WDE);
#endif
WDTCR = (7 << WDP0) | (1 << WDE);
#endif
#endif
PORTD &= ~(1 << PD6); // направление RS-485, на ввод


// Loop forever (the loop is broken by Watchdog when RESET record is
// received)
for (;;)
{
frameindex_t frameSize;
unsigned int crc;

// Get the frame size
frameSize = ((frameindex_t)busReceiveByte() << 8) | busReceiveByte();

// Receive a frame of data from communication interface and calculate
// its CRC
{
unsigned char *p = rxBuffer;
frameindex_t n = frameSize;

crc = 0;
do
{
unsigned char ch;

ch = busReceiveByte();

*p++ = ch;
crc = CRC(crc, ch);

__watchdog_reset();
}
while (--n);

busBusy();
}

// CRC is OK?
if (crc == 0x0000)
{


unsigned char *p = rxBuffer;

// Decrypt 16 bytes, CRC-bytes are ignored.
#if KEY_COUNT > 0
{
unsigned char *p = rxBuffer;

frameSize -= 2;
do
{
__watchdog_reset();
aesDecrypt(p, chainCipherBlock);
p += 16;
}
while (frameSize -= 16);
}
#endif // KEY_COUNT > 0

// Check that the signature is correct
if ((*p++ == (unsigned char)(SIGNATURE >> 24)) &&
(*p++ == (unsigned char)(SIGNATURE >> 16)) &&
(*p++ == (unsigned char)(SIGNATURE >> 8)) &&
(*p++ == (unsigned char)(SIGNATURE >> 0)))
{
unsigned char APPFLASH *address;
unsigned char bits;
frameindex_t size;
unsigned char type;

// Continue parsing the frames until the 'End Of Frame' is
// received
while ((type = *p++) != TYPE_EOF)
{
__watchdog_reset();

// Receive Lock Bits (used in TYPE_LOCKBITS)
bits = *p++;

// Destination Address (note: 'bits' and 'address' overlap)
#pragma diag_suppress=Pe1053 // Suppress warning for conversion from long-type address to flash ptr.
address =
(unsigned char APPFLASH *)((unsigned long)bits << 16);
address = (unsigned char APPFLASH *)
((unsigned long)address | ((unsigned long)*p++ << 8));
address = (unsigned char APPFLASH *)
((unsigned long)address | *p++);
#pragma diag_default=Pe1053 // Back to default.

size = ((unsigned int)*p++ << 8);
size |= *p++;

switch (type)
{

// Erase page
case TYPE_ERASE:

_SPM_ERASE(address);
while(SPMCSR & (1<<0));
//spmErasePage(address);
// Fall-through!

// Prepare for incoming data chunks by copying the page
// contents into the page buffer
case TYPE_PREPARE:
{

unsigned char *q = pageBuffer;
unsigned char APPFLASH *r = address;

do
{
*q++ = *r++;
}
while (--size);
break;
}

// Chunk of data is written into the page buffer
case TYPE_DATA:
{

unsigned char *r =
&pageBuffer[(unsigned long)(address) & 0xffff];

do
{
*r++ = *p++;
}
while (--size);

break;
}

// Program page buffer into flash page
case TYPE_PROGRAM:
{

unsigned int *q = (unsigned int *)pageBuffer;
unsigned char APPFLASH *r = address;

do
{

__watchdog_reset();
//spmWriteWord(r, *q++);
_SPM_FILLTEMP(r, *q++);


r += 2;
}
while (--size);
_SPM_ERASE(address); while(SPMCSR & (1<<0));
//spmErasePage(address);
_SPM_PAGEWRITE(address); while(SPMCSR & (1<<0));
//spmProgramPage(address);

break;
}

// Write a chunk of data into EEPROM
case TYPE_EEPROM:
do
{
__watchdog_reset();
__EEPUT(((unsigned long)address++ & 0xffff), *p++);
// spmEEWriteByte(
// (unsigned long)address++ & 0xffff, *p++
// );
}
while (--size);
break;

// Write Lock Bits
case TYPE_LOCKBITS:
// spmWriteLockBits(bits);
_SPM_LOCKBITS(bits); while(SPMCSR & (1<<0));
break;

// Reset (let the Watchdog Timer expire)!
case TYPE_RESET:

PORTD |= (1 << PD6); // направление RS-485, на вывод
__delay_cycles( 10 );
busReplyByte(ERROR_OK);
__delay_cycles( 4000 );
PORTD &= ~(1 << PD6); // направление RS-485, на ввод

for(;;);

// Nonsense frames, one byte long
default:

PORTD &= ~(1 << PD6); // направление RS-485, на ввод
p -= 5;
break;
}
}
}

PORTD |= (1 << PD6); // направление RS-485, на вывод
__delay_cycles( 10 );
busReplyByte(ERROR_OK);
__delay_cycles( 4000 );
PORTD &= ~(1 << PD6); // направление RS-485, на ввод
}
else
{
PORTB |= (1 << PB4); // светодиод
PORTD |= (1 << PD6); // направление RS-485, на вывод
__delay_cycles( 10 );
busReplyByte(ERROR_CRC);
__delay_cycles( 4000 );
PORTD &= ~(1 << PD6); // направление RS-485, на ввод
PORTB &= ~(1 << PB4); // светодиод
}
}
}
Alekseeey
Цитата(Jhohn @ Nov 12 2010, 15:31) *
В этом коде я не увидел сравнения рассчитанной и переданной CRC, поэтому создал следующую (уже проверенную) функцию заменяющую вышеописанное:


Сравнение есть. Используется свойство crc16, что, если сложить по этому алгоритму байты данных и байты контрольной суммы, то должен получиться ноль. Это и проверяется:
if (crc) continue;


Цитата
Как я понял это дело: CRC должен прописываться в конец .hex файла и, как вы подметили, не должен влиять на создание шифрованной Прикладной программы, поэтому я не спешил запихнуть реальное значение CRC в .hex. Думая, что для него что 00 00, что реальное значение CRC - без разницы. Но это почему-то не так.


Согласен.

Кстати.

На стр. 20 примера avr231 (doc2589.pdf) в блок-схеме загрузчика не указано, что он записывает контрольную сумму флеш. Указана только ветка проверки crc.

Ну вот так и есть, не поленился и заглянул в исходники create:

Ошибка ERROR_OVERLAPPING_DATA (выдаваемая на экран в виде строки Overlapping memory assignments in file)
может случится в методе insert() (файл MemoryMapp.cpp)

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

Короче, выяснить причину ошибки будет затруднительно.

Цитата
Как я понял это дело: CRC должен прописываться в конец .hex файла и, как вы подметили, не должен влиять на создание шифрованной Прикладной программы, поэтому я не спешил запихнуть реальное значение CRC в .hex. Думая, что для него что 00 00, что реальное значение CRC - без разницы. Но это почему-то не так.


Ну да, вот код из файла OutputWriter.cpp:

Код
    aesM->scheduleKey(key);

    if (createFlashCRCM && flashM)
    {
        // Calculates the CRC of Application Section and inserts it to the
        // MemoryMap of the flash memory
        unsigned int address;
        unsigned short crcCode = 0;
        DataBuffer crcBuffer;

        for (address = 0; address < memSizeM - 2; address++)
            crcCode = crc(flashM->at(address), crcCode);

        crcCode = crc(0, crcCode);
        crcCode = crc(0, crcCode);

        crcBuffer += (unsigned char)(crcCode >> 8);
        crcBuffer += (unsigned char)(crcCode & 0xff);

        flashM->insert(memSizeM - 2, crcBuffer);
    }


Фактический размер данных в *.hex файле должен быть на 2 байта меньше, чем memSizeM.


Цитата
Тестировал я следующим образом (см. прикрепленный файл) :
...
затем, команда без 2-х байт файл flash_.hex create -c Config.txt -f flash_.hex -o update.enc
- создался файл.

2) Config.txt: CRC_ENABLE = NO
затем, команда create -c Config.txt -f flash.hex -o update.enc
- файл создался

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


Затрудняюсь сказать. Выложите сюда два архива, в одном чтоб файл создавался, а в другом - нет
(при CRC_ENABLE = YES).
Будет, я надеюсь, проще.


Цитата
И еще, созданный файл update.enc без CRC пишет только одну страницу, и то, пишет ее только в том случае, если данные прикладной программы менее 256 байт (сам .hex файл): 240 байт пишется, 256 байт - уже не пишется.
При размере .hex файла 512 или 57344 в память не пишется вообще ничего. Почему так? основной файл ниже:


Кстати, а с помощью чего вы файлы *.hex создаете?
Jhohn
Цитата(Alekseeey @ Nov 12 2010, 21:19) *
Сравнение есть. Используется свойство crc16, что, если сложить по этому алгоритму байты данных и байты контрольной суммы, то должен получиться ноль. Это и проверяется:
if (crc) continue;

Не знал об этом свойстве.

Цитата(Alekseeey @ Nov 12 2010, 21:19) *
Ну да, вот код из файла OutputWriter.cpp:

Код
    aesM->scheduleKey(key);

    if (createFlashCRCM && flashM)
    {
        // Calculates the CRC of Application Section and inserts it to the
        // MemoryMap of the flash memory
        unsigned int address;
        unsigned short crcCode = 0;
        DataBuffer crcBuffer;

        for (address = 0; address < memSizeM - 2; address++)
            crcCode = crc(flashM->at(address), crcCode);

        crcCode = crc(0, crcCode);
        crcCode = crc(0, crcCode);

        crcBuffer += (unsigned char)(crcCode >> 8);
        crcBuffer += (unsigned char)(crcCode & 0xff);

        flashM->insert(memSizeM - 2, crcBuffer);
    }


Фактический размер данных в *.hex файле должен быть на 2 байта меньше, чем memSizeM.


Верно ли я понял: мой *.hex не должен содержать CRC и он должен быть меньше на 2 байта (memSizeM - 2)?

Цитата(Alekseeey @ Nov 12 2010, 21:19) *
Затрудняюсь сказать. Выложите сюда

Выложил:
test aes no.rar - файл не создается, CRC_ENABLE = YES, данные 57344, формируемый IAR hex без CRC
test aes.rar - файл создается, CRC_ENABLE = NO, данные 57344, формируемый IAR hex без CRC
test aes -2.rar - файл создается, CRC_ENABLE = YES, данные 57342, формируемый IAR hex без CRC

Цитата(Alekseeey @ Nov 12 2010, 21:19) *
Кстати, а с помощью чего вы файлы *.hex создаете?

IAR, затем редактирую под нужный размер в текстовом редакторе.
Alekseeey
Цитата(Jhohn @ Nov 13 2010, 11:19) *
Верно ли я понял: мой *.hex не должен содержать CRC и он должен быть меньше на 2 байта (memSizeM - 2)?


Да.

Цитата
Выложил:
test aes no.rar - файл не создается, CRC_ENABLE = YES, данные 57344, формируемый IAR hex без CRC


Да, файл не создается, ошибка возникает на строчке вставки CRC:
flashM->insert(memSizeM - 2, crcBuffer);

Цитата
test aes.rar - файл создается, CRC_ENABLE = NO, данные 57344, формируемый IAR hex без CRC
test aes -2.rar - файл создается, CRC_ENABLE = YES, данные 57342, формируемый IAR hex без CRC


Тут у меня тоже все работает.

Цитата
IAR, затем редактирую под нужный размер в текстовом редакторе.


И контрольную сумму для каждой строки вычисляете? smile.gif


В общем, пока выводы такие:

Контрольная сумма вставляется автоматически программой create при формировании файла enc, не нужно вставлять контрольную сумму вручную в hex файл.

Размер кодируемых данных должен быть на 2 байта меньше размера памяти, если вставляется контрольная сумма.

MrYuran был прав. smile.gif


Jhohn
Цитата(Alekseeey @ Nov 13 2010, 16:36) *
И контрольную сумму для каждой строки вычисляете? smile.gif


Что вы?) Просто удаляю адреса загрузчика


Спасибо за помощь smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.