Chinaunix首页 | 论坛 | 博客
  • 博客访问: 853702
  • 博文数量: 286
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1980
  • 用 户 组: 普通用户
  • 注册时间: 2014-05-04 16:41
文章分类

全部博文(286)

文章存档

2020年(2)

2018年(5)

2017年(95)

2016年(69)

2015年(15)

2014年(100)

我的朋友

分类: 嵌入式

2014-09-09 08:29:41

Linux移植开发指南学习笔记(四) 移植DM9000网卡驱动(Fedora9)
1、设备资源初始化
    Linux-2..6.32.2已经自带了完善的DM9000网卡驱动驱动(源代码位置:linux-2.6.32.2/ drivers/net/dm9000.c),它也是一个平台设备,因此在目标平台初始化代码中(即mach-mini2440.c中),只要填写好相应的结构表即可,具体步骤如下:
    
    首先添加驱动所需的头文件dm9000.h:
    #include  
    
    再定义DM9000网卡设备的物理基地址,以便后面用到:
    /* DM9000AEP 10/100 ethernet controller */ 
    #define MACH_MINI2440_DM9K_BASE  (S3C2410_CS4 + 0x300)      //间隔开

    再填充该平台设备的资源设置,以便和DM9000网卡驱动接口配合起来,如下
static struct resource mini2440_dm9k_resource[] = { 
    [0] = { 
                .start = MACH_MINI2440_DM9K_BASE, 
                .end = MACH_MINI2440_DM9K_BASE + 3, 
                .flags = IORESOURCE_MEM 
    }, 
    [1] = { 
                .start = MACH_MINI2440_DM9K_BASE + 4, 
                .end = MACH_MINI2440_DM9K_BASE + 7, 
                .flags = IORESOURCE_MEM 
    }, 
    [2] = { 
                .start = IRQ_EINT7, 
                .end = IRQ_EINT7, 
                .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE, 
    } 
}; 
/* 
 *   *   * The DM9000 has no eeprom, and it's MAC address is set by 
* * * the bootloader before starting the kernel. 
* * */ 
static struct dm9000_plat_data mini2440_dm9k_pdata = { 
                .flags = (DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM), 
}; 
static struct platform_device mini2440_device_eth = { 
                .name = "dm9000", 
                .id = -1, 
                .num_resources  = ARRAY_SIZE(mini2440_dm9k_resource), 
                .resource = mini2440_dm9k_resource, 
        .dev = { 
                .platform_data = &mini2440_dm9k_pdata, 
        }, 
}; 

    同时在mini2440设备集中添加上面做好的网卡平台设备,如下红色部分
static struct platform_device *mini2440_devices[] __initdata = { 
                        &s3c_device_usb, 
                        &s3c_device_lcd, 
                        &s3c_device_wdt, 
                        &s3c_device_i2c0, 
                        &s3c_device_iis, 
                        &mini2440_device_eth, 
                        &s3c_device_nand, 
};

这样,DM9000平台设备的接口就填完了


2、调整DM9000所用的位宽寄存器
    因为Linux-2.6.32.2的DM9000网卡驱动并不是专门为mini2440准备的,所以还要在其源代码中(即dm9000.c中)做一些移植工作,如下步骤。

    打开linux-2.6.32.2/ drivers/net/dm9000.c,头文件处添加2410相关的配置定义,如下红色部分:
#include  
#include  
#include  

#if defined(CONFIG_ARCH_S3C2410) 
#include  
#endif 

#include "dm9000.h" 


    在dm9000设备的初始化函数中添加如下红色部分,这里是配置DM9000所用片选总线的时序,因为mini2440目前只有一个通过总线外扩的设备,在此设备驱动中直接修改相关的寄存器配置会更加容易理解一些,当然这部分也可以放到mach-mini2440.c中,你可以自行实验一下,在此不再赘述。

static int __init 
dm9000_init(void) 

#if defined(CONFIG_ARCH_S3C2410) 
        unsigned int oldval_bwscon = *(volatile unsigned int *)S3C2410_BWSCON; 
        unsigned int oldval_bankcon4 = *(volatile unsigned int *)S3C2410_BANKCON4; 
        *((volatile unsigned int *)S3C2410_BWSCON) = 
                        (oldval_bwscon  &  ~(3<<16))  |  S3C2410_BWSCON_DW4_16  | S3C2410_BWSCON_WS4 | S3C2410_BWSCON_ST4; 
         *((volatile unsigned int *)S3C2410_BANKCON4) = 0x1f7c; 
#endif 
        printk(KERN_INFO "%s Ethernet Driver, V%s\n", CARDNAME, DRV_VERSION); 
        return platform_driver_register(&dm9000_driver); 
}

3、关于MAC地址
    需要注意的是,本开发板所用的DM9000网卡并没有外接EEPROM用以存储MAC地,因此系统中的MAC地址是一个“软”地址,也就是可以通过软件进行修改,可以随意改为其他值,在static int __devinit dm9000_probe(struct platform_device *pdev)函数中可以看出:

到此DM9000就已经移植结束

4、配置内核加入DM9000,并编译运行测试
    此时会带内核源代码目录,执行:
#make menuconfig 
    开始在内核中配置网卡驱动,依次选择如下菜单项
Device Drivers   --->Network device support  ---> Ethernet (10 or 100Mbit)   ---> 
    即可找到DM9000的配置项,可以看到DM9000已经被选中,这是因为Linux-2.6.32.2默认的内核配置已经加入了DM9000的支持

    然后执行:
#make zImage 
    最后生成arch/arm/boot/zImage文件,使用”k”命令把它烧写到开发板,并使用默认的文件系统启动,在命令行终端运行ifconfig命令可以看到如图所示。

DNW USB一插上就蓝屏,驱动不对。
参考解决了。稳定,再也不用担心下载问题了。^。

下载运行
Try to bring eth0 interface up......eth0: link down  (失败了,哪出问题了?)

进入
[root@FriendlyARM /]# ifconfig
eth0      Link encap:Ethernet  HWaddr 08:90:90:90:90:90
          inet addr:192.168.1.230  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:15 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1152 (1.1 KiB)  TX bytes:0 (0.0 B)
          Interrupt:51 Base address:0xe300


lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
参数没问题。。。启动了,不知道上面是什么问题??

阅读(678) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~