2.6.22.6最小內核構建

/* mini2440 2M nor, 256M nand, dm9000ep*/
1、修改交叉編譯工具
#vim Makefile
找到:            //第185行
ARCH        ?= $(SUBARCH)
CROSS_COMPILE    ?=

改爲:
ARCH        ?= arm
CROSS_COMPILE    ?= arm-linux-

2、修改時鐘頻率        //第180行
#vim arch\arm\mach-s3c2440\mach-smdk2440.c
找到:
static void __init smdk2440_map_io(void)
{
    ......
    s3c24xx_init_clocks(16934400);
    ......
}

改爲:
static void __init smdk2440_map_io(void)
{
    ......
    s3c24xx_init_clocks(12000000);
    ......
}

3、修改nand分區        //第109行
#vim arch\arm\plat-s3c24xx\common-smdk.c
找到:
static struct mtd_partition smdk_default_nand_part[] = {
    [0] = {
        .name    = "Boot Agent",
        .size    = SZ_16K,
        .offset    = 0,
    },
    [1] = {
        .name    = "S3C2410 flash partition 1",
        .offset = 0,
        .size    = SZ_2M,
    },
    [2] = {
        .name    = "S3C2410 flash partition 2",
        .offset = SZ_4M,
        .size    = SZ_4M,
    },
    [3] = {
        .name    = "S3C2410 flash partition 3",
        .offset    = SZ_8M,
        .size    = SZ_2M,
    },
    [4] = {
        .name    = "S3C2410 flash partition 4",
        .offset = SZ_1M * 10,
        .size    = SZ_4M,
    },
    [5] = {
        .name    = "S3C2410 flash partition 5",
        .offset    = SZ_1M * 14,
        .size    = SZ_1M * 10,
    },
    [6] = {
        .name    = "S3C2410 flash partition 6",
        .offset    = SZ_1M * 24,
        .size    = SZ_1M * 24,
    },
    [7] = {
        .name    = "S3C2410 flash partition 7",
        .offset = SZ_1M * 48,
        .size    = SZ_16M,
    }
};

改爲:
static struct mtd_partition smdk_default_nand_part[] = {
    [0] = {
        .name    = "bootloader",
        .size    = 0x00040000,
        .offset    = 0,
    },
    [1] = {
        .name    = "params",
        .offset = MTDPART_OFS_APPEND,
        .size    = 0x0002000,
    },
    [2] = {
        .name    = "kernel",
        .offset = MTDPART_OFS_APPEND,
        .size    = 0x00200000,
    },
    [3] = {
        .name    = "root",
        .offset    = MTDPART_OFS_APPEND,
        .size    = MTDPART_SIZ_FULL,
    },
}

4、增加DM9000網卡
#vim arch\arm\plat-s3c24xx\common-smdk.c
(1)增加頭文件
在第46行增加:
#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
#include <linux/dm9000.h>
#endif

(2)增加平臺設備結構
在第53行增加:
#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
/* DM9000 */
static struct resource s3c_dm9k_resource[] = {
    [0] = {
        .start = S3C2410_CS4,      
        .end   = S3C2410_CS4 + 3,
        .flags = IORESOURCE_MEM,
    },
    [1] = {
        .start = S3C2410_CS4 + 4,  
        .end   = S3C2410_CS4 + 4 + 3,
        .flags = IORESOURCE_MEM,
    },
    [2] = {
        .start = IRQ_EINT7,
        .end   = IRQ_EINT7,
        .flags = IORESOURCE_IRQ,
    }

};

static struct dm9000_plat_data s3c_dm9k_platdata = {
    .flags      = DM9000_PLATF_16BITONLY,
};

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 /* CONFIG_DM9000 */

(3)將DM9000加入內核平臺設備列表
找到:
static struct platform_device __initdata *smdk_devs[] = {
    ......
    &smdk_led7,      
};

改爲:
static struct platform_device __initdata *smdk_devs[] = {
    ......
    &smdk_led7,
    
#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
    &s3c_device_dm9k,
#endif        
};

