mini6410移植全攻略(13)--linux2.6.39 移植之支持dm9000

<style type="text/css"> <!-- @page {margin:2cm} p {margin-bottom:0.21cm} --> </style>


本文由muge0913编写,希望给嵌入开发者带来一些帮助,并希望能和大家交流技术,若有不对的地方,或有更好的方法请指出。

转载请注明出处:http://blog.csdn.net/muge0913/article/details/7242677


、vi include/linux/dm9000.h


28行增加
unsignedchar param_addr[6];

如下:



structdm9000_plat_data { unsignedint flags; unsignedchar dev_addr[6]; unsignedchar param_addr[6]; /*allow replacement IO routines */ void (*inblk)(void__iomem *reg, void *data, int len); void (*outblk)(void__iomem *reg, void *data, int len); void (*dumpblk)(void__iomem *reg, int len); };


、viarch/arm/mach-s3c64xx/mach-th6410.c
添加头文件:

/*更改网卡头文件*/ //#include<linux/smsc911x.h> #include<linux/dm9000.h>


增加

#defineS3C64XX_PA_DM9000 (0x18000000) #define S3C64XX_SZ_DM9000SZ_1M #define S3C64XX_VA_DM9000 S3C_ADDR(0x03b00300) staticstruct 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_datadm9000_setup = { .flags = DM9000_PLATF_16BITONLY, .dev_addr = {0x08, 0x90, 0x00, 0xa0, 0x90, 0x90 }, }; static structplatform_device s3c_device_dm9000 = { .name = "dm9000", .id= 0, .num_resources = ARRAY_SIZE(dm9000_resources), .resource =dm9000_resources, .dev = { .platform_data =&dm9000_setup, } };


增加mac 地址设置函数
staticint __init dm9000_set_mac(char *str) { unsigned charaddr[6]; unsigned int val; int idx = 0; char *p = str,*end; while (*p && idx < 6) { val =simple_strtoul(p, &end, 16); if (end <= p) { /* convertfailed */ 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); } return1; } __setup("ethmac=",dm9000_set_mac);


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



最后在staticstruct platform_device *th6410_devices[] __initdata 的初始化设备中
&th6410_smsc911x,
改成

&s3c_device_dm9000,


、vidrivers/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); }



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

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

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


本文由muge0913编写,希望给嵌入开发者带来一些帮助,并希望能和大家交流技术,若有不对的地方,或有更好的方法请指出。

转载请注明出处:http://blog.csdn.net/muge0913/article/details/7242677






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值