ARM9的linux内核移植

  • Post author:
  • Post category:linux




转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/22829023



写此文时,已是深夜。不得不说回想起来还是时间比较长了。但是这是值得的。。。本文将从0开始移植内核。会对我出现的一些错误进行整理。希望对大家有些帮助。



内核版本

linux-2.6.22.

6(比较老,但是基本步骤都差不多)开发环境

:mini2440


电脑主机系统:

Ubuntu

10.04.4开发板

bootloader

:uboot



交叉编译器



arm-linux-gcc-4.3.2



1.

首先到





http://www.kernel.org/


去下载内核源码。我是下载的


linux-2.6.22.6.tar.bz2



2.

将内核源码解压,可以解压到任意你想放源码文件的地方

tar xvzf linux-2.6.22.6.tar.gz

3.

进入内核源码,修改顶层

Makefile

文件中的编译器选项。

gedit Makefile


打开


Makefile






makefile


里的

ARCH ?= $(SUBARCH)

CROSS_COMPILE ?=



修改为

ARCH ?= arm

CROSS_COMPILE ?= arm-linux-

4.


修改内核中平台的时钟频率(


mini2440


开发板使用


12M


晶振)。







修改内核源码 “


arch/arm/mach- s3c2440/mach-smdk2440.c”


文件的


163





,






16.9344MHz


修改为


12MHz

static void __init smdk2440_map_io(void)

{

s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));

s3c24xx_init_clocks(12000000); //


修改为


12000000


,默认为


16934400

s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));

}

5.



修改对





nand





的分区信息。要让内核知道





nand flash





的分区信息,设置成跟





bootloader





一致。











arch/arm/plat-s3c24xx/common-smdk.c






(我用的3.4.91内核此文件在/arch/arm/mach-s3c24xx/common-smdk.c)

中修改





smdk_default_nand_part[]





,注意这个一定





要跟





bootloader





的一致。在我的板子中修改如下:


static struct mtd_partition smdk_default_nand_part[] = {

[0] = {

.name = “supervivi”,

.size = 0x000000030000,

.offset = 0,

},

[1] = {

.name = “Kernel”,

.offset = 0x000000050000,

.size = 0x000000200000,

},

[2] = {

.name = “root”,

.offset = 0x000000250000,

.size = 0x000003DAC000,

}

};



此处我通过


supervivi


查看到的分区信息写进去竟然不对,我通过


mini2440


原来的内核启动信息查



到分区信息如下:

Creating 3 MTD partitions on “NAND 64MiB 3,3V 8-bit”:

0x000000000000-0x000000030000 : “supervivi”

0x000000050000-0x000000250000 : “Kernel”

0x000000250000-0x000003ffc000 : “root”

按照韦东山老师的uboot修改:


static struct mtd_partition smdk_default_nand_part[] = {


[0] = {


.name   = “bootloader”,

.size   = 0x00040000,

.offset = 0x00000000,

},

[1] = {


.name   = “params”,

.offset = 0x00040000,

.size   = 0x00020000,

},

[2] = {


.name   = “kernel”,

.offset = 0x00060000,

.size   = 0x00200000,

},

[3] = {


.name   = “root”,

.offset = 0x00260000,

.size   = 0x0fda0000,

},

};

韦东山老师的uboot分区:(在uboot下输入命令mtdparts)

device nand0 <nandflash0>, # parts = 4

#: name                        size            offset          mask_flags

0: bootloader          0x00040000      0x00000000      0

1: params              0x00020000      0x00040000      0

2: kernel              0x00200000      0x00060000      0

3: root                0x0fda0000      0x00260000      0

active partition: nand0,0 – (bootloader) 0x00040000 @ 0x00000000

defaults:

mtdids  : nand0=nandflash0

mtdparts: mtdparts=nandflash0:256k@0(bootloader),128k(params),2m(kernel),-(root)

***********************************************************************************************************

2014.7.27补充

后期做项目发现内核实在精简不到2M一下,所以更改了uboot分区,下面是修改方法:

uboot命令行中:setenv mtdparts mtdparts=nandflash0:256k@0(bootloader),128k(params),3m(kernel),-(root)

然后:         save

再次mtdparts :

device nand0 <nandflash0>, # parts = 4

#: name                        size            offset          mask_flags

0: bootloader          0x00040000      0x00000000      0

1: params              0x00020000      0x00040000      0

2: kernel              0x00300000      0x00060000      0

3: root                0x0fca0000      0x00360000      0

active partition: nand0,0 – (bootloader) 0x00040000 @ 0x00000000

***********************************************************************************************************


注释:我用的是韦东山老师的uboot。。大家根据自己的uboot分区进行修改。



另外这个文件还要修改


smdk_nand_info


如下:

static struct s3c2410_platform_nand smdk_nand_info = {

.tacls = 0,                               //default is 20

.twrph0 = 30,                        //default is 60

.twrph1 = 0,                           //defualt is 20

.nr_sets = ARRAY_SIZE(smdk_nand_sets),

.sets = smdk_nand_sets,

};









