這裡純粹紀錄做過的事情,不保證一定成功。

環境準備:

  首先,先Google STLinux 下載2.3的ISO,另外我的電腦是跑Ubuntu,必須使用更新的install script。把下載的ISO解開複製到某個目錄內,把install用剛剛下載的新版檔案蓋掉。

  先用apt-get安裝rpm套件,再切換到superuser啟動 install script。安裝後的內容會放在 /opt/STM/STLinux-2.3 裡面。

  先到 host/bin 內執行 stmyum update 升級安裝,這樣就會取得最新的 kernel 2.6.23.17 source 與更新後的套件,由於網樂通剛好用相同版號的kernel,剛好省下了自己找kernel的麻煩。

設定環境:

  將適當的PATH加入環境變數中,這樣make才找得到STLinux的toolchain。

  然後,複製STLinux的source tree到自己的working directory,就可以開始工作了。

Start working:

  我們要先找出正確的平台組態,所以先看看目前的 kernel支援哪些平台:

  make ARCH=sh CROSS_COMPILE=sh4-linux- help

  在Architecture specific targets中,找到了符合網樂通平台的pdk7105,所以直接下pdk7105_defconfig就可以產生可用的.config文件:

  make ARCH=sh CROSS_COMPILE=sh4-linux- pdk7105_defconfig

  接下來,就可以修改核心選項,加入我要的RT73無線網卡Driver(跟一堆東西):

  make ARCH=sh CROSS_COMPILE=sh4-linux- menuconfig

  然後編譯kernel:

  make ARCH=sh CROSS_COMPILE=sh4-linux- vmlinux

  有四核心的電腦,下編譯指令時加上 -j4可以節省編譯時間。

開機測試:

  首先,我們要先確定網樂通的硬體配置為何,這可以很簡單的透過u-boot輸出訊息取得:

## Booting image at 80000000 ...
Image Name: Linux 2.6
Image Type: SuperH Linux Kernel Image (gzip compressed)
Data Size: 2459057 Bytes = 2.3 MiB
Load Address: 80800000
Entry Point: 80801000
Verifying Checksum ... OK
Uncompressing Kernel Image ... OK
CMDLen=169
There is "hwaddr" keywords! Position=95
Read MacAddr=24cf21b0ab14

[iptv_kernel]:Starting kernel console=ttyAS0,115200 root=8:2 rootfstype=ext3 rw rootflags=data=journal nwhwconf=device:eth0,hwaddr:24:cf:21:b0:ab:14 phyaddr:0,watchdog:5000 mem=120M bigphysarea=2048 - 0x00000000 - 0 ...

  其中,Load Address跟Execute Address(即Entry Point)要記下來,等下會用到。
  另外,也可以下pri指令,就可以發現u-boot其實是讀入隨身碟的第二磁區根目錄內的vmlinux.ub來開機。

PDK7105> pri
bootdelay=0
baudrate=115200
ethaddr=DE:EA:FF:FF:01:01
board=pdk7105
monitor_base=0xA4000000
monitor_len=0x00040000
monitor_sec=1:0-1
load_addr=0x80000000
ipaddr=192.9.150.61
serverip=192.9.150.67
bootdelay=0
update_uboot=usb start;fatload usb 0 80000000 u-boot.bin;update_spi_uboot
unprot=protect off $monitor_sec
update=erase $monitor_sec;cp.b $load_addr $monitor_base $monitor_len;protect on $monitor_sec
ethaddr=12:34:56:78:06:BD
stdin=serial
stdout=serial
stderr=serial
bootargs=console=ttyAS0,115200 root=8:2 rootfstype=ext3 rw rootflags=data=journal nwhwconf=device:eth0,hwaddr:10:08:E2:12:06:BD phyaddr:0,watchdog:5000 mem=120M bigphysarea=2048
bootcmd=ext2load usb 0:2 80000000 vmlinux.ub; bootm 80000000

Environment size: 715/65532 bytes

  所以如果要做一個相容核心的話,我們還要做一些指令,讓核心變成可以在網樂通上開機的vmlinux.ub:

  sh4-linux-objcopy -O binary vmlinux vmlinux.bin
  gzip --best --force vmlinux.bin
  mkimage -A sh -O linux -T kernel -C gzip -a 0x80800000 -e 0x80801000 -n "Linux 2.6" -d vmlinux.bin.gz vmlinux.ub

  其中,-a 跟 -e 後面的選項就是剛剛開機訊息裡面提到的Load Address跟Execute Address實際位址。

  在不修改任何設定值的情況下,編譯好的kernel只有1.7MB,跟網樂通內附的kernel有很大差距。不過只要編譯過的kernel可以動就好,畢竟我的重點是編譯Wifi Driver Module。

arrow
arrow
    全站熱搜

    stevennick 發表在 痞客邦 留言(3) 人氣()