免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3702 | 回复: 2
打印 上一主题 下一主题

Jx2410上进行linux2.6.14内核的全移植过程,实践证明成功 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-02 09:29 |只看该作者 |倒序浏览
Jx2410上进行linux2.6.14内核的全移植过程,实践证明成功

作者:冯知凡

[引用:我参考网上的资料做了linux2.6.14内核的移植。创维特jx2410的配置:cpu:s3c2410, 32M Nor Flash(Intel 28F12, 64M SDRAMNor Flash启动。移植有很长一段时间了,2.6的移植网上很火的,可是nor flash启动的比较少,希望它对你有用。] 以上是原作者的话,我参考他的进行了移植,但是出现了错误,因此只能自己一点一点的摸索,最后写下了这篇文章,希望对你们有用!
一、准备必要的文件
1.首先去官方网站下载最新的llinux内核                  
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.14.tar.bz2
2.因为linux2.6.14内核需要更新版本的编译器,所以需要下载交叉编译器
ftp://ftp.handhelds.org/projects/toolchain/arm-linux-gcc-3.4.1.tar.bz2
二、安装文件
1、把gcc解压到/usr/local/arm/3.4.1目录下
2、接下来需要解压linux内核,输入命令:
# tar -jxvf linux-2.6.14.tar.bz2
将内核解压到linux-2.6.14目录下。
三、修改makefile文件                             
内核的编译是根据makefile文件的指示进行的,Makefile文件来组织内核的各模块之间的关系,记录了各个模块之间的相互联系和依赖关系。首先修改linux-2.6.14的根目录下的makfile文件,须改的主要内容是目标代码的类型和为编译内核指定一个编译器。注释掉以下内容:
  
#ARCH   ?= $(SUBARCH)

   
#CROSS_COMPILE      ?=


修改成如下的内容:
   
ARCH     ?= arm

  
CROSS_COMPILE
?=/usr/local/arm/3.4.1/bin/arm-linux-

四、安装根文件系统
   
1.
首先对flash进行分区。网上的经典文章《Linux 2.6.10 以后版本对S3C2410的支持》仅提到了对Nand flash分区的方法,对Nor flash不适用。对Nor flash的分区,是通过在linux/drivers/mtd/maps下增加特定mapping驱动程序来实现。该目录下的驱动程序结构相似,可以找一个来修改成自己的。我用的是cfi_flagadm.c这个。
cp cfi_flagadm.c s3c2410.c
/*
把文件的结构给复制下来,具体的文件见同文件夹内面的s3c2410.c */
/* 注意:可能是时间仓促,原作者的修改里面有一些错误,我都进行了改进,希望对大家有用 */
   
FLASH_PHYS_ADDRFLASH_SIZE这两个宏分别修改成自己板子的flash起始地址和大小。然后修改结构体数组flagadm_parts添加自己的分区信息。(具体的修改见同文件夹内面的s3c2410.c)
   
接下来告诉内核使用该驱动程序。修改maps目录下的Kconfig文件,该文件决定出现在menuconfig中的项目,在config MTD_CDB89712之后添加
   
config MTD_S3C2410

           
tristate "gggggg 2410 board"

   
修改该目录下的Makefile,添加如下内容:
   
obj-$(CONFIG_MTD_S3C2410)       += s3c2410.o

   
现在make menuconfig时,在MTD项目中将出现gggggg 2410 board选项,选中它并重新编译内核就完成了分区工作,启动时将看到分区信息。现在,内核可以检测到分区,并找到了压缩的RAMDISK,并试图解压缩。如果你使用smdk2410默认配置,这时会报错,类似RAMDISKincomplete 云云。解决办法很简单,将内核配置中的BLK_DEV_RAM_SIZE的值从默认的4096改为8192即可。(在make menuconfig后,见device driver中的block devices里面,同时最后因为有ramdisk的加载,同时要选中ram disk support见图2)。
   
2.
linux/arch/arm/mach-s3c2410/mach-smdk2410.c中添加ramdisk支持相关的代码。具体请参考我的文件贴图。(见本文件夹内面的mach-smdk2410.c文件
   
3.
修改启动参数:
   
修改 linux/arch/arm/kernel/文件夹下的head.S文件如下:
ENTRY(stext)
/****************boot required ggggggg****************/
         mov     
r0,  #0
         mov     
r1,  #0xc1
         ldr     
r2,  =0x30000100
/*********************end****************************/
r0
恒为0r1architecture IDr2为启动地址。
五、支持启动时挂载devfs
为了我们的内核支持devfs以及在启动时并在/sbin/init运行之前能自动挂载/devdevfs文件系统,修改fs/Kconfig文件
找到menu "seudo filesystems"
添加如下语句:
config DEVFS_FS
bool "/dev file system support (OBSOLETE)"
default y
config DEVFS_MOUNT
bool "Automatically mount at boot"
default y
depends on DEVFS_FS
六、配置内核产生.config文件
cp arch/arm/configs/smdk2410_defconfig .config
/*这是为了把当前的配置文件设置为smdk2410_defconfig并有一个保存的功能*/
make menuconfig
smdk2410_defconfig基础上,我所增删的内核配置项如下:
Loadable module support >
Enable loadable module support
Automatic kernel module loading
System Type >
S3C2410 DMA support
Boot options >
Default kernel command string:
noinitrd root=/dev/mtdblock/2 init=/linuxrc console=ttySAC0,115200
/* 注意这里有错误,应该改成:initrd=0x30800000,0x440000
mem=64M
root=/dev/ram init=/linuxrc
console=ttySAC0,115200
,因为我们是从ramdisk进行启动的,因此这里一定得改,不然内核无法正常运行 */
/* 注意,修改了几个地方:
1.boot options
中的修改为initrd=0x30800000,0x440000 mem=64M root=/dev/ram init=/linuxrc console=ttySAC0115200。就是要和ppcboot一致;
2.file system
中选中devfs之类的选项;
3.device driver
中的block devices要选中ram disk support (不然会找不到文件系统)见图(1*/
#console=ttySAC0,115200使kernel启动期间的信息全部输出到串口#   
# linux2.6内核对于串口的命名改为ttySAC0,但这不影响用户空间的串口编
程。用户空间的串口编程针对的仍是/dev/ttyS0等。
Floating point emulation >
NWFPE math emulation
This is necessary to run most binaries!
#接下来要做的是对内核MTD子系统的设置
Device Drivers >
Memory Technology Devices (MTD) >
MTD partitioning support
#支持MTD分区,这样我们在前面设置的分区才有意义
Command line partition table parsing
#支持从命令行设置flash分区信息,灵活
RAM/ROM/Flash chip drivers >
<*> Detect flash chips by Common Flash
Interface (CFI) probe
<*> Detect nonCFI
AMD/JEDECcompatible flash chips
<*> Support for Intel/Sharp flash chips
<*> Support for AMD/Fujitsu flash chips
<*> Support for ROM chips in bus mapping
NAND Flash Device Drivers >
<*> NAND Device Support
<*> NAND Flash support for S3C2410/S3C2440 SoC
Character devices >
Nonstandard serial port support
S3C2410 RTC Driver
#接下来做的是针对文件系统的设置,本人实验时目标板上要上的文件系统是ext2,故做如下配置
File systems >
<*> Second extended fs support #ext2的支持
Pseudo filesystems >
/proc file system support
Virtual memory file system support (former shm fs)
/dev file system support (OBSOLETE)
Automatically mount at boot (NEW)
#这里会看到我们前先修改fs/Kconfig的成果,devfs已经被支持上了
Miscellaneous filesystems >
<*> Compressed ROM file system support (cramfs)
#支持cramfs
Network File Systems >
<*> NFS file system support
保存退出,产生.config文件.
.config文件能从提供的2.4.14.1的内核包中找到,文件名为config.back.
七、编译内核
make zImage
八、下载到开发板就可以启动了。
九、然后就是进行其它驱动的移植了,这些是后话了。


论坛徽章:
0
2 [报告]
发表于 2008-08-02 09:31 |只看该作者

Jx2410上进行linux2.6.14内核的全移植过程,实践证明成功(附录)

附录:

mach-smdk2410.c

/***********************************************************************

*

* linux/arch/arm/mach-s3c2410/mach-smdk2410.c

*

* Copyright (C) 2004 by FS Forth-Systeme GmbH

* All rights reserved.

*

* $Id: mach-smdk2410.c,v 1.1 2004/05/11 14:15:38 mpietrek Exp $

* @Author: Jonas Dietsche

*

* This program is free software; you can redistribute it and/or

* modify it under the terms of the GNU General Public License as

* published by the Free Software Foundation; either version 2 of

* the License, or (at your option) any later version.

*

* This program is distributed in the hope that it will be useful,

* but WITHOUT ANY WARRANTY; without even the implied warranty of

* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

* GNU General Public License for more details.

*

* You should have received a copy of the GNU General Public License

* along with this program; if not, write to the Free Software

* Foundation, Inc., 59 Temple Place, Suite 330, Boston,

* MA 02111-1307 USA

*

* @History:

* derived from linux/arch/arm/mach-s3c2410/mach-bast.c, written by

* Ben Dooks <ben@simtec.co.uk>

*

* 10-Mar-2005 LCVR  Changed S3C2410_VA to S3C24XX_VA

* 20-Sep-2005 BJD  Added static to non-exported items

*

***********************************************************************/



#include <linux/kernel.h>

#include <linux/types.h>

#include <linux/interrupt.h>

#include <linux/list.h>

#include <linux/timer.h>

#include <linux/init.h>



#include <asm/mach/arch.h>

#include <asm/mach/map.h>

#include <asm/mach/irq.h>



#include <asm/hardware.h>

#include <asm/io.h>

#include <asm/irq.h>

#include <asm/mach-types.h>



#include <asm/arch/regs-serial.h>



/********************gggggggggggggggggggggg************************************/

#include <asm-arm/setup.h>

#include <linux/initrd.h>

#include <linux/kdev_t.h>

#include <linux/major.h>

#include <asm-arm/arch-s3c2410/fb.h>

//#include <asm-arm/mach/map.h>

//#include <asm-arm/arch-s3c2410/gggggg.h>

//**********************end ***************************************************/



#include "devs.h"

#include "cpu.h"



static struct map_desc smdk2410_iodesc[] __initdata = {

  /* nothing here yet */

};



#define UCON S3C2410_UCON_DEFAULT

#define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB

#define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE



/*****************added---gggggggggggggg***************************************/

extern dev_t ROOT_DEV;

extern unsigned long  initrd_start ,initrd_end;

extern  void __init setup_ramdisk(int doload, int prompt, int image_start, unsigned int rd_sz);



void __init setup_ramdisk(int doload, int prompt, int image_start, unsigned int rd_sz)

{

/* #ifdef CONFIG_BLK_DEV_RAM*/

       extern int rd_size, rd_image_start, rd_prompt, rd_doload;

             rd_image_start = image_start;

    rd_prompt = prompt;

       rd_doload = doload;

              if (rd_sz)

                rd_size = rd_sz;

/* #endif*/

}



static void __init setup_initrd(unsigned int start, unsigned int size)

{

#ifdef CONFIG_BLK_DEV_INITRD

         if (start == 0)

                   size = 0;

         initrd_start = start;

         initrd_end   = start + size;

#endif

}

static void __init fixup_smdk(struct machine_desc *desc, struct param_struct *params, char **cmdline, struct meminfo *mi)

{

         /* TODO */

#if 0         /* hacked by nandy. Is these codes need ? */

         struct tag *t = (struct tag *)params;

         if (t->hdr.tag != ATAG_CORE)

                   convert_to_tag_list(params, 1);

         if (t->hdr.tag != ATAG_CORE) {

                   t->hdr.tag = ATAG_CORE;

                   t = tag_next(t);

                   t->hdr.tag = ATAG_MEM;

                   t->u.mem.start = 0x0c000000;

                   t->u.mem.size = 32 * 1024 * 1024;

         }

#endif

#if 1 /* used in asm/kernel/setup.c and asm/arch/arch.c  */

         #define S3C2410_MEM_SIZE     (64*1024*1024)

         #define PA_SDRAM_BASE         0x30000000         /* used in asm/arch/arch.c     */

         #define RAMDISK_DN_ADDR       0x30800000       /* used in asm/arch/arch.c     */

         #define ZIP_RAMDISK_SIZE      (10*1024*1024)            /* used in asm/arch/arch.c     */

         /* setup ramdisk */

         mi->bank[0].start = PA_SDRAM_BASE;

         mi->bank[0].size =  S3C2410_MEM_SIZE;

         mi->bank[0].node =  0;

         mi->nr_banks = 1;

                                                                                 

         ROOT_DEV = MKDEV(RAMDISK_MAJOR,0);

#ifdef CONFIG_BLK_DEV_RAM_SIZE

         setup_ramdisk( 1, 0, 0, CONFIG_BLK_DEV_RAM_SIZE);

#else

         setup_ramdisk( 1, 0, 0, BLK_DEV_RAM_SIZE);

#endif

         setup_initrd( __phys_to_virt(RAMDISK_DN_ADDR), ZIP_RAMDISK_SIZE);

#endif

}

/***************************************ggggggggggggggg****************************/



/********************lcd ggggggggggggggggggggggggggg*******************************/



   static struct s3c2410fb_mach_info gggggg_lcdcfg  __initdata = {

                   .fixed_syncs= 0,

                   .regs={

                            .lcdcon1=   S3C2410_LCDCON1_TFT16BPP | S3C2410_LCDCON1_TFT | S3C2410_LCDCON1_CLKVAL(2),  

                            .lcdcon2=   S3C2410_LCDCON2_VBPD(10) | S3C2410_LCDCON2_LINEVAL(479) | S3C2410_LCDCON2_VFPD(25) | S3C2410_LCDCON2_VSPW(30),

                            .lcdcon3=   S3C2410_LCDCON3_HBPD(2) | S3C2410_LCDCON3_HOZVAL(639) | S3C2410_LCDCON3_HFPD(4),

                            .lcdcon4=   S3C2410_LCDCON4_MVAL(13) | S3C2410_LCDCON4_HSPW(79),

                            .lcdcon5=   S3C2410_LCDCON5_FRM565 | S3C2410_LCDCON5_INVVLINE | S3C2410_LCDCON5_HWSWP,

                   },

                   .lpcsel=    0x0,

                   .gpccon=           0xaaaaaaaa,

                   .gpccon_mask=   0xffffffff,

                   .gpcup=         0xffffffff,

                   .gpcup_mask=    0xffffffff,

                   .gpdcon=       0xaaaaaaaa,

                   .gpdcon_mask=   0x0,

                   .gpdup=        0xffffffff,

                   .gpdup_mask=    0xffffffff,

                   .width=          640,

                   .height=          480,

                   .xres=           {640,640,640},

                   .yres=           {480,480,480},

                 .bpp=             {16,16,16},

};

static void __init smdk2410_init(void){

         set_s3c2410fb_info(&gggggg_lcdcfg);

}

/**********************end gggggggggggggg**********************************************/



static struct s3c2410_uartcfg smdk2410_uartcfgs[] = {

         [0] = {

                   .hwport          = 0,

                   .flags              = 0,

                   .ucon              = UCON,

                   .ulcon             = ULCON,

                   .ufcon            = UFCON,

         },

         [1] = {

                   .hwport          = 1,

                   .flags              = 0,

                   .ucon              = UCON,

                   .ulcon             = ULCON,

                   .ufcon            = UFCON,

         },

         [2] = {

                   .hwport          = 2,

                   .flags              = 0,

                   .ucon              = UCON,

                   .ulcon             = ULCON,

                   .ufcon            = UFCON,

         }

};



static struct platform_device *smdk2410_devices[] __initdata = {

         &s3c_device_usb,

         &s3c_device_lcd,

         &s3c_device_wdt,

         &s3c_device_i2c,

         &s3c_device_iis,

         &s3c_device_nand,

};



static struct s3c24xx_board smdk2410_board __initdata = {

         .devices       = smdk2410_devices,

         .devices_count = ARRAY_SIZE(smdk2410_devices)

};



static void __init smdk2410_map_io(void)

{

         s3c24xx_init_io(smdk2410_iodesc, ARRAY_SIZE(smdk2410_iodesc));

         s3c24xx_init_clocks(0);

         s3c24xx_init_uarts(smdk2410_uartcfgs, ARRAY_SIZE(smdk2410_uartcfgs));

         s3c24xx_set_board(&smdk2410_board);

}



static void __init smdk2410_init_irq(void)

{

         s3c24xx_init_irq();

}



MACHINE_START(SMDK2410, "SMDK2410" /* @TODO: request a new identifier and switch

                                         * to SMDK2410 */

         /* Maintainer: Jonas Dietsche */

         .phys_ram         = S3C2410_SDRAM_PA,

         .phys_io   = S3C2410_PA_UART,

         .io_pg_offst      = (((u32)S3C24XX_VA_UART) >> 1 & 0xfffc,

         .boot_params   = S3C2410_SDRAM_PA + 0x100,

         .map_io             = smdk2410_map_io,

         .init_irq     = smdk2410_init_irq,

         .timer                  = &s3c24xx_timer,

         /*******************added gggggggggggggg****************************/

         .fixup  = fixup_smdk,

         .init_machine   = smdk2410_init,



MACHINE_END



s3c2410.c

/*

*  Copyright ?2001 Flaga hf. Medical Devices, K醨i Dav眇sson <kd@flaga.is>

*

*  $Id: cfi_flagadm.c,v 1.14 2004/11/04 13:24:14 gleixner Exp $

*  

*  This program is free software; you can redistribute  it and/or modify it

*  under  the terms of  the GNU General  Public License as published by the

*  Free Software Foundation;  either version 2 of the  License, or (at your

*  option) any later version.

*

*  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED

*  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF

*  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN

*  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,

*  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT

*  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF

*  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON

*  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT

*  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF

*  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

*

*  You should have received a copy of the  GNU General Public License along

*  with this program; if not, write  to the Free Software Foundation, Inc.,

*  675 Mass Ave, Cambridge, MA 02139, USA.

*/



#include <linux/module.h>

#include <linux/types.h>

#include <linux/kernel.h>

#include <linux/init.h>

#include <asm/io.h>

#include <linux/mtd/mtd.h>

#include <linux/mtd/map.h>

#include <linux/mtd/partitions.h>





/* We split the flash chip up into four parts.

* 1: bootloader firts 128k                           (0x00000000 - 0x0001FFFF) size 0x020000

* 2: kernel 640k                                           (0x00020000 - 0x000BFFFF) size 0x0A0000

* 3: compressed 1536k root ramdisk       (0x000C0000 - 0x0023FFFF) size 0x180000

* 4: writeable diskpartition (jffs)(0x00240000 - 0x003FFFFF) size 0x1C0000

*/

/*######################modified according to jx2410*/

#define FLASH_PHYS_ADDR 0x0

#define FLASH_SIZE 0x02000000  



#define FLASH_PARTITION0_ADDR 0x0000000

#define FLASH_PARTITION0_SIZE 0x00080000



#define FLASH_PARTITION1_ADDR 0x00080000

#define FLASH_PARTITION1_SIZE (0x00800000-0x00080000)



#define FLASH_PARTITION2_ADDR 0x00800000

#define FLASH_PARTITION2_SIZE (0x02000000-0x00800000)



#define FLASH_PARTITION3_ADDR 0x02000000

#define FLASH_PARTITION3_SIZE 0x0





struct map_info gggggg_map = {

                   .name =             "gggggg flash device",

                   .size =                 FLASH_SIZE,

                   .bankwidth =    4,

};



struct mtd_partition gggggg_parts[] = {

         {

                   .name =             "Bootloader",

                   .offset       =       FLASH_PARTITION0_ADDR,

                   .size =                 FLASH_PARTITION0_SIZE

         },

         {

                   .name =             "jffs2(8m)",

                   .offset =    FLASH_PARTITION1_ADDR,

                   .size =                 FLASH_PARTITION1_SIZE

         },

         {

                   .name =             "reserved",

                   .offset =    FLASH_PARTITION2_ADDR,

                   .size =                 FLASH_PARTITION2_SIZE

         },

         {      

                   .name =             "nothing",

                   .offset =    FLASH_PARTITION3_ADDR,

                   .size =                 FLASH_PARTITION3_SIZE

         }

};



#define PARTITION_COUNT (sizeof(gggggg_parts)/sizeof(struct mtd_partition))



static struct mtd_info *mymtd;



int __init init_gggggg(void)

{      

         printk(KERN_NOTICE "S3C2410-gggggg flash device: %x at %x\n",

                            FLASH_SIZE, FLASH_PHYS_ADDR);

         

         gggggg_map.phys = FLASH_PHYS_ADDR;

         gggggg_map.virt = ioremap(FLASH_PHYS_ADDR,

                                               FLASH_SIZE);



         if (!gggggg_map.virt) {

                   printk("Failed to ioremap\n";

                   return -EIO;

         }



         simple_map_init(&gggggg_map);



         mymtd = do_map_probe("cfi_probe", &gggggg_map);

         if (mymtd) {

                   mymtd->owner = THIS_MODULE;

                   add_mtd_partitions(mymtd, gggggg_parts, PARTITION_COUNT);

                   printk(KERN_NOTICE "S3C2410-gggggg flash device initialized\n";

                   return 0;

         }



         iounmap((void *)gggggg_map.virt);

         return -ENXIO;

}



static void __exit cleanup_gggggg(void)

{

         if (mymtd) {

                   del_mtd_partitions(mymtd);

                   map_destroy(mymtd);

         }

         if (gggggg_map.virt) {

                   iounmap((void *)gggggg_map.virt);

                   gggggg_map.virt = 0;

         }

}



module_init(init_gggggg);

module_exit(cleanup_gggggg);





MODULE_LICENSE("GPL";

MODULE_AUTHOR("K醨i Dav眇sson <kd@flaga.is>";

MODULE_DESCRIPTION("MTD map driver for S3C2410  digital module";

论坛徽章:
0
3 [报告]
发表于 2008-08-02 10:19 |只看该作者
为什么移植2.6.14的? 2.6.24不是更好吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP