linux3.6.5内核移植到S3C6410

***********************准备工作***************************

1, 硬件平台:S3C6410

      软件平台:Fedora14/16 + arm-linux-gcc 4.2.2-eabi

2,下载linux-3.6.5.tar.bz2,解压源码到目录 urdir (你选择要放的目录,下同)

3,添加yaffs文件系统所需的准备。(独立完整的过程请参考:http://blog.csdn.net/cocoxiaomei/article/details/8498161)

1)下载源代码命令:git clonegit://www.aleph1.co.uk/yaffs2(@qingwu:一般在终端下都有git支持)

也可以在windows下用git工具下载(这里请注意:windows下的文件可能会出现回车换行的错误,比如^M不能识别等,可以参考:

http://blog.csdn.net/cocoxiaomei/article/details/8497929 

2)yaffs源代码下载完后,进入yaffs2源代码目录,执行:#./patch-kernel.sh c  m  urdir/linux-3.6.5(其中c:复制代码 ,m:使用支持多版本代码)

因为我们选择的系统为mini6410,因此接下来的修改以及配置都是在此基础上的。


************************内核源码文件修改*******************************

4,进入解压后的内核源码目录 ,修改Makefile文件。

[root@localhost linux-3.6.5]# vi Makefile
line 195      ARCH       ?= $(SUBARCH)       改为:ARCH ?= arm
line 196      CROSS_COMPILE ?=                改为:CROSS_COMPILE     = arm-linux-  

前者是对体系架构的定义,我们是arm平台。后者是交叉编译工具的选择。修改完成后保存退出。

5,执行 make s3c6400_defconfig,Makefile能够针对S3C6410做一系列默认配置

  注:这个命令可能会出错,说没有s3c6410_defoncig的信息,如下:*** Can't find default configuration"arch/arm/configs/s3c6410_defconfig"!

这时可以执行:

[[email protected]]#cp  arch/arm/configs/s3c6400_defconfig .config,然后再运行:

[root@localhost linux-3.6.5]# make s3c6400_defconfig 。【注:这里我用的s3c6400,因为目录下只有64006410最近。】

6,修改flash分区信息(line121 of mach-mini6410.c),设置成跟bootloader中的分区信息一致。

 [root@localhost linux-3.6.5]# vim arch/arm/mach-s3c64xx/mach-mini6410.c

结构体 mtd_partition mini6410_nand_part[]保存了nand flash的分区信息,修改如下:

static structmtd_partition mini6410_nand_part[] = {
    [0] = {
        .name   = "uboot",
        .size   = SZ_1M,
        .offset = 0,
    },
    [1] = {
        .name   ="kernel",
        .size   = SZ_2M,
        .offset = SZ_1M,
    },
    [2] = {
        .name   ="rootfs",
        .size   = SZ_1M * 0x30,
        .offset = SZ_1M + SZ_2M,
    },
    [3] = {
        .name   ="file_system",
        .size   =MTDPART_SIZ_FULL,
        .offset = SZ_1M * 0x33,
    },
};

修改之后分区情况就如下表所示:

表3-1 NAND FLASH分区表



*******************************内核配置界面************************************

7,在内核源码目录执行:make menuconfig,进入内核配置界面(如图):

插播:我在fedora16下运行这一步,报错如下:

*** Unable to find the ncurses libraries or the

 *** required header files.
 *** 'make menuconfig' requires the ncurses libraries.

 *** Install ncurses (ncurses-devel) and try again.

解决办法:yum install ncurses-devel,安装完之后 make menuconfig,就能进入正常配置界面了。


接下来按照自上而下的顺序进行配置

******************************内核配置过程*************************************
1,System Type:

有很多板级相关的配置选项,可以根据自己的需要选择合适的系统,这里我选择mini6410。

注意:S3C64XXDMA下只能选一个,多选可能会出现板级直接的兼容问题。

2,Device Drivers

2.1)<*> Memory Technology Device (MTD) support:

Caching block device access to MTD devices选项在mtdblock会用到。

进入NAND Device Support下,选择 NAND Flash support for Samsung S3C SoCs


