SVC_UncompressLZ8FromDevice

構文

#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;
}

参照

SVC_UncompressLZ16FromDevice

履歴

2007/10/22 初版