原创 移植linux2.6.29内核及根文件系统到UP-CPU-2410(2)

2009-10-27 19:12 2806 8 8 分类: MCU/ 嵌入式

二、移植linux内核<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


所需文件:


内核:Linux-2.6.29.1.tar.bz2


yaffs2代码:cvs-root.tar.gz


解压在工作目录下,分别是:


linux-2.6.29.1


cvs


1.修改内核源码


修改内核根目录的makefile,第193行:


ARCH  ?=arm 


CROSS_COMPILE  ?=arm-linux-


修改MTD分区:


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



static struct mtd_partition smdk_default_nand_part[] = {


[0] = {


.name = "vivi",


.size = 0x00020000,


.offset = 0,


},


[1] = {


.name = "param",


.offset = 0x00020000,


.size = 0x00010000,


},


[2] = {


.name = "kernel-2.6.29",


.offset = 0x00030000,


.size = 0x00200000,


},


[3] = {


.name = "root",


.offset = 0x00230000,


.size = 0x00800000,


},


[4] = {


.name = "yaffs",


.offset = 0x00a30000,


.size = 0x035cc000,


}


}



修改ECC校验:


$vim driver/mtd/nand/s3c2410.c


找到s3c2410_nand_init_chip()函数,将其中的 


chip->ecc.mode=NAND_ECC_SOFT; 


改成 


chip->ecc.mode=NAND_ECC_NONE; 



2.为内核打yaffs文件系统补丁


$cd cvs/yaffs2


$./patch-ker.sh c ../../linux-2.6.29.1/



3.移植DM9000网卡驱动


访问基址是0x10000000(BANK2):Index地址是0x10000000,Data地址是0x10000002.


地址线是ADD1,链接DM9000的CMD引脚,


总线位宽16位,


中断引脚为EINT2


添加DM9000平台设备:


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


/*添加要包含的头文件*/


#if defined(CONFIG_DM9000)||defined(CONFIG_DM9000_MODULE)


#include <linux/dm9000.h>


#endif


/*添加DM9000的平台设备结构*/


#if defined(CONFIG_DM9000)|| defined(CONFIG_DM9000_MODULE)


static struct resource s3c_dm9k_resource[] = {


   [0] = {


  .start = S3C2410_CS2,   //ADD1=0时使用的地址


  .end = S3C2410_CS2 + 1,


  .flags = IORESOURCE_MEM,


   },



   [1] = {


  .start = S3C2410_CS2 + 2,  //ADD1=1时使用的地址


  .end = S3C2410_CS2 + 2 + 1,


  .flags = IORESOURCE_MEM,


   },


   [2] = {


  .start = IRQ_EINT2,      //中断号


  .end = IRQ_EINT2,


  .flags = IORESOURCE_IRQ,


   }


};



static struct dm9000_plat_data s3c_dm9k_platdata = {


   .flags = DM9000_PLATF_16BITONLY,  //数据总线宽度为16位


};



static struct platform_device s3c_device_dm9k = {


   .name = "dm9000",


   .id = 0,


   .num_resources = ARRAY_SIZE(s3c_dm9k_resource),


   .resource = s3c_dm9k_resource,


   .dev = {


  .platform_data = &s3c_dm9k_platdata,


   }


};


#endif



/*加入内核设备列表*/


static struct platform_device __initdata *smdk_devs[] = {


/*DM9000*/


#if defined(CONFIG_DM9000) || efined(CONFIG_DM9000_MODULE)


&s3c_device_dm9k,


#endif


...


...


};



修改DM9000驱动程序:


$vim drivers/net/dm9000.c


/*添加要包含的头文件*/


#if defined (CONFIG_ARCH_S3C2410)


#include <mach/regs-mem.h>


#endif



/*设置存储控制器使BANK2可用,设置默认MAC地址*/


/*添加的代码被宏CONFIG_ARCH_S3C2410包含起来*/


dm9000_probe(struct platform_device *pdev)


