网卡驱动DM9000-基于uboot

Posted 四季帆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网卡驱动DM9000-基于uboot相关的知识,希望对你有一定的参考价值。

1. 概念

网卡是一块被设计用来允许计算机在计算机网络上进行通讯的计算机硬件,它使得用户可以通过电缆或无线相互连接。

每一个网卡都有一个被称为MAC地址的独一无二的48位串行号,它被写在卡上的一块ROM中。在网络上的每一个计算机都必须拥有一个独一无二的MAC地址。没有任何两块被生产出来的网卡拥有同样的地址。这是因为电气电子工程师协会(IEEE)负责为网络接口控制器(网卡)销售商分配唯一的MAC地址。

网卡上面装有处理器和存储器(包括RAM和ROM)。网卡和局域网之间的通信是通过电缆或双绞线以串行传输方式进行的;而网卡和计算机之间的通信则是通过计算机主板上的I/O总线以并行传输方式进行。因此,网卡的一个重要功能就是要进行串行/并行转换,由于网络上的数据率和计算机总线上的数据率并不相同,因此在网卡中必须装有对数据进行缓存的存储芯片。

 

2. DM9000

DM9000芯片是DAVICOM公司生产,DM9000A 是一款完全集成的、性价比高、引脚数少、带有通用处理器接口的单芯片快速以太网控制器。

 

3. 原理图分析

3.1 引脚

结合DM9000的数据手册,搞清楚各个引脚的作用。

3.2 控制器

将DM9000的所有引脚分析一遍以后发现,大部分的功能引脚都连接到了SOC的SROM/NAND/ONENAND控制器部分

接下来就去主控芯片寻找SROM/NAND/ONENAND控制器部分的讲解内容,对比三个控制器的IO描述可知,当前单板上的DM9000芯片是连接在SOC的SROM控制器上的,那么我们要控制DM9000就要去读写SROM控制器中的寄存器。

 

3.3 SOC寄存器

针对SROM控制器的寄存器只有两个,SROM_BW和SROM_BCn;S5PV210的SROM控制器支持6个bank,我手上的这个单板,上面的DM9000上的片选引脚是连接在SOC的Xm0CSn1上的,即DM9000连接在bank1上,其对应的寄存器是SROM_BW和SROM_BC1。

 

4. 代码分析

4.1 启动过程

这里分析的是1.3.4版本的uboot。不同版本的uboot启动主脉络略有区别,感兴趣的可以看我的另一篇博客《uboot启动流程》

uboot在启动过程中,会遍历并执行 init_sequence 数组中的所有函数指针,其中有一个函数指针board_init,该函数中对SROM控制器进行了初始化。

4.2 初始化SROM控制器

board_init 函数实现在uboot/lib_arm/board.c中

int board_init(void)
{
	DECLARE_GLOBAL_DATA_PTR;
#ifdef CONFIG_DRIVER_SMC911X
	smc9115_pre_init();
#endif
#ifdef CONFIG_DRIVER_DM9000  //要想使用DM9000,这个宏得打开
	dm9000_pre_init();      //----->
#endif
	gd->bd->bi_arch_number = MACH_TYPE;
	gd->bd->bi_boot_params = (PHYS_SDRAM_1+0x100);
	return 0;
}
----------------------------------------------------------------------------------
static void dm9000_pre_init(void)
{
	unsigned int tmp;
#if defined(DM9000_16BIT_DATA)  //原理图中使用了16根数据线
	SROM_BW_REG &= ~(0xf << 4);  //设置 SROM_BW 寄存器,前面有分析到
	SROM_BW_REG |= (1<<7) | (1<<6) | (1<<5) | (1<<4);
#else     //不成立
	SROM_BW_REG &= ~(0xf << 4);
	SROM_BW_REG |= (0<<6) | (0<<5) | (0<<4);
#endif
    //设置 SROM_BC1 寄存器,前面有分析到
	SROM_BC1_REG = ((0<<28)|(1<<24)|(5<<16)|(1<<12)|(4<<8)|(6<<4)|(0<<0));
	tmp = MP01CON_REG;
	tmp &=~(0xf<<4);
	tmp |=(2<<4);
	MP01CON_REG = tmp;
}

4.3 DM9000驱动分析

DM9000相关的功能代码在uboot/drivers/net/dm9000x.c中,在该文件中提供了对DM9000的初始化、读写、控制等各种接口,而且这些接口都被声明为全局函数,所以其它的功能模块可以直接调用。

以网络功能中最常用的Ping命令为例

do_ping()                          //在net/net.c中实现
    --->NetLoop(PING)              
        --->eth_init(bd)           //在drivers/net/dm9000x.c中实现,该函数的功能是初始化DM9000芯片
        --->PingStart()            //在net/net.c中实现
            --->PingSend()
                --->ArpRequest()
                    --->eth_send()   //在drivers/net/dm9000x.c中实现,通过控制DM9000间接发送信息    

 

附录:SROM和光纤连接器

1. 简单介绍一下 SROM 哈!SROM 是高速存储器,Cache 技术就是通过在 DROM 和 CPU 之间插入一小块 SROM 来减小 CPU 和存储之间的速度差异的。SROM是SRAM和ROM的总称

2. 光纤连接器长下面这样:

 

以上是关于网卡驱动DM9000-基于uboot的主要内容,如果未能解决你的问题,请参考以下文章

23.从0学ARM-网卡DM9000及uboot协议栈详解

一,Linux-3.19内核移植DM9000驱动(JZ2440)

嵌入式Linux驱动学习之路(二十六)DM9000C网卡驱动程序

使U_boot支持DM9000网卡芯片;编译出错:No rule to make target'dm9000.c'.need by'.depend'.stop

DM9000裸机驱动程序设计

STM32入门开发: LWIP网络协议栈移植(网卡采用DM9000)