关于2440从5.0到6.0的移植之OAL篇

这几天一直忙着移植,说实话,这个想法已经有一个月了,只是半个月前才开始行动而已。一开始以为很简单的事情,首先,我已经看了好几本

书了,当然也是大概看了一遍,比如李大为,周健设,何宗健老师,张冬泉老师的书我都有看过,七剑还看了很多论坛,可是结果依然令人失望

,往往事情和想象的不一样!
开始我从网上先搜了一下关于移植有没有现成的,我好直接拿过来用,然后再进行一定程度的修改,当然希望越少越好,可惜行不通。原因很明

显:1,CPU不一致,有的是2410的,有2443的,当然也有2440的。于是我选择了2440进行移植。因为我的板子是友善之臂的mini2440.
    2,找别人移植好的BSP。去哪找?各个论坛我已经转个遍,下了许多,这期间我要BS下TONY论坛的一些人,他们上传的一些资料聊相当不负

责任,完全是为了骗金币,当然对于TONY我还是很崇拜的!
    3,资料有了,却不知道从何下手,因为可以选择的余地多了,烦恼也就多了,这个人有这个得看法,那个人有那样的做法,我该如何进行

选择呢?
......还有许多问题,就不列举了!
今天总算把OAL调通了,算是成功了一小步吧。因为我听一个牛人说过,把OAL何KITL调通就已经成功了一半,呵呵,我不知道是不是真的,但是

我希望我能坚持下去。
首先,参考http://www.cnblogs.com/we-hjb/archive/2008/10/29/1322509.html的帖子,把这个牛人的博客的帖子调通了,刚开始怎么调也调

不通,最后过了几天无意中又调试了一下,居然调通了。
接着,参考gooogleman的移植文档,按照他的思路进行了相应的修改。
中间也出过许多错误,下面我把我的错误贴出来和大家一起探讨一下:

首先,按照http://www.cnblogs.com/we-hjb/archive/2008/10/29/1322509.html这个帖子,大家进行OAL的快速调试,通过这个操作,我想大家

可以学到更多,最起码VS2005的一些功能我现在才知道。
其次,参照gooolman的帖子进行移植,在他的个人博客里面有说明。按着来就行了。
一、先编译后模拟器的精简版本,然后把模拟器的OAL相关的代码进行删除,换成5.0BSP的代码(把KITL相关的代码删除)并修改相应的sources

文件。COMMON目录下主要有smartmedia\dll和smartmedia\fmd两个source文件。OAL目录下主要有:OALEXE和OALLIB两个文件下的SOURCE文件。

把KITL在DIR目录里面屏蔽。

二、把C:\WINCE500\PLATFORM\SMDK2440A\Src\Common代替D:\WINCE600\PLATFORM\mini2440\SRC\Common
C:\WINCE500\PLATFORM\SMDK2440A\Src\Inc代替D:\WINCE600\PLATFORM\mini2440\SRC\Inc

三、编译OAL的时候会调用D:\WINCE600\PLATFORM\mini2440\SRC\Common下的很多代码生成的lib,所以我现在首先编译D:\WINCE600

\PLATFORM\mini2440\SRC\Common下面的所有代码,在VS2005 上点中Common然后右键选择“rebuild”,有错误了(有错误才是正常的,

(*^__^*) 嘻嘻……)
警告的内容:
BUILD: [Thrd:Sequence:Type  ] Message
BUILD: [01:0000000039:WARNN ] D:\WINCE600\PLATFORM\mini2440\src\common\Intr\.\intr.c(379) : warning C4013: 'NKCallIntChain'

undefined; assuming extern returning int
BUILD: [01:0000000058:WARNN ] D:\WINCE600\PLATFORM\mini2440\src\common\Intr_dvs\.\intr.c(628) : warning C4013:

'NKCallIntChain' undefined; assuming extern returning int
BUILD: [01:0000000192:WARNN ] D:\WINCE600\PLATFORM\mini2440\src\common\Smartmedia\fmd\.\fmd.cpp(940) : warning C4018: '<' :

signed/unsigned mismatch
BUILD: [01:0000000193:WARNN ] D:\WINCE600\PLATFORM\mini2440\src\common\Smartmedia\fmd\.\fmd.cpp(941) : warning C4244: '=' :

conversion from 'unsigned long' to 'USHORT', possible loss of data
BUILD: [01:0000000194:WARNN ] D:\WINCE600\PLATFORM\mini2440\src\common\Smartmedia\fmd\.\fmd.cpp(945) : warning C4018: '<' :

signed/unsigned mismatch
BUILD: [01:0000000195:WARNN ] d:\wince600\platform\mini2440\src\common\smartmedia\fmd\fmd.cpp(956) : warning C4700:

