分类: 嵌入式
2014-04-01 22:34:01
参考博客:http://blog.csdn.net/laoniu_c/article/details/17919695
虽然2.6内核里已经有了2440的代码,但是还是想从2410移植,这样遇到的问题肯能还多一点,技术不熟,希望能够成功。
首先,美其名曰“站在巨人的肩膀上”,find -iname s3c2410、 find -iname smdk2410。(-iname查找时不区分大小写)把那些关于s3c2410的平台文件改成改成cc2440
。。。。。。。。。。。
经过思考,还是放弃这样改了,因为2410的文件太多了,不同于u-boot,Linux文件的添加与删除,不单单是添加一个文件那么简单,还需要修改Makefile来使它能够被编译,甚至于还要在kconfig中添加配置选项然后make menuconfig 或 在.config文件中支持该配置。对于我这么懒的人来说太麻烦了,所以尝试着只做板文件的修改,然后找出2410与2440不同,在2410的文件上做相应修改就行了,就不改名了。
首先修改Makefile:ARCH = arm CROSS_COMPILE = arm-linux-
make distclean
make s3c2410_defconfig
make uImage V=1 (注意V是大写的)可以看到详细信息 :
arm-linux-ld -EL -p --no-undefined -X --build-id -o vmlinux -T arch/arm/kernel/vmlinux.lds arch/arm/kernel/head.o ... ...
在这里先插讲下Makefile,要分析内核的生成,就要分析它的Makefile:
顶层的makefile
顶层的makefile中并没有找到uImage,但是在arch/arm/makefile中找到了uImage,猜测arch/arm/makefile文件是被包含到顶层的makefile中。
顶层makefile中找到include语句:
include $(srctree)/arch/$(ARCH)/Makefile
找到uImage的语句(在顶层的makefile中)uImage的目标依赖于vmlinux:
vmlinux:$(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE
其中vmlinux-init:
vmlinux-init := $(head-y) $(init-y)
head-y是在arch/arm中定义的:
head-y := arch/arm/kernel/head$(MMUEXT).o arch/arm/kernel/init_task.o
... ...
vmlinux-lds := arch/$(ARCH)/kernel/vmlinux.lds
要分析所有的文件如何生成内核,可以到vmlinux的编译命令来分析,这样分析起来非常庞大,简单一点办法是通过执行生成uImage的命令来查看终端中的输出。
# make uImage V=1
V=1的功能是将编译过程中的命令更加详细的输出来。
要分析内核的生成,只需要关心最后的几条命令即可(找到包含-o vmlinux的这一句)。
(arm-linux-ld -EL -p --no-undefined -X --build-id -o vmlinux -T arch/arm/kernel/vmlinux.lds arch/arm/kernel/head.o ... ...)
由上面可知,链接脚本为arch/arm/kernel/vmlinux.lds。 第一个执行的文件为 arch/arm/kernel/head.o
把uImage下载到内核,启动,出现错误“没有MACH_TYPE_CC2440”,需要在include/generated/mach-types中添加或替换掉其中的一项。重新下载,出现乱码,可能原因有:1、machid(机器码)设置不正确;2、波特率设置不正确,console=ttySAC0,115200。
修改后,烧写。成功。
从串口输出的信息来看,mtd子系统分了8块,可以自己设置自己设想的分区,可以通过内核输出信息分区信息来找到相应的源码,然后自己做相应修改。最好是改成和u-boot设置的一样的,这样还看着顺眼。。。