{


......


    int i;


u32 id_val;


/*DM9000 device*/


#if defined(CONFIG_ARCH_S3C2410)


unsigned int oldval_bwscon;


unsigned int oldval_bankcon2;


#endif



......



SET_NETDEV_DEV(ndev, &pdev->dev);


dev_dbg(&pdev->dev, "dm9000_probe()\n");



/*DM9000 device*/


#if defined(CONFIG_ARCH_S3C2410)


oldval_bwscon = *((volatile unsigned int *)S3C2410_BWSCON);


*((volatile unsigned int *)S3C2410_BWSCON) = (oldval_bwscon & ~(3<<8)) | S3C2410_BWSCON_DW2_16 | S3C2410_BWSCON_WS2 | S3C2410_BWSCON_ST2;



oldval_bankcon2 = *((volatile unsigned int *)S3C2410_BANKCON2);


*((volatile unsigned int *)S3C2410_BANKCON2) = 0x1f7c;


#endif


......



if (!is_valid_ether_addr(ndev->dev_addr)) {


dev_warn(db->dev, "%s: Invalid ethernet MAC address. Please "


 "set using ifconfig\n", ndev->name);



/*DM9000 device*/


#if defined(CONFIG_ARCH_S3C2410)


printk("NOW use the default MAC address: 08:90:90:90:90:90\n");


ndev->dev_addr[0] = 0x08;


ndev->dev_addr[1] = 0x90;


ndev->dev_addr[2] = 0x90;


ndev->dev_addr[3] = 0x90;


ndev->dev_addr[4] = 0x90;


ndev->dev_addr[5] = 0x90;


#endif


}


......



out:


dev_err(db->dev, "not found (%d).\n", ret);



#if defined(cONFIG_ARCH_S3C2410)


*((volatile unsigned int *)S3C2410_BWSCON) = oldval_bwscon;


*((volatile unsigned int *)S3C2410_BANKCON2) = oldval_bankcon2;


#endif


......


}



/*注册中断,指定触发方式*/


dm9000_open(struct net_device *dev)


{


......


irqflags |= IRQF_SHARED;



#if defined(CONFIG_ARCH_S3C2410)


if (request_irq(dev->irq, &dm9000_interrupt, IRQF_SHARED|IRQF_TRIGGER_RISING, dev->name, dev))


#else


if (request_irq(dev->irq, &dm9000_interrupt, IRQF_SHARED, dev->name, dev))


#endif


   return -EAGAIN;


......


}



4.配置内核


$make s3c2410_defconfig


$make menuconfig


  •  Enable loadable module support  ---> 


        

  •  Forced module loading


        

  •  Module unloading  



    System Type  --->  


        S3C2410 Machines  --->   


       

  •  SMDK2410/A9M2410 


        其余Machines都不选(包括2400,2440等)



    Kernel Features  --->


        

  •  Use the ARM EABI to compile the kernel 


    Boot options  ---> 


        noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0 



    Userspace binary formats  --->    


        

  •  Kernel support for ELF binaries 



    Device Drivers  --->  


        

  •  Network device support  --->


            

  •  Ethernet (10 or 100Mbit)  ---> 


                <*> DM9000 support



    File systems  --->  


        

  •  Miscellaneous filesystems  --->


            <*> YAFFS2 file system support 


      

  •     Lets Yaffs do its own ECC  


        -*- Native language support  ---> 


            <*>Codepage 437 (United States, Canada) 


            <*>Simplified Chinese charset (CP936, GB2312)


            <*>Traditional Chinese charset (Big5) 


            <*>ASCII (United States)


            <*>NLS ISO 8859-1  (Latin 1; Western European Languages) 


            <*>NLS UTF-8  



    $make zImage


    /arch/arm/boot目录下生成的zImage下载到kernel分区。

  • 文章评论0条评论)

    登录后参与讨论
    我要评论
    0
    8
    关闭 站长推荐上一条 /2 下一条