• «
  • 1
  • 2
  • »
  • Pages: 1/2     Go
主题 : 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: 19229
精华: 0
发帖: 88
金钱: 455 两
威望: 91 点
贡献值: 0 点
综合积分: 176 分
注册时间: 2010-04-17
最后登录: 2021-10-20
1楼  发表于: 2011-07-29 11:10
我用它自带的也可以啊,为什么一定要改呢
级别: 总版主
UID: 45585
精华: 3
发帖: 628
金钱: 3375 两
威望: 675 点
贡献值: 3 点
综合积分: 1316 分
注册时间: 2011-05-06
最后登录: 2018-10-18
2楼  发表于: 2011-08-08 15:40
顶起来
级别: 新手上路
UID: 46313
精华: 0
发帖: 1
金钱: 5 两
威望: 1 点
贡献值: 0 点
综合积分: 2 分
注册时间: 2011-05-11
最后登录: 2011-09-19
3楼  发表于: 2011-09-19 21:32
新手报道新手报道,楼主,我按你的操作做了但是,make  zImage 之后boot里面的镜像只有几百KB   然后直接拷贝到SD卡中,用SD卡启动后,木得任何反应,强烈建议楼主一步步的详细点,嘿嘿 照顾下新手,不介意的话手把手交3下我们入门、、、、
级别: 侠客
UID: 52800
精华: 0
发帖: 60
金钱: 310 两
威望: 62 点
贡献值: 0 点
综合积分: 120 分
注册时间: 2011-07-25
最后登录: 2012-10-10
4楼  发表于: 2011-09-20 14:19
顶起来
x先生
级别: 新手上路
UID: 57972
精华: 0
发帖: 6
金钱: 30 两
威望: 6 点
贡献值: 0 点
综合积分: 12 分
注册时间: 2011-11-01
最后登录: 2011-11-21
5楼  发表于: 2011-11-01 11:25
能下载不?
级别: 新手上路
UID: 27676
精华: 0
发帖: 38
金钱: 190 两
威望: 38 点
贡献值: 0 点
综合积分: 76 分
注册时间: 2010-08-30
最后登录: 2013-06-24
6楼  发表于: 2012-01-07 18:18
谢谢prettybxp~
NFS文件系统挂载成功,说明一下我的步骤:
开发板:tiny6410
linux主机:Ubuntu 11.10
说明:依据参考资料(http://www.aiothome.net/read.php?tid-14211.html,《tiny6410Linux开发指南》1.3.4 配置网络文件系统NFS服务)的说明,在linux-2.6.38,内核中依次添加了nand、yaffs2文件系统补丁(非必须)、DM9000网口组件、NFS文件系统支持,可以成功启动内核,获取IP地址,进入NFS文件系统。
测试办法:通过在SD卡中的superboot引导开发板启动,串口打印出superboot控制选项,设置superboot参数(详情见下文);然后在win7下,运行DNW下载工具,通过USB依次下载开发板tiny6410光盘B自带的已经编译好的u-boot,自己编译的内核镜像zImage,最后让superboot启动系统即可。
以上提到的工具组件等,由开发板厂商友善之臂提供的有:superboot、u-boot、DNW、文件系统,以及tiny6410开发板

详细步骤如下:

1、在linux主机上,准备文件系统
(1)复制开发板光盘tiny6410A-201110/Linux/rootfs_qtopia_qt4-20111018.tgz到Linux主机下,该tgz文件即为压缩后的文件系统;
(2)解压该文件系统到NFS共享目录下,生成rootfs_qtopia_qt4文件夹,该文件夹内为tiny6410的根文件系统,本次试验文件系统的位置在,主机:/home/a4/tiny6410portlinux2638/targetNFS/rootfs_qtopia_qt4
(3)开放文件夹rootfs_qtopia_qt4的权限为所有用户可读写执行(此步可能不需要,因为该文件的读写执行属性可以由NFS配置时设定)
host$chmod 777 rootfs_qtopia_qt4

2、在linux主机上,准备NFS服务器
(1)安装NFS服务器
host$sudo apt-get install nfs-kernel-server
(2)配置NFS服务器
host$sudo gedit /etc/exports
第一次打开该文件是空的,输入:
/home/a4/tiny6410portlinux2638/targetNFS/rootfs_qtopia_qt4 *(rw,sync,no_root_squash)
* 表示所有的客户机都可以挂接此目录,也可以限定一定的IP范围,如192.168.52.*,甚至为具体IP的客户机
rw 表示挂接此目录的客户机对该目录有读写的权力
no_root_squash 表示允许挂接此目录的客户机享有该主机的root身份
(3)启动NFS服务器
host$sudo /etc/init.d/nfs-kernel-server start
确定NFS服务器启动
host$sudo /etc/init.d/nfs-kernel-server status
nfsd running
Ubuntu 11.10启动时默认启动NFS。

3、启动tiny6410,并在其串口终端下配置superboot或u-boot
在superboot或u-boot命令行下,输入命令s并回车
接着输入:
console=ttySAC0 root=/dev/nfs nfsroot=IP0:/home/a4/tiny6410portlinux2638/targetNFS/rootfs_qtopia_qt4 ip=IP1:IP0:IP2:IP3:nameofyoulike:eth0:off
各参数的含义如下:
nfsroot是开发主机的IP地址,如果你使用了虚拟机,该地址是虚拟机中linux的IP地址,总之,它是直接提供NFS服务的Linux系统IP地址。
其中:
第一项(IP1)是目标板的临时IP(注意不要和局域网内其他IP冲突);
第二项(IP0)是开发主机的IP;
第三项(IP2)是目标板上网关(GW)的设置,这个参数设置为跟主机网关一直;
第四项(IP3)是子网掩码;
第五项(nameofyoulike)是开发主机的名字(一般无关紧要,可随便填写)
eth0是网卡设备的名称。
在superboot或u-boot命令行下,输入命令b并回车,系统即可启动并加载NFS文件系统。

4、附加实验-快速切换NFS文件系统或yaffs2文件系统
鉴于本次试验之前已经在NAND Flash中烧写了yaffs2文件系统,所以可以通过设置启动参数来切换选择NFS或yaffs2文件系统。
切换为yaffs2文件系统具体操作:在superboot或u-boot下,设置启动参数为:root=/dev/mtdblock2 console=ttySAC0,115200
切换为yaffs2文件系统的启动参数为:console=ttySAC0 root=/dev/nfs nfsroot=IP0:/home/a4/tiny6410portlinux2638/targetNFS/rootfs_qtopia_qt4 ip=IP1:IP0:IP2:IP3:nameofyoulike:eth0:off
级别: 新手上路
UID: 62096
精华: 0
发帖: 16
金钱: 80 两
威望: 16 点
贡献值: 0 点
综合积分: 32 分
注册时间: 2012-01-14
最后登录: 2012-04-06
7楼  发表于: 2012-02-02 19:47
我用原版刚解压的linux 2.6.38照你的方法做不行啊。

1、下载linux-2.6.38的源码,ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.38.tar.bz2
2、解压 tar xvfj /mnt/ubuntu/linux-2.6.38.tar.bz2 -C .
3、vi Makefile       191行改为    ARCH            ?= arm
4、cp arch/arm/configs/s3c6400_defconfig .config
5、make menuconfig
5、General setup->(/usr/4.5.1/bin/arm-linux-) Cross-compiler tool prefix    我将编译器解压到了/usr/4.5.1目录
       System Type->[*] MINI6410   选上,其他的可以去掉,不确定的可以参考友善之臂的

这几步以后按照你写的做不行
eth0: link down
eth0: link up, 100Mbps, full-duplex, lpa 0xC5E1
IP-Config: Complete:
     device=eth0, addr=192.168.1.102, mask=255.255.255.0, gw=192.168.1.102,
     host=192.168.1.102, domain=, nis-domain=(none),
     bootserver=192.168.1.100, rootserver=192.168.1.100, rootpath=
VFS: Mounted root (nfs filesystem) on device 0:11.
Freeing init memory: 144K
nfs: server 192.168.1.100 not responding, still trying
nfs: server 192.168.1.100 not responding, still trying
nfs: server 192.168.1.100 OK
nfs: server 192.168.1.100 OK
然后就没有反应了

我编译友善提供的linux 2.6.38就可以成功挂载,说明主机NFS服务没问题啊?怎么就连接不上呢??
生活是一系列的选择与决心
级别: 侠客
UID: 58970
精华: 0
发帖: 52
金钱: 265 两
威望: 53 点
贡献值: 0 点
综合积分: 104 分
注册时间: 2011-11-16
最后登录: 2014-06-16
8楼  发表于: 2012-03-19 21:20

 回 6楼(kkklll) 的帖子

按照这个做的 不过出现错误:

VFS: Unable to mount root fs via NFS, trying floppy.
VFS: Cannot open root device "nfs" or unknown-block(2,0)
Please append a correct "root=" boot option; here are the available partitions:
1f00            4096 mtdblock0  (driver?)
1f01            8192 mtdblock1  (driver?)
1f02         2084864 mtdblock2  (driver?)
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)
[<c002fe10>] (unwind_backtrace+0x0/0xe4) from [<c02b6e14>] (panic+0x50/0x16c)
[<c02b6e14>] (panic+0x50/0x16c) from [<c0008edc>] (mount_block_root+0x1b8/0x1f8)

[<c0008edc>] (mount_block_root+0x1b8/0x1f8) from [<c00090b8>] (mount_root+0xa0/0
xc0)
[<c00090b8>] (mount_root+0xa0/0xc0) from [<c0009238>] (prepare_namespace+0x160/0
x1b4)
[<c0009238>] (prepare_namespace+0x160/0x1b4) from [<c0008b38>] (kernel_init+0x10
8/0x148)
[<c0008b38>] (kernel_init+0x108/0x148) from [<c002b548>] (kernel_thread_exit+0x0
/0x8)
bootargs 设置:console=ttySAC0 root=/dev/nfs nfsroot=10.17.23.211:/home/rootfs ip=10.17.23.209:10.17.23.211:10.17.23.1:255.255.255.0:linux:eth0:off

希望指点一下……谢谢
级别: 新手上路
UID: 21524
精华: 0
发帖: 18
金钱: 90 两
威望: 18 点
贡献值: 0 点
综合积分: 36 分
注册时间: 2010-05-17
最后登录: 2012-09-06
9楼  发表于: 2012-05-22 12:00
顶起来!!!
  • «
  • 1
  • 2
  • »
  • Pages: 1/2     Go