天天看點

編譯,移植DDWRT到到belkin8230編譯,移植DDWRT到到belkin8230

編譯,移植DDWRT到到belkin8230

早年寫的筆記,壓箱底了,翻出來曬曬

目          錄

編譯,移植DDWRT到belkin8230. 1

實驗環境... 2

下載下傳DDWRTsvn源碼... 2

編譯mini版本的ddwrt4

準備編譯腳本... 4

make_kernel.v24_2.sh. 4

install_mini.v24_2.sh. 4

mini_build_top.txt6

修複tools6

執行編譯... 7

編譯支援atheros的mega版本ddwrt8

準備編譯腳本... 8

修改源碼目錄... 8

Step1. 8

Step2 手動編譯wireless-tools8

Step3. 9

Step4. 9

Step5. 9

Step6. 10

Step6. 10

Step7. 10

Step8. 11

Step9. 12

Step10. 12

執行編譯... 12

燒錄firmware到belkin8230. 12

啟動DD-WRTmini版本... 14

啟動atheros支援版本... 14

支援atheros版本的建議... 15

DD-WRT網站的一些資料... 15

編譯支援atheros的mega版本ddwrt的摸索過程... 16

使用makemenuconfig. 16

分析比較核心配置檔案... 19

CONFIG_MTD_SFLASH=y. 21

CONFIG_BRIDGE_EBT_IPF. 22

CONFIG_WL. 22

第一次嘗試編譯... 23

編譯madwifi的錯誤,mipsisa32-le-elf24

STRIP的問題... 27

利用$(errorxxx = $(xxx))來列印變量内容... 28

編譯mega版本的ddwrt28

燒錄firmware的系統選擇... 28

Insmod沒有必須的列印... 28

wlanconfig: ioctl: Input/output error29

ifconfig –a. 29

核心子產品的混合使用... 29

ddwrt的網頁配置... 30

獲得指定版本的svn源碼... 30

先執行menuconfig. 30

gc-sections option ignored. 30

實驗環境

u  FC6

u  DD WRT svn12917

u  belkin 8230,128Mram,8M flash。CFE刷成wrtsl54gs的cfe,這樣就可以支援128M ram

下載下傳DDWRT svn源碼

編譯的時候最新的源碼版本是12917。

執行

mkdir/home/dd-wrt

cd /home/dd-wrt

在/home/dd-wrt建立一個腳本檔案get_src_svn.sh,内容如下:

###########################################################

#!/bin/sh

su -c"apt-get update;apt-get install sudo openssh-server subversion;echo'dd-wrt  ALL=(ALL) ALL' >>/etc/sudoers"

sudo apt-getinstall gcc g++ binutils patch bzip2 flex bison make gettext unzip zlib1g-dev libc6 libncurses5-dev libstdc++5 automakeautomake1.7 automake1.9 openssl

wgethttp://www.dd-wrt.com/dd-wrtv2/downloads/others/sourcecode/toolchains/toolchains.x86.debian.sp1.tar.bz2

tar -jxftoolchains.x86.debian.sp1.tar.bz2

mkdir tmp

mkdir DD-WRT

mkdirDD-WRT/image

mkdir DD-WRT/src

mkdirDD-WRT/src/linux

mkdirDD-WRT/src/linux/brcm

sudo ln -s/home/dd-wrt/toolchains/3.4.6-uclibc-0.9.28//opt/3.3.4

sudo ln -s/home/dd-wrt/toolchains/3.4.6-uclibc-0.9.28//opt/3.3.6

sudo ln -s/home/dd-wrt/toolchains/3.4.6-uclibc-0.9.28//opt/3.4.4

sudo ln -s/home/dd-wrt/toolchains/3.4.6-uclibc-0.9.28//opt/3.4.6

sudo ln -s/home/dd-wrt/toolchains/4.1.0-uclibc-0.9.28//opt/4.1.0

sudo ln -s/home/dd-wrt/DD-WRT/image/ /home/dd-wrt/GruppenLW

ln -s/home/dd-wrt/toolchains/3.4.6-uclibc-0.9.28//home/dd-wrt/toolchains/3.4.6

ln -s/home/dd-wrt/toolchains/3.4.6-uclibc-0.9.28//home/dd-wrt/toolchains/3.4.4

ln -s/home/dd-wrt/toolchains/3.4.6-uclibc-0.9.28//home/dd-wrt/toolchains/3.3.6

ln -s/home/dd-wrt/toolchains/3.4.6-uclibc-0.9.28//home/dd-wrt/toolchains/3.3.4

ln -s/home/dd-wrt/toolchains/4.1.0-uclibc-0.9.28//home/dd-wrt/toolchains/4.1.0

cd DD-WRT/

svn co -Nsvn://svn.dd-wrt.com/DD-WRT .

svn cosvn://svn.dd-wrt.com/DD-WRT/tools

svn cosvn://svn.dd-wrt.com/DD-WRT/opt

svn co -Nsvn://svn.dd-wrt.com/DD-WRT/src

cd src/

svn cosvn://svn.dd-wrt.com/DD-WRT/src/include.bcm

svn cosvn://svn.dd-wrt.com/DD-WRT/src/include.v23

svn cosvn://svn.dd-wrt.com/DD-WRT/src/include.v24

svn cosvn://svn.dd-wrt.com/DD-WRT/src/led

svn cosvn://svn.dd-wrt.com/DD-WRT/src/ses

