赞
踩
早年写的笔记,压箱底了,翻出来晒晒
目 录
u IXP425DP(P720 板) 266Mhz 64M ram16M flash,phy片为KS8721B,一个以太网口IXP0
u FC4: kernel 2.6.11-1.1369_FC4smp(FC6, RH9也行),安装在虚拟机上
u tool chain为i686-pc-linux-gnulibc2.2-x-xscale-elf.tar
u redboot-intel-xscale-040330.tar.gz
u redboot-intel-xscale-050425.tar.gz
u redboot-intel-xscale-070320.tar.gz
u npe-1.4.epk
u npe-2.02.epk
u December 12, 2003版本的IxNpeMicrocode.c
u 2.02版本的IxNpeMicrocode.c
3个不同版本的redboot编译和修改的方法都有区别。
Redboot需要专门的编译器。源文件为i686-pc-linux-gnulibc2.2-x-xscale-elf.tar.Z。3个版本的redboot需要的编译器是一样的。
将i686-pc-linux-gnulibc2.2-x-xscale-elf.tar.复制到在/home/linuxuser/redboot/gnulibc2.2下,执行如下命令:
#cd/home/linuxuser/redboot/gnulibc2.2
#tar zxfvi686-pc-linux-gnulibc2.2-x-xscale-elf.tar.Z
#mkdir -p/opt/redhat/xscale-030422
#cd ..
#mv gnulibc2.2/*/opt/redhat/xscale-030422
#cd /opt/redhat/xscale-030422/H-i686-pc-linux-gnulibc2.2/bin
#ln -sxscale-elf-gcc arm-elf-gcc
#ln -sxscale-elf-ar arm-elf-ar
#ln -sxscale-elf-objcopy arm-elf-objcopy
#exportPATH=/opt/redhat/xscale-030422/H-i686-pc-linux-gnulibc2.2/bin:$PATH
这样,编译器就安装到/opt/redhat/xscale-030422/H-i686-pc-linux-gnulibc2.2/bin了。
040330版本的redboot也就是1.94版本。下载的源文件为redboot-intel-xscale-040330.tar.gz。解压到/home/linuxuser/redboot/redboot-intel-xscale-040330。040330版本需要npe-1.4.epk和December 12, 2003版本的IxNpeMicrocode.c来支持. 这个版本的IxNpeMicrocode已经很难在网上下载了,也许可以使用2.02或者2.04版本的IxNpeMicrocode。但是本次实验没有试过。
npe-1.4.epk和2.02版本的IxNpeMicrocode不能搭配使用于1.94版本的redboot。npe-2.02.epk和2.02版本的IxNpeMicrocode也不能搭配使用于1.94版本的redboot。
RH9和 FC4下可以编译,FC6下无法编译040330版本的redboot。
Redboot的编译是使用ecosconfig,在./bin文件夹下,需要一些库的支持,可以用ldd来检查。
#ldd ecosconfig
libtcl.so.0 => /usr/lib/libtcl.so.0(0x40026000)
libstdc++-libc6.2-2.so.3 =>/usr/lib/libstdc++-libc6.2-2.so.3 (0x400b0000)
libm.so.6 => /lib/tls/libm.so.6 (0x400f2000)
libc.so.6 => /lib/tls/libc.so.6(0x42000000)
libdl.so.2 => /lib/libdl.so.2(0x40114000)
libgcc_s.so.1 => /lib/libgcc_s.so.1(0x40117000)
/lib/ld-linux.so.2 =>/lib/ld-linux.so.2 (0x40000000)
在FC4,一般需要建立libtcl.so.0链接文件,安装compat-libstdc++-296-2.96-132.fc4.i386.rpm来获得libstdc++-libc6.2-2.so.3。建立libtcl.so.0链接的命令如下:ln -s /usr/lib/libtcl8.4.so/usr/lib/libtcl.so.0
在RH9里需要建立libtcl.so.0链接。命令如下:ln -s /usr/lib/libtcl.so/usr/lib/libtcl.so.0
在FC6下要安装tcl-8.4.13-3.fc6.i386.rpm来获得libtcl8.4.so,然后使用ln -s /usr/lib/libtcl8.4.so /usr/lib/libtcl.so.0建立链接。
需要两个软件包就可以支持以太网。先加入npe-1.4.epk,执行如下命令:
cd /home/linuxuser/redboot/redboot-intel-xscale-040330
exportTOPDIR=`pwd`
exportECOS_REPOSITORY=${TOPDIR}/packages
chmod +x${ECOS_REPOSITORY}/ecosadmin.tcl
echo y |${ECOS_REPOSITORY}/ecosadmin.tcl add npe-1.4.epk
中间可能会报错如下说tcl没有安装好,但是没关系。
Can't find ausable init.tcl in the following directories:
/opt/redhat/xscale-030422/H-i686-pc-linux-gnulibc2.2/share/tcl8.0 /opt/redhat/H-i686-pc-linux-gnulibc2.2/usr/share/tcl8.0/opt/redhat/share/tcl8.0 /opt/redhat/share/tcl8.0
This probablymeans that Tcl wasn't installed properly.
命令输入后正确结果如下:
# exportTOPDIR=`pwd`
# exportECOS_REPOSITORY=${TOPDIR}/packages
# chmod +x ${ECOS_REPOSITORY}/ecosadmin.tcl
# echo y |${ECOS_REPOSITORY}/ecosadmin.tcl add npe-1.4.epk
adding packageCYGPKG_DEVS_ETH_INTEL_NPE
adding packageCYGPKG_DEVS_ETH_ARM_IXDP425_NPE
adding packageCYGPKG_DEVS_ETH_ARM_GRG_NPE
adding packageCYGPKG_DEVS_ETH_ARM_PRPMC1100_NPE
再加入IxNpeMicrocode.c,下载December 12, 2003版本的IxNpeMicrocode.c,执行如下命令:
cp IxNpeMicrocode.c${ECOS_REPOSITORY}/devs/eth/intel/npe/v1_4/src/npeDl
这样就弄好了。
FC4中不能调用ecosadmin.tcl加入npe-1.4.epk,会报错。
npe-1.4.epk实际上是一个tar ball。将npe-1.4.epk复制到/home/linuxuser/redboot/npe,利用tar –xvf npe-1.4.epk命令解压后得到devs文件夹和pkgadd.db,devs文件夹可以覆盖/home/linuxuser/redboot/redboot-intel-xscale-040330/packages/devs。另外将pkgadd.db的全部内容复制粘贴到/home/linuxuser/redboot/redboot-intel-xscale-040330/packages/ecos.db的末尾。
或者使用cat命令也可以达到复制粘贴同样的效果
#cat pkgadd.db >>/home/linuxuser/redboot/redboot-intel-xscale-040330/packages/ecos.db
根据板子的不同,需要对redboot进行修改。
1.4版本在/packages/hal/arm/xscale/ixdp425/current/include/ixdp425.h,修改内存大小和配置。
在ixdp425.h里找到下面两行:
#define SDRAM_SIZE 0x10000000 // 256MB
#defineIXP425_SDRAM_CONFIG_INIT (SDRAM_CONFIG_CAS_3 | SDRAM_CONFIG_2x32Mx16)
修改为如下:
//#defineSDRAM_SIZE 0x10000000 // 256MB
#defineSDRAM_SIZE 0x04000000 // 64Mbytes
//#defineIXP425_SDRAM_CONFIG_INIT (SDRAM_CONFIG_CAS_3 | SDRAM_CONFIG_2x32Mx16)
#defineIXP425_SDRAM_CONFIG_INIT (SDRAM_CONFIG_CAS_3 | SDRAM_CONFIG_2x16Mx16)
找到/packages/hal/arm/arch/current/src/vectors.S,找到其中vectors:段,将代码修改两行如下为如下,其中红色部分为修改内容。
vectors:
//UNMAPPED_PTR(reset_vector) // 0x20
ldr pc,.reset_vector
PTR(undefined_instruction) // 0x24
PTR(software_interrupt) // 0x28
PTR(abort_prefetch) // 0x2C
PTR(abort_data) // 0x30
// .word 0 //0x34
UNMAPPED_PTR(reset_vector)
因为phy使用的是KS8721B, phy的id从1开始。
1. IxEthMii.c
在1.4版本epk中修改packages/devs/eth/intel/npe/v1_4/src/ethMii/IxEthMii.c
找到如下代码,加入红色部分:
if ((ixEthMiiPhyId[i] ==IX_ETH_MII_KS8995_PHY_ID)
|| (ixEthMiiPhyId[i] == IX_ETH_MII_KS8721B_PHY_ID)
|| (ixEthMiiPhyId[i] == IX_ETH_MII_LXT971_PHY_ID)
|| (ixEthMiiPhyId[i] == IX_ETH_MII_LXT972_PHY_ID)
|| (ixEthMiiPhyId[i] == IX_ETH_MII_LXT973_PHY_ID))
2. IxEthMii_p.h
找到如下代码加入红色部分
#defineIX_ETH_MII_LXT973_PHY_ID 0x00137A10
#defineIX_ETH_MII_KS8995_PHY_ID 0x00221450
#defineIX_ETH_MII_KS8721B_PHY_ID 0x00221619
1.4版本在packages/devs/eth/arm/ixdp425/npe/v1_4/include/ixdp425_npe.inl.
将CYGNUM_ETH0_PHY_NO改为 1,CYGNUM_ETH1_PHY_NO改为 2
//#defineCYGNUM_ETH0_PHY_NO 0
#defineCYGNUM_ETH0_PHY_NO 1
//#defineCYGNUM_ETH1_PHY_NO 1
#defineCYGNUM_ETH1_PHY_NO 2
另外找到
#ifdefined(CYGPKG_REDBOOT) && defined(CYGPKG_REDBOOT_FLASH) && \
defined(CYGSEM_REDBOOT_FLASH_CONFIG)&& defined(CYGPKG_REDBOOT_NETWORKING) && \
!defined(CYGSEM_DEVS_ETH_ARM_IXDP425_EEPROM)
去掉!defined(CYGSEM_DEVS_ETH_ARM_IXDP425_EEPROM),修改为如下:
#ifdefined(CYGPKG_REDBOOT) && defined(CYGPKG_REDBOOT_FLASH) && \
defined(CYGSEM_REDBOOT_FLASH_CONFIG) &&defined(CYGPKG_REDBOOT_NETWORKING)
1.4版本在packages/devs/eth/intel/npe/v1_4/src/if_npe.c
在检查mac_ok之前加入mac_ok = true就可以了。
mac_ok= true;
if (!mac_ok) {
#ifdef DEBUG
diag_printf("Error getting MACaddress.\n");
#endif
执行以下命令
exportTOPDIR=`pwd`
exportECOS_REPOSITORY=${TOPDIR}/packages
#chmod +x${ECOS_REPOSITORY}/ecosadmin.tcl
#echo y |${ECOS_REPOSITORY}/ecosadmin.tcl add npe-1.4.epk
mkdir${TOPDIR}/build
cd${TOPDIR}/build
#../host/configure
#make
cp../bin/ecosconfig .
./ecosconfig newixdp425 redboot
./ecosconfigimport ${ECOS_REPOSITORY}/hal/arm/xscale/ixdp425/current/misc/redboot_ROM.ecm
./ecosconfig addintel_npe
./ecosconfig addixdp425_npe
./ecosconfigtree
make
编译完成之后,会在build/install/bin下生成redboot.bin等文件。
下载的源文件为redboot-intel-xscale-050425.tar.gz。解压到/home/linuxuser/redboot/redboot-intel-xscale-050425。
这个版本的redboot是IXP400-RedBoot-2_02-relnotes.pdf上说明的版本。另外这个版本的一些npe文件的路径和040330版本的不一样。
0504版本的redboot可以在FC4,FC6下编译通过。
这个版本的ecosconfig需要的库文件和040330版本的一样。
将npe-2.02.epk和2.02版本的IxNpeMicrocode.c复制到/home/linuxuser/redboot/redboot-intel-ixp4xx-050425,并且输入以下命令:
#cd /home/linuxuser/redboot/redboot-intel-ixp4xx-050425
#exportTOPDIR=`pwd`
#exportECOS_REPOSITORY=${TOPDIR}/packages
#chmod +x${ECOS_REPOSITORY}/ecosadmin.tcl
#echo y |${ECOS_REPOSITORY}/ecosadmin.tcl add npe-2.02.epk
#cp IxNpeMicrocode.c${ECOS_REPOSITORY}/devs/eth/intel/npe/npeDl/v2_01/src
中间可能会报错说tcl没有安装好,但是没关系。
根据板子的不同,需要对redboot进行修改。
2.02版本在/packages/hal/arm/xscale/ixdp425/current/include/ixdp425.h,修改内存大小和配置。
在ixdp425.h里找到下面两行:
#defineSDRAM_SIZE 0x10000000 // 256MB
#defineIXP425_SDRAM_CONFIG_INIT (SDRAM_CONFIG_CAS_3| SDRAM_CONFIG_4x32Mx16)
修改为如下:
//#defineSDRAM_SIZE 0x10000000 // 256MB
#defineSDRAM_SIZE 0x04000000 // 64Mbytes
//#defineIXP425_SDRAM_CONFIG_INIT (SDRAM_CONFIG_CAS_3 | SDRAM_CONFIG_4x32Mx16)
#defineIXP425_SDRAM_CONFIG_INIT (SDRAM_CONFIG_CAS_3 | SDRAM_CONFIG_2x16Mx16)
找到/packages/hal/arm/arch/current/src/vectors.S,找到其中vectors:段,将代码修改两行如下为如下,其中红色部分为修改内容。
vectors:
//UNMAPPED_PTR(reset_vector) // 0x20
ldr pc,.reset_vector
PTR(undefined_instruction) // 0x24
PTR(software_interrupt) // 0x28
PTR(abort_prefetch) // 0x2C
PTR(abort_data) // 0x30
// .word 0 //0x34
UNMAPPED_PTR(reset_vector)
因为phy使用的是KS8721B, phy的id从1开始。注意数组序号和1.94版本的不同
1. IxEthMii.c
/packages/devs/eth/intel/npe/ethMii/v2_01/src/IxEthMii.c
找到如下代码,加入红色部分:
if((ixEthMiiPhyId[phyId] == IX_ETH_MII_KS8995_PHY_ID)
|| (ixEthMiiPhyId[phyId] ==IX_ETH_MII_KS8721B_PHY_ID)
|| (ixEthMiiPhyId[phyId] ==IX_ETH_MII_LXT971_PHY_ID)
|| (ixEthMiiPhyId[phyId] ==IX_ETH_MII_LXT972_PHY_ID)
|| (ixEthMiiPhyId[phyId] ==IX_ETH_MII_LXT973_PHY_ID)
|| (ixEthMiiPhyId[phyId] ==IX_ETH_MII_LXT973A3_PHY_ID)
|| (ixEthMiiPhyId[phyId] == IX_ETH_MII_LXT9785_PHY_ID))
2. IxEthMii_p.h
找到如下代码加入红色部分
#defineIX_ETH_MII_LXT973_PHY_ID 0x00137A10
#defineIX_ETH_MII_KS8995_PHY_ID 0x00221450
#defineIX_ETH_MII_KS8721B_PHY_ID 0x00221619
在packages/devs/eth/arm/ixdp425/npe/v2_01/include/ixdp425_npe.inl。
先在文件前面加上
#defineCYGPKG_DEVS_ETH_INTEL_NPE_REDBOOT_HOLDS_ESA
将CYGNUM_ETH0_PHY_NO改为 1,CYGNUM_ETH1_PHY_NO改为 2
//#defineCYGNUM_ETH0_PHY_NO 0
#defineCYGNUM_ETH0_PHY_NO 1
//#defineCYGNUM_ETH1_PHY_NO 1
#defineCYGNUM_ETH1_PHY_NO 2
2.02版本在/packages/devs/eth/intel/npe/common/v2_01/src/if_npe.c
在检查mac_ok之前加入mac_ok = true就可以了。
mac_ok= true;
if (!mac_ok) {
#ifdef DEBUG
diag_printf("Error getting MACaddress.\n");
#endif
执行以下命令
exportTOPDIR=`pwd`
exportECOS_REPOSITORY=${TOPDIR}/packages
rm –rf ${TOPDIR}/build
mkdir${TOPDIR}/build
cd${TOPDIR}/build
cp../bin/ecosconfig .
chmod +x ecosconfig
./ecosconfig newixdp425_npe redboot
./ecosconfigimport ${ECOS_REPOSITORY}/hal/arm/xscale/ixdp425/current/misc/redboot_ROM.ecm
./ecosconfig addintel_npe
./ecosconfig addixdp425_npe
./ecosconfigtree
make
编译命令的主要差别是:在040330版本中使用./ecosconfignew ixdp425 redboot命令。而在050425版本中使用的是./ecosconfignew ixdp425_npe redboot,多了_npe。
这个版本ecosconfig需要更多的库支持,需要在FC6下支持较好。
将redboot-intel-ixp4xx-070320.tar.gz复制到到/home/linuxuser/redboot,执行如下命令:
#cd /home/linuxuser/redboot
#tar xfv redboot-intel-ixp4xx-070320.tar.gz
# ldd ecosconfig
linux-gate.so.1 => (0x00919000)
libtcl8.4.so => not found
libstdc++.so.6 =>/usr/lib/libstdc++.so.6 (0x00110000)
libm.so.6 => /lib/libm.so.6 (0x006f6000)
libgcc_s.so.1 => /lib/libgcc_s.so.1(0x00458000)
libc.so.6 => /lib/libc.so.6(0x00923000)
/lib/ld-linux.so.2 (0x007fa000)
安装一下FC6光盘里的tcl-8.4.13-3.fc6.i386.rpm。安装以后显示如下:
# ldd ecosconfig
linux-gate.so.1 => (0x003a1000)
libtcl8.4.so =>/usr/lib/libtcl8.4.so (0x00110000)
libstdc++.so.6 =>/usr/lib/libstdc++.so.6 (0x001d0000)
libm.so.6 => /lib/libm.so.6(0x002ba000)
libgcc_s.so.1 => /lib/libgcc_s.so.1(0x00b5d000)
libc.so.6 => /lib/libc.so.6 (0x003a2000)
libdl.so.2 => /lib/libdl.so.2(0x002e1000)
libpthread.so.0 =>/lib/libpthread.so.0 (0x0065b000)
/lib/ld-linux.so.2 (0x00fd0000)
07版本的redboot不需要npe-2.02.epk,源码里面已经包括了。IxNpeMicrocode.c也自带了一个,但是那个需要用2.04版本的IxNpeMicrocode.c进行覆盖掉。注意,07版本的redboot不支持2.02版本的IxNpeMicrocode.c,可以编译通过,但是会无法启动以太网。
根据板子的不同,需要对redboot进行修改。
在/packages/hal/arm/xscale/ixdp425/current/include/ixdp425.h,修改内存大小和配置。
在ixdp425.h里找到下面两行:
#defineSDRAM_SIZE 0x10000000 // 256MB
#defineIXP425_SDRAM_CONFIG_INIT (SDRAM_CONFIG_CAS_3 | SDRAM_CONFIG_4x32Mx16)
修改为如下:
//#defineSDRAM_SIZE 0x10000000 // 256MB
#defineSDRAM_SIZE 0x04000000 // 64Mbytes
//#defineIXP425_SDRAM_CONFIG_INIT (SDRAM_CONFIG_CAS_3 | SDRAM_CONFIG_4x32Mx16)
#defineIXP425_SDRAM_CONFIG_INIT (SDRAM_CONFIG_CAS_3 | SDRAM_CONFIG_2x16Mx16)
找到/packages/hal/arm/arch/current/src/vectors.S,找到其中vectors:段,将代码修改两行如下为如下,其中红色部分为修改内容。
vectors:
//UNMAPPED_PTR(reset_vector) // 0x20
ldr pc,.reset_vector
PTR(undefined_instruction) // 0x24
PTR(software_interrupt) // 0x28
PTR(abort_prefetch) // 0x2C
PTR(abort_data) // 0x30
// .word 0 //0x34
UNMAPPED_PTR(reset_vector)
因为phy使用的是KS8721B, phy的id从1开始。
1. IxEthMii.c
/packages/devs/eth/intel/npe/ethMii/current/src/IxEthMii.c
找到如下代码,加入红色部分:
if((ixEthMiiPhyId[phyId] == IX_ETH_MII_KS8995_PHY_ID)
|| (ixEthMiiPhyId[phyId] ==IX_ETH_MII_KS8721B_PHY_ID)
|| (ixEthMiiPhyId[phyId] ==IX_ETH_MII_LXT971_PHY_ID)
|| (ixEthMiiPhyId[phyId] ==IX_ETH_MII_LXT972_PHY_ID)
|| (ixEthMiiPhyId[phyId] ==IX_ETH_MII_LXT973_PHY_ID)
|| (ixEthMiiPhyId[phyId] ==IX_ETH_MII_LXT973A3_PHY_ID)
|| (ixEthMiiPhyId[phyId] == IX_ETH_MII_LXT9785_PHY_ID))
2. IxEthMii_p.h
找到如下代码加入红色部分
#defineIX_ETH_MII_LXT973_PHY_ID 0x00137A10
#defineIX_ETH_MII_KS8995_PHY_ID 0x00221450
#defineIX_ETH_MII_KS8721B_PHY_ID 0x00221619
在packages/devs/eth/arm/ixdp425/npe/current/include/ixdp425_npe.inl。
先在文件前面加上
#defineCYGPKG_DEVS_ETH_INTEL_NPE_REDBOOT_HOLDS_ESA
将CYGNUM_ETH0_PHY_NO改为 1,CYGNUM_ETH1_PHY_NO改为 2
//#defineCYGNUM_ETH0_PHY_NO 0
#defineCYGNUM_ETH0_PHY_NO 1
//#defineCYGNUM_ETH1_PHY_NO 1
#defineCYGNUM_ETH1_PHY_NO 2
在/packages/devs/eth/intel/npe/common/ current /src/if_npe.c
在检查mac_ok之前加入mac_ok = true就可以了。
mac_ok= true;
if (!mac_ok) {
#ifdef DEBUG
diag_printf("Error getting MACaddress.\n");
#endif
070320版本redboot编译方法和050425版本的一样。
redboot下载到盒子上运行以后,第一次启动会报checksum error,可以使用fconfig –i进行配置。
RedBoot>fconfig -i
Initializenon-volatile configuration - continue (y/n)? y
Run script atboot: true
Boot script:
Enter script,terminate with empty line
>> load -r-v -b 0x00800000 ramdisktest.gz
>> load -r-v -b 0x01600000 zImage
>> exec
>>
Boot scripttimeout (1000ms resolution): 1
Use BOOTP fornetwork configuration: false
Gateway IPaddress: 10.0.0.1
Local IPaddress: 10.0.0.203
Local IP addressmask: 255.0.0.0
Default serverIP address: 10.0.0.103
Console baudrate: 115200
GDB connectionport: 9000
Force consolefor special debug messages: false
Network debug atboot time: false
Defaultnetwork device: npe_eth0
Update RedBootnon-volatile configuration - continue (y/n)? y
... Unlock from0x50fe0000-0x51000000: .
... Erase from0x50fe0000-0x51000000: .
... Program from0x03fd0000-0x03ff0000 at 0x50fe0000: .
... Lock from0x50fe0000-0x51000000: .
其中Defaultnetwork device如果不清楚的话,可以故意输错。redboot会提示正确的选项。比如故意写i82559_:
Default networkdevice: i82559_
Sorry, Port namemust be one of:
i82559_eth0
npe_eth0
npe_eth1
** invalid entry
第一次启动redboot,还需要执行fis init命令。
由于redboot需要调试和升级,可以使用ram模式先调试redboot,成功以后再烧录。这个方法要求盒子上已经有了一个能正常运行的redboot。ram模式的redboot编译和rom非常类似,只需要将redboot_ROM.ecm换成redboot_RAM.ecm即可。按照前面章节的方法,将
./ecosconfigimport ${ECOS_REPOSITORY}/hal/arm/xscale/ixdp425/current/misc/redboot_ROM.ecm
修改为
./ecosconfigimport ${ECOS_REPOSITORY}/hal/arm/xscale/ixdp425/current/misc/redboot_RAM.ecm
编译之后在build/install/bin下面就得到redboot.srec。
在盒子原有的redboot正常启动之后,使用load -v redboot_ram.srec和go -w 1 0x00100040就能够将盒子重新启动,转到新的redboot环境下。其中输入load -v redboot_ram.srec完成之后,系统会打印出一个Entry point值,在本例中是0x00100040,然后再第二步命令中执行go -w 1 0x00100040就可以启动了。实际打印信息如下:
RedBoot> load-v redboot_ram.srec
Using defaultprotocol (TFTP)
Entry point:0x00100040, address range: 0x00100000-0x0014dc50
RedBoot> go-w 1 0x00100040
About to startexecution at 0x00100040 - abort with ^C within 1 seconds
TryingNPE-B...no PHY found
TryingNPE-C...success. Using NPE-C with PHY 1.
Ethernet eth1:MAC address 00:03:47:df:32:61
IP:192.168.1.171/255.255.255.0, Gateway: 192.168.1.110
Default server:192.168.1.110
RedBoot(tm)bootstrap and debug environment [RAM]
Red Hatcertified release, version 2.04 - built 17:27:19, Sep 1 2009
Platform:IXDP425 Development Platform (IXP42X 266MHz) BE
Copyright (C)2000, 2001, 2002, 2003, 2004, 2007 Free Software Foundation, Inc.
RAM:0x00000000-0x02000000, [0x0016e518-0x01fc1000] available
FLASH:0x50000000 - 0x50800000, 64 blocks of 0x00020000 bytes each.
== Executingboot script in 1.000 seconds - enter ^C to abort
RedBoot>
这个时候需要先使用fconfig来设置新环境下的网络。设置完成之后重启盒子,然后使用同样的方法可以在此进入新redboot环境,然后就可以测试网口之类是不是已经正常启动了。
当然不是任意两种新旧redboot搭配都可以运行ram,比如板子上原来是07版本的redboot,下载04版本的redboot的ram文件,很可能失败。错误如下
RedBoot> load-v redboot194_ram.srec
Using defaultprotocol (TFTP)
*** Abort! Attempt to load S-record to address:0x00020000, which is not in RAM
注意一点这个时候不能使用load -v redboot_ram.srec-b %{FREEMEMLO}来代替。虽然加了-b%{FREEMEMLO}可以让ram文件正常load完成,但是启动的时候会出问题。在一次实验中,发现虽然这样能启动,但是启动的却是老版本的rom模式的redboot。信息如下
RedBoot> load -v redboot194_ram.srec -b%{FREEMEMLO}
Using default protocol (TFTP)
Address offset = 0x00004c00
Entry point: 0x00024c40,address range: 0x00024c00-0x00060124
RedBoot> go -w 1 0x00024c40
About to start execution at 0x00024c40 - abort with ^C within 1 seconds
Trying NPE-C...success. Using NPE-C with PHY 5.
Trying NPE-B...success. Using NPE-B with PHY 1.
Ethernet eth0: MAC address 00:03:47:df:32:60
IP: 192.168.1.171/255.255.255.0, Gateway: 192.168.1.1
Default server: 192.168.1.111
RedBoot(tm) bootstrap and debug environment [ROM]
Red Hat certified release, version 2.04 - built01:42:53, Jan 5 2009
Platform: Linksys WRV54G (IXP42X 266MHz) BE
Copyright (C) 2000, 2001, 2002, 2003, 2004, 2007 FreeSoftware Foundation, Inc.
RAM: 0x00000000-0x02000000, [0x00024ac8-0x01fc1000] available
FLASH: 0x50000000 - 0x50800000, 64 blocks of0x00020000 bytes each.
从version 2.04和[ROM]可以看出,虽然是startexecution at 0x00024c40,但是并没有正确启动ram的1.94版本的redboot。
这个方法可以用来升级redboot。注意在此之前老的rom版本的redboot里必须已经执行了fis init和fconfig –i命令。
升级的命令如下:
load -vredboot_RAM.srec
go -w 10x00100040
# <wait forRedBoot to restart>
重新进入ram的redboot之后,执行fconfig,配置redboot的启动选项以便于能够利用tftp下载新的redboot。配置完成以后,不管是flash上的redboot,还是用ram启动的redboot,都可以使用tftp了。重新启动,然后进入了flash上的老版本的redboot环境,执行如下命令:
load -vredboot_RAM.srec
go -w 10x00100040
# <wait forRedBoot to restart>
load -vredboot_ROM.srec -b %{FREEMEMLO}
fis unlockRedBoot
fis createRedBoot -b %{FREEMEMLO}
fis lock RedBoot
注意%{FREEMEMLO}命令中使用的{}是大括号。
如果报错no such file或者找不到redboot分区的错误,注意是不是老的rom的redboot上是不是执行了fis init和fconfig –i命令。
利用redboot升级redboot并不能保证升级成功,最安全可靠的方法还是利用jtag。
因为redboot的特殊性,不能像zImage和ramdisk一样可以任意重新load,所以特意先检查了目前P720板上正在运行的redboot.bin的属性,利用file命令显示如下:
检查以前的编译好的binfile,记下便于以后对比编译的结果。
file *
redboot_RAM.bin: data
redboot_RAM.elf: ELF 32-bit MSB executable, ARM, version 1(ARM), statically linked, not stripped
redboot_RAM.img: ELF 32-bit MSB executable, ARM, version 1(ARM), statically linked, not stripped
redboot_RAMLE.bin: data
redboot_RAMLE.elf: ELF 32-bit LSB executable, ARM, version 1(ARM), statically linked, not stripped
redboot_RAMLE.img: ELF 32-bit LSB executable, ARM, version 1(ARM), statically linked, not stripped
redboot_RAMLE.srec:Motorola S-Record; binary data in text format
redboot_RAM.srec: Motorola S-Record; binary data in textformat
redboot_ROM.bin: data
redboot_ROM.elf: ELF 32-bit MSB executable, ARM, version 1(ARM), statically linked, not stripped
redboot_ROM.img: ELF 32-bit MSB executable, ARM, version 1(ARM), statically linked, not stripped
redboot_ROMLE.bin: data
redboot_ROMLE.elf: ELF 32-bit LSB executable, ARM, version 1(ARM), statically linked, not stripped
redboot_ROMLE.img: ELF 32-bit LSB executable, ARM, version 1(ARM), statically linked, not stripped
redboot_ROMLE.srec:Motorola S-Record; binary data in text format
redboot_ROM.srec: Motorola S-Record; binary data in textformat
然后开始下载编译器i686-pc-linux-gnulibc2.2-x-xscale-elf.tar.Z。在RH9和FC4决不能双击查看。但是将后缀名修改为.gz后可以查看里面的内容,解压之后,发现INSTALL文件,但是尝试多次均出现错误,经过搜索得知,安装时候并不适用INSTALL文件,可能已经太老了,从其支持tape上就可以看到出。最后使用的是解压复制链接的方法安装好了编译器。
在编译redboot,执行ecosconfig的时候有如下错误:
#./ ecosconfignew ixdp425 redboot
./ecosconfig:error while loading shared libraries: libtcl.so.0: cannot open shared objectfile: No such file or directory
可以用ldd命令查看到底需要哪些sharedlibraries。输入lddecosconfig.
# ldd ecosconfig
libtcl.so.0 => not found
libstdc++-libc6.2-2.so.3 =>/usr/lib/libstdc++-libc6.2-2.so.3 (0x40026000)
libm.so.6 => /lib/tls/libm.so.6(0x40068000)
libc.so.6 => /lib/tls/libc.so.6(0x42000000)
libgcc_s.so.1 => /lib/libgcc_s.so.1(0x4008a000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2(0x40000000)
应该ln -s/usr/lib/libtcl.so /usr/lib/libtcl.so.0。
曾经尝试把/usr/lib/libtcl.so复制一份到/redboot-intel-xscale-040330/build目录,改名为libtcl.so.0,但是没有用,只能ln -s /usr/lib/libtcl.so/usr/lib/libtcl.so.0。在FC4里面没有usr/lib/libtcl.so,只有libtcl8.4.so,只能ln -s /usr/lib/libtcl8.4.so/usr/lib/libtcl.so.0。另外在FC4里面缺少libstdc++-libc6.2-2.so.3=> not found。
libstdc++-libc6.2-2.so.3只发现在RH9里有。
搜索得知FC4下要安装compat-libstdc++-296-2.96-132.fc4.i386.rpm。
安装完毕再次执行lddecosconfig.
# ldd ecosconfig
libtcl.so.0 => /usr/lib/libtcl.so.0(0x40026000)
libstdc++-libc6.2-2.so.3 =>/usr/lib/libstdc++-libc6.2-2.so.3 (0x400b0000)
libm.so.6 => /lib/tls/libm.so.6 (0x400f2000)
libc.so.6 => /lib/tls/libc.so.6(0x42000000)
libdl.so.2 => /lib/libdl.so.2(0x40114000)
libgcc_s.so.1 => /lib/libgcc_s.so.1(0x40117000)
/lib/ld-linux.so.2 =>/lib/ld-linux.so.2 (0x40000000)
说明问题已经解决。往下就可以编译了。编译修改完成的redboot-intel-xscale-040330。检查/build下的makefile,可以看到如下信息
export HOST :=UNIX
export PREFIX :=/home/linuxuser/redboot-intel-xscale-040330/build/install
exportCOMMAND_PREFIX := xscale-elf-
export CC :=$(COMMAND_PREFIX)gcc
export OBJCOPY:= $(COMMAND_PREFIX)objcopy
export AR :=$(COMMAND_PREFIX)ar
其实安装编译器的时候,原来的编译器名字都是arm-elf开头的,比如arm-elf-gcc。其实是一样的。编译完的bin文件经过检查,和原始的属性一样。
另外在烧录redboot的时候,实验过两个IX425DP的板子。两个板子的flash型号不一样。为了确认两个板子能够使用相同的redboot.bin,在两个板子启动的时候观察信息,redboot打印出的编译信息都是如下
RedBoot(tm)bootstrap and debug environment [ROM]
Red Hatcertified release, version 1.94 - built 10:21:53, Jun 10 2005
新的板子和旧的板子使用的flash不一样,但是redboot显示的编译时间完全一样,所以应该可以通用。
//#defineSDRAM_SIZE 0x10000000 // 256MB
#defineSDRAM_SIZE 0x04000000 // 64Mbytes
//#defineIXP425_SDRAM_CONFIG_INIT (SDRAM_CONFIG_CAS_3 | SDRAM_CONFIG_2x32Mx16)
#defineIXP425_SDRAM_CONFIG_INIT (SDRAM_CONFIG_CAS_3 | SDRAM_CONFIG_2x16Mx16)
板子应该是64M的,但是为什么SDRAM_CONFIG_2x16Mx16?也许16bit位宽算两个?
实际上原版里是这样对应的:
#define SDRAM_SIZE 0x10000000 // 256MB
#define IXP425_SDRAM_CONFIG_INIT (SDRAM_CONFIG_CAS_3 | SDRAM_CONFIG_2x32Mx16)
这个容量看起来也是差了一倍。那么还是按照差了一倍修改。
新旧两个版本的ixdp425_npe.inl有一些不同,但是有个宏是控制从eeprom还是从redboot里面获取mac地址。实际上不同的设置也能编译过去,但是在板子运行的时候会报错,打开debug信息或者自己加入一些打印信息,可以看到是mac地址获取的原因,所以加上#define CYGPKG_DEVS_ETH_INTEL_NPE_REDBOOT_HOLDS_ESA。
没有修改原始3.5.if_npe.c的时候,有如下报错。
Trying NPE-B...EthAcc:(Mac) cannot enable port 0, MAC address not set
can't enable port!
Trying NPE-C...no PHY found
No network interfaces found。
检查代码,发现07版本当中是有phy_present()调用的,这样就是已经检查过正确的phy了。看起来NPE-B对接的phy已经找到了。但是无法设置MAC地址,而NPE-C是找不到phy。
起作用的选项在packages/devs/eth/intel/npe/common/current/src/if_npe.c。
打开if_npe.c的debug选项,这次的错误信息显示如下:
npe_csr_load
eeprom_read: Can't getwrite start ACK
Error getting MAC addressfor NPE-B.
eeprom_read: Can't getwrite start ACK
Error getting MAC addressfor NPE-C.
Trying NPE-B...Wait for PHY1 to be ready ...success.
PHY 1 configuration:
PHY ID [phyAddr]: 00221619
Status reg: 786d
control reg: 1000
PHY Status:
Link is Up
Auto Negotiation Completed
PHY Configuration:
Speed 100Mb/s
Full Duplex
Auto Negotiation Enabled
phy for NPE-B found!
EthAcc: (Mac) cannot enableport 0, MAC address not set
can't enable port!
Trying NPE-C...no PHY found
No network interfaces found
RedBoot(tm) bootstrap anddebug environment [ROM]
Red Hat certified release,version 2.04 - built 13:32:23, Aug 30 2009
Platform: IXDP425Development Platform (IXP42X 266MHz) BE
Copyright (C) 2000, 2001,2002, 2003, 2004, 2007 Free Software Foundation, Inc.
对比1.94版本的打印,发现1.94版本的mac_ok实际上也是0,也就是false,在检查mac_ok的前一行加入mac_ok=TRUE,强行改写了mac_ok。那么在07版里也强行改一下好了。结果实验成功。唯一需要的就是在npe_set_mac_address()函数检查mac_ok的前面加入mac_ok =TRUE就行了。另外在改写之前打印一下设定的mac地址,发现已经有预想的值了,所以强行改mac_ok应该是没有问题的。修改如下:
mac_ok = TRUE;
if (!mac_ok) {
#ifdef DEBUG
diag_printf("Error getting MAC address for %s.\n",npe_names[p_npe->eth_id]);
本来按照050425的方法也将npe-2.02.epk集成到070320版本,但是在实际编译的过程中,发现201目录当中的文件修改根本不起作用,再进build目录找个makefile看看,发现根本就不调用201目录当中的文件。最后实验不加入npe-2.02.epk也可以成功,但是不加入新的IxNpeMicrocode.c编译会报错,提示”replace the file with theone …fromhttp://xxxxx”的字样,网址连接上去发现就是下载intel网站中下载IXP425一些代码的网页。
在获得到正确代码中,vectors.S进行了如下的修改:
vectors:
//UNMAPPED_PTR(reset_vector) // 0x20
ldr pc,.reset_vector
PTR(undefined_instruction) // 0x24
PTR(software_interrupt) // 0x28
PTR(abort_prefetch) // 0x2C
PTR(abort_data) // 0x30
// .word 0 //0x34
UNMAPPED_PTR(reset_vector)
红色部分是修改的,绿色屏蔽掉的代码是intel网站上下载的原始代码,紧接着下面红色代码新加入的。尝试不修改代码,当时使用的是07版本,板子启动后串口没有任何信息,在openjtag准备连接的时候有输出部分数据,但是随后因为jtag控制了CPU,也就没有了数据。04版本的也有同样的现象。看起来这个和中断还是有比较大的关系。如果用openjtag进行reset然后resume,就能打印出信息。
在openjtag的telnet控制窗口输入poll,状态如下:
> poll
target state:halted
target halted inARM state due to debug request, current mode: Supervisor
cpsr: 0x800000d3pc: 0x50016178
MMU: enabled,D-Cache: enabled, I-Cache: enabled
然后输入resume,可以看到redboot已经正常启动了。使用reset和resume可以让系统再次正常启动redboot。网卡也是通的。但是刷写flash有问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。