Linux2.6.34.2在TQ6410上的移植详解

原创文章版权所有!如需转载,请注明出处: http://hi.baidu.com/liushuiyue1/myhome

由于Linux2.6.34.2S3C64xx有了一定的支持,所以采用Linux2.6.34.2版本的内核。

一、        移植环境

 机:VMWare--Fedora 8

开发板:天嵌TQ6410—256M nandflash,Kernel:2.6.34.2

编译器:EABI-4.3.2_V0.1

u-bootu-boot-2010.08

二、   源码获得

         内核源码到http://www.all.kernel.org/下载;

三、     移植步骤

1.Linux2.6.34.2内核源码放到工作目录文件夹下,并解压。

#tar xzvf linux2.6.34.2.tar.gz –c /
#pwd
/
# cd linux2.6.34.2

       2. 修改内核源码根目录下的Makefile文件(CROSS_COMPILE    =的值因个人情况而定,其他可以照做,蓝色部分为修改部分。)

         #gedit Makefile

......
#SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ /
#                  -e s/arm.*/arm/ -e s/sa110/arm/ /
#                  -e s/s390x/s390/ -e s/parisc64/parisc/ /
#                  -e s/ppc.*/powerpc/ -e s/mips.*/mips/ )
......

#ARCH        ?= $(SUBARCH)
#CROSS_COMPILE    ?=

ARCH        = arm
CROSS_COMPILE    = /usr/local/arm/usr/local/arm/4.3.2/bin/arm-none-linux-
gnueabi-

       3. 对于平台时钟的修改,可以查看内核顶层目录下的arch/arm/mach-s3c64xx/mach-smdk6410.csmdk6410_mapio()函数中有声明为12000000,而开发板上的外部时钟也是12M所以不用修改。

     4. 修改机器码,可以看到在arch/arm/mach-s3c64xx/mach-smdk6410.cMACHINE_START(SMDK6410,”SMDK6410”)是在uboot引导内核时需要对应的机器码。所以在arch/arm/tools/mach-types文件中找到这个SMDK6410对应的机器码并改为888(uboot中是这样设置的)

     4. 配置内核,由于开始对s3c6410的内核支持结构不是很了解,所以可以采用默认配置内核。(arch/arm/configs/目录下是一般内核的默认配置)

#pwd

#/linux2.6.34.2

#cp –f arch/arm/configs/s3c6400_defconfig .config

可以使用make menuconfig对刚刚配置的内核根据具体的情况进行修改,开始我没有进行修改直接make zImage,最后在arch/arm/boot/目录下生成zImage镜像文件。

5.使用mkimage命令打包zImage并烧写到开发板上。

#mkimage –n ‘linux-2.6.34.2’ -A arm -O linux -C none -a 0xc0008000 -e 0xc0008000 -d zImage uImage

可以看到内核停在Starting kernel ...不能解压内核。

打印信息如下:

Booting image at c0008000 ...                                
Image Name:   Linux-2.6.34.2                               
Created:      2010-08-10   0:13:40 UTC                       
Image Type:   ARM Linux Kernel Image (uncompressed)  
         Data Size:    1650092 Bytes =  1.6 MB                                         Load Address: c0008000                         
        Entry Point:  c0008000    
         Verifying Checksum ... OK                                                      
         Starting kernel ...
         后来经过对比天嵌原来开发板上的内核是没有上面的打印信息的,在网上查找原因得知是内核引导指令的问题。原来:生成zImage的内核镜像文件可以通过UBOOT提供的go命令,通过mkimage命令,在zImage中加入头文件(镜像头长0x40,真正的内核入口向后偏移了0x40大小),生成uImage镜像文件,该文件就是执行bootm所需的内核镜像文件。以前uboot引导内核都是用bootm指令,这次用的go指令,所以才会出错。看来学习还是要深究啊。
       直接烧写zImage系统引导内核成功了。可是对于内核的系统分区还没有添加,内核最后打印信息为:
       Memory: 126516k/126516k available, 4556k reserved, 0K highmem
