编译,移植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.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值