X210开发板(S5PV210芯片)uboot移植DM9000驱动移植

前言

本文是介绍在uboot中如何移植DM9000的驱动,并不深入去讲解DM9000芯片的操作时序和内部寄存器,想要读懂驱动代码要仔细阅读DM9000芯片的数据手册。
移植的基础是手里有DM9000芯片可以用的驱动代码,只需要根据开发板中DM9000芯片的接线方式来配置驱动的参数。

SROM控制器介绍

S5PV210芯片的地址映射

X210开发板(S5PV210芯片)uboot移植DM9000驱动移植_第1张图片X210开发板(S5PV210芯片)uboot移植DM9000驱动移植_第2张图片

S5PV210芯片有6个SROM端口,其中SROM Bank1的地址是0x8800_0000–0x8FFF_FFFF,DM9000就是接在Bank1上面。

SROM控制器

X210开发板(S5PV210芯片)uboot移植DM9000驱动移植_第3张图片

(1)SROM是指SRAM、PROM、NorFlash等可以和Soc总线式连接,不需要初始化的介质;
(2)S5PV210芯片有6个SROM端口,支持8bit和16bit模式,每个Bank的地址固定;
(3)接在SROM端口的设备,可以像读写内存一样去访问;

SROM端口原理图

X210开发板(S5PV210芯片)uboot移植DM9000驱动移植_第4张图片

6个SROM Bank用一个端口来表示,通过片段引脚来分时操作不同的SROM端口,共用地址线、数据线、控制线。相关的引脚都是复用的,在初始化SROM端口时,肯定要先设置GPIO端口的模式。

SROM控制器引脚说明

X210开发板(S5PV210芯片)uboot移植DM9000驱动移植_第5张图片

(1)ADDR[0:22]:地址线;DM9000只连接了16根数据线,用了DDR2用作命令线用以区分发的是命令还是数据;
(2)DATA[0:15]:数据线,传输数据或者地址,分时复用;
(3)OEn:读数据的使能引脚;
(4)WEn:写数据的使能引脚;
(5)nGCS[5:0]:6个片选信号引脚;6个SROM Bank但是只有一组地址线和数据线,通过片选信号引脚去操作不同的SROM控制器,访问不同的设备;
(6)nWAIT:等待输入引脚;(不太清楚具体功能,实际没有接这个引脚)
(7)nWBE/nBE[1:0]:写字节使能;(不太清楚具体功能,实际没有接这个引脚)

SROM控制器的寄存器

X210开发板(S5PV210芯片)uboot移植DM9000驱动移植_第6张图片

SROM控制器的寄存器分为两类:SROM_BW和SROM_BCn[0:5]。其中SROM_BW是配置SROM控制器位宽等信息的,每4位配置一个SROM控制器;SROM_BCn是每个SROM控制器对应一个,根据接在SROM端口的设备设置时序;

SROM_BW寄存器

X210开发板(S5PV210芯片)uboot移植DM9000驱动移植_第7张图片

引脚名称 功能
ByteEnablen[0:5] 和时序相关,不清楚,实际也没有接这根线
WaitEnablen[0:5] 和时序相关,不清楚,实际也没有接这根线
AddrModen [0:5] 按字节对齐还是按半字对齐
DataWidthn[0:5] 设置SROM控制器的模式,接几根数据线就是什么模式

SROM_BCn[0:5]寄存器

X210开发板(S5PV210芯片)uboot移植DM9000驱动移植_第8张图片

全是和时序有关的,要根据DM9000芯片数据手册去查相关的时间,然后根据时间长短和时钟频率去计算需要的时钟周期。

DM9000芯片介绍

原理图

X210开发板(S5PV210芯片)uboot移植DM9000驱动移植_第9张图片备注:左边是DM9000芯片的原理图,右边是网口的原理图;#号表示该引脚低电平有效

引脚介绍

引脚名称 功能说明
SDn[0:15] 16根数据线,和SROM端口的数据线相连接,既传数据又传地址
CS# 片选引脚
CMD 命令引脚,高电平表示数据线上传输的是数据,低电平时传输的地址
IOR# 读数据使能
IOW# 写数据使能
INT 中断引脚
LED1 表示网络传输速度
LED2 网路是否连接
TX+/TX- 发送数据引脚,采用的差分信号
RX+/RX- 接收数据引脚,采用的差分信号

寄存器

X210开发板(S5PV210芯片)uboot移植DM9000驱动移植_第10张图片

DM9000芯片的数据手册对寄存器有说明,不过光看数据手册也很难完全理解驱动代码里的操作时序代码,这里就不做介绍了。Soc访问这些寄存器的地址等于SROM端口的基地址+偏移量。

uboot中DM9000芯片移植

驱动设计思想

参见博客:《驱动设计思想(机制、策略、分离、分层)》;

网卡初始化函数调用

start_armboot()
	init_sequence[]
		board_init()
		dm9000_pre_init()

SROM端口控制器初始化

static void dm9000_pre_init(void)
{
	unsigned int tmp;

#if defined(DM9000_16BIT_DATA)
	SROM_BW_REG &= ~(0xf << 4); //DM9000接在SROM Bank1,所以是bit4-bit7
	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_REG = ((0<<28)|(1<<24)|(5<<16)|(1<<12)|(4<<8)|(6<<4)|(0<<0));//uboot
	//SROM_BC1_REG = ((0<<28)|(0<<24)|(5<<16)|(0<<12)|(0<<8)|(0<<4)|(0<<0));//kernel
	tmp = MP01CON_REG;
	tmp &=~(0xf<<4);
	tmp |=(2<<4);
	MP01CON_REG = tmp;
}

(1)SROM_BW_REG和SROM_BC1_REG 是SROM控制器的配置寄存器。SROM_BW_REG中设置SROM Bank1为16bit模式、字节存取,因为DM9000就是接在SROM Bank1上的;SROM_BC1_REG 就是SROM Bank1的时序配置寄存器,具体要去根据时序算需要的时钟周期数。
(2)MP01CON_REG是MP01端口的控制寄存器,将MP01_1设置成Xm0CSN1模式,也就是SROM Bank1的片选引脚;

DM9000芯片的基地址修改

#define DM9000_16BIT_DATA

#define CONFIG_DRIVER_DM9000	1

#ifdef CONFIG_DRIVER_DM9000
#define CONFIG_DM9000_BASE		(0x88000300)
#define DM9000_IO			(CONFIG_DM9000_BASE)
#if defined(DM9000_16BIT_DATA)
#define DM9000_DATA			(CONFIG_DM9000_BASE+4)
#else
#define DM9000_DATA			(CONFIG_DM9000_BASE+1)
#endif
#endif

(1)CONFIG_DM9000_BASE是DM9000接在SROM控制器上的基地址。本来SROM Bank1的基地址查询地址映射表应该是0x88000000,之所以加0x300,是查看别人已经移植好的网卡程序。DM9000出过很多款,有的是不用加这个偏移量的。
(2)DM9000_DATA=CONFIG_DM9000_BASE+4:因为是将地址线DDR2接在CMD引脚,所以是+4;

你可能感兴趣的:(#,uboot移植,uboot)