U-boot在S3C2440上的移植詳解(四)---支持DM9000EP網卡

在這一篇中,咱們首先讓開發板對CS8900或者DM9000X網卡的支持,而後再分析實現u-boot怎樣來引導Linux內核啓動。由於測試u-boot引導內核咱們要用到網絡下載功能。html

7)u-boot對CS8900或者DM9000X網卡的支持。
u-boot-2009.08版本已經對CS8900和DM9000X網卡有比較完善的代碼支持(代碼在drivers/net/目錄下),並且在S3C24XX系列中默認對CS8900網卡進行配置使用。只是在個別地方要根據開發板的具體網卡片選進行設置,就能夠對S3C24XX系列中CS8900網卡的支持使用。代碼以下:
java

 

如今修改對咱們開發板上DM9000X網卡的支持。
首先,咱們看看drivers/net/目錄下有關DM9000的代碼,發現dm9000x.h中對CONFIG_DRIVER_DM9000宏的依賴,dm9000x.c中對CONFIG_DM9000_BASE宏、DM9000_IO宏、DM9000_DATA等宏的依賴,因此咱們修改代碼以下:linux

#gedit include/configs/my2440.h

#define CONFIG_BOOTDELAY	3
/*#define CONFIG_BOOTARGS	"root=ramfs devfs=mount console=ttySA0,9600" */
#define CONFIG_ETHADDR	08:00:3e:26:0a:5b
#define CONFIG_NETMASK          255.255.255.0
#define CONFIG_IPADDR		192.168.0.119
#define CONFIG_SERVERIP		192.168.0.111
#define CONFIG_GATEWAYIP	192.168.0.1
#define CONFIG_OVERWRITE_ETHADDR_ONCE
/*#define CONFIG_BOOTFILE	"elinos-lart" */
/*#define CONFIG_BOOTCOMMAND	"tftp; bootm" */


/* * Hardware drivers */  屏蔽掉u-boot默認對CS8900網卡的支持
//#define CONFIG_DRIVER_CS8900 1 /* we have a CS8900 on-board */
//#define CS8900_BASE          0x19000300
//#define CS8900_BUS16         1 /* the Linux driver does accesses as shorts */
 
//添加u-boot對DM9000X網卡的支持
#define CONFIG_DRIVER_DM9000    1
#define CONFIG_NET_MULTI        1
#define CONFIG_DM9000_NO_SROM   1
#define CONFIG_DM9000_BASE      0x20000300
#define DM9000_IO               CONFIG_DM9000_BASE
#define DM9000_DATA             (CONFIG_DM9000_BASE + 4)
#define DM9000_IO CONFIG_DM9000_BASE
//#define CONFIG_DM9000_USE_16BIT 1
注意:
u-boot-2009.08 能夠自動檢測DM9000網卡的位數,根據開發板原理圖可知網卡的數據位爲16位,而且網卡位於CPU的BANK4上,因此只需在 board/samsung/my2440/lowlevel_init.S中設置 #define B4_BWSCON (DW16) 便可,不須要此處的 #define CONFIG_DM9000_USE_16BIT 1

#undef CONFIG_DM9000_DEBUG
 
//給u-boot加上ping命令,用來測試網絡通不通
#define CONFIG_CMD_PING

添加板載DM9000網卡初始化代碼,以下:網絡

#gedit board/samsung/my2440/my2440.c

#include <net.h>
#include <netdev.h>
 
#ifdef CONFIG_DRIVER_DM9000
extern int dm9000_initialize(bd_t *bis);
int board_eth_init(bd_t *bis)
{
    return dm9000_initialize(bis);
}
#endif

修改MD9000網卡驅動代碼,以下:函數

#gedit drivers/net/dm9000x.c  // 須要三處修改,如下三處可能順序不對,讀者自行校訂

        #if 1
	i = 0;
	while (!(phy_read(1) & 0x20)) {	/* autonegation complete bit */
		udelay(1000);
		i++;
		if (i == 3000) {
			printf("could not establish link\n");
			return 0;
		}
	}
	#endif
	
。。。。。。
。。。。。。
	
/*
  Stop the interface.
  The interface is stopped when it is brought.
*/
static void dm9000_halt(struct eth_device *netdev)
{
#if 0 
 DM9000_DBG("%s\n", __func__);
 /* RESET devie */
 phy_write(0, 0x8000); /* PHY RESET */
 DM9000_iow(DM9000_GPR, 0x01); /* Power-Down PHY */
 DM9000_iow(DM9000_IMR, 0x80); /* Disable all interrupt */
 DM9000_iow(DM9000_RCR, 0x00); /* Disable RX */
#endif 
}

。。。。。。
。。。。。。

/*
   Read a word from phyxcer
*/
// phy_read 函數中只修改了 帶/* Wait read complete */標註的一行
static u16
phy_read(int reg)
{
 u16 val;
 /* Fill the phyxcer register into REG_0C */
 DM9000_iow(DM9000_EPAR, DM9000_PHY | reg);
 DM9000_iow(DM9000_EPCR, 0xc); /* Issue phyxcer read command */
 udelay(1000); //udelay(100);   /* Wait read complete */
 DM9000_iow(DM9000_EPCR, 0x0); /* Clear phyxcer read command */
 val = (DM9000_ior(DM9000_EPDRH) << 8) | DM9000_ior(DM9000_EPDRL);
 /* The read data keeps on REG_0D & REG_0E */
 DM9000_DBG("phy_read(0x%x): 0x%x\n", reg, val);
 return val;
}

net/nfs.c

#if defined(CONFIG_CMD_NET) && defined(CONFIG_CMD_NFS)
#define HASHES_PER_LINE 65 /* Number of "loading" hashes per line */
#define NFS_RETRY_COUNT 30
#define NFS_TIMEOUT (CONFIG_SYS_HZ/1000*2000UL) //2000UL


此博文是兩篇博文的合體:測試

http://www.embeddedlinux.org.cn/html/jishuzixun/201303/16-2496.html spa

http://www.linuxidc.com/Linux/2011-05/35982p4.htm code


注:移植網卡這一塊,常常碰到的問題是,不能ping通主機,本人也遇到了,參考以上兩篇文章後,當以XP(本身的家用電腦),爲主機時,能夠ping通,以WIN7(公司電腦,防火牆受管理員控制,本身改不了設置)爲主機時,不能ping通,最後判斷,網卡移植沒問題,問題是:公司電腦防火牆的問題。orm

最後,發個能ping通的畫面htm

網卡搞定後,就能夠下載了

直接上圖吧:

上圖,成功將1.bin文件下載到NAND FLASH的0x60000位置上

相關文章
相關標籤/搜索