免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3985 | 回复: 1
打印 上一主题 下一主题

移植android内核到mini2440 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-06 11:37 |只看该作者 |倒序浏览

                                                                    国庆这几天,趁着有时间,在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
        下载:
下载
       
               
               
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/44250/showart_2064754.html

论坛徽章:
0
2 [报告]
发表于 2011-09-07 14:28 |只看该作者
楼主大部分工作花在了将linux bsp的kernel与android 要求的kernel一致上了,希望以后分享更多的android系统要求的细节
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP