X210开发板(S5PV210芯片)uboot移植DM9000驱动移植
Posted 正在起飞的蜗牛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了X210开发板(S5PV210芯片)uboot移植DM9000驱动移植相关的知识,希望对你有一定的参考价值。
前言
本文是介绍在uboot中如何移植DM9000的驱动,并不深入去讲解DM9000芯片的操作时序和内部寄存器,想要读懂驱动代码要仔细阅读DM9000芯片的数据手册。
移植的基础是手里有DM9000芯片可以用的驱动代码,只需要根据开发板中DM9000芯片的接线方式来配置驱动的参数。
SROM控制器介绍
S5PV210芯片的地址映射
S5PV210芯片有6个SROM端口,其中SROM Bank1的地址是0x8800_0000–0x8FFF_FFFF,DM9000就是接在Bank1上面。
SROM控制器
(1)SROM是指SRAM、PROM、NorFlash等可以和Soc总线式连接,不需要初始化的介质;
(2)S5PV210芯片有6个SROM端口,支持8bit和16bit模式,每个Bank的地址固定;
(3)接在SROM端口的设备,可以像读写内存一样去访问;
SROM端口原理图
6个SROM Bank用一个端口来表示,通过片段引脚来分时操作不同的SROM端口,共用地址线、数据线、控制线。相关的引脚都是复用的,在初始化SROM端口时,肯定要先设置GPIO端口的模式。
SROM控制器引脚说明
(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控制器的寄存器
SROM控制器的寄存器分为两类:SROM_BW和SROM_BCn[0:5]。其中SROM_BW是配置SROM控制器位宽等信息的,每4位配置一个SROM控制器;SROM_BCn是每个SROM控制器对应一个,根据接在SROM端口的设备设置时序;
SROM_BW寄存器
引脚名称 | 功能 |
---|---|
ByteEnablen[0:5] | 和时序相关,不清楚,实际也没有接这根线 |
WaitEnablen[0:5] | 和时序相关,不清楚,实际也没有接这根线 |
AddrModen [0:5] | 按字节对齐还是按半字对齐 |
DataWidthn[0:5] | 设置SROM控制器的模式,接几根数据线就是什么模式 |
SROM_BCn[0:5]寄存器
全是和时序有关的,要根据DM9000芯片数据手册去查相关的时间,然后根据时间长短和时钟频率去计算需要的时钟周期。
DM9000芯片介绍
原理图
备注:左边是DM9000芯片的原理图,右边是网口的原理图;#号表示该引脚低电平有效
引脚介绍
引脚名称 | 功能说明 |
---|---|
SDn[0:15] | 16根数据线,和SROM端口的数据线相连接,既传数据又传地址 |
CS# | 片选引脚 |
CMD | 命令引脚,高电平表示数据线上传输的是数据,低电平时传输的地址 |
IOR# | 读数据使能 |
IOW# | 写数据使能 |
INT | 中断引脚 |
LED1 | 表示网络传输速度 |
LED2 | 网路是否连接 |
TX+/TX- | 发送数据引脚,采用的差分信号 |
RX+/RX- | 接收数据引脚,采用的差分信号 |
寄存器
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;
以上是关于X210开发板(S5PV210芯片)uboot移植DM9000驱动移植的主要内容,如果未能解决你的问题,请参考以下文章