svn cosvn://svn.dd-wrt.com/DD-WRT/src/shared

svn cosvn://svn.dd-wrt.com/DD-WRT/src/router

svn cosvn://svn.dd-wrt.com/DD-WRT/src/squashfs-tools

svn cosvn://svn.dd-wrt.com/DD-WRT/src/switch

svn cosvn://svn.dd-wrt.com/DD-WRT/src/tools

svn cosvn://svn.dd-wrt.com/DD-WRT/src/wl

cd linux/brcm

svn cosvn://svn.dd-wrt.com/DD-WRT/src/linux/brcm/linux.v24_2

ln -s/home/dd-wrt/DD-WRT/src/linux/brcm/linux.v24_2/home/dd-wrt/DD-WRT/src/linux/linux

###########################################################

執行這個腳本:

cd /home/dd-wrt

./get_src_svn.sh

執行完了後源碼和toolchain都下好了。

編譯mini版本的ddwrt

       編譯之前,需要在

準備編譯腳本

       一共需要準備3個編譯腳本。其中make_kernel.v24_2.sh和install_mini.v24_2.sh要複制到/dd-wrt/DD-WRT/opt,mini_build_top.txt要複制到/dd-wrt。mini_build_top.txt就是最頂層的編譯檔案。

make_kernel.v24_2.sh

       建立make_kernel.v24_2.sh,内容如下:

###########################################################

#!/bin/sh

./loader-0.02/lzmae ../src/linux/brcm/linux.v24_2/arch/mips/bcm947xx/compressed/piggy vmlinuz

./loader-0.02/lzmae ../src/linux/brcm/linux.v24_2/arch/mips/bcm947xx/compressed/piggyvmlinuzmicro

###########################################################

install_mini.v24_2.sh

建立install_mini.v24_2.sh,内容如下:

###########################################################

cd ../src

cd router

rm -rfmipsel-uclibc/install

make rc-clean

makeservices-clean

makeshared-clean

make httpd-clean

rmbusybox/busybox

rmbusybox/applets/busybox.o

cd ..

make

cd ../opt

mkdir../src/router/mipsel-uclibc/target/etc/config