uninitialized local variable 'pLockInfo' used
BUILD: [00:0000000445:WARNN ] D:\WINCE600\PLATFORM\mini2440\src\common\Smartmedia\Dll\: Missing source file: D:\WINCE600

\public\cesysgen\sdk\lib\ARMV4I\debug\coredll.lib.
BUILD: [00:0000000446:WARNN ] D:\WINCE600\PLATFORM\mini2440\src\common\Smartmedia\Dll\: Missing source file: D:\WINCE600

\public\cesysgen\oak\lib\ARMV4I\debug\fal.lib.


(这个VS2005 唯一不好的地方就是编译错误不是红色显示的)
出错地方
 // First find if IRQ is claimed by chain
        sysIntr = NKCallIntChain((UCHAR)irq);

晕,上面仅仅是警告,但是估计也有问题。跑到Common下打开build.err看看,有错误。
BUILD: [Thrd:Sequence:Type  ] Message
BUILD: [01:0000000480:ERRORE] fal.lib(falmain.obj) : error LNK2019: unresolved external symbol FMDHOOK_UnhookInterface

referenced in function DSK_Deinit
BUILD: [01:0000000481:ERRORE] fal.lib(falmain.obj) : error LNK2019: unresolved external symbol FMDHOOK_HookInterface

referenced in function "void __cdecl GetFMDInterface(struct _DEVICE *)" (?GetFMDInterface@@YAXPAU_DEVICE@@@Z)
BUILD: [01:0000000482:ERRORE] smflash_lib.lib(fmd.obj) : error LNK2019: unresolved external symbol ReadPage512 referenced in

function "int __cdecl FMD_SB_ReadSector(unsigned long,unsigned char *,struct _SectorInfo *,unsigned long,int)" (?

FMD_SB_ReadSector@@YAHKPAEPAU_SectorInfo@@KH@Z)
BUILD: [01:0000000483:ERRORE] smflash_lib.lib(fmd.obj) : error LNK2019: unresolved external symbol WritePage512 referenced in

function "int __cdecl FMD_SB_WriteSector(unsigned long,unsigned char *,struct _SectorInfo *,unsigned long,int)" (?

FMD_SB_WriteSector@@YAHKPAEPAU_SectorInfo@@KH@Z)
BUILD: [01:0000000484:ERRORE] D:\WINCE600\platform\mini2440\target\ARMV4I\debug\smflash.dll : fatal error LNK1120: 4

unresolved externals

 

怎么回事呢?
接着参考http://bbs.driverdevelop.com/simple/index.php?t112006.htmlztg0021的帖子,发现他也遇见类似的错误,按照他的思路进行修改


Src\Common\Smartmedia\Dll中的sources文件修改
在SOURCELIBS语句段中原有的两个库的基础上增加下面的库
$(_COMMONOAKROOT)\lib\$(_CPUINDPATH)\fmdhooklib.lib \
之后又有新的错误了。
BUILD: [Thrd:Sequence:Type  ] Message
BUILD: [01:0000000432:ERRORE] D:\WINCE600\PLATFORM\mini2440\src\common\Smartmedia\Dll\sources(12) :  U1033: syntax error :

'$(_COMMONOAKROOT)\lib\$(_CPUINDPATH)\fmdhooklib.lib' unexpected
BUILD: [01:0000000434:ERRORE] NMAKE.EXE TargetLibFiles  -i -c BUILDMSG=Stop.  BUILDROOT=D:\WINCE600\PLATFORM\mini2440

CLEANBUILD=1 LINKONLY=1 NOPASS0=1 failed - rc = 2

警告:
BUILD: [Thrd:Sequence:Type  ] Message
BUILD: [01:0000000039:WARNN ] D:\WINCE600\PLATFORM\mini2440\src\common\Intr\.\intr.c(379) : warning C4013: 'NKCallIntChain'

undefined; assuming extern returning int
BUILD: [01:0000000058:WARNN ] D:\WINCE600\PLATFORM\mini2440\src\common\Intr_dvs\.\intr.c(628) : warning C4013:

'NKCallIntChain' undefined; assuming extern returning int
BUILD: [01:0000000192:WARNN ] D:\WINCE600\PLATFORM\mini2440\src\common\Smartmedia\fmd\.\fmd.cpp(940) : warning C4018: '<' :

signed/unsigned mismatch
BUILD: [01:0000000193:WARNN ] D:\WINCE600\PLATFORM\mini2440\src\common\Smartmedia\fmd\.\fmd.cpp(941) : warning C4244: '=' :

conversion from 'unsigned long' to 'USHORT', possible loss of data
BUILD: [01:0000000194:WARNN ] D:\WINCE600\PLATFORM\mini2440\src\common\Smartmedia\fmd\.\fmd.cpp(945) : warning C4018: '<' :

signed/unsigned mismatch
BUILD: [01:0000000195:WARNN ] d:\wince600\platform\mini2440\src\common\smartmedia\fmd\fmd.cpp(956) : warning C4700:

uninitialized local variable 'pLockInfo' used


晕倒,把D:\WINCE600\PLATFORM\mini2440\SRC\Common目录下的Smartmedia换成ztg0021的那个就好了!
没有错误,编译成功!
警告:
BUILD: [Thrd:Sequence:Type  ] Message
BUILD: [01:0000000039:WARNN ] D:\WINCE600\PLATFORM\mini2440\src\common\Intr\.\intr.c(380) : warning C4013: 'NKCallIntChain'

undefined; assuming extern returning int
BUILD: [01:0000000058:WARNN ] D:\WINCE600\PLATFORM\mini2440\src\common\Intr_dvs\.\intr.c(628) : warning C4013:

'NKCallIntChain' undefined; assuming extern returning int
BUILD: [00:0000000436:WARNN ] D:\WINCE600\PLATFORM\mini2440\src\common\Smartmedia\Dll\: Missing source file: D:\WINCE600

\public\cesysgen\sdk\lib\ARMV4I\debug\coredll.lib.
BUILD: [00:0000000437:WARNN ] D:\WINCE600\PLATFORM\mini2440\src\common\Smartmedia\Dll\: Missing source file: D:\WINCE600

\public\cesysgen\oak\lib\ARMV4I\debug\fal.lib.
BUILD: [00:0000000438:WARNN ] D:\WINCE600\PLATFORM\mini2440\src\common\Smartmedia\Dll\: Missing source file: D:\WINCE600

\public\cesysgen\oak\lib\ARMV4I\debug\fmdhooklib.lib.

 

继续编译OAL。在参考了gooogleman 的移植笔记,在OALlib的时候还是卡住了,始终是8个错误,我贴出来在此向大家求教下:
BUILD: [Thrd:Sequence:Type  ] Message
BUILD: [01:0000000030:ERRORE] D:\WINCE600\PLATFORM\mini2440\src\oal\oallib\.\init.c(53) : error C2065: 'dwNKDrWatsonSize' :

undeclared identifier
BUILD: [01:0000000034:ERRORE] D:\WINCE600\PLATFORM\mini2440\src\oal\oallib\.\intr.c(71) : error C2065:

'BSP_BASE_REG_PA_DM9000_IOBASE' : undeclared identifier
BUILD: [01:0000000035:ERRORE] D:\WINCE600\PLATFORM\mini2440\src\oal\oallib\.\intr.c(71) : error C2051: case expression not

constant
BUILD: [01:0000000045:ERRORE] D:\WINCE600\PLATFORM\mini2440\src\oal\oallib\.\debug.c(73) : error C2065: 'BSP_UART0_UFCON' :

undeclared identifier
BUILD: [01:0000000046:ERRORE] D:\WINCE600\PLATFORM\mini2440\src\oal\oallib\.\debug.c(74) : error C2065: 'BSP_UART0_UMCON' :

undeclared identifier
BUILD: [01:0000000047:ERRORE] D:\WINCE600\PLATFORM\mini2440\src\oal\oallib\.\debug.c(75) : error C2065: 'BSP_UART0_ULCON' :

undeclared identifier
BUILD: [01:0000000048:ERRORE] D:\WINCE600\PLATFORM\mini2440\src\oal\oallib\.\debug.c(76) : error C2065: 'BSP_UART0_UCON' :

undeclared identifier
BUILD: [01:0000000049:ERRORE] D:\WINCE600\PLATFORM\mini2440\src\oal\oallib\.\debug.c(77) : error C2065: 'BSP_UART0_UBRDIV' :

undeclared identifier

晕倒我的没有extern DWORD dwNKDrWatsonSize;会提示dwNKDrWatsonSize未定义错误,加上就好了,但是ztg0021的却要屏蔽
extern DWORD dwNKDrWatsonSize 才行的。希望等下不要出乱子。

这里我加上了这句外部声明,不知道最后的结果如何?先放在这里!但是编译COMMON时没有任何问题的。

在这里我要特别感谢一个人:wlc311
在CSDN的这些日子里,他就像一个老朋友帮了我很多,再次向他致谢!
wlc311搞定了6个错误:解决办法如下:
我提拱其中6个错误的解决方法:
BUILD: [01:0000000034:ERRORE] D:\WINCE600\PLATFORM\mini2440\src\oal\oallib\.\intr.c(71) : error C2065:

