

#include <nitro/os/common/systemCall.h>
s32 SVC_UncompressLZ8FromDevice( const void* srcp,
void* destp,
const void* paramp,
const MIReadStreamCallbacks* callbacks );
| srcp | LZ77圧縮データの格納されているソースアドレス |
| destp | 展開するディスティネーションアドレス |
| paramp | MIReadStreamCallbacks 構造体の initStream関数へ渡すパラメータへのアドレス |
| callbacks | MIReadStreamCallbacks 構造体のアドレス |
0以上ならば展開したサイズで、0より小さければエラーです。
LZ77圧縮データを展開し、指定のメモリ領域に書き込みます。
srcp で指定する圧縮データを展開し、destp で指定する領域に格納されます。
メモリマッピングされていないデバイス上の圧縮データをテンポラリバッファを使わずに直接展開することが出来ます。
バイトアクセスできないRAMにも展開できます。
srcp で指定するデータは 'ntrcomp -l 2' で圧縮したものとしてください。
srcp の境界制限は initStream コールバック関数の実装依存となります。
サンプルコード
s32 NVRAMi_UncompressLZ8( const u8 *nvram, void *ram, int limit )
{
static const MIReadStreamCallbacks cb = {NVRAMi_InitReadStream, NVRAMi_TerminateReadStream,
NVRAMi_ReadByteStream, NULL, NVRAMi_ReadWordStream};
return SVC_UncompressLZ8FromDevice( nvram, ram, &limit, &cb );
}
s32 NVRAMi_InitReadStream( const u8 *nvram, void *ram, const void *param )
{
int limit = *(int*)param;
u32 comp_header;
u32 address = (u32)nvram;
u8 adr[3];
int size;
int i;
s32 retval;
adr[0] = (u8)(address >> 16);
adr[1] = (u8)(address >> 8);
adr[2] = (u8)(address);
// 命令部4バイト送信
SPI_Wait();
NVRAM_SPIChangeMode( SPI_TRANSMODE_CONTINUOUS );
SPI_Send( NVRAM_INSTRUCTION_READ );
for (i = 0; i < 3; i++)
{
SPI_Wait();
SPI_Send(adr[i]);
}
// preload
SPI_Wait();
SPI_Dummy();
comp_header = NVRAMi_ReadWordStream( nvram );
retval = comp_header;
size = comp_header >> 8;
if ( (int)(nvram + size) > NVRAM_SIZE_MAX ||
size <= 0 || size > limit )
{
retval = -1;
}
return retval;
}
u8 NVRAMi_ReadByteStream( const u8 *nvram )
{
u8 byte;
SPI_Wait();
byte = SPI_Receive();
// preload
SPI_Dummy();
return byte;
}
u32 NVRAMi_ReadWordStream( const u8 *nvram )
{
u32 word;
u8* bytep = (u8*)&word;
int i;
for (i=0; i<4; i++)
{
*bytep++ = NVRAMi_ReadByteStream( NULL );
}
return word;
}
s32 NVRAMi_TerminateReadStream( const u8 *nvram )
{
// 1st dummy read
SPI_Wait();
(void)SPI_Receive();
// 2nd dummy read
NVRAM_SPIChangeMode(SPI_TRANSMODE_1BYTE);
SPI_DummyWait();
(void)SPI_Receive();
return 0;
}
2007/10/22 初版