Wince5.0下如何将Public和Private下的代码移植到BSP下——转载

来源:互联网 发布:led显示屏通用软件 编辑:程序博客网 时间:2024/05/06 03:46

 转载自CSDN 好友:gsymichael

有时候在调试驱动或是学习驱动的过程发现源码在Public下,而这部分又不能乱动。同时对于Private下的代码更是如此了。如果能将这部分代码移植到自己的BSP下岂不是可以随意加入调试信息从而更好的掌握代码的实现机制,也可以自己加些功能什么的也不用担心Private或是Public下的内容被改掉。

 那么就来看看如何做吧。首先看如何把Public下的驱动移植到BSP去:

 将Public下的驱动移植到BSP下比较容易,实际上PB也提供了相关的工具:Sysgen_capture(参考MSDN:Cloning the Microsoft Public Common Code)。那么如何来用这个工具呢? 下面就以SDMemory为例子来介绍一下:首先把D:/WINCE500/PUBLIC/COMMON/OAK/DRIVERS/SDCARD/SDCLIENTDRIVERS下的SDMEMORY文件夹拷贝到<Platform>/SRC/DRIVERS/路径下。然后在命令行中设置到该路径下,键入sysgen_capture sdmemory之后回车。那么在该文件夹下出现一个sources.sdmemory打开该文件有如下的设置:

  1. TARGETNAME=sdmemory
  2. TARGETTYPE=DYNLINK
  3. RELEASETYPE=PLATFORM
  4. SYNCHRONIZE_DRAIN=1
  5. DLLENTRY=DllEntry
  6. DEFFILE=$(_PUBLICROOT)/common/oak/lib/$(_CPUINDPATH)/sdmemory.def
  7. SOURCELIBS=
  8. TARGETLIBS=/
  9.     $(_PUBLICROOT)/common/oak/lib/$(_CPUINDPATH)/sdmemory_lib.lib /
  10.     $(_SYSGENOAKROOT)/lib/$(_CPUINDPATH)/ceddk.lib /
  11.     $(_SYSGENOAKROOT)/lib/$(_CPUINDPATH)/sdcardlib.lib /
  12.     $(_SYSGENOAKROOT)/lib/$(_CPUINDPATH)/sdbus.lib /
  13.     $(_SYSGENSDKROOT)/lib/$(_CPUINDPATH)/coredll.lib
  14. SOURCES=

 有了这个以后就可以修改了。根据DEFFILE的设置路径找到这个sdmemory.def把它拷贝到我们的SDMEMORY中,然后把这个DEFFILE的值直接改成sdmemory.def。之后看TARGETLIBS下的东西,可以看到有个sdmemory_lib.lib这个lib就是SDMEMORY下的源码所生成的,所以直接把这个拿掉。在SOURCES下把该目录下的源文件都加上。这样就可以生成sdmemory.dll了,同时也会生成一个同名的lib。如果要使用这个lib使用$(_TARGETPLATROOT)/lib/$(_CPUINDPATH)/来设置路径。

 通过使用sysgen_capture可以简化我们移植的步骤,它把生成该Dll所需的lib都列出来了。只需要略作修改即可了。如果我们要把Private下的代码移植到BSP下该如何做呢?还是举个例子吧,下面以把FATFS移植到BSP为例来介绍:同样的把

D:/WINCE500/PRIVATE/WINCEOS/COREOS/FSD下的FATFS复制到<Platform>/SRC/DRIVERS/路径下。之后到D:/WINCE500/PUBLIC/COMMON/CESYSGEN路径下打开makefile文件,搜索fatfsd可以找到如下的信息:
  1. fatfsd::fsdmgr
  2.         @set TARGETLIBS=$(OWNLIB) $(SG_OUTPUT_OAKLIB)/fsdmgr.lib
  3. OWNLIB=$(SG_INPUT_LIB)/$@.lib

从这些信息可以看出fatfsd.dll是由fatfsd.lib和fsdmgr.lib生成的。有了这些信息,我们就到BSP下的FATFS目录下打开sources文件,该sources有下面的内容:

  1. WINCEOEM=1
  2. IMGNODFLTDDK=1
  3. TARGETNAME=fatfsd
  4. TARGETTYPE=LIBRARY
  5. CONDITIONAL_INCLUDES=fakepeg.h pfake.h pcmd.h sys/types.h
  6. INCLUDES= ..
  7. SOURCES=/
  8.     ../api.c       /
  9.     ../buffer.c    /
  10.     ../cache.c     /
  11.     ../disk.c      /
  12.     ../fat.c       /
  13.     ../file.c      /
  14.     ../find.c      /
  15.     ../misc.c      /
  16.     ../name.c      /
  17.     ../path.c      /
  18.     ../stream.c    /
  19.     ../streamrun.c /
  20.     ../volume.c
  21. x86_SOURCES=/
  22.     ../x86/chkstk.asm
  23. TARGETDEFNAME=fatfsd
  24. DEFFILE=fatfsd.def
  25. WINCETARGETFILE0=$(_RELEASELIBDIR)/fatfsd.def

根据TARGETTYPE看到生成的是个lib。我们把它改成DYNLINK,这样就让它生成dll。同时DEFFILE就直接设为fatfsd.def。由SOURCES下的源文件可以生成fatfsd.lib,还缺一个fsdmgr.lib。那我们就把这个lib用TARGETLIBS的方式把它链进来,这样就OK啦。

原创粉丝点击