編譯,移植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.