上一節移植了uboot 支持了NANDFLASH的操作,這一節修改uboot支持DM9000。
通過Makefile把dm9000x編譯進uboot
cd drivers/net
vi Makefile
需要在文件中添加以下宏
在smdk2440.h中修改文件支持DM9000
#if 0
#define CONFIG_CS8900 /* we have a CS8900 on-board */
#define CONFIG_CS8900_BASE 0x19000300
#define CONFIG_CS8900_BUS16 /* the Linux driver does accesses as shorts */
#else
#define CONFIG_DRIVER_DM9000 /*DM9000*/
#endif
編譯報錯
編譯報錯 DM9000_DATA
搜索DM9000_DATA那裏定義
grep "DM9000_DATA" *nR
參考別人配置文件
在smdk2440.h中修改爲如下內容
/*
* Hardware drivers
*/
#if 0
#define CONFIG_CS8900 /* we have a CS8900 on-board */
#define CONFIG_CS8900_BASE 0x19000300
#define CONFIG_CS8900_BUS16 /* the Linux driver does accesses as shorts */
#else
#define CONFIG_DRIVER_DM9000 /*DM9000*/
#define CONFIG_DM9000_BASE 0x20000000 /*參考芯片手冊 nGCS4*/
#define DM9000_IO CONFIG_DM9000_BASE
#define DM9000_DATA (CONFIG_DM9000_BASE + 4) /*bit 2 1 0*/
#endif
我們的DM9000是放在2440的bank4(0X20000000)的片選上面,而DM9000的CMD引腳接在bank4的LADDR2上面。也就是說當0X20000000地址上讀寫數據時, 此時CMD爲低,則讀寫的便是DM9000C的地址。向0X20000000+4地址上讀寫數據時,此時CMD爲高,則讀寫的便是DM9000C的數據。
修改內存控制器時序
由於之前在start.S裏,就調用了board/samsung/smdk2440/lowlevl_init.S來初始化各個bank的配置、時序。所以我們只需要在那裏修改bank4的內容即可。(也可以直接在dm9000x.c裏的dm9000_initialize()函數設置)參考之前寫的移植DM9000C驅動裏的時序
由於兼容DM9000E,所以修改的值儘量大一點,設爲:
.long 0x00000740; //BANKCON4
參考手冊如下
BWSCON位寬設置
時序設置
編譯燒寫
網卡的初始化的流程
搜索No ethernet found
,
1)uboot重定位後進入第二階段board_init_r():
void board_init_r(gd_t *id, ulong dest_addr) //gd uboot重定位地址
{
... ...
#if defined(CONFIG_CMD_NET)
puts("Net: ");
eth_initialize(gd->bd); // 以太網初始化
#if defined(CONFIG_RESET_PHY_R)
debug("Reset Ethernet PHY\n");
reset_phy();
#endif
#endif
... ...
}
2)然後進入board_init_r()->eth_initialize():
int eth_initialize(bd_t *bis)
{
... ...
if (board_eth_init(bis) < 0) //初始化 單板上的以太網
printf("Board Net Initialization Failed\n");
... ...
if (!eth_devices) { //初始化失敗,打印"No ethernet found.\n"
puts ("No ethernet found.\n");
bootstage_error(BOOTSTAGE_ID_NET_ETH_START);
}
... ...
}
3)進入board_eth_init(), 位於board/samsung/smdk2440/smdk2440.c
int board_eth_init(bd_t *bis)
{
int rc = 0;
#ifdef CONFIG_CS8900
rc = cs8900_initialize(0, CONFIG_CS8900_BASE); //初始化cs8900
#endif
return rc;
}
從上面代碼看到,單板初始化board_eth_init()函數裏,只支持初始化CS8900,沒有DM9000C
支持DM9000C的初始化
搜索dm9000_initialize,看下其它單板的board_eth_init()是如何初始化DM9000C的,如下圖所示:
所以,我們修改2440單板的board_eth_init(),使它支持DM9000C
修改代碼如下(位於board/samsung/smdk2440/smdk2440.c):
int board_eth_init(bd_t *bis)
{
int rc = 0;
#ifdef CONFIG_CS8900
rc = cs8900_initialize(0, CONFIG_CS8900_BASE); //初始化cs8900
#endif
#ifdef CONFIG_DRIVER_DM9000
rc = dm9000_initialize(bis); //初始化DM9000C
#endif
return rc;
}
編譯測試
然後試驗,來ping下PC機,輸入:
set ipaddr 192.168.2.120
ping 192.168.2.100
打印如下圖所示:
上面表示,MAC(硬件地址)沒有設置,我們需要設置ethaddr,來更改MAC地址
輸入(參考別人的MAC地址):
set ethaddr 08:00:3e:26:0a:5b //設置MAC地址
ping 192.168.2.100 //重新ping
便可以ping通.
TFTP下載測試
使用tftp工具,通過網卡來下載內核
tftp工具是通過電腦來設置本機爲服務器,然後開發板作爲客戶端,便可以讀取到PC機裏的文件了
1)PC機打開tftp工具,設置文件根目錄,以及PC本機的IP地址
2)進入開發板,輸入:
set serverip 192.168.2.101 //設置PC機地址
tftp 30000000 uImage //下載PC機設置的tftp根目錄下的uImage文件
bootm 30000000 //使用bootm命令啓動內核代碼
由於uboot沒有配置mtdparts命令,所以啓動內核沒成功.
主要修改文件:include/configs/smdk2440.h lowevel_init.s