#vim drivers\net\dm9000.c
(1)在第73行增加:
#if defined(CONFIG_ARCH_S3C2410)
#include <asm/arch-s3c2410/regs-mem.h>
#endif

(2)找到:    //第394行
static int
dm9000_probe(struct platform_device *pdev)
{
    struct dm9000_plat_data *pdata = pdev->dev.platform_data;
    ......
}
改爲:
static int
dm9000_probe(struct platform_device *pdev)
{
#if defined(CONFIG_ARCH_S3C2410xxx)
  unsigned int oldval_bwscon;        
  unsigned int oldval_bankcon4;
#endif    

    struct dm9000_plat_data *pdata = pdev->dev.platform_data;
    ......
}

(3)在dm9000_probe(struct platform_device *pdev)函數中,找到:
    ......
    if (!is_valid_ether_addr(ndev->dev_addr))
        printk("%s: Invalid ethernet MAC address.  Please "
            "set using ifconfig\n", ndev->name);

    platform_set_drvdata(pdev, ndev);
    ......

改爲:
    ......
    if (!is_valid_ether_addr(ndev->dev_addr))
    {
        printk("%s: Invalid ethernet MAC address.  Please "
               "set using ifconfig\n", ndev->name);
#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
    }

    platform_set_drvdata(pdev, ndev);
    ......

(4)在dm9000_probe(struct platform_device *pdev)函數中,找到:
    ......
    out:
    printk("%s: not found (%d).\n", CARDNAME, ret);

    dm9000_release_board(pdev, db);
    ......
改爲:
    ......
    out:
    printk("%s: not found (%d).\n", CARDNAME, ret);
    
#if defined(CONFIG_ARCH_S3C2410xxx)
  *((volatile unsigned int *)S3C2410_BWSCON) = oldval_bwscon;
  *((volatile unsigned int *)S3C2410_BANKCON4) = oldval_bankcon4;
#endif    

    dm9000_release_board(pdev, db);
    ......

(5)在dm9000_open(struct net_device *dev)函數中,找到:
    ......
    if (request_irq(dev->irq, &dm9000_interrupt, IRQF_SHARED, dev->name, dev))
        return -EAGAIN;
    ......
改爲:
    ......
    #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;

(6)在dm9000_rx(struct net_device *dev)函數中找到:
    ......
    /* Check packet ready or not */
    do {
        ior(db, DM9000_MRCMDX);    /* Dummy read */
        ......
改爲:
    ......
    /* Check packet ready or not */
    do {
        ior(db, DM9000_MRRH);
           ior(db, DM9000_MRRL);
        ior(db, DM9000_MRCMDX);    /* Dummy read */
        ......

5、配置make menuconfig
#make menuconfig  //未列出的選項,可以不選或者默認不去更改
1、選擇處理型號
System Type
    ==>S3C2410 Machines -->
        ==>[*]SMDK2410/A9M2410
    ==>S3C2440 Machines -->
        ==>[*]SMDK2440
        ==>[*]SMDK2440 with S3C2440 CPU module
    ==>[*]Support ARM920T processor

2、支持DM9000
Device Drivers
    ==>Network device support
        ==>Ethernet (10 or 100Mbit)--->
            ==>[*]DM9000 support    //選上此項

3、支持nfs起根文件系統
Network --->
    ==>Netwokring options --->
        ==>[*]IP:kernel level autoconfiguration
           [*]  IP: DHCP support
           [*]  IP: BOOTP support
           [*]    IP: RARP support

File systems --->
    ==>Pseudo filesystem --->
        ==>[*]Virtual memory file system support(former shm fs)
           [*]Tmpfs POSIX Access Control Lists
    ==>Network FIle Systems --->
        ==><*>NFS file system support
                  [*]   Provide NFSv3 client support
                   [*]      Provide client support for the NFSv3 ACL protocol extension
                   [*]   Provide NFSv4 client support(EXPERIMENTAL)
                   [*]   Root file system on NFS

6、編譯:

#make uImage


/* 生成uImage 後,就可以利用uboot的tftp引導內核和文件系統;*/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章