资源描述:
《linux_dm9000网卡驱动程序完全分析》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、LinuxDM9000网卡驱动程序完全分析说明1:本文分析基于内核源码版本为linux-2.6.31 说明2:本文在理解了linux中总线、设备和驱动模型的基础上加以分析代码虽然Linux驱动程序应该是和具体的硬件平台分离的,但是为了更好的理解DM9000的驱动程序,这里还是结合一下Mini2440开发板,这样也可以更好的体会如何实现驱动和平台分离。本文分成以下几个部分: 一、Mini2440开发板上DM9000的电气连接和Mach-mini2440.c文件的关系。二、两个重要的结构体介绍:sk_buff和net_device 三、具体代码分析一、Mini24
2、40开发板上DM9000的电气连接和Mach-mini2440.c文件的关系 Mini2440开发板上DM9000与S3C2440的连接关系如下: 其中片选信号AEN使用了nGCS4,所以网卡的内存区域在BANK4,也就是从地址0x20000000开始。DM9000的TXD[2:0]作为strappin在电路图中是空接的,所以IObase是300H。中断使用了EINT7。这些内容在Mach文件中有如下体现: 1.#define S3C2410_CS4 (0x20000000) 2.#define MACH_MINI2440_DM9K_BASE (S3C
3、2410_CS4 + 0x300) 3.static struct resource mini2440_dm9k_resource[] __initdata = { 4. [0] = { 5. .start = MACH_MINI2440_DM9K_BASE, 6. .end = MACH_MINI2440_DM9K_BASE + 3, 7. .flags = IORESOURCE_MEM 8. }, 9. [1] = { 1. .start = MA
4、CH_MINI2440_DM9K_BASE + 4, 2. .end = MACH_MINI2440_DM9K_BASE + 7, 3. .flags = IORESOURCE_MEM 4. }, 5. [2] = { 6. .start = IRQ_EINT7, 7. .end = IRQ_EINT7, 8. .flags = IORESOURCE_IRQ
5、 IORESOURCE_IRQ_HIGHEDGE, 9. } 10.}
6、; 另外在Mach文件中还定义了DM9000平台设备,设备名称为“dm9000”,设备资源就是上面定义的IO和中断资源。代码清单如下: 1.static struct dm9000_plat_data mini2440_dm9k_pdata __initdata = { 2. .flags = (DM9000_PLATF_16BITONLY
7、 DM9000_PLATF_NO_EEPROM), 3.}; 4. 5.static struct platform_device mini2440_device_eth __initdata
8、= { 6. .name = "dm9000", 7. .id = -1, 8. .num_resources = ARRAY_SIZE(mini2440_dm9k_resource), 9. .resource = mini2440_dm9k_resource, 10. .dev = { 11. .platform_data = &mini2440_dm9k_pdata, 12. }, 13.}; 这个DM9000平台设备作为众多平台设备中的一个在扳
9、子初始化的时候就被添加到了总线上。代码清单如下:1.MACHINE_START(MINI2440, "MINI2440") 2. /* Maintainer: Michel Pollet */ 3. .phys_io = S3C2410_PA_UART, 4. .io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc, 5. .boot_params = S3C2410_SDRAM_PA + 0x100, 6.
10、 .map_io = mini