主题 : linux-2.6.38到tiny6410的移植手册(连载2)__网卡&NFS 复制链接 | 浏览器收藏 | 打印
一路走好,下辈子再也不做程序员
级别: 侠客
UID: 32071
精华: 6
发帖: 38
金钱: 490 两
威望: 98 点
贡献值: 6 点
综合积分: 196 分
注册时间: 2010-11-09
最后登录: 2019-10-18
楼主  发表于: 2011-07-28 16:50

 linux-2.6.38到tiny6410的移植手册(连载2)__网卡&NFS

管理提醒: 本帖被 xoom 执行加亮操作(2011-08-11)
linux-2.6.38到tiny6410的移植手册(连载1)__nand flash
http://www.aiothome.net/read.php?tid-14196-fpage-2.html

linux-2.6.38到tiny6410的移植手册(连载2)__网卡&NF
http://www.aiothome.net/read.php?tid-14211.html

linux-2.6.38到tiny6410的移植手册(连载3)__ LCD&触摸屏
http://www.aiothome.net/read.php?tid=14261

linux-2.6.38到tiny6410的移植手册(连载4)__USB设备
http://www.aiothome.net/read.php?tid=14462

今天做的是dm9000网卡移植,和nfs文件系统的搭建

1、vi include/linux/dm9000.h
28行增加
unsigned char    param_addr[6];

2、vi arch/arm/mach-s3c64xx/mach-mini6410.c

为方便起见,将他的网卡结构体注释掉
#if 0
static struct resource mini6410_dm9k_resource[] = {
        [0] = {
                .start  = S3C64XX_PA_XM0CSN1,
                .end    = S3C64XX_PA_XM0CSN1 + 1,
                .flags  = IORESOURCE_MEM
        },
        [1] = {
                .start  = S3C64XX_PA_XM0CSN1 + 4,
                .end    = S3C64XX_PA_XM0CSN1 + 5,
                .flags  = IORESOURCE_MEM
        },
        [2] = {
                .start  = S3C_EINT(7),
                .end    = S3C_EINT(7),
             .flags  = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL
        }
};

static struct dm9000_plat_data mini6410_dm9k_pdata = {
        .flags          = (DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM),
};

static struct platform_device mini6410_device_eth = {
        .name           = "dm9000",
        .id             = -1,
        .num_resources  = ARRAY_SIZE(mini6410_dm9k_resource),
        .resource       = mini6410_dm9k_resource,
        .dev            = {
                .platform_data  = &mini6410_dm9k_pdata,
        },
};

#endif

增加

#define S3C64XX_PA_DM9000       (0x18000000)
#define S3C64XX_SZ_DM9000       SZ_1M
#define S3C64XX_VA_DM9000       S3C_ADDR(0x03b00300)

static struct resource dm9000_resources[] = {
        [0] = {
                .start          = S3C64XX_PA_DM9000,
                .end            = S3C64XX_PA_DM9000 + 3,
                .flags          = IORESOURCE_MEM,
        },
        [1] = {
                .start          = S3C64XX_PA_DM9000 + 4,
                .end            = S3C64XX_PA_DM9000 + S3C64XX_SZ_DM9000 - 1,
                .flags          = IORESOURCE_MEM,
        },
        [2] = {
                .start          = IRQ_EINT(7),
                .end            = IRQ_EINT(7),
                .flags          = IORESOURCE_IRQ | IRQF_TRIGGER_HIGH,
        },
};

static struct dm9000_plat_data dm9000_setup = {
        .flags                  = DM9000_PLATF_16BITONLY,
        .dev_addr               = { 0x08, 0x90, 0x00, 0xa0, 0x90, 0x90 },
};

static struct platform_device s3c_device_dm9000 = {
        .name                   = "dm9000",
        .id                             = 0,
        .num_resources  = ARRAY_SIZE(dm9000_resources),
        .resource               = dm9000_resources,
        .dev                    = {
                .platform_data = &dm9000_setup,
        }
};

如果不嫌麻烦,也可以直接在原代码上改,S3C64XX_PA_XM0CSN1的值也为0x18000000的。

增加mac地址设置函数
static int __init dm9000_set_mac(char *str) {
        unsigned char addr[6];
        unsigned int val;
        int idx = 0;
        char *p = str, *end;
        while (*p && idx < 6) {
                val = simple_strtoul(p, &end, 16);
                if (end <= p) {
                        /* convert failed */
                        break;
                } else {
                        addr[idx++] = val;
                        p = end;
                        if (*p == ':'|| *p == '-') {
                                p++;
                        } else {
                                break;
                        }
                }
        }
         if (idx == 6) {
                printk("Setup ethernet address to %pM\n", addr);
                memcpy(dm9000_setup.param_addr, addr, 6);
        }

        return 1;
}

