Linux DM9000网卡驱动程序完全分析


说明1:本文分析基于内核源码版本为linux-2.6.31
说明2:本文在理解了linux中总线、设备和驱动模型的基础上加以分析代码

虽然Linux驱动程序应该是和具体的硬件平台分离的,但是为了更好的理解DM9000的驱动程序,这里还是结合一下Mini2440开发板,这样也可以更好的体会如何实现驱动和平台分离。

本文分成以下几个部分:
一、Mini2440开发板上DM9000的电气连接和Mach-mini2440.c文件的关系。
二、两个重要的结构体介绍:sk_buff和net_device
三、具体代码分析

一、Mini2440开发板上DM9000的电气连接和Mach-mini2440.c文件的关系
Mini2440开发板上DM9000与S3C2440的连接关系如下:  
 
其中片选信号AEN使用了nGCS4,所以网卡的内存区域在BANK4,也就是从地址0x20000000开始。DM9000的TXD[2:0]作为strap pin在电路图中是空接的,所以IO base是300H。中断使用了EINT7。这些内容在Mach文件中有如下体现:

 

  1. #define S3C2410_CS4 (0x20000000)  
  2. #define MACH_MINI2440_DM9K_BASE (S3C2410_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] = {    
  10.         .start = MACH_MINI2440_DM9K_BASE + 4,    
  11.         .end   = MACH_MINI2440_DM9K_BASE + 7,    
  12.         .flags = IORESOURCE_MEM    
  13.     },    
  14.     [2] = {    
  15.         .start = IRQ_EINT7,    
  16.         .end   = IRQ_EINT7,    
  17.         .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,    
  18.     }    
  19. };  

另外在Mach文件中还定义了DM9000平台设备,设备名称为“dm9000”,设备资源就是上面定义的IO和中断资源。代码清单如下:

 

  1. static struct dm9000_plat_data mini2440_dm9k_pdata __initdata = {   
  2.     .flags      = (DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM),   
  3. };   
  4.   
  5. static struct platform_device mini2440_device_eth __initdata = {   
  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. };  

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9..
  • 13
  • 下一页

相关内容