u-boot-2009.08移植笔记五,平台TQ2440 .

时间:2021-06-10 16:36:23

五.增加對網卡的支持
開發板使用的是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的時候總是不通,第二次就好了