华清远见-嵌入式领域著名讲师 O(∩_∩)O 牛牛猛
点击链接加我好友!
http://student.csdn.net/invite.php?u=111047&c=758a60d66d3a92d1
欢迎大家去我CSDN博客上踩踩
写在前面:
这篇文章是我的工作笔记整理出来的,里面也参考了很多网络大侠的写的内容,这里我把我的感受记录下来,和更多的嵌入式爱好者分享技。体验嵌入式开发的快乐,快乐中寻找技术的真谛。
同时,下周我就要在csdn学生大本营,开设自己的讲堂了,里面的很多内容是取自这篇文章,我会把他们应用到我们实际的项目中,和大家一起分享工程实践中的点点滴滴。这些文字也能留下来供后来人参考。
宿主机:ubuntu9.04
目标机:中芯优电TE2440DEV-I开发板
交叉编译器:arm-linux-gcc-4.4.2
移植的内核版本:linux-2.6.33.2
文件系统类型: cramfs+yaffs2 (实际项目中最合理的组合方式)
通产交叉工具链有三种方式:
(1) 自己通过下载源码,逐个编译,分别制作。
优点:可以根据自己的需求,制作自己的交叉工具链。可以满足自己的求知欲。
缺点:费时、费力、还费电。适合发烧的人,呵呵。
(2) 借助第三方的工具软件,这些工具通常都是网上的大侠们为了,方便人民群众而编写的,通的功能其实就是上面的提及的方法的批处理的脚本文件,而且一旦发现您的linux环境下是否缺少某些软件包,会自动去网络上下载。当然,需要你已经指定了正确的源文件。我们使用最多的是crosstools工具。
优点:很容易制作自己的交叉工具链,省力,简单
缺点:对于的知识理解不会深深刻,由于还是很长时间的编译过程,所以,还是费时、费电。不是党号召的低碳生活。
(3) 最Easy的方法,直接用别人做好的,通常我们的做法都是这样,利用别人做好的做适当的修改就好啦。
优点:省时、省力、省力、还低碳
缺点:对于初学者可能搞不清楚概念。
这里,我们采用上面提到的第三种方法,实际的工程实践中也是采用第三种方法的居多,最多是在上面的基础做些修改。
可以登录http://www.codesourcery.com/sgpp/lite/arm/portal/release1293下载最新的交叉编译器。
也可以在中芯优电的官网上下载和我一样的交叉编译器,与我一起走进嵌入式开发
下载符合EABI标准交叉编译器: arm-linux-gcc-4.3.2 with EABI
下载地址:
注明:
交叉编译器在编译的时候,对于浮点运行会预设硬浮点运算FPA(Float Point Architecture),而没有FPA的CPU,比如SAMSUNG S3C2410/S3C2440,会使用FPE(Float Point Emulation 即软浮点),这样在速度上就会遇到极大的限制,使用EABI(Embedded Application Binary Interface)则可以对此改善处理,ARM EABI有许多革新之处,其中最突出的改进就是Float Point Performance,它使用Vector Float Point(矢量浮点),因此可以极大提高涉及到浮点运算的程序。但是编译内核时,也要开启EABI功能,并且应用程序也要用这个with EABI的编译器重新编译。后面会解释如何在内核中添加EABI功能。
首先,从官网上下载linux-2.6.33的内核。ftp://ftp.kernel.org/pub/linux/kernel/v2.6/可以找到。
新建目录/home/topelec/te2440/kernel/Kernel-2.6.33.2-TE2440。将内核源码包拷贝到Kernel-2.6.33.2-TE2440目录下。
解压源码包
tar zxvf linux-2.6.33.tar.gz
得到目录结构和我的一样吗?
topelec@allen-vmdesktop:~/te2440/kernel/Kernel-2.6.33.2-TE2440$ ls arch fs Makefile samples usr block include mm scripts virt COPYING init modules.builtin security vmlinux CREDITS ipc modules.order sound vmlinux.o crypto Kbuild Module.symvers System.map Documentation kernel net te2440_2010-4-17.config drivers lib README te2440_2010-4-19.config firmware MAINTAINERS REPORTING-BUGS tools |
1) 修改Makefile文件,对于搞过Linux开发的人来说,这并不难,
修改成:
ARCH ?= arm CROSS_COMPILE ?= arm- linux- |
具体的arm-linux-应该是什么,关键要实际的交叉编译器的名字啦。
我的实际的编译器是用带有EABI的交叉编译器,所以我的Makefile是:
ARCH ?= arm #CROSS_COMPILE ?= arm-linux- CROSS_COMPILE ?= /home/topelec/env/usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi- |
2
修改机器码
由于U-boot中已经指定了机器码,是193.
机器码假如不一致,会直接导致系统不能启动。
3) 快速编译爽一把
这一步我们简单配置一下内核,先编译一把爽一下,直接采用我们提供的配置文件,或是采用内核自带的配置文件也可以, Load an Alternate Configuration File
键入配置文件的名字,te2440_2010-4-19.config,这个文件名字根据实际情况修改。就是加载一个配置文件,对于初次接触Linux内核编译的用户来说,这是很好的体验方式,不然,如果自己去配置内核,会直接打击用户的信心,太过的内容要选择了,而且还有很多选项是有依赖关系的。
实际的项目开发中我们也是采用,在原有配置文件上修改的方法来配置内核的。
保存退出后
键入make命令开始编译过程,一般如果你的计算机第一次编译这个版本的内核可能需要10分钟左右,编译过一次后,下次对内核修改后,编译器之编译修改过的内核文件。
在内核源码的arch/arm/boot下会有个zImage文件就是我们要的linux 内核。
这样的内核编译出来几乎是没法用的,最多可以在内存中运行起来,很多问题需要我们去修改,不过不要害怕。Linux2.6.33的内核几乎搞定了我们通常需要的驱动和服务,所以一般只是简单的修改就可以正常工作。
接下来我们就可以一步一步的完善我们小企鹅啦!
完善Nand Flash的代码,其实在Linux-2.6.33 里面已经做好了 NandFlash 的驱动,只需要进行简单的分区修改就可以直接使用了。
打开 linux/arch/arm/plat-s3c24xx/common-smdk.c 文件
查找这样的结构体数组,smdk_default_nand_part[],将这个结构体数组修改成下面的样子。不过,建议读者不要直接修改原数组,可以考虑将原数组注释掉,自己仿照它写一个这样的数组。对于您养成良好的编程习惯是有好处的,也让你更加职业,呵呵。
/* NAND parititon for TE2440 */
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "UBoot",
.size = 0x00030000, //U-boot所占用的nandflash空间
.offset = 0, //U-boot在nandflash中的起始地址
},
[1] = {
.name = "Param",
.offset = 0x00030000,
.size = 0x00010000,
},
[2] = {
.name = "Kernel",
.offset = 0x00040000, //内核在nandflash中的起始地址
.size = 0x00300000, //内核在nandflash中占用的空间大小
},
[3] = {
.name = "Root",
.offset = 0x00340000,
.size = 0x00a00000,
},
[4] = {
.name = "Yaffs",
.offset = 0x00d40000,
.size = 0x032c0000, //
}
};
这个内核的分区是十分重要的,我们用U-boot部署内核和文件系统时,里面的起始地址都是根据这里的分区信息。
当然,这样基本可以满足我们开发板的64MB的nandflash的需求,后面我们还可以将nandflash扩大成更大的容量,例如,256MB、1G等。同样需要修改这里的代码。
未完待续,尽量每天更新,大家一起来,这周搞定linux内核到电路板上吧!