//这个没修改,直接过了。


6.


修改机器码。

mini2440


使用的


supervivi


的机器码是


782


,这里需要修改机器码


,


否则会出现不能启动的情况。



机器码保存在内核源码的 “


arch/arm/tools/mach-types”


文件中


,


在大概


379





,


把原来的


362



改为


782


保存即可。





//用韦东山老师uboot的同学此处可以省略







7.


修改


drivers/mtd/nand/s3c2410.c


,去掉


nand flash





ECC


。(

此步未做,通过)




如果内核是通过


U





BOOT


写到


Nand Flash





, U





BOOT


通过的软件


ECC


算法产生


ECC







验码


,



这与内核校验的


ECC


码不一样


,


内核中的


ECC


码是由


S3C2410





Nand Flash


控制器产生




的。所以,



我在这里选择禁止内核


ECC


校验。



搜索关键字


NAND_ECC_SOFT





s3c2410_nand_init_chip


函数里,修改


NAND_ECC_SOFT






NAND_ECC_NONE

8.

增加

Yaffs2

文件系统的支持




首先到



http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/



网站下






载一个



yaffs



文件系统的补丁。





得到补丁包后



,



解压补丁



,



然后打上



yaffs2



的补丁



,



方法如下



:

#tar xvfz cvs-root.tar.gz                                    (



解压得到补丁目录



cvs)

#cd cvs/yaffs2/                                                   (



进到



yaffs2



的补丁目录下



)

# ./patch-ker.sh c /work/transplantation/trans_show/linux-2.6.22.6

(



执行补丁脚本



,



打补丁到内核中,其中



/work/transplantation/trans_show/linux-2.6.22.6




为内核源码的地址)





此时到内核源码的“



fs/”



目录下面您将看到新添加了一个名为“



yaffs2/”



的目录



,



同时



fs/



目录下面的


Makefile



文件和



Kconfig



文件也添加了



yaffs2



的配置和编译条件。









9.



配置内核





调用自带的一个默认配置单



,



该配置单在内核源码的 “



arch/arm/configs/”




目录下面



,



名为



:“s3c2410_defconfig”,



该配置文件里面选择了几乎所有的和



S3C24XX



系列


CPU



相关的






配置选项



,



我们完全可以在该配置单的基础上进行配置。








# cp arch/arm/configs/s3c2410_defconfig .config

# make menuconfig

(1).General setup —>

[*] Configure standard kernel features (for small systems) —>




选上这项,否则文件系统中的一些选项不会出现


(2). System Type —->

[*] S3C2410 DMA support [*] Support ARM920T processor

S3C2440 Machines —>

[*] SMDK2440

[*] SMDK2440 with S3C2440 CPU module

(3).[*] Enable loadable module support —>

[*] Module unloading

(4).Device Drivers —>

<*> Memory Technology Device (MTD) support —>

[*] MTD partitioning support

<*> NAND Device Support —>

<*> NAND Flash support for S3C2410/S3C2440 SoC

[ ] S3C2410 NAND Hardware ECC //



这个要去掉


[*] Network device support —>

[*] Ethernet (10 or 100Mbit) —>

<*> DM9000 support

< > Real Time Clock —>

(5).File systems—–>

Miscellaneous filesystems —>

<*>YAFFS2 file system support

(6).kernel Features—–>

[*]Use the ARM EABI to compile the Kernel




保存退出








10.



编译内核



make zImage




编译完成后下载内核启动即可。


出现问题:


1.make menuconfig的时候出现一大堆错误和警告,错误足足有一页多,就不贴了。


解决办法是

$sudo apt-get install libncurses5-dev


2.下载时候出现


Verifying

Checksum



Bad

Data

CRC


解决办法


配置好内核按照如上步骤make后。生成的uImage看下大小,注意不要比你UBOOT里面分配的区间大。


3.

下载内核到flash中,运行到如下即停止没有下文:

Uncompressing Linux……………………done,booting the kernel

解决办法


确保在配置内核时选上了在Device Drivers->Character devices->Serial drivers中选择加载Samsung SoC serial support ,然后再选上Support for console on Samsung SoC serial port 。

4 出现如下警告







kernel panic – not syncing: VFS: Unable to mount root fs on unknown-block(0,0)


解决办法:


在device drivers -> Memory Technology Device (MTD) support —>


发现里面有个选项:


Caching block device access to MTD devices这个选项配置上

当你解决完前四个问题后,你会发现你能够烧写YAFFS文件系统了。当你想烧写Jffs系统的时候你会惊讶的发现烧写不进去

5.解决办法。在启动UBOOT的时候进行如下设置。


当然你要想再烧写YAFFS还需要再设置回来。至于原因就是uboot没能够自动识别文件系统类型。

本文参考的资料:韦东山视频第一期(内核移植)

http://blog.csdn.net/hpwzd/article/details/7365781(虽然他也是转载的,但是原文地址连接打不开,如原作者看到,请与我联系)


排名不分先后





版权声明:本文为u013584315原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。