当前位置:   article > 正文

在IX425DP上安装redbootv4_error while loading shared libraries: libecm.so.1:

error while loading shared libraries: libecm.so.1: cannot open shared object

在IX425DP上安装redboot

早年写的笔记,压箱底了,翻出来晒晒

目          录

在IX425DP上安装redboot1

实验环境...2

安装redboot编译器...2

编译040330版本的redboot3

1. 准备编译组件...3

2. 加入以太网支持...3

2.1 RH9的加入方法...3

2.2. FC4的加入方法...4

3. 修改redboot5

3.1. 内存配置ixdp425.h.5

3.2. 中断配置vectors.S.5

3.3. 加入phy支持...5

3.4. ixdp425_npe.inl6

3.5. if_npe.c.6

4. 编译redboot7

编译050425版本的redboot7

1. 准备编译组件...7

2. 加入以太网支持...7

3. 修改redboot8

3.1. 内存配置ixdp425.h.8

3.2. 中断配置vectors.S.8

3.3. 加入phy支持...9

3.4. ixdp425_npe.inl9

3.5. if_npe.c.9

3. 编译redboot10

编译070320版本的redboot10

1. 准备编译组件...10

2. 加入以太网支持...11

3. 修改redboot11

3.1. 内存配置ixdp425.h.11

3.2. 中断配置vectors.S.11

3.3. 加入phy支持...12

3.4. ixdp425_npe.inl12

3.5. if_npe.c.13

4. 编译redboot13

启动redboot,配置redboot13

使用ram模式调试redboot14

版本搭配问题...15

使用redboot升级新的redboot。...16

编译redboot的摸索过程...16

内存配置ixdp425.h的问题...18

ixdp425_npe.inl的问题...19

if_npe.c.19

070320版本的以太网支持...20

vectors.S的问题...20

 

 

实验环境

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编译器

       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

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。

1. 准备编译组件

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建立链接。

2. 加入以太网支持

       需要两个软件包就可以支持以太网。先加入npe-1.4.epk,执行如下命令:

 

2.1 RH9的加入方法

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

这样就弄好了。

 

2.2. FC4的加入方法

       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

 

3. 修改redboot

根据板子的不同,需要对redboot进行修改。

3.1. 内存配置ixdp425.h

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)

 

 

3.2. 中断配置vectors.S

找到/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)

 

3.3. 加入phy支持

因为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

 

3.4. ixdp425_npe.inl

       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)

3.5. if_npe.c

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

 

4. 编译redboot

       执行以下命令

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等文件。

编译050425版本的redboot

       下载的源文件为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下编译通过。

1. 准备编译组件

       这个版本的ecosconfig需要的库文件和040330版本的一样。

 

2. 加入以太网支持

       将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没有安装好,但是没关系。

3. 修改redboot

       根据板子的不同,需要对redboot进行修改。

3.1. 内存配置ixdp425.h

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)

 

3.2. 中断配置vectors.S

找到/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)

 

3.3. 加入phy支持

因为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

 

3.4. ixdp425_npe.inl

       在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

3.5. if_npe.c

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

 

3. 编译redboot

       执行以下命令

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。

 

编译070320版本的redboot

       这个版本ecosconfig需要更多的库支持,需要在FC6下支持较好。

       将redboot-intel-ixp4xx-070320.tar.gz复制到到/home/linuxuser/redboot,执行如下命令:

 

#cd /home/linuxuser/redboot

#tar xfv redboot-intel-ixp4xx-070320.tar.gz

 

1. 准备编译组件

# 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)

2. 加入以太网支持

       07版本的redboot不需要npe-2.02.epk,源码里面已经包括了。IxNpeMicrocode.c也自带了一个,但是那个需要用2.04版本的IxNpeMicrocode.c进行覆盖掉。注意,07版本的redboot不支持2.02版本的IxNpeMicrocode.c,可以编译通过,但是会无法启动以太网。

3. 修改redboot

       根据板子的不同,需要对redboot进行修改。

3.1. 内存配置ixdp425.h

在/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)

 

3.2. 中断配置vectors.S

找到/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)

 

3.3. 加入phy支持

因为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

 

3.4. ixdp425_npe.inl

       在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

3.5. if_npe.c

在/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

 

 

4. 编译redboot

070320版本redboot编译方法和050425版本的一样。

 

启动redboot,配置redboot

       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命令。

使用ram模式调试redboot

       由于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升级新的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的摸索过程

       因为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显示的编译时间完全一样,所以应该可以通用。

 

内存配置ixdp425.h的问题

//#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的问题

       新旧两个版本的ixdp425_npe.inl有一些不同,但是有个宏是控制从eeprom还是从redboot里面获取mac地址。实际上不同的设置也能编译过去,但是在板子运行的时候会报错,打开debug信息或者自己加入一些打印信息,可以看到是mac地址获取的原因,所以加上#define CYGPKG_DEVS_ETH_INTEL_NPE_REDBOOT_HOLDS_ESA。

if_npe.c

没有修改原始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]);

 

070320版本的以太网支持

       本来按照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.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有问题。

 

 


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/编程探险家/article/detail/60627
推荐阅读
相关标签
  

闽ICP备14008679号