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

来源:互联网 发布:孔浩 shiro 源码 编辑:程序博客网 时间:2024/05/17 08:59

二、移植linux内核
所需文件:
内核: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分区。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 232串口打开失败怎么办 逆水寒cpu不支持怎么办 显卡被禁用了怎么办 vmvare注册错了怎么办 电脑主机未成功启动怎么办 主机未成功启动怎么办 电脑主机未能成功启动怎么办 虚拟机没有自带怎么办 错误连接为720怎么办 dns错误不能上网怎么办 家里无线用不了怎么办 磁盘c5坏了怎么办 一体机装xp蓝屏怎么办 虚拟机密码忘记了怎么办 vivoy66手机太卡怎么办 虚拟机装xp蓝屏怎么办 exagear玩起来卡怎么办 第五人格模拟器玩太卡怎么办 速腾油箱盖打不开怎么办 奥迪a6油箱盖打不开怎么办 苹果手提虚拟机黑屏怎么办 mac系统桌面变大怎么办 删除文件要权限怎么办 页面载入错误了怎么办 手机打不开excel表格怎么办 皇室战争闪退怎么办 苹果老是闪退怎么办 黑苹果开机黑屏怎么办 MAC磁盘删了怎么办 mac磁盘被锁定怎么办 bt5读不到网卡怎么办 笔记本电脑cpu温度过高怎么办 笔记本cpu温度过高怎么办 联想系统崩溃了怎么办 办公软件用不了怎么办 win10设置闪退怎么办 手机浏览器版本低怎么办 wps界面动不了怎么办 手机设置删了怎么办 苹果手机设置不见了怎么办 笔记本电脑键盘不好使怎么办