u-boot网卡移植——DM9000
u-boot网卡移植——DM9000
一、SROM-BANK控制器
![Address Map Address Map](http://0nism.oss-cn-beijing.aliyuncs.com/%E5%B0%8F%E4%B9%A6%E5%8C%A0/1582258617497.png)
Address Map
由内存映射图可见,SROM_BANK包含6个区域。
SROM是与CPU连接时,采用的是总线式的访问方法。SROM_BANK就是SoC提供的对外总线式连接SRAM/ROM的接口。
如果SoC要外部外接一些SRAM/ROM类的存储芯片(或者伪装成SROM接口的芯片,譬如网卡芯片)就要通过SROM Controller来连接。网卡接在SROM中好处就是网卡芯片好像一个存储芯片一样被扩展在SoC的一个地址空间中,主机SoC可以直接用一个地址来访问网卡芯片内部寄存器。
二、原理图
![DM9000接线图 DM9000接线图](http://0nism.oss-cn-beijing.aliyuncs.com/%E5%B0%8F%E4%B9%A6%E5%8C%A0/1582258979082.png)
DM9000接线图
从图中可以看出:
1.DM9000采用的是16bits的接线
2.Chip Select接CSn1,意味着DM9000连接着SROM_BANK1,地址为
0x8800_0000
。
3.图中只出现了数据线,说明数据线与地址线共用
4.重要端口CMD接ADDR2。CMD引脚置高电平,表示现在传输的是数据;CMD引脚置低电平,表示现在传输的是寄存器地址(index)。
![DM9000——CMD DM9000——CMD](http://0nism.oss-cn-beijing.aliyuncs.com/%E5%B0%8F%E4%B9%A6%E5%8C%A0/1582260079620.png)
5.负责与外部通讯的有四根线,分别为
TX-
,
TX+
与
RX-
,
RX+
,这意味着网线传输采用的是差分传输。另外网线还有四根地线,用于抗干扰。
三、网卡初始化
start_armboot
init_sequence
board_init
dm9000_pre_init
该函数其实主要用于初始化SROM_BANK。对于网卡本身的设置,由于u-boot直接移植自Linux内核,所以目前可能还看不懂。
static void dm9000_pre_init(void)
{
unsigned int tmp;
#if defined(DM9000_16BIT_DATA)
SROM_BW_REG &= ~(0xf << 4);
SROM_BW_REG |= (1<<7) | (1<<6) | (1<<5) | (1<<4);
#endif
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;
}
分析上述被使用的三个寄存器:
-
SROM_BW
全称SROM Bus Width & Wait Control Register
-
SROM_BC
全称SROM Bank Control Register
配置按照原厂配置即可 -
MP0_1CON
GPIO复用设置
对于其他的相关配置,有三点值得考虑:
#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)
#endif
#endif
1.为何DM9000的基地址是多了三百的偏移量?猜测可能是DM9000的型号差异导致的。
2.为何DM9000的数据线基地址要加上0x100
?DM9000_IO表示访问芯片IO寄存器的基地址,直接就是CONFIG_DM9000_BASE;DM9000_DATA表示我们访问数据时的基地址,因为DM9000芯片的CMD引脚接到了ADDR2,因此这里要+4(0b100
,对应ADDR2)