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

 
 
> Формирование собственного HEX intel файла, существуют ли готовые решения ?
west329_
сообщение Nov 17 2008, 08:39
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423



Целью задачи защитить прошивку, ход действий был следующий,
прошивка в виде HEX для контроллера атмега64 проходит через шифрующую случайно сгенерированною матрицу 255 байт. Для упрощения пока была взята матрица в 16 бит. Потом шьется через бутлоад а он выполняет обратное преобразование.

Но пока нам не удаётся выйти за пределы компьютера, программа которая должна отправляет HEX находит в нём ошибку.

Для этого на С была написана простенькая программа основываясь на студенческих лабораторках и конспектах для работы с файлом и строками.

Программа работает следующим образом,
-построчно считываю HEX файл,
-потом в считанной строке начиная с 9 бита считываю 32 ASCCI символа,
-объединяю и перевожу их в 16 бит масив
-прогоняю через матрицу.
-перевожу опять в ASCCI 32,
-запись новой строки на место старой.
-определение crc и запись на место последнего байта

Вопрос такой может существуют уже готовые модули для формирования НЕХ ? или более простой способ. Наставьте так сказать на правильный путь, если нету то будим разбираться с этой. Интересует мнение людей которые работали с подобными вещами.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AHTOXA
сообщение Nov 17 2008, 09:10
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(west329_ @ Nov 17 2008, 14:39) *
-потом в считанной строке начиная с 9 бита считываю 32 ASCCI символа,


Там совершенно необязательно 32 символа. И не все строки являются кодом.

Вот примерчик чтения хекса и заливки его в еепром:
CODE
#define HEX_LINE_DATA (0x00)
#define HEX_LINE_END (0x01)
#define HEX_LINE_BAD (0xFF)


static struct ProgRecord
{
u08 count;
u08 kind;
u16 address;
u08 data[32];
}HexLine;

static u08 csum;

u08 h2b(u08 b )
{
return ((b <= '9') ? (b - '0') : (b - 0x37));
}

u08 read_hex(void)
{
u08 Hb, Lb;

Hb = rs_getchar();
Lb = rs_getchar();

Lb = (h2b(Hb) << 4) | h2b(Lb);
csum += Lb;
return(Lb);
}

u08 read_hex_line(void)
{
u08 i;

// hex line sample:
//:10007B00DFF6804288828C8387F009E0A3B5F036E7

// skip to the ':'
while (rs_getchar() != ':');

csum = 0;

// Number of Bytes.
HexLine.count = read_hex();

if (HexLine.count > 32) goto bad_len;

// Build address Information.
HexLine.address = (u16)read_hex() << 8;
HexLine.address |= read_hex();

// Get Type
HexLine.kind = read_hex();

// Extract the Data Bytes.
for (i = 0; i < HexLine.count; i++)
HexLine.data[i] = read_hex();

// don't forget about the Checksum u08.*/
read_hex();

if (csum) goto bad_cs;

return TRUE;

bad_len:
rs_puts_p("Bad length. Hit esc\r\n");
while (rs_getchar() != 27);
return FALSE;

bad_cs:
rs_puts_p("Bad csum. Hit esc\r\n");
while (rs_getchar() != 27);
return FALSE;
}


void programm_eeprom(void)
{
rs_puts_p("\r\nSend file!\r\n");
while (read_hex_line())
{
if (HexLine.kind == HEX_LINE_END)
{
rs_puts_p("Done!\r\n");
break;
}
if (HexLine.kind == HEX_LINE_DATA && HexLine.count > 0)
if (!at24c256_write(HexLine.address, (u08*)&HexLine.data, HexLine.count))
{
rs_puts_p("Write error\r\n");
break;
}
rs_putchar('.');
}
}


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 3rd September 2025 - 20:50
Рейтинг@Mail.ru


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