1.1.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平台设备的接口就填完了。 1.1.2 调整DM9000所用的位宽寄存器 因为Linux-2.6.32.2的DM9000网卡驱动并不是专门为mini2440准备的,所以还要在其源代码中做一些移植工作,如下步骤。打开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中(注意将这部分放在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%sn", CARDNAME, DRV_VERSION); return platform_driver_register(&dm9000_driver); } 1.1.3 关于MAC地址 需要注意的是,本开发板所用的DM9000网卡并没有外接EEPROM用以存储MAC地址,因此系统中的MAC地址是一个“软”地址,也就是可以通过软件进行修改,可以随意改为其他值,在static int __devinit dm9000_probe(struct platform_device *pdev)函数中可以看出: /* try reading the node address from the attached EEPROM */ //尝试从EEPROM读取MAC地址 for (i = 0; i < 6; i += 2) dm9000_read_eeprom(db, i / 2, ndev->dev_addr+i); if (!is_valid_ether_addr(ndev->dev_addr) && pdata != NULL) { mac_src = "platform data"; memcpy(ndev->dev_addr, pdata->dev_addr, 6); } if (!is_valid_ether_addr(ndev->dev_addr)) { /* try reading from mac */ mac_src = "chip"; for (i = 0; i < 6; i++) ndev->dev_addr[i] = ior(db, i+DM9000_PAR); } //使用“软”MAC地址: 08:90:90:90:90:90 memcpy(ndev->dev_addr, "x08x90x90x90x90x90", 6); if (!is_valid_ether_addr(ndev->dev_addr)) dev_warn(db->dev, "%s: Invalid ethernet MAC address. Please " "set using ifconfign", ndev->name); 实际上到此为止DM9000就已经移植结束了。 1.1.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 命令可以看到如下所示。 [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 MULTICAST MTU:1500 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:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) Interrupt:51 Base address:0x300 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) 测试网络:ping 127.0.0.1,等号后面有数的话,就是网卡正常ping 网关地址,等号后面有数的话,就是和网关连接正常ping 别的主机的IP,等号后面有数的话,就是和别的主机连接正常.
上一篇:linux2.6.32.2 mini2440平台移植-- 激活 RTC 驱动
下一篇:linux 2.6.32.2 mini2440平台移植--内核移植、yaffs2文件系统移植
推荐阅读最新更新时间:2024-11-11 22:35
设计资源 培训 开发板 精华推荐
- DC1525A-H,基于 LTC2174-12、12 位、105Msps、1.8V 四路串行 ADC 的演示板
- MPC8XXFADS,基于 MPC850 MPU PowerQUICC MPC8xx 处理器的参考设计板
- DC895A-A,使用 LT3485EDD-0、500mA 输入电流、2.8 至 4.2Vin、1.8 至 4.2VBat、5V 最大闪光灯充电器的演示板
- 使用 Analog Devices 的 REF194 的参考设计
- MIKROE-3443,用于 ACS723 高精度电流隔离电流传感器的霍尔电流 6 Click 板
- EVAL-AD7952CBZ,AD7952 评估板,14 位,1 Msps PulSAR 模数转换器
- VN7040AS评估板
- LF90CPT-TR 9V 极低压降稳压器的典型应用,带开关
- 用于电池充电指示器的 NCP300LSN34T1 3.4V 电压检测器的典型应用
- NCP382LMN20AGEVB:2.0 A DFN 评估板