u-boot网卡驱动移植

u-boot网卡驱动移植

网卡移植的驱动是针对国嵌GQ2440开发板的,u-boot版本为u-boot-2009,比这版本高一些的也没问题。移植主要有一下几个步骤,大多数和mini2440相同。

1.设置网卡的位宽

由于s3c2440存储控制器的bank4连接的是DM9000网卡,下面是网上截取的图,可知网卡位宽为16。

这里写图片描述
接着在lowlevel_init.S修改如下代码

    #define B1_BWSCON               (DW16)
    #define B2_BWSCON               (DW16)
    #define B3_BWSCON               (DW16)
    #define B4_BWSCON               (DW16)//没有使用wait信号
    #define B5_BWSCON               (DW8)
    #define B6_BWSCON               (DW32)
    #define B7_BWSCON               (DW32)

2.设置网卡时序
相关位的含义如下图:
这里写图片描述
修改的代码如下:

#define B4_Tacs                 0x0
#define B4_Tcos                 0x0
#define B4_Tacc                 0x7
#define B4_Tcoh                 0x1//这句修改,其它的和mini2440相似
#define B4_Tah                  0x0
#define B4_Tacp                 0x0
#define B4_PMC                  0x0

3、在board/GQ2440/GQ2440.c 文件中添加网卡驱动入口函数

添加如下代码:

#ifdef CONFIG_CMD_NET
int board_eth_init(bd_t *bis)
{
        int rc = 0;
#ifdef CONFIG_CS8900
        rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
#endif
#ifdef CONFIG_DRIVER_DM9000
        rc = dm9000_initialize(bis);
#endif
        return rc;
}
#endif

4、在include/configs/GQ2440.h文件添加网卡驱动相关定义
主要是DM9000的基地址设置

#define CONFIG_NET_MULTI                1
#define CONFIG_NET_RETRY_COUNT          20
#define CONFIG_DRIVER_DM9000            1
#define CONFIG_DM9000_BASE              0x20000000  
#define DM9000_IO                       CONFIG_DM9000_BASE
#define DM9000_DATA                     (CONFIG_DM9000_BASE+4)
#define CONFIG_DM9000_USE_16BIT         1
#define CONFIG_DM9000_NO_SROM           1
#undef CONFIG_DM9000_DEBUG

5、修改网卡驱动相关代码

在drivers/net/dm9000x.c文件中主要进行如下的修改
防止出现“could not establish link”的错误,进行下面修改:

i = 0;
while (!(phy_read(1) & 0x20)) { /* autonegation complete bit */
    udelay(1000);
    i++;
    if (i == 1000) {
//        printf("could not establish link\n");
//        return 0;
          break;
     }
}

防止出现ping不同的情况,修改如下代码:

static void dm9000_halt(struct eth_device *netdev)
{
#if 0
        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 */
#endif
}

到此为止,网卡驱动移植完成了。

### U-Boot网卡 PHY 的移植 在 U-Boot 中进行网卡 PHY 的移植是一项复杂的工作,涉及多个层面的配置和实现。以下是关于如何完成这一任务的具体细节: #### 1. 理解 PHY 芯片及其驱动框架 PHY 是物理层收发器 (Physical Layer Transceiver),负责以太网数据链路层与物理介质之间的通信。U-Boot 提供了一个通用的 PHY 框架来支持不同类型的 PHY 芯片[^2]。 对于特定型号的 PHY(如裕太微电子 YT8511),通常需要确认该芯片是否已被纳入到主流 U-Boot 版本的支持列表中。如果未被支持,则需手动添加其驱动程序并适配至现有框架。 #### 2. 修改设备树文件 设备树描述了硬件资源分配情况,在现代嵌入式系统开发过程中占据重要地位。为了使新加入的 PHY 正常工作,可能需要更新对应的 `.dts` 文件,定义必要的参数比如地址、中断线号以及连接方式等信息[^4]: ```dts &ethernet { phy-handle = <&phy0>; phy-mode = "rmii"; /* 或者 mii */ }; &mdio { #address-cells = <1>; #size-cells = <0>; phy0: ethernet-phy@0 { compatible = "yutai,yt8511"; }; }; ``` 上述代码片段展示了如何通过设备树指定所使用的 PHY 类型及模式设置。 #### 3. 添加或调整 PHY 驱动代码 当目标平台上的 PHY 不受当前版本 U-Boot 支持时,开发者应依据官方文档编写专属驱动模块。此过程大致分为以下几个方面: - **注册新的 PHY 设备**: 将自定义的 PHY 描述符添加进 `drivers/net/phy/Kconfig` 和相应的 Makefile 当中。 - **实现核心功能函数**: 编写初始化、读取状态寄存器等功能接口,确保它们遵循既定 API 定义[^3]。 下面是一个简单的例子展示如何扩展已有的 PHY 表格结构体: ```c static struct phy_driver yt8511_phy __phy_table_ptr = { .uid = 0x001cc916, .name = "yt8511", .features = PHY_GBIT_FEATURES, // 实现其他成员变量... }; mii_register_phy(&yt8511_phy); ``` 注意这里假设了YT8511具有千兆能力,并设置了相应特性标志位;实际应用当中还需要仔细查阅具体器件手册以便正确填充这些字段值。 #### 4. 测试验证 最后一步就是进行全面的功能测试,包括但不限于连通性检测(ping命令)、速度协商状况观察等等。任何异常现象都应该追溯根源直至彻底解决为止。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值