具体就是按下面的步骤操作的: 1、修改DM9000平台设备 修改/arch/arm/plat-s3c24xx/common-smdk.c文件 (1)、添加要包含的头文件 #if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE) #include <linux/dm9000.h> #endif (2)、添加DM9000的平台设备结构 #if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE) /*DM9000*/ static struct resource s3c_dm9k_resource[]={ [0] = { .start = S3C2410_CS4, //ADDR2 = 0 .end = S3C2410_CS4 + 3, .flags = IORESOURCE_MEM, }, [1] = { .start = S3C2410_CS4 + 4, //ADDR2 = 1 .end = S3C2410_CS4 + 4 + 3, .flags = IORESOURCE_MEM, }, [2] = { .start = IRQ_EINT7, .end = IRQ_EINT7, .flags = IORESOURCE_IRQ, } }; static struct dm9000_plat_data s3c_dm9k_platdata = { .flags = DM9000_PLATF_16BITONLY, }; static 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, } }; #endif (3)、将DM9000平台设备加入内核设备列表中 /* devices we initialise */ 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 }; 2、修改drivers/net/dm9000.c dm9000.c中包含dm9000_probe函数,该函数完成DM9000设备的枚举,dm9000_probe函数的介绍在《嵌入式Linux应用开发完全手册》一书中详细介绍。 (1)、添加必要的头文件 #if defined(CONFIG_ARCH_S3C2410) #include <mach/regs-mem.h> #endif (2)、在dm9000_probe中设置存储器使BANK4可用,设置默认MAC地址(也可以在根文件系统启动脚本设置),添加的代码如下: /* * Search DM9000 board, allocate space and register it */ static int __devinit dm9000_probe(struct platform_device *pdev) { … #if defined(CONFIG_ARCH_S3C2410) unsigned int oldval_bwscon; //用来保存BWSCON寄存器的值 unsigned int oldval_bankcon4; //用来保存S3C2410_BANKCON4寄存器的值 #endif … #if defined (CONFIG_ARCH_S3C2410) //设置BANK4:总线宽度为16,使能nWAIT 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; //设置BANK4的时间参数 oldval_bankcon4 = *((volatile unsigned int *)S3C2410_BANKCON4); *((volatile unsigned int *)S3C2410_BANKCON4) = 0x1f7c; #endif … if (!is_valid_ether_addr(ndev->dev_addr)) dev_warn(db->dev, "%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 … out: 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 (3)、指定注册中断时的触发方式 dm9000_open(struct net_device *dev) { … irqflags |= IRQF_SHARED; #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 //if (request_irq(dev->irq, &dm9000_interrupt, irqflags, dev->name, dev)) return -EAGAIN; … } 三、在内核中增加对网卡DM9000的配置 在内核目录下执行“make menuconfig”命令进行如下的配置: Device Drivers---> [*]Network device support---> [*]Ethernet(10 or 100Mbit)---> <*>DM9000 support [*]Networking support---> Networking options---> <*>TCP/IP networking <*>IP:kernel leel autoconfiguration //增加对nfs的支持 File systems---> [*]Networking File Systems---> <*>NFS client support [*]NFS client support for NFS version 3 [*]NFS client support for the NFSv3 ACL protocol extension [*]Boot file system on NFS [*]NFS server support 四、修改根文件系统启动脚本rcS 在根文件etc/init.d/rcS文件中添加如下: echo "network interface" /sbin/ifconfig lo 127.0.0.1 /sbin/ifconfig eth0 192.168.1.230 up route add default gw 192.168.1.1 参考的是别人的流程 我修改完成烧写内核启动 出现了 ............................................... network interface dm9000 dm9000.0: WARNING: no IRQ resource flags set. eth0: link down ............................................. 有兄弟遇到过这个问题吗? | |||
![]() |
|
【1楼】 aduo 积分:181 派别: 等级:------ 来自: | 问题解决了 把 [2] = { .start = IRQ_EINT7, .end = IRQ_EINT7, .flags = IORESOURCE_IRQ, } 修改为 [2] = { .start = IRQ_EINT7, /* 中断号*/ .end = IRQ_EINT7, .flags = IORESOURCE_IRQ | IRQF_TRIGGER_RISING } 就可以了,具体原因不明白。 linux真是麻烦啊 |