Chinaunix首页 | 论坛 | 博客
  • 博客访问: 284479
  • 博文数量: 49
  • 博客积分: 3083
  • 博客等级: 中校
  • 技术积分: 710
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-27 08:22
文章分类

全部博文(49)

文章存档

2009年(8)

2008年(41)

分类: LINUX

2009-10-06 11:37:40

    国庆这几天,趁着有时间,在mini2440上捣鼓android。

系统环境:

    Fedora 11 x86

准备工作:

    手里需要有这些东西才能开始做移植工作。
    通过git得到的android。具体方法可以参考android的说明文件来下载。不过速度嘛……就不得而知了。在这里面有两个文件是需要注意的:kernel,prebuilt。kernel是Android所使用的Linux的内核文件,我这里得到的版本号为2.6.27的。prebuilt,我需要用到这个目录下的prebuilt/linux-x86/toolchain/arm-eabi-4.4.0交叉编译工具链来编译内核。

    友善之臂提供的linux-2.6.29-mini2440-20090429.tgz。这个内核主要用来提取一些文件供移植时使用。如果你git得到的Android内核版本为2.6.29的,那么恭喜你……

    linux-2.6.31.1.tar.bz2。在这个版本里面mini2440已经被加入了内核树中,他的一些可以作为移植的参考。但是不推荐使用这个版本,虽然在这个版本中mini2440和Linux结合更加完美,但是跟我所使用的Android的内核版本差距过大。

    dnw_linux。这个用于在linux上传输镜像文件。使用时需要自己编译个USB模块插入到系统中。
    svn,或者其他版本控制工具。在计划中是需要使用一个版本控制工具来管理代码的更新何回滚的,但是我使用的svn似乎出了点状况,最终采用tar来代替了svn。

移植过程:

    分析版本区别。在Linux2.6.27和2.6.29之间,arch/arm/目录中的plat-s3c和plat-s3c24xx中完善了不少三星arm体系的代码,尤其是其中增加的include可能会对移植造成影响。在2.6.27中,缺少uda134驱动,需要从2.6.29中移植。

    开始移植准备。使用tags -R建立一个符号链接表tags。移植时不能图方便采用整个目录树复制的方式,这样会在编译内核最后时刻跳出一个重定义的错误,白白消耗了大量时间。因此,这里需要建立一个tags文件来查询一些变量和函数的路径。另外,修改Makefile文件,将交叉编译工具链指向Android的toolchain。

    移植开始。将mach-mini2440.c、common-friendly-arm.c复制到arch/arm/mach_s3c2440/。另外,common-friendly-arm.h可以加入include/asm-arm/plat-s3c24xx/中。修改arch/arm/mach_s3c2440/Kconfig和Makefile,加入mini2440的信息。

    由于内核不同,因此友善提供的mini2440 config文件最好别使用。我们需要自行配置config。由于在2.6.27中,没有将s3c2440的单独列出来,并且s3c2410与s3c2440硬件类似,所以我采用了s3c2410_defconfig,在System Type中将其他machines的支持全部给去掉。 Graphice support -> Console display driver support -> VGA text console
这个选上后在编译的过程中会报错,无法成功编译,这个应该是在控制台中输出图形的模块,也没什么用途,给去掉。在文件系统中,因为板子没有CD-ROM设备,在config中也给去掉了。我也不需要NFS,所以,网络设备也被我咔嚓掉了。在Make menuconfig的时候需要注意选中Soc的支持,否则串口将没有输出,可悲……

    编译内核。刚开始千万别抱有编译成功的想法,plat里面变了很多东西。编译的目的在于,找到被修改了路径的变量及函数,添加缺少的头文件。寻找被修改路径的变量和函数有个方法,找到编译报错的函数,在android的tags里grep,再修改mach_mini2440.c。如果没有,那么就到2.6.29里面grep后再加入到android/kernel中。在修改mach_mini2440.c时,我将cs8900的相关东西给删掉了,我的mini2440采用的是dm9000。

    在编译的过程中,至少还会遇上两个错误:
    driver/gpio/gpiolib.c 1060
    跟踪gpio_to_irq()发现它仅仅是返回个-EINVAL,直接修改代码为:int irq = -EINVAL搞定。
    scripts/unifdef.c 209
    这里错的有些奇怪了,提示跟我系统中的库冲突。搞不懂!!在linux内核邮件列表里也发现了这个错误,而且当时没有重现出来,也有人说这个BUG和某种文件系统冲突。现在这个问题被我给碰上了,哎!为了方便,暂时给修改成了getlines。

    从板子启动。虽然这个内核是从2.6.29移植到2.6.27的,但是mach_type依然是782。我自作主张的按照2.6.31的来修改成1999,把arch/arm/mach-type给更新了,结果板子一直是到了解压缩内核完毕就停止了。我在这里调试浪费了不少时间。

    这样,内核就可以启动了。附上经过修改的mini2440部分文件。
文件:mach-mini2440.tar.gz
大小:11KB
下载:下载
阅读(4987) | 评论(0) | 转发(1) |
0

上一篇:android的点点滴滴

下一篇:没有了

给主人留下些什么吧!~~