這一部分雖然移植起來簡單,但是當我自己去分析的時候確實折騰了接近兩天的時間,真的傷不起啊。雖然說網上對于uboot移植的DM9000A網卡的移植的資料很多,移植過程也很簡單,總的來說主要就是設置一下頭文件/include/configs/fl2440.h 中宏的定義和drivers/net/dm9000x.c中網卡的函數的修改,和在board/samsung/fl2440/fl2440.c中增加關于網卡的初始化。?
打開/include/configs/fl2440.h:
注釋掉下面語句:
~~~
#define CONFIG_DRIVER_CS89001/* we have a CS8900 on-board */
#define CS8900_BASE0x19000300
#define CS8900_BUS161 /* the Linux driver does accesses as shorts
~~~
增加下面語句:
~~~
#define CONFIG_DRIVER_DM9000?1?
#define CONFIG_NET_MULTI?1?
#define CONFIG_DM9000_NO_SROM1?
#define CONFIG_DM9000_BASE?0x20000000 //網卡片選地址?
#define DM9000_IO ??CONFIG_DM9000_BASE //網卡命令端口?
#define DM9000_DATA(CONFIG_DM9000_BASE+4) //網卡數據端口?
#define CONFIG_CMD_PING?//增加ping命令?
#define CONFIG_CMD_DHCP ? //這個是什么 目前還不知道
~~~
加不加好像是都沒有影響
~~~
#define CONFIG_CMD_NET ? //這是一個紅開關 ?我們沒有用到
~~~
定不定義都無所謂
~~~
#define CONFIG_DM9000_USE_16BIT ? 1 ?//定義位寬
~~~
然后定義缺省的環境變量,先添加MAC地址,再修改開發板以及宿主機的IP地址:
~~~
#define CONFIG_ETHADDR? ? ? ? ? 00:0c:29:4b:94:53//我選擇的俄式和虛擬機上的一樣的MAC地址
#define CONFIG_NETMASK ? ? ? ? ?255.255.255.0?
#define CONFIG_IPADDR?210.41.141.111 //開發板IP,自定義,注意要與主機IP在同一網段
#define CONFIG_SERVERIP?210.41.141.98//主機IP
#define CONFIG_GATEWAYIP? ? ? 210.41.141.1//網關,在虛擬機上我都是靜態設置好了的
~~~
修改board/samsung/fl2440/fl2440.c;添加網卡初始化代碼:
~~~
#include <net.h>?
#include <netdev.h>?
#ifdef CONFIG_DRIVER_DM9000?
int board_eth_init(bd_t *bis)?
{?
return dm9000_initialize(bis);?
}?
#endif?
~~~
在drivers/net/dm9000x.c中修改:
~~~
i = 0;
while (!(phy_read(1) & 0x20)) {/* autonegation complete bit */
udelay(1000);
i++;
if (i ==?500000) { ? ? ?? ??
?//將10000改為500000,這樣就能解決第一次ping 不通的情況,網上說是把這段屏蔽掉,會有第一 次ping不通。
printf("could not establish link\n");
return 0;
}
}
~~~
接著在dm9000x.c中修改,屏蔽掉dm9000_halt函數中的內容,否則ping不通。?
~~~
/*?
Stop the interface.?
The interface is stopped when it is brought.?
*/?
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 */?
}?
~~~
再修改dm9000x.c中phy_read() 函數,解決傳輸過程中出現“operating at unknow : 0 mode"字符串,如下:
~~~
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(8000); ?/* Wait read complete */ ? ? ? ?//默認的的是8000的就不用修改 網上說要修改1000 ?沒有必要 這幾個值可以自己測試
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/tftp.c (注意net是在頂層目錄下),修改TIMEOUT的值,原來是5000UL,否則會出現在超時重傳的情況。
~~~
#define TIMEOUT ?70000UL /* Millisecs to timeout for lost pkt */
~~~
(注意這里的值的是不固定的,70000UL就可以正常傳輸,這個值也不是越大越好,
到這里,DM9000A的網卡驅動就移值完成了。
簡單介紹一個用到的宏定義CONFIG_DM9000_BASE
這里需要注意的是#define CONFIG_DM9000_BASE 0x20000000 //網卡片選地址。而不是0x20003000,這個是DM9000,而我們使用的是DM9000A。因為CMD接在ADDR2上所以#define DM9000_DATA (CONFIG_DM9000_BASE+4)。因為DM9000A的地址信號和數據信號復用,CMD引腳決定傳輸的是地址信號還是數據信號。數據手冊上說CMD為0時是地址信號所以DM9000_IO CONFIG_DM9000_BASE,CMD為1時,是數據信號,所以#define DM9000_DATA (CONFIG_DM9000_BASE+4)。DM9000A內部有一個4K Dword SRAM,因為數據線和地址線是復用的,所以如果這部分用地址線進行尋址,范圍是16KB,所以在 0x20000000~0x20000000+16KB范圍內都可以的。所以0x20003000是碰巧在這里的。第一次ping不同,第二次開始就可以ping通了,這個是正常現象。
到此時就可以ping通虛擬機和pc機了。
在PC機上啟動tftpd32.exe ?選擇好服務端,IP地址,端口。就可以傳輸了。
tftpboot 0x30008000 210.41.141.98:zImage
在這里我折騰了很久,就是因為這個路徑選擇錯誤了,錯誤的選擇方法如下:
~~~
tftpboot 0x30008000 210.41.141.98:zImage ?//文章并沒有提示我路徑錯誤,只是不停的打印如下信息:
lzd> tftp 0x30000000 /home/lzd/nfs/image???????????????????????????????????????????????????????? ?
TFTP from server 10.107.4.145; our IP address is 10.107.4.146????????????????? ?
Filename '/home/lzd/nfs/image'.??????????????????????????????????????????????? ?
Load address: 0x30000000?????????????????????????????????????????????????????? ?
Loading: T T T T T T T T T T?????????????????????????????????????????????????? ?
Retry count exceeded; starting again?????????????????????????????????????????? ?
TFTP from server 10.107.4.145; our IP address is 10.107.4.146????????????????? ?
Filename '/home/lzd/nfs/image'.??????????????????????????????????????????????? ?
Load address: 0x30000000?????????????????????????????????????????????????????? ?
Loading: T T T T T T T T T T?????????????????????????????????????????????????? ?
Retry count exceeded; starting again
~~~
呵呵,遇到的問題越多,你學會的東西也越多。參照別人的視頻教程,別人把程序和補丁都給你弄好了,然后按照他們的操作去做,你學到什么了嗎?你敢換塊開發板玩玩試試。我相信你自己心里也是虛的。你只是大自然的搬運工。
參考地址:http://blog.csdn.net/yanghao23/article/details/7693435
- 前言
- FL2440的u-boot-2010.09移植(一)
- FL2440的u-boot-2010.09移植(二)
- FL2440的U-boot-2009.08移植(三)支持Nor FLASH
- FL2440的U-boot-2009.08移植(四) 支持DM900網卡
- FL2440的U-boot-2009.08移植(五)uboot架構中NAND Flash驅動修改
- FL2440如何利用JLINK燒寫U-boot到NAND Flash中
- uboot中的快捷菜單的制作說明
- env_relocate 函數深入分析
- U-boot mkimage指定Linux內核地址時的兩種方式
- 實現u-boot對yaffs/yaffs2文件系統下載的支持