'BSP_BASE_REG_PA_DM9000_IOBASE' : undeclared identifier
在SRC->INC->bsp_base_reg_cfg中加上如这样:
#define BSP_BASE_REG_PA_DM9000_IOBASE          0x20000300
#define BSP_BASE_REG_PA_DM9000_MEMBASE          0x20000000
BUILD: [01:0000000045:ERRORE] D:\WINCE600\PLATFORM\mini2440\src\oal\oallib\.\debug.c(73) : error C2065: 'BSP_UART0_UFCON' :

undeclared identifier
BUILD: [01:0000000046:ERRORE] D:\WINCE600\PLATFORM\mini2440\src\oal\oallib\.\debug.c(74) : error C2065: 'BSP_UART0_UMCON' :

undeclared identifier
BUILD: [01:0000000047:ERRORE] D:\WINCE600\PLATFORM\mini2440\src\oal\oallib\.\debug.c(75) : error C2065: 'BSP_UART0_ULCON' :

undeclared identifier
BUILD: [01:0000000048:ERRORE] D:\WINCE600\PLATFORM\mini2440\src\oal\oallib\.\debug.c(76) : error C2065: 'BSP_UART0_UCON' :

undeclared identifier
BUILD: [01:0000000049:ERRORE] D:\WINCE600\PLATFORM\mini2440\src\oal\oallib\.\debug.c(77) : error C2065: 'BSP_UART0_UBRDIV' :

undeclared identifier
在SRC->INC->bsp_cfg中加上
#define BSP_UART0_ULCON        0x03                // 8 bits, 1 stop, no parity
#define BSP_UART0_UCON          0x0005              // pool mode, PCLK for UART
#define BSP_UART0_UFCON        0x00                // disable FIFO
#define BSP_UART0_UMCON        0x00                // disable auto flow control
#define BSP_UART0_UBRDIV        (S3C2440A_PCLK/(115200*16) - 1)

其它两个原因,因为没遇到过这种情况,故不便乱说。
重新编译整个OAL

build.err变成
BUILD: [Thrd:Sequence:Type  ] Message
BUILD: [01:0000000076:ERRORE] D:\WINCE600\PLATFORM\mini2440\src\oal\oallib\.\init.c(53) : error C2065: 'dwNKDrWatsonSize' :

undeclared identifier

关于:NKCallIntChain,我上网搜了一下,大概意思是:
要生成错误报告的dump文件,需要至少有128K的内存。OAL层初始化函数OEMInit中,变量dwNKDrWatsonSize就是记录这个内存的大小。内核会从

主内存区域的最后,保留出这一块内存。设置编译环境变量SYSGEN_WATSON_DMPGEN,让镜像包含有错误报告生成器的功能。

后面再论坛上求助,得到何宗健老师的指导:
何宗健老师:看来出错的代码在oal自己的代码中。其实我感觉,可以把dwNKDrWatsonSize注释掉,禁止dump这个功能,或者自己在任何一个头

文件里面定义一个就好了,看看5.0版本的bsp该变量定义在哪里的。据自己的经验,5.0移植6.0只要参考微软的官方移植文档,基本上工作量不

大。

zhengshijie:5.0里面直接外部引用的全局变量,在6.0里不能用了,而是通过
platform/common/src/inc/oal.h->public/common/oak/inc/oemglobal.h->public/common/oak/inc/bcoemglobal.h
#define dwNKDrWatsonSize                    g_pOemGlobal->cbErrReportSize
在6.0里把extern DWORD dwNKDrWatsonSize去掉就可以了,extern DWORD CEProcessorType;有这个定义的话也去掉。

接着又出现一个小问题:
大概错误是找不到KITL.DLL,所以无法生成OAL.EXE。
我不是屏蔽了嘛?
原来我在省城选项里还是选择了KITL=1,将其勾掉。
然后进行总体编译,生成OSDesign6,天啊,终于成功了!
NK.bin和NK.nb0生成了。
下面我要做的就是移植KITL,当然还要下载到板子里去试试!

忘记说了,Bootloader我直接从网上下了一个通用的,所以也就没有进行修改,后面我打算再研究下,最好再写一个NBOOT,再添加一个自己的LOGO,呵呵,先想想。
最后感谢:
wlc311,gooogleman,何宗健老师,WINCE.he前辈,QQ网名叫2008的朋友,谢谢你们给与我的帮助!

转载于:https://www.cnblogs.com/Torres_fans/archive/2009/10/13/1582540.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值