2.2)SCSI device supportSCSI disk support(必选,听说这个是u盘挂载后sd[a]的全称) 

2.3)Generic HID driver

进入USB HID support,选择USB HID transport layer。


2.4)USB support,其中 USB Monitor(也可以不选),

USB Mass Storage support(必选):挂载u盘不成功跟这个有关,例如出现错误:

yaffs: dev is 8388609 name is "sda1" rw

yaffs: passed flags ""



3,File systems

3.1)yaffs support


注:之前已添加yaffs文件系统支持,若是在文件系统配置界面中发现没有yaffs的配置选项.

解决办法:在配置界面,查找/yaffs,找到如图的说明:


图中,其中[]内的参数是对应选项当前的状态,要让yaffs_fs选项为[y],依赖于MISC_FILESYSTEMS 

MTD_BLOCK同时为[y],进行相应设置即可

3.2)VFAT (Windows-95) fs support

这里添加vfat文件支持,解决插入u盘有反应,可以出现sd[a],但是没有设备名(sd[a])的问题 。

4,Nativelanguage support:

这里解决mount时可能的出错:[root@(none) /]# mount -t vfat /dev/sda1 /tmp/sd/

FAT-fs (sda1): IO charset iso8859-1 not found
mount: mounting /dev/sda1 on /tmp/sd/ failed: Invalid argument




*********************内核编译问题及解决办法*********************

1,在源码目录执行make的过程中出现一系列与yaffs有关的错误:

[[email protected]]#make

fs/yaffs2/yaffs_vfs.c:2216:error: 'struct super_block' has no member named 's_dirt'

……

fs/yaffs2/yaffs_vfs.c:2507:error: 'struct mtd_info' has no member named 'sync'

原因是内核版本过高,最新的yaffs2文件也会有版本之间细节不匹配的问题。解决办法请参考:

http://blog.csdn.net/cocoxiaomei/article/details/8498161

2,make。在最终会在arch/arm/boot/目录下生成内核镜象zImage。


**********烧录内核到开发板,可能出现的问题及解决办法********

1,烧录内核到开发板的过程中可能会出现下面的报错:

List of all partitions:

1f00            1024 mtdblock0  (driver?)
1f01            2048 mtdblock1  (driver?)
1f02           49152 mtdblock2  (driver?)
1f03          209920 mtdblock3  (driver?)
No filesystem could mount root, tried:  cramfs
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(31,2)

解决办法:关闭nand的Ecc校验,修改 driver/mtd/nand/s3c2410.c 文件( line846)

chip->ecc.mode=NAND_ECC_SOFT 改为chip->ecc.mode=NAND_ECC_NONE

2,挂载u盘没反应,或者内核启动时出现错误提示:

s3c2410-ohcis3c2410-ohci: startup error -75(或error -62

原因是时钟没有打开。解决办法:

1)在 arch/arm/mach-s3c64xx/mach-mini6410.c文件中添加头文件:

#include

#include

#include

2)在该文件的mini6410_machine_init()函数中增加下列代码:

/* clock source: 48MHz XTAL */
__raw_writel(__raw_readl(S3C_CLK_SRC) & (~(0x3 << 5)), S3C_CLK_SRC);
__raw_writel(__raw_readl(S3C_CLKREG(0x900))|(1<<16), S3C_CLKREG(0x900));
__raw_writel(0x0, S3C_PHYPWR);
__raw_writel(0x0, S3C_PHYCLK);
__raw_writel(0x1, S3C_RSTCON);
udelay(50);
__raw_writel(0x0, S3C_RSTCON);

udelay(50);
__raw_writel(__raw_readl(S3C_CLK_DIV1) & ~(0xF << 20), S3C_CLK_DIV1);
__raw_writel(__raw_readl(S3C_HCLK_GATE) | S3C_CLKCON_HCLK_UHOST |S3C_CLKCON_HCLK_SECUR, S3C_HCLK_GATE);
__raw_writel(__raw_readl(S3C_SCLK_GATE) | S3C_CLKCON_SCLK_UHOST,S3C_SCLK_GATE);

*****整理笔记绝对是力气活----by qingwu---end*****

你可能感兴趣的:(linux)