早年写的笔记,压箱底了,翻出来晒晒
目 录
在IXDP425上安装ecos3redboot1
实验环境...1
1. 编译ecosconfig.2
2. 修改ecos3配置和源码...2
2.1内存配置ixdp425.h.2
2.2. mlt_arm_xscale_ixdp425_rom.h和mlt_arm_xscale_ixdp425_rom.ldi3
2.3 加入以太网支持...4
2.3.1. IxEthDB_p.h.4
2.3.2. ixosalos.h.4
2.3.3. 加入phy支持...4
2.3.4. ixdp425_npe.inl5
2.3.5. if_npe.c.5
2.3.5. ecos.db.5
3. 编译redboot6
3.1. 准备编译器...6
4.reset问题...7
5. 使用configtool8
摸索过程...8
编译ecosconfig.8
尝试ram模式...9
直接编译rom模式...9
检验flash驱动...9
检查config写入内容...10
加入以太网...11
not within region rom..13
driver init failed.15
配置redboot3.16
内存大小的修改...17
独立加入打印...18
去掉I82559以太网驱动...18
u FC6
u IXP425DP(P720 板) 266Mhz 64M ram16M flash,phy片为KS8721B,一个以太网口IXP0
u tool chain为ecoscentric-gnutools-arm-eabi-20081213-sw.i386linux.tar.bz2
u ecos-trunk-full.tar.bz2(3.0版本)。http://www.ecoscentric.com/devzone/snapshots.shtml
u ecos-3.0.i386linux.tar.bz2
u npe-2.02.epk
u 2.02版本的IxNpeMicrocode.c
u 实验路径为/home/linuxuser/ecos3/ecosfull
下面的实验以ecos-trunk-full.tar.bz2为例。ecos-3.0.i386linux.tar.bz2的操作方法和ecos-trunk-full.tar.bz2的一样,只不过路径中current要改成v3_0。
ecos-3.0.i386linux.tar.bz2当中有编译好的ecosconfig,不需要重新编译,而ecos-trunk-full.tar.bz2中没有编译ecosconfig,需要手工编译一下。编译ecosconfig光有tcl和tk支持是不够的,不仅需要安装tk-8.4.13-3.fc6.i386.rpm和tcl-8.4.13-3.fc6.i386.rpm,还需要安装tcl-devel-8.4.13-3.fc6.i386.rpm和tk-devel-8.4.13-3.fc6.i386.rpm。
cd /home/linuxuser/ecos3/ecosfull
mkdir ecbuild
cd ecbuild/
../host/configure
make
这样就编译好了,文件的位置在ecbuild/tools/configtool/standalone/common/ecosconfig.
将其复制到/home/linuxuser/ecos3/ecosfull/bin下
mkdir –p /home/linuxuser/ecos3/ecosfull/bin
cp -f tools/configtool/standalone/common/ecosconfig /home/linuxuser/ecos3/ecosfull/bin
在/packages/hal/arm/xscale/ixdp425/current/include/ixdp425.h,修改内存片选配置。
在ixdp425.h里找到下面两行:
#defineIXP425_SDRAM_CONFIG_INIT (SDRAM_CONFIG_CAS_3 | SDRAM_CONFIG_4x32Mx16)
修改为如下:
//#defineIXP425_SDRAM_CONFIG_INIT (SDRAM_CONFIG_CAS_3 | SDRAM_CONFIG_4x32Mx16)
#defineIXP425_SDRAM_CONFIG_INIT (SDRAM_CONFIG_CAS_3 | SDRAM_CONFIG_2x16Mx16)
和以前的版本不相同的是,ecos3中SDRAM_SIZE是不能修改的,必须是保持256MB。
#defineSDRAM_SIZE 0x10000000 // 256MB
这两个文件在/packages/hal/arm/xscale/ixdp425/current/include/pkgconf。这里将修改ram大小和redboot分区大小。因为后面要加入npe,redboot编译完的内容超过256K,所以需要修改redboot分区大小为512K。
在mlt_arm_xscale_ixdp425_rom.h中,将下面配置:
#define CYGMEM_REGION_ram_SIZE(0x10000000)
#defineCYGMEM_REGION_rom_SIZE (0x40000)
#defineCYGMEM_SECTION_heap1_SIZE (0x10000000 - (size_t) CYG_LABEL_NAME (__heap1))
修改为:
//#defineCYGMEM_REGION_ram_SIZE (0x10000000)
#defineCYGMEM_REGION_ram_SIZE (0x4000000)
//#defineCYGMEM_REGION_rom_SIZE (0x40000)
#defineCYGMEM_REGION_rom_SIZE (0x80000)
//#defineCYGMEM_SECTION_heap1_SIZE (0x10000000 - (size_t) CYG_LABEL_NAME (__heap1))
#defineCYGMEM_SECTION_heap1_SIZE (0x4000000 - (size_t)CYG_LABEL_NAME (__heap1))
其中CYGMEM_REGION_ram_SIZE是内存大小,从256M(0x10000000)修改为64M(0x4000000)。CYGMEM_REGION_rom_SIZE是redboot分区大小,从256K修改为512K。CYGMEM_SECTION_heap1_SIZE当中的修改也是因为内存大小修改为64M。
在mlt_arm_xscale_ixdp425_rom.h中,将下面配置:
MEMORY
{
ram : ORIGIN = 0, LENGTH = 0x10000000
rom : ORIGIN = 0x50000000, LENGTH = 0x40000
}
修改为:
MEMORY
{
ram : ORIGIN = 0, LENGTH = 0x10000000
rom : ORIGIN = 0x50000000, LENGTH = 0x80000
}
这个rom的修改也是为了将redboot分区大小改为512K。
将npe-2.02.epk复制到/home/linuxuser/ecos3/npe,利用tar –xvf npe-2.02.epk命令解压后得到devs文件夹和pkgadd.db,devs文件夹可以覆盖/home/linuxuser/ecos3/ecosfull/packages/devs。另外将pkgadd.db的全部内容复制粘贴到/home/linuxuser/ecos3/ecosfull/packages/ecos.db的末尾。
由于npe-2.02.epk是为了05的redboot而做的,不能直接用到ecos3 redboot上,所以必须进行修改。
将下面语句:
IX_ETH_DB_PUBLICIxEthDBStatus ixEthDBNPEUpdateHandler(IxEthDBPortId portID, IxEthDBFeaturetype)
修改为:
IX_ETH_DB_PUBLICIxEthDBStatus ixEthDBNPEUpdateHandler(IxEthDBPortId portID, IxEthDBRecordTypetype)
/packages/devs/eth/intel/npe/common/v2_01/include/osal/ecos/core/ixosalos.h
找到
#ifdefined(CYGHWR_HAL_ARM_XSCALE_CPU_IXP42x)
#define __ixp42X
#elifdefined(CYGHWR_HAL_ARM_XSCALE_CPU_IXP46x)
#define __ixp46X
#endif
在前面加上#define CYGHWR_HAL_ARM_XSCALE_CPU_IXP42x
因为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
找到targetixdp425_npe的定义:
targetixdp425_npe {
alias { "IXDP425 with NPEethernet" ixdp425npe }
packages { CYGPKG_HAL_ARM
CYGPKG_HAL_ARM_XSCALE_CORE
CYGPKG_HAL_ARM_XSCALE_IXP425
CYGPKG_HAL_ARM_XSCALE_IXDP425
CYGPKG_IO_PCI
CYGPKG_DEVS_ETH_INTEL_I82559
CYGPKG_DEVS_ETH_ARM_IXDP425_I82559
CYGPKG_DEVS_ETH_INTEL_NPE
CYGPKG_DEVS_ETH_INTEL_NPE_ETHACC
CYGPKG_DEVS_ETH_INTEL_NPE_ETHDB
CYGPKG_DEVS_ETH_INTEL_NPE_ETHMII
CYGPKG_DEVS_ETH_INTEL_NPE_NPEDL
CYGPKG_DEVS_ETH_INTEL_NPE_NPEMH
CYGPKG_DEVS_ETH_INTEL_NPE_OSSERVICES
CYGPKG_DEVS_ETH_INTEL_NPE_QMGR
CYGPKG_DEVS_ETH_INTEL_NPE_FEATURECTRL
CYGPKG_DEVS_ETH_ARM_IXDP425_NPE
CYGPKG_DEVS_FLASH_STRATA
CYGPKG_DEVS_FLASH_IXDP425
}
description "
The ixdp425 target provides thepackages needed to run
eCos on an Intel network processorevaluation board."
}
删除CYGPKG_DEVS_FLASH_STRATA,CYGPKG_DEVS_FLASH_IXDP425,加上CYGPKG_DEVS_FLASH_STRATA_V2。
下载ecoscentric-gnutools-arm-eabi-20081213-sw.i386linux.tar.bz2,解压到/home/linuxuser/ecos3/gnutools/arm-eabi/bin
执行以下命令
exportTOPDIR=`pwd`
exportECOS_REPOSITORY=${TOPDIR}/packages
exportPATH=$PATH:/home/linuxuser/ecos3/gnutools/arm-eabi/bin
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
编译完成之后,会在build/install/bin下生成redboot.bin等文件。烧录到板子上就可以运行了。
在以前的版本中,如果不修改vector.S,那么系统不能启动。如果修改了,P720上的reset命令就不能正常使用。ecos3当中不论是否按照以前的方法修改vector.S,系统都能启动。如果不修改,reset命令就可以正常使用。
查到资料上讲过:reset命令实际上在do_reset函数里面最终调用的是hal\common\current\src\hal_if.c中的reset函数。reset函数采用了两种方式来重启系统,一种是调用平台提供的HAL_PLATFORM_RESET()函数;另一种就是简单的goto到入口地址HAL_PLATFORM_RESET_ENTRY处执行。
reset函数
static void
reset(void)
{
CYGARC_HAL_SAVE_GP();
// With luck, the platform defines somemagic that will cause a hardware
// reset.
#ifdefHAL_PLATFORM_RESET
HAL_PLATFORM_RESET();
#endif
#ifdefHAL_PLATFORM_RESET_ENTRY
// If that's not the case (above is anempty statement) there may
// be defined an address we can jump to -and effectively
// reinitialize the system. Not quite asgood as a reset, but it
// is often enough.
goto *HAL_PLATFORM_RESET_ENTRY;
#else
#error " noRESET_ENTRY"
#endif
CYG_FAIL("Reset failed");
CYGARC_HAL_RESTORE_GP();
}
找到
#define HAL_PLATFORM_RESET()CYG_EMPTY_STATEMENT
但是CYG_EMPTY_STATEMENT是一个空定义,什么都不干。
Hal_var_ints.h(ecos\packages\hal\arm\xscale\ixp425\current\include):#defineHAL_PLATFORM_RESET_ENTRY 0x00000000
这个函数就是不干什么事情,然后跳转到0x00000000重启。
config tool是一个图形化的配置工具,可以配置好以后直接编译成bin文件。但是还是没有找到配置sdram大小以及其他需要直接修改源码的地方。另外configtool特别容易崩溃。
另外利用在ecos.db加入信息,可以使用./ecosconfig newixdp425_npe redboot产生支持以太网的bin,但是config tool就没有这个选项,应该是configtool在编译的时候就集成了一些数据,导致以后无法更新。所以如果对ecos进行了修改,不推荐使用这种方法。
如果没有建立ecbuild目录直接执行configure,会报错:
checking that aseparate build tree is being used... no
configure:error: This configure script should not be run inside the source tree. Insteadplease use a separate build tree
如果没有安装tcl-devel
checking forTcl/Tk installation...
configure:looking for tclConfig.sh in /usr/local/lib /usr/lib
configure:error: unable to locate Tcl configuration file tclConfig.sh
configure:error: ../../host/libcdl/configure failed for libcdl
如果没有安装tk-devel
configure: looking for tkConfig.sh in /usr/local/lib /usr/lib
configure: error: unable to locate Tk config filetkConfig.sh
configure: error: ../../host/libcdl/configure failedfor libcdl
P720板子上已经烧录好了redboot07, 按照利用redboot升级redboot的方法运行ram版本的redboot.srec,但是每次都出现乱码,似乎是波特率不对,但是试了各种波特率,没有匹配的,放弃。
在实际中,也有正确的redboot编译完成之后不能在其他版本的redboot上不能以ram模式运行起来的,所以才想是不是因为redboot07的版本为2.04,和ecos3相差太大所以不能成功。如果是这样的话,直接烧录rom模式也许会成功。
不做任何修改用ecos-3.0.i386linux.tar.bz2直接编译rom模式的bin,结果可以启动,但是输入fconfig -i或者fis init之后有打印信息,但是配置结果并不能保存到flash。按照07的方法修改了ixdp425.h中正确的sdram size和片选之后,反而不能启动了,连基本的输出也没有了。所以把sdram size和片选重新改回来,先启动再说。
在刚刚执行完fconfig -i之后执行fconfig -l,检查结果。
RedBoot>fconfig -l
FLASHconfiguration checksum error or invalid key
<Not astring: 0xFFD300C>:
FLASH configurationchecksum error or invalid key
<Not astring: 0xFFD320E>:
FLASHconfiguration checksum error or invalid key
<Not astring: 0xFFD3410>:
FLASHconfiguration checksum error or invalid key
<Not astring: 0xFFD3612>:
FLASHconfiguration checksum error or invalid key
<Not astring: 0xFFD3814>:
FLASHconfiguration checksum error or invalid key
<Not astring: 0xFFD3A16>:
FLASHconfiguration checksum error or invalid key
<Not astring: 0xFFD3C18>:
FLASHconfiguration checksum error or invalid key
<Not a string:0xFFD3E1A>:
查看flash配置区的内容:
> dump -b 0x50fe0000 -l 0x800
50FE0000: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF |................|
50FE0010: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF |................|
这个说明redboot配置完全没有写入保存到flash。猜测这个是因为flash的读取或者写入有问题,或者写入的地址有问题。但是根据实际的打印来看,地址应该是正确的。flash也许没有正确驱动。所以接下来尝试flash的读写。实验一下几条命令检查flash的读写:
mfill -b 0x16000-l 0x800 -p 0xa0a055
dump -b 0x16000-l 0x800
dump -b 0x50fe0000-l 0x800
fis write -f0x50fe0000 -b 0x16000 -l 0x800
dump -b 0x50fe0000-l 0x800
每条命令的作用如下:
1. 在ram的0x16000开始填写0xa0a055,写入0x800个bytes。
2. 在串口上打印ram的0x16000处开始0x800个bytes的内容,检查写入是否正确。
3. 在串口上打印flash的0x50fe0000处开始0x800个bytes的内容,检查原始内容。
4. 将ram的0x16000开始0x800个bytes的内容写入flash的0x50fe0000处。
5. 在串口上打印flash的0x50fe0000处开始0x800个bytes的内容,检查写入内容是否正确。
实验的结果证明,flash和ram的读写完全正确。将盒子重启,再次打印flash的内容,发现正确无误。这个说明flash的驱动是没有问题的。
以上的实验证明写入的地址没有问题,flash的驱动也没有问题,那么剩下的唯一可能就是写入的内容除了问题。查看全部的源码,发现配置的内容保存在一个叫config的全局变量中,写入的内容是从一个叫fis_work_block的全局变量。实现fconfig命令的主要源码在fconfig.c文件中,结构很清晰。 config的内容和fis_work_block有交互,于是全程各个fconfig相关函数都加入打印,发现config在配置的时候内存看起来是有意义的,但是在某一个地方突然变成了全0xff。继续缩小范围,加大打印密度,发现是下面这句话前后config的内存发生了变化。
memcpy(ram,(void*)addr, read_count);
这句话非常普通,而且ram和addr地址都检查过,绝对不应该是能够破坏内存。但是既然发生了内存被清除的现象,回想在ecos当中sdram size和片选都没有修改,还是如下:
#define SDRAM_SIZE 0x10000000 // 256MB
#defineIXP425_SDRAM_CONFIG_INIT (SDRAM_CONFIG_CAS_3 | SDRAM_CONFIG_2x32Mx16)
这两个设置错了肯定有问题,所以猜想是这里配置错了才导致memcpy出现奇怪的错误。但是如果两个修改了,系统根本就不能启动。另外,在以前编译redboot07的过程中,曾经修改了IXP425_SDRAM_CONFIG_INIT而没有修改SDRAM_SIZE而系统照样能够启动。猜想也许能够只修改IXP425_SDRAM_CONFIG_INIT就可以启动。IXP425_SDRAM_CONFIG_INIT是直接设置CPU寄存器的,肯定要设定成正确的,所以决定先修改IXP425_SDRAM_CONFIG_INIT。将2x32Mx16改成2x16Mx16:
//#defineIXP425_SDRAM_CONFIG_INIT (SDRAM_CONFIG_CAS_3 | SDRAM_CONFIG_2x32Mx16)
#defineIXP425_SDRAM_CONFIG_INIT (SDRAM_CONFIG_CAS_3 | SDRAM_CONFIG_2x16Mx16)
修改完之后使用下面的命令编译,这次能够成功fconfig了。
exportTOPDIR=`pwd`
exportECOS_REPOSITORY=${TOPDIR}/packages
rm –rf ${TOPDIR}/build
mkdir${TOPDIR}/build
cd${TOPDIR}/build
cp../bin/ecosconfig .
chmod +x ecosconfig
./ecosconfig newixdp425 redboot
./ecosconfigimport ${ECOS_REPOSITORY}/hal/arm/xscale/ixdp425/current/misc/redboot_ROM.ecm
./ecosconfig addintel_npe
./ecosconfig addixdp425_npe
./ecosconfigtree
make
注意是./ecosconfig new ixdp425 redboot,不是./ecosconfig new ixdp425_npe redboot. 使用ixdp425_npe会报错。
利用05版redboot的方法加入以太网支持,包括phy的支持之类。另外microcode用的是2.02版本而不能是2.04版本。为了安全起见,npe-2.02.epk是解压之后手工加入的。另外要使用./ecosconfig newixdp425_npe redboot,如果是./ecosconfig new ixdp425 redboot,以太网的驱动将不会得到编译。
编译出现问题:
In file includedfrom/home/linuxuser/ecos3/ecos_fullr2/packages/devs/eth/intel/npe/ethDB/v2_01/src/IxEthDBPortUpdate.c:47:
/home/linuxuser/ecos3/ecos_fullr2/build/install/include/IxEthDB_p.h:59:11:warning: "SIMSPARCSOLARIS" is not defined
/home/linuxuser/ecos3/ecos_fullr2/packages/devs/eth/intel/npe/ethDB/v2_01/src/IxEthDBPortUpdate.c:347:error: conflicting types for ‘ixEthDBNPEUpdateHandler’
/home/linuxuser/ecos3/ecos_fullr2/build/install/include/IxEthDB_p.h:660:error: previous declaration of ‘ixEthDBNPEUpdateHandler’ was here
/home/linuxuser/ecos3/ecos_fullr2/packages/devs/eth/intel/npe/ethDB/v2_01/src/IxEthDBPortUpdate.c:In function ‘ixEthDBNPEUpdateHandler’:
/home/linuxuser/ecos3/ecos_fullr2/packages/devs/eth/intel/npe/ethDB/v2_01/src/IxEthDBPortUpdate.c:386:warning: passing argument 1 of ‘__v2p’ makes integer from pointer without acast
make[1]: ***[src/IxEthDBPortUpdate.o.d] Error 1
检查两个定义,确实不一样
IxEthDB_p.h的定义如下:
IX_ETH_DB_PUBLICIxEthDBStatus ixEthDBNPEUpdateHandler(IxEthDBPortId portID, IxEthDBFeature type)
IxEthDBPortUpdate.c的定义如下:
IX_ETH_DB_PUBLICIxEthDBStatus ixEthDBNPEUpdateHandler(IxEthDBPortId portID, IxEthDBRecordTypetype)
也不知道05版本是怎么编译过的。
IxEthDBRecordType是一种枚举类型,IxEthDBFeature是另外一种枚举类型,完全不通。参考ixEthDBNPEUpdateHandler()的调用,发现输入的参数都是IX_ETH_DB_FIREWALL_RECORD等属于IxEthDBRecordType的类型,那么就按照IxEthDBRecordType修改IxEthDB_p.h文件。
注意需要修改的是packages/devs/eth/intel/npe/ethDB/v2_01/include/IxEthDB_p.h,而不是build里的那个文件。
再次编译,出现错误:
/home/linuxuser/ecos3/ecos_fullr2/packages/devs/eth/intel/npe/featureCtrl/v2_01/src/IxFeatureCtrl.c:In function ‘ixFeatureCtrlComponentCheck’:
/home/linuxuser/ecos3/ecos_fullr2/packages/devs/eth/intel/npe/featureCtrl/v2_01/src/IxFeatureCtrl.c:271:error: ‘componentMask’ undeclared (first use in this function)
/home/linuxuser/ecos3/ecos_fullr2/packages/devs/eth/intel/npe/featureCtrl/v2_01/src/IxFeatureCtrl.c:271:error: (Each undeclared identifier is reported only once
/home/linuxuser/ecos3/ecos_fullr2/packages/devs/eth/intel/npe/featureCtrl/v2_01/src/IxFeatureCtrl.c:271:error: for each function it appears in.)
/home/linuxuser/ecos3/ecos_fullr2/packages/devs/eth/intel/npe/featureCtrl/v2_01/src/IxFeatureCtrl.c:316:10:warning: "SIMSPARCSOLARIS" is not defined
make[1]: ***[src/IxFeatureCtrl.o.d] Error 1
make[1]: Leavingdirectory `/home/linuxuser/ecos3/ecos_fullr2/build/devs/eth/intel/npe/featureCtrl/v2_01'
make: ***[build] Error 2
但是源码中有如下定义
#ifdef __ixp42X
UINT32componentMask[IX_FEATURECTRL_MAX_COMPONENTS] = {
(0x1<<IX_FEATURECTRL_RCOMP),
(0x1<<IX_FEATURECTRL_USB),
……
#elif defined (__ixp46X)
UINT32componentMask[IX_FEATURECTRL_MAX_COMPONENTS] = {
(0x1<<IX_FEATURECTRL_RCOMP),
(0x1<<IX_FEATURECTRL_USB),
/packages/devs/eth/intel/npe/common/v2_01/include/osal/ecos/core/ixosalos.h
这个应该是因为__ixp42X没有定义。__ixp42X的定义部分在ixosalos.h 如下:
#ifdefined(CYGHWR_HAL_ARM_XSCALE_CPU_IXP42x)
#define __ixp42X
#elifdefined(CYGHWR_HAL_ARM_XSCALE_CPU_IXP46x)
#define __ixp46X
#endif
那么问题在于CYGHWR_HAL_ARM_XSCALE_CPU_IXP42x.
这个宏,07redboot是在build文件夹中Hal_arm_xscale_ixp425.h定义的。ecos3中根本没有这个文件。
但是在ecos3当中没有这个定义。不过搜索全文CYGHWR_HAL_ARM_XSCALE_CPU_IXP42x只在npe里用过了两次,所以直接修改ixosalos.h算了。
出现新的错误:
arm-eabi-gcc-mno-thumb-interwork -mbig-endian -mcpu=xscale -Wl,--gc-sections -Wl,-static -g-O2 -nostdlib -L/home/linuxuser/ecos3/ecos_fullr2/build/install/lib -Ttarget.ld-o /home/linuxuser/ecos3/ecos_fullr2/build/install/bin/redboot.elf/home/linuxuser/ecos3/ecos_fullr2/build/install/lib/version.o
/home/linuxuser/ecos3/gnutools/arm-eabi/bin/../lib/gcc/arm-eabi/4.3.2/../../../../arm-eabi/bin/ld:address 0x50049b7a of/home/linuxuser/ecos3/ecos_fullr2/build/install/bin/redboot.elf section .rodatais not within region rom
其中0x50049b7a是关键,0x50000000是flash的基地址,0x49b7a的大小为294K多。而07redboot都有300多K,似乎不是问题,但是notwithin region rom也许是ecos3定义的region rom太小了。结合Redboot Setting Guide for32bit,似乎和CYGMEM_REGION_rom_SIZE有关系。而04的redboot分区大小为256K, 05和07的都是512K。找到07的Mlt_arm_xscale_ixdp425_rom.h 文件。(packages\hal\arm\xscale\ixdp425\current\include\pkgconf\)
有如下定义:
#defineCYGMEM_REGION_rom (0x50000000)
#defineCYGMEM_REGION_rom_SIZE (0x80000)
0x80000就是512K, 而0x40000就是256K。而05的也是一样0x80000。看看04的。
#defineCYGMEM_REGION_rom (0x50000000)
#defineCYGMEM_REGION_rom_SIZE (0x40000)
果然不一样,是256K,这个和04redboot的实际情况一样。
检查ecos3,也是256K。
#define CYGMEM_REGION_rom (0x50000000)
#define CYGMEM_REGION_rom_SIZE (0x40000)
这个肯定需要改过来,但是为了防止遗漏,搜索全部的源码寻找0x80000,除了Redboot.h(redboot-intel-ixp4xx-070320ryan\build\install\include\pkgconf):#defineCYGBLD_REDBOOT_MIN_IMAGE_SIZE 0x80000
其他的就没有了,说明修改这个就好了。
修改完之后删除build,彻底重新编译一次,还是同样的错误,也许别的什么地方还是有显示。
在ecos3的mlt_arm_xscale_ixdp425_rom.mlt找到
region ram 010000000 0 !
region rom50000000 40000 1 !
在mlt_arm_xscale_ixdp425_rom.ldi找到
MEMORY
{
ram : ORIGIN = 0, LENGTH = 0x10000000
rom : ORIGIN = 0x50000000, LENGTH = 0x40000
}
这两个都显示为0x40000,检查一下07的配置。
mlt_arm_xscale_ixdp425_rom.ldi
里发现mlt_arm_xscale_ixdpg425_rom.ldi
MEMORY
{
ram : ORIGIN = 0, LENGTH = 0x02000000
rom : ORIGIN = 0x50000000, LENGTH = 0x80000
}
在mlt_arm_xscale_ixdpg425_rom.mlt发现
region ram 002000000 0 !
region rom50000000 40000 1 !
这个说明mlt_arm_xscale_ixdpg425_rom.ldi的配置是关键。mlt_arm_xscale_ixdpg425_rom.mlt的没什么关系,修改之后编译完成。
编译完整之后烧录到板子上,打印如下信息:
driver initfailed: Invalid FLASH address
Copyright (C)2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
Free SoftwareFoundation, Inc.
RedBoot is freesoftware, covered by the eCos license, derived from the
GNU GeneralPublic License. You are welcome to change it and/or distribute
copies of itunder certain conditions. Under the license terms, RedBoot's
source code andfull license terms must have been made available to you.
Redboot comeswith ABSOLUTELY NO WARRANTY.
Platform:IXDP425 Development Platform (XScale) BE
RAM:0x00000000-0x10000000 [0x000273c8-0x0fff1000available]
后面就没有输出了。本来接下来应该打印flash的大小的。说明flash的读取出了问题。本来加入以太网以前,flash的读写是没有问题的。而以太网是不应该对flash的驱动产生问题的。还有一个区别是,在没有以太网的编译过程中,使用的是ecosconfig new ixdp425 redboot,而现在是./ecosconfig new ixdp425_npe redboot。ixdp425_npe是npe-2.02.epk解压之后的pkgadd.db的内容,追加到ecos.db当中的。检查一下这两个配置有什么不同。
在ecos.db当中发现
targetixdp425_npe {
alias { "IXDP425 with NPEethernet" ixdp425npe }
packages { CYGPKG_HAL_ARM
CYGPKG_HAL_ARM_XSCALE_CORE
CYGPKG_HAL_ARM_XSCALE_IXP425
CYGPKG_HAL_ARM_XSCALE_IXDP425
CYGPKG_IO_PCI
CYGPKG_DEVS_ETH_INTEL_I82559
CYGPKG_DEVS_ETH_ARM_IXDP425_I82559
CYGPKG_DEVS_ETH_INTEL_NPE
CYGPKG_DEVS_ETH_INTEL_NPE_ETHACC
CYGPKG_DEVS_ETH_INTEL_NPE_ETHDB
CYGPKG_DEVS_ETH_INTEL_NPE_ETHMII
CYGPKG_DEVS_ETH_INTEL_NPE_NPEDL
CYGPKG_DEVS_ETH_INTEL_NPE_NPEMH
CYGPKG_DEVS_ETH_INTEL_NPE_OSSERVICES
CYGPKG_DEVS_ETH_INTEL_NPE_QMGR
CYGPKG_DEVS_ETH_INTEL_NPE_FEATURECTRL
CYGPKG_DEVS_ETH_ARM_IXDP425_NPE
CYGPKG_DEVS_FLASH_STRATA
CYGPKG_DEVS_FLASH_IXDP425
}
description "
The ixdp425 target provides thepackages needed to run
eCos on an Intel network processorevaluation board."
}
target ixdp425 {
alias { "IXDP425 board" }
packages { CYGPKG_HAL_ARM
CYGPKG_HAL_ARM_XSCALE_CORE
CYGPKG_HAL_ARM_XSCALE_IXP425
CYGPKG_HAL_ARM_XSCALE_IXDP425
CYGPKG_IO_PCI
CYGPKG_DEVS_ETH_INTEL_I82559
CYGPKG_DEVS_ETH_ARM_IXDP425_I82559
CYGPKG_DEVS_FLASH_STRATA_V2
}
description "
The ixdp425 target provides thepackages needed to run
eCos on an Intel network processorevaluation board."
}
比较明显的区别是:
在ixdp425当中flash的驱动为
CYGPKG_DEVS_FLASH_STRATA_V2
而在ixdp425_npe当中flash的驱动为
CYGPKG_DEVS_FLASH_STRATA
CYGPKG_DEVS_FLASH_IXDP425
这个可能就是flashdriver的问题。对比07版本的这两个target的区别。
果然在07的ecos.db当中驱动是:
CYGPKG_DEVS_FLASH_STRATA
CYGPKG_DEVS_FLASH_IXDP425
那么在ecos3中targetixdp425_npe中的flash驱动修改为CYGPKG_DEVS_FLASH_STRATA_V2。重新编译系统,正常启动。
这一版ecos比较奇怪的是,没有让选择以太网。
RedBoot>fconfig
Run script atboot: true
Boot script:
Enter script,terminate with empty line
>>
Boot scripttimeout (1000ms resolution): 2
Use BOOTP fornetwork configuration: false
Gateway IP address:10.0.0.1
Local IPaddress: 10.0.0.204
Local IP addressmask: 255.0.0.0
Default serverIP address: 10.0.0.110
Console baudrate: 115200
GDB connectionport: 9000
Force consolefor special debug messages: false
Network debug atboot time: false
Update RedBootnon-volatile configuration - continue (y/n)? y
... Unlockingfrom 0x50fe0000-0x50ffffff: .
... Erase from0x50fe0000-0x50ffffff: .
... Program from0x03fe0000-0x04000000 to 0x50fe0000: .
... Locking from0x50fe0000-0x50ffffff: .
以前的修改都是通过SDRAM_SIZE实现的,但是ecos3只要修改SDRAM_SIZE,系统就不能启动。在源码里搜索全部的SDRAM_SIZE,发现有如下语句:
.macroIXP_MAP_SDRAM va, c, b, x, p
XSCALE_MMU_SECTIONSDRAM_PHYS_BASE>>20, \va>>20, SDRAM_SIZE>>20, \c, \b, 3, \x,\p
.endm
.macroIXP_MAP_EXP_V n, va, sz, c, b, x, p
XSCALE_MMU_SECTION (0x500 +((IXP425_EXP_CS_SIZE * \n) >> 20)), \va>>20, \sz>>20, \c, \b,3, \x, \p
.endm
.macroIXP_MAP_EXP n, sz, c, b, x, p
IXP_MAP_EXP_V \n, (0x50000000 +(IXP425_EXP_CS_SIZE * \n)), \sz, \c, \b, \x, \p
.endm
.macroIXP_MAP_IO addr, sz
XSCALE_MMU_SECTION \addr>>20,\addr>>20, \sz>>20, 0, 0, 3, 0, 0
.endm
这个SDRAM_SIZE也许不是定义真是的ram大小,而是给mmu配置用的虚拟地址。根据RedBoot_Setting_Guide_v04文档的内容,内存的修改还有例外的地方,和HAL_MEM_REAL_REGION_TOP相关,位置在/packages/hal/i386/pc/v2_0/include/pkhconf/。
ecos3里没有这个目录,最相近的在/packages/hal/arm/xscale/ixdp425/current/include/pkgconf。
在mlt_arm_xscale_ixdp425_rom.h中,找到下面配置:
#defineCYGMEM_REGION_ram_SIZE (0x10000000)
#defineCYGMEM_SECTION_heap1_SIZE (0x10000000 - (size_t) CYG_LABEL_NAME (__heap1))
其中CYGMEM_REGION_ram_SIZE和CYGMEM_SECTION_heap1_SIZE和fis_work_block密切相关,根据前面调试fconfig得到的信息,fis_work_block的地址就是CYGMEM_SECTION_heap1_SIZE决定的。这个定义是内存的大小减去一个保留长度,所以如果修改,这两处要配合。
修改为:
//#defineCYGMEM_REGION_ram_SIZE (0x10000000)
#defineCYGMEM_REGION_ram_SIZE (0x4000000)
//#defineCYGMEM_SECTION_heap1_SIZE (0x10000000 - (size_t) CYG_LABEL_NAME (__heap1))
#defineCYGMEM_SECTION_heap1_SIZE (0x4000000 - (size_t)CYG_LABEL_NAME (__heap1))
编译后烧录到板子,启动信息中ram大小的信息改变了。
Platform:IXDP425 Development Platform (XScale) BE
RAM:0x00000000-0x04000000 [0x00016e78-0x03fd1000 available]
FLASH:0x50000000-0x50ffffff, 128 x 0x20000 blocks
在ecos3中,不能使用printf来打印调试,而是使用diag_printf。这个不是宏定义之类的,而是ecos3中实现的打印。在调用之前加入:
externC int diag_printf( const char *fmt, ... );
就可以使用这个函数了。
这个能节省大约20K的flash空间。
在ecos.db里面有ixdp425_npe的配置包。
targetixdp425_npe {
alias { "IXDP425 with NPEethernet" ixdp425npe }
packages { CYGPKG_HAL_ARM
CYGPKG_HAL_ARM_XSCALE_CORE
CYGPKG_HAL_ARM_XSCALE_IXP425
CYGPKG_HAL_ARM_XSCALE_IXDP425
CYGPKG_IO_PCI
CYGPKG_DEVS_ETH_INTEL_I82559
CYGPKG_DEVS_ETH_ARM_IXDP425_I82559
CYGPKG_DEVS_ETH_INTEL_NPE
CYGPKG_DEVS_ETH_INTEL_NPE_ETHACC
CYGPKG_DEVS_ETH_INTEL_NPE_ETHDB
CYGPKG_DEVS_ETH_INTEL_NPE_ETHMII
CYGPKG_DEVS_ETH_INTEL_NPE_NPEDL
CYGPKG_DEVS_ETH_INTEL_NPE_NPEMH
CYGPKG_DEVS_ETH_INTEL_NPE_OSSERVICES
CYGPKG_DEVS_ETH_INTEL_NPE_QMGR
CYGPKG_DEVS_ETH_INTEL_NPE_FEATURECTRL
CYGPKG_DEVS_ETH_ARM_IXDP425_NPE
CYGPKG_DEVS_FLASH_STRATA
CYGPKG_DEVS_FLASH_IXDP425
}
description "
The ixdp425 target provides thepackages needed to run
eCos on an Intel network processorevaluation board."
}
删除下面的两项
CYGPKG_DEVS_ETH_INTEL_I82559
CYGPKG_DEVS_ETH_ARM_IXDP425_I82559
另外在redboot_ROM的cdl_configuration eCos结构里面去掉了I82559相关的两条内容
package-hardware CYGPKG_DEVS_ETH_INTEL_I82559 current ;
package-hardware CYGPKG_DEVS_ETH_ARM_IXDP425_I82559 current ;
去掉以后,redboot.bin大小从310K减少到293k。烧录到板子,以太网完全正常。这个方法应该也可以用到07redboot上,虽然节省的空间不大。