资源描述:
《LINUX_网卡驱动分析》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、LinuxDM9000网卡驱动程序完全分析说明仁本文分析基于内核源码版本为linux-2.6.31说明2本文在理解了linux中总线、设备和驱动模型的基础上加以分析代码虽然Linux驱动程序应该是和具体的硬件平台分离的,但是为了更好的理解DM9000的驱动程序,这里还是结合一下Mini2440开发板,这样也可以更好的体会如何实现驱动和平台分离。本文分成以下几个部分:一、Mini2440开发板上DM9000的电气连接和Mach・mini2440.c文件的关系。二、两个重要的结构体介绍:sk_buff和net_device
2、三、具体代码分析一、Mini2440开发板上DM9000的电气连接和Mach-mini2440.c文件的关系Mini2440开发板上DM9000与S3C2440的连接关系如下:SD0"SD15DATA0xDATA15<>INTEINT7/GPF7DM9000CMDADDR2S3C2440■AEN■nGCS4/GPA15IOR#nOEIOW■ME其中片选信号AEN使用了nGCS4,所以网卡的内存区域在BANK4,也就是从地址0x20000000开始。DM9000的TXD[2:0]作为strappin在电路图中是空接的,所
3、以IObase是300Ho屮断使用了EINT7。这些内容在Mach文件屮有如下体现:viewplaincopytoclipboardDrint?1.#defineS3C2410_CS4(0x20000000)2.#defineMACH_MINI2440_DM9K_BASE(S3C2410_CS4+0x300)1.staticstructresourcemini2440_dm9k_resource[]_initdata={2.[0]={3..start=MACHMINI2440DM9KBASE,4..end=MACH_M
4、INI2440_DM9K_BASE+3,5..flags=IORESOURCE_MEM6.},7.[1]={8..start=MACH_MIN12440_DM9K_BASE+4,11..end=MACH_MINI244O_DM9K_BASE+7,12..flags=IORESOURCE_MEM13.},14.[2]={15..start=IRQ_EINT7,16..end=IRQ_EINT7,17..flags=IORESOURCEJRQ
5、IORESOURCE_IRQ_HIGHEDGE,18.}19.};另外在Mach
6、文件中还定义了DM9000平台设备,设备名称为“dm9000”,设备资源就是上而定义的IO和中断资源。代码清单如下:下:viewplaincopytoclipboardprint?1・staticstructdm9000_plat_datamini2440_dm9k_pdata_initdata={2..flags=(DM9000_PLATF_16BITONLY
7、DM9000_PLATF_NO_EEPROM),3.};4.4.staticstructplatform_devicemini2440_device_eth_
8、initdata={5..name=”dm9000”,6..id=-1,7..numresources=ARRAY_SIZE(mini2440_dm9k_resource),8..resource=mini2440_dm9k_resource,9..dev={10..platform_data=&mini2440_dm9k_pdata,11.},12.};这个DM9000平台设备作为众多平台设备中的一个在扳子初始化的时候就被添加到了总线上。代码清单如下:viewplaincopytoclipboardprint?1.M
9、ACHINE_START(MINI2440,”MINI2440”)2./*Maintainer:MichelPollet*/3..phys_io=S3C2410_PA_UART,4.・io_pg_offst=(((u32)S3C24XX_VA_UART)»18)&Oxfffc,5..bootjDarams=S3C2410_SDRAM_PA+0x100,6..map」o=mini2440_map_io,7..init_machine=mini2440_init,广初始化函数*/8.
10、.initjrq=s3c24xx_init_irq,9..timer=&s3c24xx_timer,10.MACHINE_ENDviewplaincopytoclipboardprint?1.staticvoid_initmini2440」nit(void)2.{3....4■…5.platform_add_devices(min