0nism

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

u-boot网卡移植——DM9000

u-boot网卡移植——DM9000

一、SROM-BANK控制器

Address Map
Address Map

  由内存映射图可见,SROM_BANK包含6个区域。
  SROM是与CPU连接时,采用的是总线式的访问方法。SROM_BANK就是SoC提供的对外总线式连接SRAM/ROM的接口。
  如果SoC要外部外接一些SRAM/ROM类的存储芯片(或者伪装成SROM接口的芯片,譬如网卡芯片)就要通过SROM Controller来连接。网卡接在SROM中好处就是网卡芯片好像一个存储芯片一样被扩展在SoC的一个地址空间中,主机SoC可以直接用一个地址来访问网卡芯片内部寄存器。

二、原理图

DM9000接线图
DM9000接线图

  从图中可以看出:
  1.DM9000采用的是16bits的接线
  2.Chip Select接CSn1,意味着DM9000连接着SROM_BANK1,地址为0x8800_0000
  3.图中只出现了数据线,说明数据线与地址线共用
  4.重要端口CMD接ADDR2。CMD引脚置高电平,表示现在传输的是数据;CMD引脚置低电平,表示现在传输的是寄存器地址(index)。
DM9000——CMD
  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_BW 4-7bits定义

  • SROM_BC
      全称SROM Bank Control Register
      配置按照原厂配置即可

  • MP0_1CON
      GPIO复用设置
    MP0_1CON

  对于其他的相关配置,有三点值得考虑:

#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)

posted on 2020-02-28 22:03  0nism  阅读(338)  评论(0编辑  收藏  举报