话说:PC上的内核升级到2.6.31后,一直以来的Nvidia驱动问题搞定了,遂对2.6.31内核的感情非常好。这不刚买了一块mini2440的ARM9开发板,就琢磨着将内核移植上去,这不就遇到了问题了。相对而言,这个版本的移植是很容易的,因为2.6.31本身就已经加入了mini2440的支持了。(参见前文“关于mini2440进入2.6.31内核的考证”)不过往往天下没有免费的午餐,往往看上去没问题的东西,是有问题的。失败的经历如下:

通常这样就可以了,但是正如前面所说,事情是没有这么简单的。编译出现了下面的错误:

嘿嘿,出错了!错误提示大致就是说s3c_device_usb这个东西没有定义,所以在链接生成arch/arm/mach-s3c2440/built-in.o的时候出问题了。我们知道,通常内核里是不会出现缺失文件或者缺失定义这样的错误的。那还有什么问题会导致这样的错误呢?很明显,是因为内核配置中相应的模块配置为不编译。

于是解决方法也就出来了——找到该模块所在的源文件,确认模块名,然后将相应的模块加入到编译中。

看错误提示,大致可看出所缺的应该是s3c这个平台相关的usb部分的定义。内核中于此相关的定义应该就只有几个目录:arch/arm/march-s3c*、arch/arm/plat-s3c*,找了一下这些目录,发现原来是arch/arm/plat-s3c这个目录里的dev-usb.c里定义了s3c_device_usb的38-48行有这个东西:

找到根源了,问题就好解决了。

首先,根据上面的线索,说明错误的原因是因为dev-usb.c没有被编译进去,看看arch/arm/plat-s3c目录里的Makefile,其中最后两行的内容是:

说明dev-usb.c相关的应该是内核配置里的S3C_DEV_USB_HOST配置项决定了这个模块是否被编译。

于是进入内核配置菜单,搜索了一下S3C_DEV_USB_HOST。不幸的是根本没有某个配置选项和他直接相关,而是以来于很多个选项的组合(真的是很多组,我都拉成了四个屏幕宽,才看完)。而且这些组合有个特点,就是几乎没一组都是由两部分与起来的,前一半是开发板相关的,后一半是s3c2410或s3c2440。

我们知道,一旦我们选择了CPU类型,后一半就已经算是配置上了,那么就是前一半了,也就是和平台相关的那部分配置决定了S3C_DEV_USB_HOST是否配置,从而决定了dev-usb.c是否编译。而且从搜索结果来看,很多流行的开发板都在其中,不过唯独我们的mini2440没有。于是我想,是不是因为mini2440这个板子定义的时候有一些依赖的模块没有加上呢?

因此我们自然就回到了我们的mini2440定义的目录arch/arm/march-s3c2440,因为问题只是出在依赖上。因此我们把目光放到了该目录下内核配置文件Kconfig上,打开该文件,问题就发现了。请先看下面两组对比:

Vs

上面一个是开发板AT2440EVB的定义,下面一个就是我们的MINI2440的。怎么样,看出问题来了没?

原来是我们的MINI2440定义里面,少了一个

在看看别的板子定义,基本上都有这一行,唯独mini2440没有,于是在这里加上这一行,使之变成这样:

然后重新编译

结果问题解决了!

附上解决这个问题的补丁如下:

将补丁放在内核根目录下运行即可。