`
saybody
  • 浏览: 863824 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

移植Linux-2.6.33内核到TE2440DEV-I

阅读更多

移植Linux-2.6.33内核到TE2440DEV-I

华清远见-嵌入式领域著名讲师 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、准备交叉工具链

通产交叉工具链有三种方式:

(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),而没有FPACPU,比如SAMSUNG S3C2410/S3C2440,会使用FPE(Float Point Emulation 即软浮点),这样在速度上就会遇到极大的限制,使用EABI(Embedded Application Binary Interface)则可以对此改善处理,ARM EABI有许多革新之处,其中最突出的改进就是Float Point Performance,它使用Vector Float Point(矢量浮点),因此可以极大提高涉及到浮点运算的程序。但是编译内核时,也要开启EABI功能,并且应用程序也要用这个with EABI的编译器重新编译。后面会解释如何在内核中添加EABI功能。

2、下载快速编译内核

首先,从官网上下载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的内核几乎搞定了我们通常需要的驱动和服务,所以一般只是简单的修改就可以正常工作。

接下来我们就可以一步一步的完善我们小企鹅啦!

3、完善内核

(1) 完善nandflash代码

完善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-bootnandflash中的起始地址

},

[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部署内核和文件系统时,里面的起始地址都是根据这里的分区信息。

当然,这样基本可以满足我们开发板的64MBnandflash的需求,后面我们还可以将nandflash扩大成更大的容量,例如,256MB1G等。同样需要修改这里的代码。

未完待续,尽量每天更新,大家一起来,这周搞定linux内核到电路板上吧!

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics