Перейти к содержанию
    

алгоритм декомпрессии LZMA

Есть желание программировать ПЛИС (xilinx spartan 3) из процессора (lpc2148)

Сжал утилитой LZMA прошивку для ПЛИС (файл *.rbt) размером 1.8 Mb,

получился файл 12kb.

 

Как этот файл подшить в мой проект? (использую Keil)

Т.е. как его запихнуть во FLASH и потом прочитать?

Может есть у кого-нить готовый код?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В Инете есть такая утилитка - file2carray называется. Исходничек Здесь

Там буквально сотня строк, генерирует из любого файла исходные данные для инициализации C-массива.

Пишете:

 

const
#include "имя_файла_сгенерированного_утилитой"

 

и получаете нужный массив в прошивке.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не хватает хэд-файлов для компиляции этой утилиты :(

может есть уже откомпилированная? под линукс или под винду - любому бинарику буду рад :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

спасибо! кажеца работает!!!

щас попробую распаковать процессором свой архив и прошить ПЛИС

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот моя програмка для упаковки прошивки для ПЛИС.

Адаптированный Хафман для *.rbf

Hafm.zip

 

Вот код распаковки, прошивка берется из внешней еепром, но это легко изменить.

void programm_acex(void){
  unsigned int bytecounter;
  unsigned char outbyte, cnt1s;
  unsigned char a[16];

  i2c_start_wait(EEPROM_24256+I2C_WRIT);
  i2c_write(acexhex >> 8);
  i2c_write(acexhex & 0xFF);
  i2c_rep_start(EEPROM_24256+I2C_READ);
  for (outbyte=0;outbyte<16;outbyte++) a[outbyte] = i2c_readAck();
  
  acc = i2c_readAck();
  acnt = 8;
  bytecounter = 0;

  for (;;) {
    outbyte = 0;
    if ( get1bit() ) 
    {
      for (cnt1s=1;cnt1s<5;cnt1s++)
         if (!(get1bit())) break;
      if (cnt1s == 5)
        for (cnt1s=0;cnt1s<8;cnt1s++) outbyte = (outbyte << 1) + get1bit();
        else {
          cnt1s = ((((cnt1s-1)<<1) + get1bit())<<1)+get1bit();
          outbyte = a[cnt1s]; 
        }
    }    
    outbyte2acex(outbyte);
    if ( bytecounter++ == acexsize) break;
  }

  outbyte2acex(0);
  outbyte2acex(0);

  i2c_readNak();        
  i2c_stop();
}

unsigned char get1bit(void){
  unsigned char retval;
  
  retval = ((acc&0x80) != 0);
  acc <<= 1; 
  if ( !(--acnt) ) {
    acc = i2c_readAck();
    acnt = 8;
  }    
  return retval;
}

 

Может поможет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вот код для распаковки LZMA... правда это для винды

можно ли портировать под ARM7 - пока не знаю...

для распаковки похоже выделяется память ~ 16kb

хотя это можно уменьшить если сжимать с опциями, т.е.

LZMA e file.bin file.lzma -lc0 -lp2

 

#include "LzmaDec.h" 
#include "Types.h"
#include "fpga_config.h" // архив lzma

VOID *MyAlloc (size_t size);
VOID MyFree (VOID *address);

static void *SzAlloc(void *p, size_t size) { p = p; return MyAlloc(size); }
static void SzFree(void *p, void *address) {  p = p; MyFree(address); }
static ISzAlloc g_Alloc = { SzAlloc, SzFree };

VOID *MyAlloc (size_t size) {
return VirtualAlloc(0, size, MEM_COMMIT, PAGE_READWRITE);
       // return malloc(size);
}
VOID MyFree (VOID *address) {
VirtualFree(address, 0, MEM_RELEASE);
       //free(address);
} 

int main (int argc, char *argv[]){
Byte obuf[50]; // буфер для распакованных данных
SizeT destLen = sizeof(obuf);
SizeT srcLen = sizeof(fpga_config) - 13; // 13 - размер шапки LZMA архива в байтах
ELzmaStatus status;

Byte * src = fpga_config + 13; // адрес начала данных
Byte * dest = obuf;
Byte * propData = fpga_config; // адрес шапки LZMA архива

LzmaDecode( 
	dest,
	&destLen,
	src,
	&srcLen,
	propData,
	LZMA_PROPS_SIZE,
	LZMA_FINISH_END,
	&status,
	&g_Alloc
);

DeleteFile ("config");
int config_file = OpenFile ("config", VAL_TRUNCATE, VAL_OPEN_AS_IS, VAL_ASCII);
WriteLine (config_file, obuf, 30);
CloseFile (config_file);

   return 0;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вот код для распаковки LZMA... правда это для винды

можно ли портировать под ARM7 - пока не знаю...

для распаковки похоже выделяется память ~ 16kb

хотя это можно уменьшить если сжимать с опциями, т.е.

LZMA e file.bin file.lzma -lc0 -lp2

код портировать не надо он прекрасно компилится IAR, RVCT, GCC

для распковки надо 3 файла

types.h lzmadec.*

 

размер памяти нужный для распаковки -

размер словаря + 1846 + (768 << (lc + lp)))

 

я как раз тоже недавно применял этот алгоритм для загрузки альтеры и блекфина.

по быстродействию здесь писал

http://electronix.ru/forum/index.php?showtopic=68880

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

код портировать не надо он прекрасно компилится IAR, RVCT, GCC

Можно узнать, сколько в Вашей реализации использовалось RAM и FLASH для декодера (включая размер словаря) применительно к тестам? Сколько сейчас в проектах тратите на это? Можно ли уменьшать размер словаря? Реально ли вписаться в 8КБ Flash и 2КБ RAM?

 

 

KAlex

А у вас нет тестов скорости для случая, если прошивка лежит во FLASH-памяти самого МК?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

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

×
×
  • Создать...