__setup("ethmac=", dm9000_set_mac);

    增加IO映射
增加映射结构体
static struct map_desc mini6410_iodesc[] = {
#ifdef CONFIG_DM9000
        {
                .virtual        = (u32)S3C64XX_VA_DM9000,
                .pfn            = __phys_to_pfn(S3C64XX_PA_DM9000),
                .length         = S3C64XX_SZ_DM9000,
                .type           = MT_DEVICE,
        },
#endif
};
然后在static void __init mini6410_map_io(void)函数中
将s3c64xx_init_io(NULL, 0);改成
  s3c64xx_init_io(mini6410_iodesc, ARRAY_SIZE(mini6410_iodesc));

最后在static struct platform_device *mini6410_devices[] __initdata 的初始化设备中
将     &mini6410_device_eth,
改成   &s3c_device_dm9000,

3、vi drivers/net/dm9000.c
大概1586行
将mac_src = "platform data";
memcpy(ndev->dev_addr, pdata->dev_addr, 6);

改成

  mac_src = "param data";
  memcpy(ndev->dev_addr, pdata->param_addr, 6);

大概1598行
增加
   if (!is_valid_ether_addr(ndev->dev_addr) && pdata != NULL) {
                mac_src = "platform data";
                memcpy(ndev->dev_addr, pdata->dev_addr, 6);
        }


4、make menuconfig
        [*] Networking support  --->
                Networking options  --->  
               <*> Packet socket                                                
                 <*> Unix domain sockets  
                [*] TCP/IP networking
                  [*]   IP: kernel level autoconfiguration                      
                      [*]     IP: DHCP support                                        
                          [*]     IP: BOOTP support                                        
                      [*]     IP: RARP support
    Device Drivers  --->
        [*] Network device support  --->
            [*]   Ethernet (10 or 100Mbit)  --->
                 <*>   DM9000 support  
            [ ]   Ethernet (1000 Mbit)  --->   去掉
其他的默认

编译出来,在引导信息中就能看到dm9000网卡信息了。

dm9000 Ethernet Driver, V1.31
eth0: dm9000a at d0930000,d0e00004 IRQ 108 MAC: 08:90:90:90:。。。。

5、增加NFS挂载功能
make menuconfig
    File systems  --->
        Network File Systems  --->
            <*>   NFS client support  
             [*]   Root file system on NFS   这个一点要选
            <*>   NFS server support

之后编译出来的内核就能挂载nfs文件系统了
我的是setenv bootargs console=ttySAC0 root=/dev/nfs nfsroot=58.154.51.164:/root/my_root ip=58.154.51.199:58.154.51.164:58.154.51.199:255.255.255.0 :kiss:eth0:off


mmc1: mmc_rescan_try_freq: trying to init card at 100000 Hz
eth0: link down
eth0: link up, 100Mbps, full-duplex, lpa 0xC1E1
IP-Config: Complete:
     device=eth0, addr=58.154.51.199, mask=255.255.255.0, gw=58.154.51.199,
     host=58.154.51.199, domain=, nis-domain=(none),
     bootserver=58.154.51.164, rootserver=58.154.51.164, rootpath=
VFS: Mounted root (nfs filesystem) on device 0:11.
Freeing init memory: 120K


Please press Enter to activate this console. [root@kissBaofish /]#
[root@kissBaofish /]#
[root@kissBaofish /]#
[root@kissBaofish /]#
[ 此帖被prettybxp在2011-08-09 23:10重新编辑 ]
一路走好,下辈子再也不做程序员
级别: 新手上路
UID: 46313
精华: 0
发帖: 1
金钱: 5 两
威望: 1 点
贡献值: 0 点
综合积分: 2 分
注册时间: 2011-05-11
最后登录: 2011-09-19
1楼  发表于: 2011-09-19 21:32
新手报道新手报道,楼主,我按你的操作做了但是,make  zImage 之后boot里面的镜像只有几百KB   然后直接拷贝到SD卡中,用SD卡启动后,木得任何反应,强烈建议楼主一步步的详细点,嘿嘿 照顾下新手,不介意的话手把手交3下我们入门、、、、