linux设备驱动-DM9000移植

来源:互联网 发布:艺术家 知乎 编辑:程序博客网 时间:2024/05/18 00:02

一、开发环境

1、内核:Linux 2.6.22.6;

2、JZ2440

3、ubuntu9.10

二、移植过程

1、添加头文件在内核目录下的/arch/arm/plat-s3c24xx/commom-smdk.c文件中添加
#if defined (CONFIG_DM9000) || defined (CONFIG_DM9000_MODULE)
#include <linux/dm9000.h>
#endif
2、添加DM9000平台设备结构。内核目录下的/arch/arm/plat-s3c24xx/commom-smdk.c文件中添加
/* DM9000 Device */

#if defined (CONFIG_DM9000) || defined (CONFIG_DM9000_MODULE)
static struct resource s3c_dm9k_resource[] = {
[0] = {
.start = S3C2410_CS4,
.end   = S3C2410_CS4+0x3,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = S3C2410_CS4+0x4,
.end   = S3C2410_CS4+0x4+0x3,
.flags = IORESOURCE_MEM,
},
[2] = {
.start = IRQ_EINT7,
.end   = IRQ_EINT7,
.flags = IORESOURCE_IRQ,
}
};

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

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,
},
};

EXPORT_SYMBOL(s3c_device_dm9k);
#endif          /* DM9000 Device */

3、加入内核设备列表。
static struct platform_device __initdata *smdk_devs[] = {
&s3c_device_nand,
&smdk_led4,
&smdk_led5,
&smdk_led6,
&smdk_led7,
#if defined (CONFIG_DM9000) || defined (CONFIG_DM9000_MODULE)
&s3c_device_dm9k,
#endif

};
4、修改源码/drivers/net/dm9000.c。
(1)添加头文件
#if defined(CONFIG_ARCH_S3C2410)
#include <asm/arch-s3c2410/regs-mem.h>
#endif

(2)修改/drivers/net/dm9000.c。设置存储控制器使BANK4可用。
 在dm9000_probe()函数中,添加

u32 id_val;
#if defined(CONFIG_ARCH_S3C2410)
unsigned int oldval_bwscon;
unsigned int oldval_bankcon4;
#endif



/* Init network device */
ndev = alloc_etherdev(sizeof (struct board_info));
PRINTK2("dm9000_probe()");
#if defined(CONFIG_ARCH_S3C2410)
oldval_bwscon = *((volatile unsigned int *)S3C2410_BWSCON);
*((volatile unsigned int *)S3C2410_BWSCON) = (oldval_bwscon & ~(3<<16)) | S3C2410_BWSCON_DW4_16 |\
S3C2410_BWSCON_WS4 | S3C2410_BWSCON_ST4;
oldval_bankcon4 = *((volatile unsigned int *)S3C2410_BANKCON4);
*((volatile unsigned int *)S3C2410_BANKCON4) = 0x1f7c;
#endif


printk("%s: not found (%d).\n", CARDNAME, ret);
#if defined(CONFIG_ARCH_S3C2410)
*((volatile unsigned int *)S3C2410_BWSCON) = oldval_bwscon;
*((volatile unsigned int *)S3C2410_BANKCON4) = oldval_bankcon4;
#endif


PRINTK2("entering dm9000_open\n");
#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;


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


printk("%s: not found (%d).\n", CARDNAME, ret);
#if defined(CONFIG_ARCH_S3C2410)
*((volatile unsigned int *)S3C2410_BWSCON) = oldval_bwscon;
*((volatile unsigned int *)S3C2410_BANKCON4) = oldval_bankcon4;
#endif

5、配置内核支持DM9000。

 在内核目录下执行make menuconfig。依次选Device Drives-->Network device support-->[*]Network device support --> Ethernet (10 or 100Mbit)--><*>DM9000 support。如图


6、在内核目录下执行make uImage。在arch/arm/boot/下生成支持DM9000的uImage。


可惜这样能够识别出DM9000,也能设置IP,但并不能ping通。查看资料才知道,jz2440V3使用的是DM9000C,不能直接使用内核里带的DM9000.c,需要

使用厂家提供的dm9dev9000c.c移植,见《linux内核移植-DM9000C移植笔记。这个第二期视频里有讲解。权做了解过程吧。





0 0
原创粉丝点击