OK6410-A开发板学习-⑤uboot移植(3)DM9000 网卡驱动移植

时间:2023-02-03 16:34:41

开始我以为DM9000是个PHY,查了一下是个含有MAC和PHY的网卡,还包含一个4KDWORD值的SRAM


 一、网卡的正常化配置

  1、修改头文件调用关系

  在原配的smdk6400.h中(因为是复制过来的),网卡配置为CS8900,而手头开发板上的网卡为DM9000,所以第一步来修改网卡驱动程序。

  修改/include/configs/smdk6410.h

  找到如下字段,更改如下

OK6410-A开发板学习-⑤uboot移植(3)DM9000 网卡驱动移植
/*
* Hardware drivers
*/
#define CONFIG_NET_MULTI
//#define CONFIG_CS8900 /* we have a CS8900 on-board */
//#define CONFIG_CS8900_BASE 0x18800300
//#define CONFIG_CS8900_BUS16 /* follow the Linux driver */
#define CONFIG_DRIVER_DM9000 1 /* we have a DM9000 on-board */
#define CONFIG_DM9000_BASE 0x18000000
#define DM9000_IO CONFIG_DM9000_BASE
#define DM9000_DATA (CONFIG_DM9000_BASE+4)
#define CONFIG_DM9000_USE_16BIT

#define CONFIG_ETHADDR 00:40:5c:26:0a:5b
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 192.168.0.22
#define CONFIG_SERVERIP 192.168.0.88
#define CONFIG_GATEWAYIP 192.168.0.1
OK6410-A开发板学习-⑤uboot移植(3)DM9000 网卡驱动移植

  2、修改dm9000x.c文件

  文件为drivers/net/dm9000x.c

  在for(;;)之前加入两句

DM9000_ior(DM9000_MRRH);
DM9000_ior(DM9000_MRRL);

  修改函数为dm9000_halt

OK6410-A开发板学习-⑤uboot移植(3)DM9000 网卡驱动移植
static void dm9000_halt(struct eth_device *netdev)
{
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 */

}
OK6410-A开发板学习-⑤uboot移植(3)DM9000 网卡驱动移植

  3、修改net配置文件

  文件一 /net/eth.c

  增加启动属性,在int eth_initialize(bd_t *bis)函数中,

#if defined(CONFIG_DB64360) || defined(CONFIG_CPCI750)
        mv6436x_eth_initialize(bis);
#endif
#if defined(CONFIG_DB64460) || defined(CONFIG_P3Mx)
        mv6446x_eth_initialize(bis);
#endif

之后添加

增加一段
        /* for DM9000 init */
#if defined(CONFIG_DRIVER_DM9000)
dm9000_initialize(bis);
#endif
/*------------------------------*/

  文件二 /net/net.c

  修改ARP_TIMEOUT

#ifndef CONFIG_ARP_TIMEOUT
//# define ARP_TIMEOUT 5000UL /* Milliseconds before trying ARP again */
# define ARP_TIMEOUT 5 /* Milliseconds before trying ARP again */
#else
# define ARP_TIMEOUT CONFIG_ARP_TIMEOUT
#endif

  修改NetArpWaitTimerStart

//      if ((t - NetArpWaitTimerStart) > ARP_TIMEOUT) {
if ((t - NetArpWaitTimerStart) > ARP_TIMEOUT*CONFIG_SYS_HZ) {

  修改NetSetTimeout

//      NetSetTimeout (10000UL, PingTimeout);
NetSetTimeout (10*CONFIG_SYS_HZ, PingTimeout);

  文件三/net/tftp.c

  修改 TftpStart (void)

  注释如下函数段

OK6410-A开发板学习-⑤uboot移植(3)DM9000 网卡驱动移植
        /*
* Allow the user to choose TFTP blocksize and timeout.
* TFTP protocol has a minimal timeout of 1 second.
*/
/* if ((ep = getenv("tftpblocksize")) != NULL)
* TftpBlkSizeOption = simple_strtol(ep, NULL, 10);
*
* if ((ep = getenv("tftptimeout")) != NULL)
* TftpTimeoutMSecs = simple_strtol(ep, NULL, 10);
*
* if (TftpTimeoutMSecs < 1000) {
* printf("TFTP timeout (%ld ms) too low, "
* "set minimum = 1000 ms\n",
* TftpTimeoutMSecs);
* TftpTimeoutMSecs = 1000;
* }
*
* debug("TFTP blocksize = %i, timeout = %ld ms\n",
* TftpBlkSizeOption, TftpTimeoutMSecs);
*/
OK6410-A开发板学习-⑤uboot移植(3)DM9000 网卡驱动移植

  至此,网卡驱动修改完成,可以编译试一试了。

  如果在局域网中,可以尝试ping一下其他主机的ip,

OK6410-A开发板学习-⑤uboot移植(3)DM9000 网卡驱动移植