21553内核由linux.2.4.21升级到linux.2.4.31的过程

1,首先对linux.2.31的代码和infineon提供linux内核代码进行比较
顶层Makefile,由于 www.kernel.org上面的代码并不存在给嵌入式的menuconfig的cpu配置选项,所以存在
EXTRAVERSION = $(shell if [ -f .hhl_target_lspname ]; then \
    echo "-`cat .hhl_target_lspname`"; \
         else \
    echo "_mvl31"; \
         fi)
KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
ARCH := $(shell if [ -f .hhl_target_cpu ]; then \
   cat .hhl_target_cpu; \
  else \
   uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/; \
  fi)
infineon提供linux内核Makefile多出来这几句,所以我们需要在31的Makefile的基础上增加这几句,让menuconfig时间能够选译cpu和arch这里面的东西。
当然.hhl_target_cpu这个文件也是需要考过去的。
2,比较infineon提供的驱动,他主要通过一个ifx\bsp\arch的目录把这些驱动给加进去,他也不是只提供这个目录就可以把驱动给加进去,他对
linux-2.4.31/arch/mips/config-shared.in进行了一些修改。
比较两个文件得到这个差异,然后把相应的地方给加上,这样Machine selection里面就有了
Support for Inca-IP board这一项.
呵呵,这只是改了菜单,make还是不会有变化的,所以我们还得改Makefile
3,linux-2.4.31/arch/mips/Makefile才是把这些驱动给加进去的关键,上面的菜单只是增加一个#defnie,
没有用到这个#define当然不会有效果。
比较
kernel\opensource\linux_2_4_20\arch\mips\Makefile
linux-2.4.31\arch\mips\Makefile
这两个文件,把INCAIP相关的都给增加进去,并且知道对应的目录结构,所以就可以所
ifx\bsp\arch里面文件夹给考到相应的地方去.
好像一切都可以了,有这么简单的事没,哈哈。
4,make menuconfig把这些都给选进去,make
出错了,
setup.c: In function `incaip_time_init':
setup.c:202: error: `mips_counter_frequency' undeclared (first use in this function)
setup.c:202: error: (Each undeclared identifier is reported only once
setup.c:202: error: for each function it appears in.)
setup.c: In function `incaip_timer_setup':
setup.c:213: warning: unused variable `pPM_CR'
setup.c:214: warning: unused variable `pPM_GEN'
setup.c:215: warning: unused variable `pCGU_DIVCR'
make[1]: *** [setup.o] Error 1
呵呵,我有些时候运气就是这么差,infineon驱动在31的内核里面有些内核变量找不到了,
在linux.2.4.21的代码里找了找,终于在/arch/mips/kernel/time.c里面找到定义,然后去31的代码里
找了找,哈哈,终于搞定,原来,这个变量在这个linux内核里面不叫这个名字,mips_hpt_frequency
看看旁边的代码也没个注释说明一下,妈的,开始ps写内核的。
后面又遇到几个小问题,一一搞定。
5,终于link了,哈哈,还是问题一大堆,一些内核驱动里面有的函数找不到,试了几次都是这样,
好好想一想,到了那个驱动的文件夹看了看,原来.o都没有生成呀,难怪找不到,在驱动的Makefile里面看了看,发现
CONFIG_INCAIP_PSEUDO_LAN这样几个宏,在这几个config.in里面找找了,竟然没有发现,知道问题了,原来在31的内核
里面没有#define这几个宏,这几个宏又不是通过menuconfig给选上去的,所以在config-shared.in里面增加
   define_bool CONFIG_INCAIP_PSEUDO_LAN y
   define_bool CONFIG_INCAIP_SWITCH_ACCESS y
   define_bool CONFIG_INCAIP_SWITCH_HASH y
   define_bool CONFIG_INCAIP_SWITCH_CONTROL y
   define_bool CONFIG_INCAIP_SWITCH_API y
   define_bool CONFIG_INCAIP_SWITCH_AMDIX y
然后make,所以问题搞定,
 vmlinux生成了。
 vmlinux终于生成了。。。
呵呵,搞定这个其实也不是很难,细心很重要,我都遇到了config.in里面if,,,,fi不配对的问题,那个郁闷呀,
就像我第一次写个win32窗口板的程序出来的100多个err一样,正是因为我有以前那搞定100多个err的经历,所以我不急,
关键的问题,只有那么一两个,问题一个一个来。
  其实这有点像体力活,还好,出了力,还是有结果。

你可能感兴趣的:(C++,c,linux,C#,OpenSource)