./sstrip/sstrip../src/router/mipsel-uclibc/target/bin/*

./sstrip/sstrip../src/router/mipsel-uclibc/target/sbin/rc

./sstrip/sstrip../src/router/mipsel-uclibc/target/usr/sbin/*

cp ./bin/ipkg../src/router/mipsel-uclibc/target/bin

cp ./libgcc/*../src/router/mipsel-uclibc/target/lib

cd../src/router/mipsel-uclibc/target/lib

ln -slibgcc_s.so.1 libgcc_s.so

cd../../../../../opt

cp ./etc/preinit../src/router/mipsel-uclibc/target/etc

cp./etc/postinit ../src/router/mipsel-uclibc/target/etc

cp./etc/ipkg.conf ../src/router/mipsel-uclibc/target/etc

cp./etc/config/* ../src/router/mipsel-uclibc/target/etc/config

cp./usr/lib/smb.conf ../src/router/mipsel-uclibc/target/usr/lib

cd../src/router/mipsel-uclibc/target/www

ln -s../tmp/smbshare smb

cd../../../../../opt

./strip_libs.sh

../src/linux/brcm/linux.v24_2/scripts/squashfs/mksquashfs-lzma../src/router/mipsel-uclibc/target target.squashfs -noappend -root-owned -le

./make_kernel.v24_2.sh

../tools/trx -odd-wrt.v24_2.trx ./loader-0.02/loader.gz ../src/router/mipsel-uclibc/vmlinuztarget.squashfs

cpdd-wrt.v24_2.trx /GruppenLW/dd-wrt.v24_mini_generic.bin

###########################################################

mini_build_top.txt

建立mini_build_top.txt,内容如下:

###########################################################

cdDD-WRT/src/router;cp .config_mini.v24 .config;cp ../linux/linux/.config_std../linux/linux/.config;export MYPATH=$PATH;export PATH=/opt/4.1.0/bin:$MYPATH;makeconfigure;cd ../../opt;./install_mini.v24_2.sh;

###########################################################

給mini_build_top.txt加上可執行屬性,輸入:

chmod +x mini_build_top.txt

修複tools

       DDWRT原始附帶的一些tool是AMD64環境下編譯出的64bit可執行程式,通常需要重新編譯。

1.     打開/home/dd-wrt/DD-WRT/src/squashfs-tools/lzma/C/7zip/Compress/LZMA_Lib/makefile

CXX = g++ -O3  -funroll-loops -mtune=opteron -march=opteron-mfpmath=sse -m3dnow -msse2 -mmmx -msse -msse3 -m64 -O3 -Wall-finline-functions

當中的-m64删除

2.     打開/home/dd-wrt/DD-WRT/src/squashfs-tools/makefile

将CFLAGS :=-I$(INCLUDEDIR) -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -funroll-loops-mtune=opteron -march=opteron -mfpmath=sse -m3dnow -msse2 -m64 -O3-D_LZMA_PARAMS

當中的-m64删除

在/home/dd-wrt目錄下建立一個腳本repair_tools.txt,内容如下:

###########################################################

cd /home/dd-wrt

cdDD-WRT/src/router/tools

rm -f jsformat

gcc jsformat.c-o ./jsformat

cd /home/dd-wrt

cdDD-WRT/src/squashfs-tools

rm -fmksquashfs-lzma

make

cp -fmksquashfs-lzma ../linux/brcm/linux.v24_2/scripts/squashfs

cd /home/dd-wrt

cd DD-WRT/tools

rm -f ./strip

gcc strip.c -o./strip

rm -f ./write3

gcc write3.c -o./write3

rm -f ./write4

gcc write4.c -o./write4

rm -f ./webcomp

gcc -o webcomp-DUEMF -DWEBS -DLINUX webcomp.c

cd /home/dd-wrt

###########################################################

執行指令:

cd /home/dd-wrt

chmod +x repair_tools.txt

./repair_tools.txt

執行編譯

執行指令:

cd /home/dd-wrt

./mini_build_top.txt

編譯完成之後會在/home/dd-wrt/GruppenLW下找到編譯好的檔案dd-wrt.v24_mini_generic.bin。也可以在找到/home/dd-wrt/DD-WRT/dd-wrt.v24_2.trx,這兩個檔案是一樣的。

通常情況下更新路由器的固件還需要加上pattern,也就是在dd-wrt.v24_mini_generic.bin檔案頭上加入32bytes的資料,這樣才能被路由器識别接受并更新。

       在編譯好的DDWRT的檔案夾裡,在DD-WRT/tools包含一個程式addpattern。執行指令:

./addpattern -idd-wrt.v24_2.trx -o 8230mega_ar.bin -p W54U

可以得到8230mega_ar.bin。

編譯支援atheros的mega版本ddwrt

Atheros的驅動名字為madwifi,全稱是Multimode Atheros Driver forWiFi on Linux (VAP branch).

準備編譯腳本

       編譯腳本大緻和mini版本的相同,修改mini_build_top.txt,内容如下:

###########################################################

cd DD-WRT/src/router;cp .config_mega_atheros.v24 .config;cp../linux/linux/.config_atheros ../linux/linux/.config;exportMYPATH=$PATH;export PATH=/opt/4.1.0/bin:$MYPATH;makeconfigure;cd ../../opt;./install_mini.v24_2.sh;

###########################################################

修改源碼目錄

以下操作一般都在/DD-WRT/src/router下:

Step1

将madwifi移動到/madwifi.dev/madwifi.dev/

mkdir madwifi.dev

mv madwifimadwifi.dev/madwifi.dev

Step2 手動編譯wireless-tools

在router/wireless-tools/makefile

找到主要的配置語句

## Compiler to use (modify this for crosscompile).

CC = gcc

## Other tools you need to modify for crosscompile (static lib only).

AR = ar

RANLIB = ranlib

修改為

CC = mipsel-linux-gcc

AR = mipsel-linux-uclibc-ar

RANLIB = mipsel-linux-ranlib

在router/wireless-tools/執行一次make:

exportPATH=$PATH:/opt/4.1.0/bin

make

Step3

在src/router/rules目錄,裡面有很多的.mk檔案,找到madwifi.mk檔案。

裡面有下面的語句:

ifeq($(ARCH),mipsel)

madwifi:

ifeq($(CONFIG_DIST),"micro")

    make -j 4 -C madwifi.dev/madwifi.dev/tools2TARGET=mipsisa32-le-elf-micro BINDIR=$(INSTALLDIR)/madwifi/usr/sbin

    make -j 4 -C madwifi.dev/madwifi.dev KERNELPATH=$(LINUXDIR)TARGET=mipsisa32-le-elf-micro

else

    make -j 4 -C madwifi.dev/madwifi.dev/toolsTARGET=mipsisa32-le-elf BINDIR=$(INSTALLDIR)/madwifi/usr/sbin

    make -j 4 -C madwifi.dev/madwifi.devKERNELPATH=$(LINUXDIR) TARGET=mipsisa32-le-elf

endif

将mipsisa32-le-elf全部替換成mips-le-elf。

Step4

       madwifi/ath裡面少了兩個檔案,ah_osdep.c和uudecode.c,從ath_hal目錄裡複制進去。

Step5

複制./hal/public/mips-le-elf.opt_ah.h為./hal/public/opt_ah.h

cd ./hal/public/

cp –rfmips-le-elf.opt_ah.h opt_ah.h

在/home/linuxuser/madwifi_dd/madwifi.dev/ath/makefile

的INCS+=    -I${HAL} -I${obj} -I${HAL}/${OS}-I${obj}/${WLAN} -I${obj}/${DEPTH}後面加上

INCS+=-I ${HAL}/public

Step6

進入/home/dd-wrt/DD-WRT/src/router/radauth

在makefile檔案找到下面的語句:

ifeq($(CONFIG_MADWIFI),y)

  CFLAGS += -DHAVE_MADWIFI -I../madwifi/ -include../madwifi/include/compat.h -DHEADERS_KERNEL

endif

修改成

ifeq($(CONFIG_MADWIFI),y)

  CFLAGS += -DHAVE_MADWIFI -I../ madwifi.dev/madwifi.dev/ -include ../madwifi.dev/madwifi.dev/include/compat.h -DHEADERS_KERNEL

endif

Step6

在config_mega_athero.v24裡屏蔽掉下面的選項。

SUPERCHANNEL

CONFIG_RFLOW

CONFIG_OPENVPN=y

CONFIG_SNMP

CONFIG_NCURSES=y

CONFIG_IPTRAF=y

CONFIG_IPERF=y

Step7

打開src/router/httpd/visuals/dd-wrt.c

把下面

        if (si->isi_rates

           && ((si->isi_rates[si->isi_txrate] &IEEE80211_RATE_VAL) !=

            0)

            &&((si->isi_rates[si->isi_rxrate] & IEEE80211_RATE_VAL) !=

            0)) {

            websWrite(wp,

                 "'%s','%s','%s','%3dM','%3dM','%d','%d','%d','%d'",

                 mac, ifname, UPTIME(si->isi_uptime),

                 ((si->isi_rates[si->isi_txrate] &

                    IEEE80211_RATE_VAL) / 2) * turbo,

                 ((si->isi_rates[si->isi_rxrate] &

                    IEEE80211_RATE_VAL) / 2) * turbo,

                 si->isi_noise + si->isi_rssi + bias,

                 si->isi_noise + bias, si->isi_rssi, qual);

        } else {

            websWrite(wp,

                 "'%s','%s','%s','N/A','N/A','%d','%d','%d','%d'",

                 mac, ifname, UPTIME(si->isi_uptime),

                 si->isi_noise + si->isi_rssi + bias,

                 si->isi_noise + bias, si->isi_rssi, qual);

修改為

        if (si->isi_rates

           && ((si->isi_rates[si->isi_txrate] &IEEE80211_RATE_VAL) !=

            0)

           && ((si->isi_rates[si->isi_txrate] &IEEE80211_RATE_VAL) !=

            0)) {

            websWrite(wp,

                 "'%s','%s','N/A','%3dM','%3dM','%d','%d','%d','%d'",

                 mac, ifname,

                 ((si->isi_rates[si->isi_txrate] &

                    IEEE80211_RATE_VAL) / 2) * turbo,

                 ((si->isi_rates[si->isi_txrate] &

                    IEEE80211_RATE_VAL) / 2) * turbo,

                 si->isi_noise + si->isi_rssi + bias,

                 si->isi_noise + bias, si->isi_rssi, qual);

        } else {

            websWrite(wp,

                 "'%s','%s','N/A','N/A','N/A','%d','%d','%d','%d'",

                 mac, ifname,

                 si->isi_noise + si->isi_rssi + bias,

                 si->isi_noise + bias, si->isi_rssi, qual);

        }

Step8

DD-WRT/src/router/services/tools/site_survey_madwifi.c

直接清除MTIK_OUI。

static int__inline ismtikoui(const unsigned char *frm)

{

    //return frm[1] > 3 &&LE_READ_4(frm + 2) == MTIK_OUI;

    return 0;

}

Step9

       在madwifi.dev/makefile.inc裡

COPTS2+= -Werror

屏蔽掉

Step10

在/home/dd-wrt/DD-WRT/src/router/makefile裡找到export STRIP := @true。改成

export STRIP := $(CROSS_COMPILE)strip

執行編譯

執行指令:

cd /home/dd-wrt

./mini_build_top.txt

編譯完成之後會在/home/dd-wrt/GruppenLW下找到編譯好的檔案dd-wrt.v24_mini_generic.bin。也可以在找到/home/dd-wrt/DD-WRT/dd-wrt.v24_2.trx,這兩個檔案是一樣的。

在DD-WRT/tools包含一個程式addpattern。執行指令:

./addpattern -idd-wrt.v24_2.trx -o 8230mega_ar.bin -p W54U

可以得到8230mega_ar.bin。

燒錄firmware到belkin8230

       belkin8230的ttl定義如下:

4 = Data In (in to router)

3= Data Out

2 = GND

1 = 3.3v power

belkin8230在啟動的時候,會有非常短暫的時間接受tftp的firmware更新。在dos下輸入tftp -i 192.168.1.1 PUT dd.bin,注意dd必須包含在目前路徑下。輸入完後先不要回車。拔掉路由器電源,然後插上,馬上回車。這個需要掌握時間的提示成功後 過一會就可以登入路由器了。

這裡建議使用專門的tftp工具。需要注意的就是路由器一重新開機馬上執行tftp指令就可以成功。tftp完成之後,路由器需要一點時間來重新整理firmware,完成之後就會自動重新開機。

啟動DD-WRT mini版本

啟動atheros支援版本

       DDWRT對8230上插的madwifi支援的很不好,這點可以從編譯atheros網卡需要修改的檔案數量之多可以看出來。是以這裡需要手工啟動atheros網卡。

       啟動的指令如下:

insmod wlan.o

insmod ath_hal.o

insmod ath_rate_sample.o

insmod wlan_scan_ap.o

insmod wlan_scan_sta.o

insmod ath_pci.o

wlanconfig ath0destroy

wlanconfig athcreate wlandev wifi0 wlanmode ap

iwconfig ath0channel 6

iwconfig ath0essid "8230dd"

ifconfig ath0 10.0.0.11up

這個時候應該可以用筆記本網卡掃描到了。

支援atheros版本的建議

       由于編譯出來的atheros支援并不好,甚至連原始目錄都是錯誤的(madwifi而不是madwifi.dev),可以想象svn維護的時候根本就沒考慮過或者測試過atheros的情況。在V24和V24SP1的目錄下可以下載下傳到已經編譯好的支援atheros的firmware,運作是正常的。但是那裡面包含的atheros驅動和自己編譯出來的完全不一樣,版本資訊,核心列印資訊和檔案都不一樣。可知這個根本就不是利用svn裡源碼編譯的。而且web頁面對自己編譯的atheros不太支援。目前的V24SP2根本連編譯好的支援atheros的firmware都找不到。

       如果确實需要使用自己編譯完的atheros的firmware,建議還是使用DDWRT網站已經編譯好的版本。目前找不到這個版本裡面帶的madwifi的源碼,是以無法重做一份。如果需要自己制作module,可以使用2.4.37版本的核心制作,是可以混合使用的。

DD-WRT網站的一些資料

這裡可以看到網頁形式的ddwrt代碼

http://svn.dd-wrt.com:8000/dd-wrt.

這裡可以下載下傳編譯好的支援atheros網卡的firmware。

http://www.dd-wrt.com/dd-wrtv2/downloads/v24-sp1/Consumer/Belkin/F5D8230-4

有dd-wrt.v24_atheros_wifi.bin和dd-wrt.v24_mega_atheros_generic.bin。

編譯支援atheros的mega版本ddwrt的摸索過程

使用make menuconfig

一開始試圖通過利用makemenuconfig來配置編譯支援atheros網卡。

/home/dd-wrt/DD-WRT/src/router下執行make menuconfig

選中BroadcomLinux Router Configuration ─>Special DD-WRT Features --->   include madwifi atherosdrivers

這個選項也其實選項不多,選完後儲存。為了對比,把.config,.config.old和.config.cmd全部儲存下來,放在learning2\router\dd-wrt\lab\1stconfig\目錄下面。

儲存完之後出現第二個配置頁面。

是Linux Kernelv2.4.37 Configuration。

發現config和config.old的差别比較大,感覺也許使用配置好的config進行修改的比較好。

目前使用的實際上是.config_mini.v24。

關鍵的選項是CONFIG_MADWIFI。

在madwifi/makefile找到有configcheck一段如下

# new targetsshould be inserted ABOVE this line in order to avoid

# problems withthe included kernel configuration file below.

include$(KERNELCONF)

configcheck:sanitycheck

    @echo -n "Checking kernelconfiguration... "

    @# check version of kernel

    @echo $(KERNELRELEASE) | grep -q -i'^[2-9]\.[4-9]\.' || { \

       echo "FAILED"; \

       echo "Only kernel versions 2.4.x and above are supported."; \

       echo "You have $(KERNELRELEASE)."; \

       exit 1; \

    }

    @# check kernel configuration

    @if [ -z "$(CONFIG_SYSCTL)" ];then \

       echo "FAILED"; \

       echo "Please enable sysctl support."; \

       exit 1; \

    fi

ifneq ($(strip$(BUS)),AHB)

    @# check PCI support

    @if [ -z "$(CONFIG_PCI)" ]; then \

       echo "FAILED"; \

       echo "Please enable PCI support."; \

       exit 1; \

    fi

endif

    @# check wireless extensions support isenabled

    @if [ -z "$(CONFIG_NET_RADIO)" ];then \

       echo "FAILED"; \

       echo "Please enable wireless extensions."; \

       exit 1; \

    fi

    @# check crypto support is enabled

    @if [ -z "$(CONFIG_CRYPTO)" ];then \

       echo "FAILED"; \

       echo "Please enable crypto API."; \

       exit 1; \

    fi

    @echo "ok."

其中關鍵的幾點如下

kernel versions 2.4.x or above

CONFIG_SYSCTL

CONFIG_PCI=y

CONFIG_NET_RADIO

CONFIG_CRYPTO

這幾條.config_atheros檔案全部滿足。但是.config_mini不一定。在看看src/linux/brcm/linux.v24_2/下有.config_std, .config_micro和.config_atheros。認為既然是svn裡面的配置檔案,應該比自己配置的好。

分析比較核心配置檔案

先比價一下.config_std和.config_atheros,這兩個大小最為接近,而且.config_std是目前能夠編譯成功運作的核心配置。

這兩個檔案差别不大。

CONFIG_MTD_SFLASH=y

std中有CONFIG_MTD_SFLASH=y,但是atheros中沒有

檢視menuconfig得知這個選項是Broadcom Chipcommon SerialFlash support。

這個沒有選項,對比下PMC551的位置推斷出來的。

# CONFIG_MTD_SFLASH is not set

# CONFIG_MTD_PMC551 is not set

8230闆子上的flash是spansion的S29GL064。spansion專門從事NOR閃存開發和制造,好像已經破産。這個flash顯然不是Broadcom的,是以因為沒有影響。

CONFIG_BRIDGE_EBT_IPF

這個是

ebt: IP filter support 

對系統支援關系不大。

CONFIG_WL

CONFIG_WL_USE_APSTA=y

CONFIG_WL_AP="wlconfig_lx_router_ap"

CONFIG_WL_STA="wlconfig_lx_router_sta"

CONFIG_WL_APSTA="wlconfig_lx_router_apsta"

CONFIG_WL_AP_MIMO="wlconfig_lx_router_ap_mimo"

CONFIG_WL_STA_MIMO="wlconfig_lx_router_sta_mimo"

CONFIG_WL_APSTA_MIMO="wlconfig_lx_router_apsta_mimo"

CONFIG_WL_AP_ONCHIP_G="wlconfig_lx_router_ap_1chipG"

CONFIG_WL_STA_ONCHIP_G="wlconfig_lx_router_sta_1chipG"

CONFIG_WL_APSTA_ONCHIP_G="wlconfig_lx_router_apsta_1chipG"

CONFIG_WL=y

CONFIG_APSTAMIMO=y

這些配置都是std的,atheros都沒有。關系應該不大。也許是配置工具的問題,而atheros卡使用的配置工具是另外一種,是以很可能就不能配置。

CONFIG_WL=y

CONFIG_APSTAMIMO=y

這些配置都是std的,atheros都沒有。不過這個是重複的。

USBSerial Converter support

CONFIG_USB_SERIAL=m

CONFIG_USB_SERIAL_GENERIC=y

CONFIG_USB_SERIAL_PL2303=m

CONFIG_USB_SERIAL_SIERRAWIRELESS=m

CONFIG_USB_SERIAL_IPW=m

CONFIG_USB_SERIAL_OPTION=m

這個顯然沒有必要,隻有PC上才會使用USB轉序列槽的東西。

在src/router下面有不少的配置檔案。

第一次嘗試編譯

在config_mini.v24裡加入CONFIG_MADWIFI=y。修改mini_build_top.txt

cd DD-WRT/src/router;cp .config_mini.v24 .config;cp ../linux/linux/.config_atheros../linux/linux/.config;export MYPATH=$PATH;export PATH=/opt/4.1.0/bin:$MYPATH;makeconfigure;cd ../../opt;./install_mini.v24_2.sh;

編譯失敗,幾乎所有madwifi的include全都是src/router/madwifi.dev/madwifi.dev,而且結構體成員應用錯誤如isi_getuptime等層出不窮。

另外出現這個錯誤:

mipsel-linux-uclibc-gcc-I. -I/home/dd-wrt/DD-WRT/src/router/shared-I../httpd -I/home/dd-wrt/DD-WRT/src/include.v24 -Wall-I/home/dd-wrt/DD-WRT/src/ -fpic -DHAVE_DROPBEAR -DHAVE_SSHD -DHAVE_MADWIFI -I../services/networking-I../madwifi -include ../madwifi/include/compat.h -I../wireless-tools-DHEADERS_KERNEL -DHAVE_SYSLOG -DARCH_broadcom -DSET_BOOT_WAIT-DHAVE_SPUTNIK_APD -DHAVE_UPNP -Os -pipe -mips32 -mtune=mips32-funit-at-a-time   -c -o crc.o crc.c

make[2]: *** Norule to make target `../wireless-tools/libiw.so.29', needed by`libutils.so'.  Stop.

make[2]: Leavingdirectory `/home/dd-wrt/DD-WRT/src/router/libutils'

make[1]: ***[libutils] Error 2

make[1]: Leavingdirectory `/home/dd-wrt/DD-WRT/src/router'

make: *** [all]Error 2

檢視wireless-tools/libiw.so.29裡根本沒有編譯的痕迹,檢查一下wireless-tools的makefile

找到主要的配置語句:

## Compiler to use (modify this for crosscompile).

CC = gcc

## Other tools you need to modify for crosscompile (static lib only).

AR = ar

RANLIB = ranlib

這個都已經寫成固定的了,沒法用變量适應交叉編譯,隻好進行修改。這個時候可以肯定svn的版本維護有很大的問題惡劣。

修改為

CC = mipsel-linux-gcc

AR = mipsel-linux-uclibc-ar

RANLIB = mipsel-linux-ranlib

接下來還有宏定義MTIK_OUI的錯誤,

編譯madwifi的錯誤,mipsisa32-le-elf

       當DD-WRT編譯到madwifi時出現錯誤

make[2]:Entering directory `/home/dd-wrt/DD-WRT/src/router/madwifi.dev/madwifi.dev'

Makefile.inc:198:*** TARGET mipsisa32-le-elf is invalid, valid targets are: mips-le-elf.  Stop.

make[2]: Leavingdirectory `/home/dd-wrt/DD-WRT/src/router/madwifi.dev/madwifi.dev'

make[1]: ***[madwifi] Error 2

make[1]: Leavingdirectory `/home/dd-wrt/DD-WRT/src/router'

make: *** [all]Error 2

這個看起來是makefile裡編譯器錯誤。

makefile.inc原文如下

# TARGET definesthe target platform architecture. It must match one of

# the targetplatforms supported by the HAL. The default target is the

# host machinearchitecture. You can override TARGET on the make command

# line or in theenvironment. See hal/linux/*.inc for the list of

# supportedtargets.

ifeq(,$(wildcard $(HAL)/public/$(TARGET).inc))

TARGETS=$(basename$(notdir $(wildcard $(HAL)/public/*.inc)))

$(error TARGET$(TARGET) is invalid, valid targets are: $(TARGETS))

endif

查找target定義,在68行找到

ifeq ($(strip $(BUS)),AHB)

# Bus type AHBforces the target platform to be mipsisa32.

TARGET :=   mipsisa32-be-elf

在makefile.inc有懷疑的target語句後加上

$(error TARGET = $(TARGET))

進入/home/dd-wrt/DD-WRT/src/router/madwifi.dev/madwifi.dev。

執行

exportPATH=$PATH:/opt/4.1.0/bin

make

這樣可以單獨調試madwifi了。加上error會導緻編譯終止。

強制修改了makefile.inc的target還是不行

make -j 4 -Cmadwifi.dev/madwifi.devKERNELPATH=/home/dd-wrt/DD-WRT/src/linux/brcm/linux.v24_2TARGET=mipsisa32-le-elf

make[2]:Entering directory `/home/dd-wrt/DD-WRT/src/router/madwifi.dev/madwifi.dev'

Makefile.inc:207:*** TARGET mipsisa32-le-elf is invalid, valid targets are: mips-le-elf.  Stop.

make[2]: Leavingdirectory `/home/dd-wrt/DD-WRT/src/router/madwifi.dev/madwifi.dev'

還是獨立編譯一次

make[3]:Entering directory `/home/linuxuser/madwifi_dd/madwifi.dev/ath'

/opt/3.3.6/bin/mipsel-linux-uclibc-gcc-D__KERNEL__ -I/home/dd-wrt/DD-WRT/src/linux/brcm/linux.v24_2/include -Wall-Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common-fno-builtin-strpbrk -fno-builtin-sprintf -DBCMDRIVER -DBCMVISTAROUTER-DBCM5354 -DBCMWPA2 -fomit-frame-pointer -funit-at-a-time  -I/home/dd-wrt/DD-WRT/src/linux/brcm/linux.v24_2/include/asm/gcc -G 0-mno-abicalls -fno-pic -pipe -DBCMGPIO2 -finline-limit=100000 -O2 -mabi=32 -march=mips32 -Wa,-32 -Wa,-march=mips32-Wa,-mips32 -Wa,--trap -DMODULE -mlong-calls -fno-common -include./../include/compat.h -I./../include -I./../hal -I.-I./../hal/linux -I./../net80211 -I./.. -DATH_PCI-DAH_BYTE_ORDER=AH_LITTLE_ENDIAN -O2 -G 0 -mno-abicalls -fno-pic -pipe -mips32-mtune=mips32 -funit-at-a-time -Wa,--trap -fno-strict-aliasing -fno-common-fomit-frame-pointer -mlong-calls -DATH_SUPERG_FF=1 -DATH_SUPERG_DYNTURBO=1-DATH_TURBO_SCAN=1 -DATH_SUPERG_COMP=1 -DATH_SUPERG_XR=1-DOPT_AH_H=\"./../hal/public/mips-le-elf.opt_ah.h\" -nostdinc-iwithprefix include -DKBUILD_BASENAME=if_ath -c -o if_ath.o if_ath.c

if_ath.c:45:20:opt_ah.h: No such file or directory

make[3]: ***[if_ath.o] Error 1

make[3]: Leavingdirectory `/home/linuxuser/madwifi_dd/madwifi.dev/ath'

make[2]: ***[_mod_/home/linuxuser/madwifi_dd/madwifi.dev/ath] Error 2

make[2]: Leavingdirectory `/home/dd-wrt/DD-WRT/src/linux/brcm/linux.v24_2'

make[1]: ***[all] Error 2

make[1]: Leavingdirectory `/home/linuxuser/madwifi_dd/madwifi.dev/ath'

make: ***[modules] Error 1

在get_arch_target裡面最後強制加上

TARGET=mips_le_elf

ARCH=mips

最終還是misp32_le_elf的問題。在makefile.inc沒有起到作用。不知道這些變量到底是那個地方決定的。

make -j 4 -C madwifi.dev/madwifi.devKERNELPATH=/home/dd-wrt/DD-WRT/src/linux/brcm/linux.v24_2TARGET=mipsisa32-le-elf

這句話是上層檔案強加的,而src目錄的makefile沒有任何實質性内容。

在router的makefile裡面找到下面的話。

CONFIG_IPTABLES=y

#CONFIG_WLC=y

include rules/configs.mk

立刻找到rules目錄,裡面有很多的.mk檔案,找到madwifi.mk檔案。

裡面有下面的語句:

ifeq($(ARCH),mipsel)

madwifi:

ifeq($(CONFIG_DIST),"micro")

    make -j 4 -C madwifi.dev/madwifi.dev/tools2TARGET=mipsisa32-le-elf-micro BINDIR=$(INSTALLDIR)/madwifi/usr/sbin

    make -j 4 -C madwifi.dev/madwifi.devKERNELPATH=$(LINUXDIR) TARGET=mipsisa32-le-elf-micro

else

    make -j 4 -C madwifi.dev/madwifi.dev/toolsTARGET=mipsisa32-le-elf BINDIR=$(INSTALLDIR)/madwifi/usr/sbin

    make -j 4 -C madwifi.dev/madwifi.devKERNELPATH=$(LINUXDIR) TARGET=mipsisa32-le-elf

endif

這個就完全是了修改madwifi的配置檔案始終無用的的原因。

将mipsisa32-le-elf全部替換成mips-le-elf。

STRIP的問題

make -C./tools  install || exit 1

make[3]:Entering directory`/home/dd-wrt/DD-WRT/src/router/madwifi.dev/madwifi.dev/tools'

install -d/home/dd-wrt/DD-WRT/src/router/mipsel-uclibc/install/madwifi/usr/sbin

for i inathstats 80211stats athkey athchans athctrl athdebug 80211debug wlanconfigregdomain; do \

                install $i/home/dd-wrt/DD-WRT/src/router/mipsel-uclibc/install/madwifi/usr/sbin/$i; \

                @true/home/dd-wrt/DD-WRT/src/router/mipsel-uclibc/install/madwifi/usr/sbin/$i; \

        done

/bin/sh: line 2:@true: command not found

對應的是makefile裡面下面幾句話:

install: ${ALL}

    install -d ${DESTDIR}${BINDIR}

    for i in ${ALL}; do \

        install $$i ${DESTDIR}${BINDIR}/$$i; \

        ${STRIP} ${DESTDIR}${BINDIR}/$$i; \

    done

利用$(error xxx = $(xxx))來列印變量内容

不知道為什麼strip成了@true了。在各個相關的makefile裡面加上echo,在makefile.inc裡面加上$(error xxx = $(xxx))來列印變量内容。比如在一個Makefile.inc加上如下語句

$(error STRIP = $( STRIP),CC = $( CC),LD = $( LD), OBJCOPY = $( OBJCOPY) ),列印的結果如下

Makefile.inc:223:*** STRIP = @true, CC=mipsel-linux-uclibc-gcc, LD=mipsel-linux-uclibc-ld,OBJCOPY=.  Stop.

經過檢查strip成了@true,是上層檔案的makefile引入的, 在/home/dd-wrt/DD-WRT/src/router/makefile裡找到export STRIP := @true。改成export STRIP :=$(CROSS_COMPILE)strip

編譯mega版本的ddwrt

       剛才編譯完成的firmware是mini版本的,無法正常啟動,缺少libiw.so.2檔案,導緻啟動的時候kernelpanic。

Mounted devfs on/dev

/sbin/initKernelpanic: Attempted to kill init!

: can't load library 'libiw.so.2<0>Rebooting in 5 seconds..9'

Please stand bywhile rebooting the system...

查找庫檔案。根本沒有libiw.so.2。隻有一個libiw.so.29。先複制到squashfs-root/lib看看。系統成功啟動。但是頁面上沒有無線的資訊。Iwconfig等工具也都沒有。決定編譯mega版本,也許能自動複制這些東西到rootfs。

       mega版本的ddwrt也出現很多的錯誤,基本上靠去掉選項來uibi錯誤。因為這些出錯的功能并不重要。

燒錄firmware的系統選擇

另外在HP的筆記本上用window下的tftp工具可以燒錄啟動,dell的FC6下的tftp工具燒錄不能啟動。這個用的是同樣的檔案,原因不明。

Insmod沒有必須的列印

       系統啟動之後,并不能找到atheros網卡。需要手工啟動。使用以下的指令:

insmod wlan.o

insmod ath_hal.o

insmod ath_rate_sample.o

insmodwlan_scan_ap.o

insmodwlan_scan_sta.o

insmod ath_pci.oautocreate=ap

結果在執行insmod ath_pci.o autocreate=ap一點反映都沒有,使用echo 8 > /proc/sys/kernel/printk之後執行insmod也一點資訊都沒有。但是實際上ath_pci應該是裝載子產品的時候就應該有必然列印的資訊。而且這些insmod指令在其他的系統上測試過,沒有問題的。經過試驗,發現是這個版本的ath_pci不支援autocreate=ap,如果執行insmod ath_pci.o就能夠正常insmod。這個比較難找問題。另外這個系統沒有modinfo,modprobe之類的指令。

wlanconfig: ioctl: Input/outputerror

       使用手動編譯的madwifi驅動的時候,執行wlanconfig會出現如下錯誤:

wlanconfig: ioctl: Input/output error。

經過查找資料,必須先執行wlanconfig ath0 destroy。這個也是在這台路由器上才出現的現象。同樣的驅動在openwert下執行就沒有這個問題。

ifconfig –a

       一般情況下使用ifconfig檢視所有的活動裝置的資訊。如果使用ifconfig –a可以檢視所有的網絡裝置,不管有沒有啟動,這個在檢測驅動上有一定的作用。

核心子產品的混合使用

       一般情況下,如果kernel module和kernel的版本号是密切相關的,一般來講必須一一對應,否則insmod就會報錯。但是這次試驗中,2.4.37和2.4.36的vmlinuz和module是可以混合搭配使用的。比如編譯的2.4.37的vmlinuz下,是可以insmod2.4.36的核心子產品。

ddwrt的網頁配置

       如果沒有成功insmod ath_pci.o,在ddwrt的網頁上就會完全沒有無線配置的内容,缺少page。隻有在成功之後重新整理一次網頁才會重新出現。

獲得指定版本的svn源碼

在試驗中,找到過svn10011版本的源碼,應該使用如下的指令:

svn –revision=10010co svn://svn.xxxx

雖然找到了ddwrt已經編譯好能用的firmware一樣的svn版本号,但是根據madwifi的編譯結果和版本列印資訊來看,絕對不是同一份代碼。

先執行menuconfig

       如果是下載下傳一份全新的DDWRT源碼,需要先在linux目錄執行一次make menuconfig才行,否則可能報出如下錯誤。

there's no rule to makeinclude/linux/autoconf.h (needed by include/config/MARKER

gc-sections option ignored

mipsel-linux-uclibc/bin/ld: Warning:gc-sections option ignored。

這隻是一個警告,在編譯(-c)的時候使用了"-l"選項,這個應該用于連結。 

下面有一段來自于http://gcc.gnu.org/ml/gcc-help/1999-12n/msg00351.html的原文:

The message that gcc reported is correct.When you supply a library (even a compiled object file like you did) to acommand that does no linking (gcc -c), gcc simply informs you that the librarywas not used because no linking was done. You didn't ask it to. Since youspecified -c, "source" files are going to be compiled into .o objectfiles, NOT into an executable, nor is anything going to be done with any objectfiles. Gcc saw the extraneous object file supplied and simply ignored it.