/* BL_RunPartOne Expend loader if use compress @return void */ static void BL_RunPartOne(void) { #if (_LOADER_COMPRESSED_ == ENABLE) UINT8 *in_addr = (UINT8 *)(_loader_exec_compress_load_cpu_addr); UINT8 *out_addr = (UINT8 *)(_loader_exec_compres_start); UINT32 uiCompressedOutSize; // Get decompress size within specific header uiCompressedOutSize = (((UINT32)*(in_addr + 12)) << 24) + (((UINT32)*(in_addr + 13)) << 16) + (((UINT32)*(in_addr + 14)) << 8) + ((UINT32)*(in_addr + 15)); // Decompress loader image LZ_Uncompress((unsigned char *)(in_addr + LDC_HEADER_SIZE), (unsigned char *)(out_addr), uiCompressedOutSize); // Need to clean data cache CPUInvalidateICacheAll(); CPUCleanInvalidateDCacheAll(); /// uart_putSystemUARTStr("\r\nUNZOK!"); #else #endif }
int TestFile( char *name, int algo, int verbose ) { unsigned int insize, outsize, bufsize, *work, k, err_count; unsigned char *in, *out, *buf; FILE *f; double t0, t_comp, t_uncomp; printf( "Testing %s...", name ); /* Open input file */ f = fopen( name, "rb" ); if( !f ) { printf( "unable to open!\n" ); return 0; } /* Get input size */ insize = GetFileSize( f ); if( insize < 1 ) { printf( "empty file!\n" ); fclose( f ); return 0; } /* Worst case output buffer size */ bufsize = (insize*104+50)/100 + 384; /* Allocate memory */ in = (unsigned char *) malloc( insize + 2*bufsize ); if( !in ) { printf( "out of memory!\n" ); fclose( f ); return 0; } /* Pointers to compression buffer and output memory */ buf = &in[ insize ]; out = &buf[ bufsize ]; /* Read and close input file */ fread( in, 1, insize, f ); fclose( f ); /* Compress and decompress */ switch( algo ) { case 1: t0 = GetTime(); outsize = RLE_Compress( in, insize, buf, bufsize ); t_comp = GetTime() - t0; t0 = GetTime(); RLE_Uncompress( buf, outsize, out, insize ); t_uncomp = GetTime() - t0; break; case 2: t0 = GetTime(); outsize = Huffman_Compress( in, buf, insize ); t_comp = GetTime() - t0; t0 = GetTime(); Huffman_Uncompress( buf, out, outsize, insize ); t_uncomp = GetTime() - t0; break; case 3: t0 = GetTime(); outsize = Rice_Compress( in, buf, insize, RICE_FMT_UINT8 ); t_comp = GetTime() - t0; t0 = GetTime(); Rice_Uncompress( buf, out, outsize, insize, RICE_FMT_UINT8 ); t_uncomp = GetTime() - t0; break; case 4: t0 = GetTime(); outsize = Rice_Compress( in, buf, insize, RICE_FMT_UINT16 ); t_comp = GetTime() - t0; t0 = GetTime(); Rice_Uncompress( buf, out, outsize, insize, RICE_FMT_UINT16 ); t_uncomp = GetTime() - t0; break; case 5: t0 = GetTime(); outsize = Rice_Compress( in, buf, insize, RICE_FMT_UINT32 ); t_comp = GetTime() - t0; t0 = GetTime(); Rice_Uncompress( buf, out, outsize, insize, RICE_FMT_UINT32 ); t_uncomp = GetTime() - t0; break; case 6: t0 = GetTime(); outsize = Rice_Compress( in, buf, insize, RICE_FMT_INT8 ); t_comp = GetTime() - t0; t0 = GetTime(); Rice_Uncompress( buf, out, outsize, insize, RICE_FMT_INT8 ); t_uncomp = GetTime() - t0; break; case 7: t0 = GetTime(); outsize = Rice_Compress( in, buf, insize, RICE_FMT_INT16 ); t_comp = GetTime() - t0; t0 = GetTime(); Rice_Uncompress( buf, out, outsize, insize, RICE_FMT_INT16 ); t_uncomp = GetTime() - t0; break; case 8: t0 = GetTime(); outsize = Rice_Compress( in, buf, insize, RICE_FMT_INT32 ); t_comp = GetTime() - t0; t0 = GetTime(); Rice_Uncompress( buf, out, outsize, insize, RICE_FMT_INT32 ); t_uncomp = GetTime() - t0; break; case 9: t0 = GetTime(); outsize = LZ_Compress( in, buf, insize ); t_comp = GetTime() - t0; t0 = GetTime(); LZ_Uncompress( buf, out, outsize ); t_uncomp = GetTime() - t0; break; case 10: work = malloc( sizeof(unsigned int) * (65536+insize) ); if( work ) { t0 = GetTime(); outsize = LZ_CompressFast( in, buf, insize, work ); t_comp = GetTime() - t0; free( work ); t0 = GetTime(); LZ_Uncompress( buf, out, outsize ); t_uncomp = GetTime() - t0; } else { printf( "unable to allocate working buffer!\n" ); t_comp = 0.0; t_uncomp = 0.0; outsize = 0; } break; case 11: t0 = GetTime(); outsize = SF_Compress( in, buf, insize ); t_comp = GetTime() - t0; t0 = GetTime(); SF_Uncompress( buf, out, outsize, insize ); t_uncomp = GetTime() - t0; break; default: /* Should never happen... */ outsize = 0; t_comp = 0.0; t_uncomp = 0.0; } err_count = 0; if(outsize > 0) { /* Show compression result */ if( verbose ) { printf( "\n Compression: %d/%d bytes (%.1f%%)", outsize, insize, 100*(float)outsize/(float)insize ); } /* Compare input / output data */ for( k = 0; k < insize; ++ k ) { if( in[ k ] != out[ k ] ) { if( err_count == 0 ) printf( "\n" ); if( err_count == 30 ) printf( " ...\n" ); else if( err_count < 30 ) { printf( " %d: %d != %d\n", k, out[ k ], in[ k ] ); } ++ err_count; } } /* Did we have success? */ if( err_count == 0 ) { printf( " - OK!\n" ); if( verbose ) { printf( " Compression speed: %.1f KB/s (%.2f ms)\n", (double) insize / (1024.0 * t_comp), 1000.0 * t_comp ); printf( " Uncompression speed: %.1f KB/s (%.2f ms)\n", (double) insize / (1024.0 * t_uncomp), 1000.0 * t_uncomp ); } } else { printf( " *******************************\n" ); printf( " ERROR: %d faulty bytes\n", err_count ); printf( " *******************************\n" ); } } /* Free all memory */ free( in ); return (outsize > 0) && (err_count == 0); }