Virtual kernel memory layout:
    vector  : 0xffff0000 - 0xffff1000   (   4 kB)
    fixmap  : 0xfff00000 - 0xfffe0000   ( 896 kB)
    DMA     : 0xffc00000 - 0xffe00000   (   2 MB)
    vmalloc : 0xc8800000 - 0xe0000000   ( 376 MB)
    lowmem  : 0xc0000000 - 0xc8000000   ( 128 MB)
    modules : 0xbf000000 - 0xc0000000   (  16 MB)
      .init : 0xc0008000 - 0xc0024000   ( 112 kB)
      .text : 0xc0024000 - 0xc0300000   (2928 kB)
      .data : 0xc0300000 - 0xc0324920   ( 147 kB)
 
Please append a correct "root=" boot option; here are the available partitions:
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)
Backtrace: 
[<c0028ab0>] (dump_backtrace+0x0/0x114) from [<c0228780>] (dump_stack+0x18/0x1c)
 r7:c7c11000 r6:00000000 r5:c0021a08 r4:c0325230
[<c0228768>] (dump_stack+0x0/0x1c) from [<c02287d0>] (panic+0x4c/0xc0)
[<c0228784>] (panic+0x0/0xc0) from [<c0008fd0>] (mount_block_root+0x1e0/0x220)
 r3:00000000 r2:00000000 r1:c7c27f60 r0:c02c5f65
[<c0008df0>] (mount_block_root+0x0/0x220) from [<c00090d4>] (mount_root+0xc4/0xfc)
[<c0009010>] (mount_root+0x0/0xfc) from [<c000927c>] (prepare_namespace+0x170/0x1c8)
 r5:c0021a08 r4:c0324b60
[<c000910c>] (prepare_namespace+0x0/0x1c8) from [<c00084ec>] (kernel_init+0x110/0x14c)
 r5:00000000 r4:c0324920
[<c00083dc>] (kernel_init+0x0/0x14c) from [<c0042fa4>] (do_exit+0x0/0x5a8)
 r5:00000000 r4:00000000
继续努力啊,添加分区
6.由于linux2.6.34.2s3c6410上的nand驱动支持不是很好,所以自己添加修改arch/arm/mach-s3c64xx/mach-smdk6410.c文件,添加Nand Flash的分区信息和Nand Flash的硬件信息。(蓝色字体为添加部分)

#pwd

       #gedit mach-smdk6410.c
        //add here 
       static struct mtd_partition s3c_partition_info[] = {
        [0] = {
         .name            = "u-boot",
            .offset       = 0,
            .size         = 0x40000,
            .mask_flags   = MTD_CAP_NANDFLASH,
        },
        [1] = {
         .name            = "Kernel",
            .offset       = 0x200000,
            .size         = 0x300000,
            .mask_flags   = MTD_CAP_NANDFLASH,
        },
        [2] = {
         .name            = "Yaffs2",
            .offset     = 0x500000,
            .size         = MTDPART_SIZ_FULL,
        }
};
 
static struct s3c2410_nand_set s3c_nandset[]=
{
        [0]=
        {
        .name              ="s3c24xx-nand",
        .nr_chips = 1,
        .nr_partitions     =ARRAY_SIZE(s3c_partition_info),
        .partitions                =s3c_partition_info,
        }
};
static struct s3c2410_platform_nand s3c_platform=
{
        .tacls =0,
        .twrph0 =30,
        .sets = &s3c_nandset,
        .nr_sets =ARRAY_SIZE(s3c_nandset),
};
//add here
static struct platform_device *smdk6410_devices[] __initdata = {
#ifdef CONFIG_SMDK6410_SD_CH0
        &s3c_device_hsmmc0,
#endif
#ifdef CONFIG_SMDK6410_SD_CH1
        &s3c_device_hsmmc1,
#endif
        &s3c_device_i2c0,
        &s3c_device_i2c1,
        &s3c_device_fb,
        &s3c_device_ohci,
        &s3c_device_usb_hsotg,
        &s3c64xx_device_iisv4,
        //add here
        &s3c_device_nand,
        //add here
}
static void __init smdk6410_map_io(void)
{
        u32 tmp;
        //add here
        s3c_device_nand.name = "s3c6410-nand";
        //add here
}
static void __init smdk6410_machine_init(void)
{
        u32 cs1;
 
        s3c_i2c0_set_platdata(NULL);
        s3c_i2c1_set_platdata(NULL);
        s3c_fb_set_platdata(&smdk6410_lcd_pdata);
        //add here
        s3c_nand_set_platdata(&s3c_platform);//
        //add here
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值