packer 主要的目地是用來產生燒錄器使用的 image 檔案. 目前我們的 flash
規劃是長成這樣:
offset
0x00000- Loader(第一段)
0x04000- BDINFO
0x06000- CCFG
0x08000- Loader(第二段)
0x20000- Runtime Code
也就是說, packer 的目地有以下各項 (依重要性排列):
1. 把 loader 切成兩段, 一段放在 0x00000 開始的地方,
另一段放在 0x08000 的地方.
2. 將 MAC address, Web出廠預設值(CCFG), 及
runtime code ... 等, 一起包裝在 image 檔中.
3. 作 byte swap (for燒錄)
packer 目前是放在 uClinux-dist/tools/ 底下, 這是一個 .c 檔,
使用前需要編譯(compile).
有關編譯的問題請看 Appendix.
========================================================================================
了解 packer 的用途之後, 底下就來為大家示範 packer 的幾個典型用法 (執行
tools/packer 可以看到使用說明):
1. 只燒 loader:
a. 首先進入 loader 的目錄, 將 ldr.bin
檔 build 出來.
% cd
loader_srcroot; make clean; make; cd ..
b. 再來, 使用 packer 將 loader
切成兩個部份, 第一個部份放在 0x00000, 第二部份放在 0x08000:
%
tools/packer -2 images/massprod.bin \
0x00000=loader_srcroot/ldr.bin,0x0,0x4000
\
0x08000=loader_srcroot/ldr.bin,0x4000,0x18000
c. 解釋一下, '-2' 是代表最後做出來的檔案要做
byte swap;
'images/massprod.bin' 是最後做出來的檔案名稱;
'0x00000=loader_srcroot/ldr.bin,0x0,0x4000'
這一行的意思是:
把 loader_srcroot/ldr.bin 的 offset 0x0 到 0x3FFF 之間的 16K 內容, 放到
images/massprod.bin 的 0x00000 的位置.
最後一行的意思則是:
把 loader_srcroot/ldr.bin 的 offset 0x4000 到 0x17FFF 之間的內容, 放到
images/massprod.bin 的 0x08000 的位置.
也就是把 loader
拆成兩段.
...........................................................................
2. 指定出廠設定值
a. 首先將 loader
準備好
b. 再來將 packer 將 loader
及出廠設定值包起來:
%
tools/packer -2 images/massprod.bin \
0x00000=loader_srcroot/ldr.bin,0x0,0x4000
\
0x08000=loader_srcroot/ldr.bin,0x4000,0x18000
\
0x04000=01:02:03:04:05:06 \
0x06000=CCFG.bin
c. 解釋一下: 前半段跟 1. 一樣, 是 loader
的部份,
新增的兩行是直接指定
images/massprod.bin 的 0x04000 位置要依序擺入 01:02:03:04:05:06 一共 6 bytes
的值.
0x06000 的值則設由
CCFG.bin 這個檔案提供 (長度為 CCFG.bin 的檔案大小).
(註: 0x04000
現在規劃給 BDINFO 使用, 其中前 6 bytes 為 MAC address)
...........................................................................
3. 量產時為每一張板子設定唯一的 MAC
address.
a. 首先做出一個模板檔案.
% tools/packer -2 images/massprod.bin \
0x00000=loader_srcroot/ldr.bin,0x0,0x4000
\
0x08000=loader_srcroot/ldr.bin,0x4000,0x18000
\
0x04000=BDINFO.bin \
0x06000=CCFG.bin \
0x20000=images/run.bix
b. 再來, 使用 shell script
或其它程式語言產生迴圈, 其中 ${MAC} 為每次都唯一的 MAC address 字串(xx:yy:zz:ww:tt:ss格式).
% cp
images/massprod.bin images/massprod.bin.${MAC}
% tools/packer -e images/massprod.bin.${MAC} 0x04000=${MAC}
c. 解釋一下, '-e' 代表輸出的時候只更改部份內容, 不要
overwrite 整個檔案.
'images/massprod.bin.${MAC}' 是要被修改的檔案,
'0x04000=${MAC}'
則是修改 MAC address 成新的值.
d. 最後, 就會產生一堆 massprod.bin.*
檔來供燒錄了.
e. 如果嫌這個方法太占硬碟空間,
可參考下列方法:
% tools/packer -e
images/massprod.bin \
0x00000=images/massprod.bin \
0x04000=${MAC}
...........................................................................
Appendix:
A. 編譯 packer
的程序:
% cd
uClinux-dist
% cc -o
tools/packer tools/packer.c
註: SDK-0.5.8
所附的 packer.c 有兩個地方並沒有依照 ANSI C 的規定撰寫,
將會造成某些平台上的編譯失敗(如: gcc 2.x), 請依照下列方式修改後即可編譯:
1.
第236行移到第238行: szFilename =
"/tmp/packer.tmp";
2. 第351行移到第288行: int nRemind;
B. 如果檔案不存在, packer 會自動跳過,
將該區留下空白(0xFF).
C. 不同 flash 大小的寫法:
- 1MB/2MB/4MB flash:
% tools/packer -2 images/massprod.bin \
0x000000=loader_srcroot/ldr.bin,0x0,0x4000 \
0x008000=loader_srcroot/ldr.bin,0x4000,0x18000
- 8MB flash:
% tools/packer -2 images/massprod.bin \
0x000000=loader_srcroot/ldr.bin,0x0,0x4000 \
0x008000=loader_srcroot/ldr.bin,0x4000,0x18000 \
0x400000=0B:80:00:00:00:00:00:00
- 16MB flash:
% tools/packer -2 images/massprod.bin \
0x000000=loader_srcroot/ldr.bin,0x0,0x4000 \
0x008000=loader_srcroot/ldr.bin,0x4000,0x18000 \
0xC00000=0B:80:00:00:00:00:00:00
---------------------------------------------------------------------------------------------
$Header: /local/cvsroot/uClinux-dist/tools/packer-Chinese.htm,v 1.3 2004/09/30 02:54:38 yjlou Exp $
$Author: yjlou $