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

 
 
 
Reply to this topicStart new topic
> алгоритм декомпрессии LZMA, для прошивки ПЛИС
cornflyer
сообщение Nov 22 2009, 14:43
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 11-07-06
Из: Dubna
Пользователь №: 18 729



Есть желание программировать ПЛИС (xilinx spartan 3) из процессора (lpc2148)
Сжал утилитой LZMA прошивку для ПЛИС (файл *.rbt) размером 1.8 Mb,
получился файл 12kb.

Как этот файл подшить в мой проект? (использую Keil)
Т.е. как его запихнуть во FLASH и потом прочитать?
Может есть у кого-нить готовый код?
Go to the top of the page
 
+Quote Post
VslavX
сообщение Nov 22 2009, 15:55
Сообщение #2


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



В Инете есть такая утилитка - file2carray называется. Исходничек Здесь
Там буквально сотня строк, генерирует из любого файла исходные данные для инициализации C-массива.
Пишете:

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


и получаете нужный массив в прошивке.
Go to the top of the page
 
+Quote Post
cornflyer
сообщение Nov 22 2009, 19:24
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 11-07-06
Из: Dubna
Пользователь №: 18 729



не хватает хэд-файлов для компиляции этой утилиты sad.gif
может есть уже откомпилированная? под линукс или под винду - любому бинарику буду рад smile.gif
Go to the top of the page
 
+Quote Post
VslavX
сообщение Nov 22 2009, 20:04
Сообщение #4


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Используемый мной вариант под win32 - в аттаче
Прикрепленные файлы
Прикрепленный файл  f2a.rar ( 17.3 килобайт ) Кол-во скачиваний: 163
 
Go to the top of the page
 
+Quote Post
cornflyer
сообщение Nov 22 2009, 20:25
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 11-07-06
Из: Dubna
Пользователь №: 18 729



спасибо! кажеца работает!!!
щас попробую распаковать процессором свой архив и прошить ПЛИС
Go to the top of the page
 
+Quote Post
KAlex
сообщение Nov 23 2009, 08:27
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719



Вот моя програмка для упаковки прошивки для ПЛИС.
Адаптированный Хафман для *.rbf
Прикрепленный файл  Hafm.zip ( 200.66 килобайт ) Кол-во скачиваний: 157


Вот код распаковки, прошивка берется из внешней еепром, но это легко изменить.
Код
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;
}


Может поможет.
Go to the top of the page
 
+Quote Post
cornflyer
сообщение Nov 23 2009, 23:29
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 11-07-06
Из: Dubna
Пользователь №: 18 729



вот код для распаковки LZMA... правда это для винды
можно ли портировать под ARM7 - пока не знаю...
для распаковки похоже выделяется память ~ 16kb
хотя это можно уменьшить если сжимать с опциями, т.е.
LZMA e file.bin file.lzma -lc0 -lp2

CODE
#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;
}
Go to the top of the page
 
+Quote Post
KRS
сообщение Nov 24 2009, 21:10
Сообщение #8


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(cornflyer @ Nov 24 2009, 02:29) *
вот код для распаковки 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
Go to the top of the page
 
+Quote Post
Altemir
сообщение Jan 30 2012, 10:25
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 249
Регистрация: 2-05-06
Из: Россия, Поволжье
Пользователь №: 16 686



Цитата(KRS @ Nov 25 2009, 01:10) *
код портировать не надо он прекрасно компилится IAR, RVCT, GCC

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


KAlex
А у вас нет тестов скорости для случая, если прошивка лежит во FLASH-памяти самого МК?
Go to the top of the page
 
+Quote Post

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

 


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


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