1. 程式人生 > >uboot 解壓縮

uboot 解壓縮

mage += 時間 des align set 成了 拷貝 null

在uboot中進行解壓縮是非常實用的

uboot中完畢delay 用戶進行交互的段

if(BootType == ‘3‘) {

char *argv[3];

printf(" \n3: System Boot system code via Flash.\n");

。。。

下面就是要進入kernel拷貝內容了

由於kernel的尺寸比較大 通常會達到3M以上 這樣用串口或者網絡都會比較耗費時間 也會浪費寶貴的內存

解決方法就是傳輸和保存都用壓縮過的 應用的時候在進行解壓

uboot中已經集成了集中經常使用的解壓縮程序,一般常見的gzip 、 bzip 、 lzma 都已經存在。

我們僅僅須要調用就能夠了,這裏給出一個建立解壓縮命令的方法。

建立新的命令在簽名的博客已經寫了 ,這裏就直接引用結果了

#include <common.h>
#include <command.h>
u32 ret_decomps;
#ifdef CONFIG_CMD_DECOMPRESS
do_compress(cmd_tbl_t *cmdtp,int flag,int argc,char *argv[])
{
u32 destLen = 0,len;
len = simple_strtoul(argv[1], NULL, 16);
printf("decompress start");
//lzmaBuffToBuffDecompress (unsigned char *outStream, SizeT *uncompressedSize, unsigned char *inStream, SizeT length)
ret_decomps = lzmaBuffToBuffDecompress ((char *)0xa2000000, &destLen, (char *)0xa1000000, len);
printf("decompress finish");
return 0;
}
U_BOOT_CMD(

decomps,5,1,do_compress,"decompress test\n","decompress:addr \n"

);
#endif

這裏明有一些調試的信息沒除去,反正不影響結果。

插一點,開啟debug打印的方法

在uboot中能夠看到有非常多的debug信息打印

debug ("LZMA: Image address............... 0x%lx\n", inStream);
debug ("LZMA: Properties address.......... 0x%lx\n", inStream + LZMA_PROPERTIES_OFFSET);
debug ("LZMA: Uncompressed size address... 0x%lx\n", inStream + LZMA_SIZE_OFFSET);
debug ("LZMA: Compressed data address..... 0x%lx\n", inStream + LZMA_DATA_OFFSET);
debug ("LZMA: Destination address......... 0x%lx\n", outStream);

盡管自己也能夠用print函數實現 , 可是不如直接打開省事的 。

能夠在相應的.h文件裏添加一個

#define DEBUG

這樣上面那些打印就能夠打印出來了

以下繼續我們命令的部分

這倆要開始添加lzma編譯連接在make中的設置,由於默認lzma是不編譯鏈接的。方法就是主文件夾下的makefile中加

LIBS += lib/lzma/liblzma.a

這樣就能夠編譯連接進去了

然後我們就能夠調用解壓縮的接口函數進行解壓縮操作了


uboot 解壓縮