五.增加對網卡的支持
開發板使用的是DM9000網卡,u-boot里已經有現成的驅動
增加宏定義:
#define CONFIG_DRIVER_DM9000 1 //屏蔽原來CS8900 的配置
#define CONFIG_DM9000_BASE 0x20000300
#define DM9000_IO CONFIG_DM9000_BASE
#define DM9000_DATA (CONFIG_DM9000_BASE + 4)
#define CONFIG_DM9000_USE_16BIT
#define CONFIG_NET_MULTI 1
#define CONFIG_DM9000_NO_SROM 1
修改網絡參數配置
#define CONFIG_ETHADDR 0a:1B:2C:3d:4e:5f
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 192.168.1.6
#define CONFIG_SERVERIP 192.168.1.2
在CM2440.c下添加
#include <net.h>
#include <netdev.h>
extern dm9000_initialize(bd_t *bis);
#ifdef CONFIG_DRIVER_DM9000:
int eth_init(bd_t *bis)
{
return dm9000_initialize(bis);
}
#endif
至此網卡驅動已經移植好了,可能很多人不明白,網卡是怎樣初始華的,因為這個
函數是我們自己添加的。但並沒有在第二階段明顯的調用。
且看board.c第463行左右,有這麼一句eth_initialize(gd->bd);
這個函數在net/eth.c中,這個函數裡面又進行調用
/* Try board-specific initialization first. If it fails or isn't
* present, try the cpu-specific initialization */
if (board_eth_init(bis) < 0)
cpu_eth_init(bis);
所以這個我們只需要編寫board_eth_init()函數並返回DM9000的初始化函數即可
其實這裡也並沒有進行真正意義上的初始化
要等使用網絡命令時,U-BOOT才會進行初始化,並且使用結束就會關閉網卡,如果不想關閉
那麼修改dm9000x.c中屏蔽
static void dm9000_halt(struct eth_device *netdev)
{
//DM9000_DBG("%sn", __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 */
}
現在make一下,下載到nand中啟動,控制台出現
net:DM9000
並有一個錯誤提示
could not establish link
在修改dm9000x.c大約第373行
屏蔽
/* i = 0;
while (!(phy_read(1) & 0x20)) { /* autonegation complete bit *
udelay(1000);
i++;
if (i == 10000) {
printf("could not establish link\n");
return 0;
break;
}
}*/
編譯后重新下載沒有錯誤了
使用tftp命令試一下
這時會出出現一些問題,就是在利用TFTP下載的時候,會出現斷斷續續,一直超時的情況,
甚至U-BOOT一直向服務器請求服務,使控制台不斷滾屏
結果一些分析這是由於U-BOOT的延時函數出現問題,導致一直无休止循环,
经网上搜索得知Uboot 端 tftp 程序传过来的Timeout参数不符合服务器
端定义引起的
現修改/drivers/net/dm9000x.c,phy_read(int reg)函數,第595行
udelay(1000); //原來為100
net/net.c中第104行
# define ARP_TIMEOUT 50000UL //原來為5000UL擴大十倍
net/tftp.c;第16行
#define TIMEOUT 50000UL//原來為5000UL
重新編譯下載到NAND中后啟動,
tftp 0x30000000 zImage.img
下載成功
L~CM2440 # tftp 0x30000000 zImage.img
dm9000 i/o: 0x20000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 0a:1b:2c:3d:4e:5f
operating at 100M full duplex mode
Using dm9000 device
TFTP from server 192.168.1.2; our IP address is 192.168.1.6
Filename 'zImage.img'.
Load address: 0x30000000
Loading: T #################################################################
#################################################################
done
Bytes transferred = 1895232 (1ceb40 hex)
另外這裡有個小BUG,那就是第一次PING的時候總是不通,第二次就好了