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 $