hi3520dv300 u-boot 网卡驱动移植

uboot网络驱动修改 首先 I.MX6Ull是采用 内部 MAC+外部PHY 芯片的方式来进行网络通信,某国际XXX组织规定,所有的PHY芯片的内部前16个寄存器必须一模一样,PHY芯片的特殊功能配置是在第16个寄存器以后的位置,因此,理论上uboot里边有一个PHY芯片的通用驱动程序,即更换PHY芯片无需更改驱动程序。 阅读详情

海思原厂提供的u-boot网卡驱动有问题,不能用,需要修改驱动程序。

网卡接口模式选择:

#define CONFIG_HIGMAC_PHY1_INTERFACE_MODE 2

模式为RGMII

网卡PHY地址:

#define CONFIG_HIGMAC_PHY1_ADDR 2

修改下面两个函数就可以了,主要是网卡的接口模式要是RGMII。

网卡型号:LAN8710A,需要通过网卡的SMI(Serial Management Interface)接口来配置网卡的PHY。

static int higmac_net_adjust_link(struct higmac_netdev_local *ld)
{
    char *mii_name = higmac_board_info[ld->index].mii_name;
    int phy_addr = higmac_board_info[ld->index].phy_addr;
    enum if_mode phy_mode = higmac_board_info[ld->index].phy_intf;
    int stat = 0, speed = 0, is_duplex_half = 1, port_mode, phy_duplex;
    enum speed_mode speed_mode;

    if (phy_addr == INVALID_PHY_ADDR)
        return stat;

    phy_fixup(mii_name, phy_addr, phy_mode);

    stat |= miiphy_link(mii_name, phy_addr) ? HIGMAC_LINKED : 0;

    phy_duplex = miiphy_duplex(mii_name, phy_addr);
    if (phy_duplex == FULL) {
        stat |= HIGMAC_DUP_FULL;
        is_duplex_half = 0;
    }

    speed = miiphy_speed(mii_name, phy_addr);
    switch (speed) {
    case _10BASET:
        stat |= HIGMAC_SPD_10M;
        speed_mode = speed_mode_10M;
        break;
    default:
        printf("wired, phy speed!\n");
    case _100BASET:
        stat |= HIGMAC_SPD_100M;
        speed_mode = speed_mode_100M;
        break;
    case _1000BASET:
        stat |= HIGMAC_SPD_1000M;
        speed_mode = speed_mode_1000M;
        break;
    }

    if (ld->link_stat != stat) {
        if (stat & HIGMAC_LINKED) {
            port_mode = calculate_port_mode(speed_mode,
                higmac_board_info[ld->index].phy_intf,
                is_duplex_half);
            //printf("port_mode:%#x\n",port_mode);
            //printf("ld->iobase:%#x\n",ld->iobase);
            port_mode |= 0x30;
            higmac_set_macif(ld, port_mode, speed_mode);

            if (is_duplex_half)
                higmac_writel(ld, 0x0, MAC_DUPLEX_HALF_CTRL);
            else
                higmac_writel(ld, 0x1, MAC_DUPLEX_HALF_CTRL);

        }
        ld->link_stat = stat;
    }

    return stat;
}

static int gmac_inited;
static int mdio_register;
static int higmac_init(void)
{
    int ret = 0;
    struct higmac_netdev_local *ld;
    int i;

    /* init once to save time */
    if (!gmac_inited) {
        gmac_inited = 1;
        higmac_sys_init();
        higmac_mdiobus_driver_init();

        if (!mdio_register) {
            mdio_register = 1;
            miiphy_register(mdio_bus[0], higmac0_mdio_read,
                    higmac0_mdio_write);

            if (CONFIG_GMAC_NUMS == 2) {
                miiphy_register(mdio_bus[1], higmac1_mdio_read,
                        higmac1_mdio_write);
            }
        }
#if 0
        /* disable PHY 1000M Mode */
        miiphy_write(higmac_board_info[0].mii_name,
                higmac_board_info[0].phy_addr, PHY_1000BTCR, 0);

        if (CONFIG_GMAC_NUMS == 2)
            miiphy_write(higmac_board_info[1].mii_name,
                    higmac_board_info[1].phy_addr,
                    PHY_1000BTCR, 0);
#endif
#if 1
    unsigned short value;
    unsigned int oui;
    unsigned char model;
    unsigned char rev;
    unsigned char PHY_ADDR;
    int j;
    char *phy_name = higmac_board_info[0].mii_name;

    for(j=2;j<32;j++)
    {
        if(miiphy_info (phy_name,j, &oui,&model, &rev) == 0)
        {
            //printf("PHY 0x%02X: ""OUI = 0x%04X, ""Model = 0x%02X, ""Rev = 0x%02X \n",j, oui,model, rev);
            if(oui == 0x1374)
            {
            //    writel(0xc14fc1cf, 0x20050100);
            //    writel(0xc14fdfcf, 0x20050100);

            #if 1
                PHY_ADDR = j;
                miiphy_write(phy_name,PHY_ADDR,PHY_BMCR,PHY_BMCR_RESET);
                udelay(1000);
                miiphy_read(phy_name,PHY_ADDR,PHY_BMCR,&value);
                value |= PHY_BMCR_AUTON;
                //value |=0x1140;
                miiphy_write(phy_name,PHY_ADDR,PHY_BMCR,value);
                udelay(1000);

                miiphy_read(phy_name,PHY_ADDR,PHY_ANAR,&value);
                value |= (PHY_ANLPAR_TXFD|PHY_ANLPAR_TX|PHY_ANLPAR_10FD|PHY_ANLPAR_10);
                miiphy_write(phy_name,PHY_ADDR,PHY_ANAR,value);
                udelay(1000);
                //printf("PHY_ANAR:%lx\n",value);
                miiphy_write(phy_name,PHY_ADDR,0x1d,0x05);
                miiphy_write(phy_name,PHY_ADDR,0x1e,0x0100);  
                //printf("CONFIG RGMII\n");
            #endif
            }
            else if(oui == 0x01f0)
            {
                //writel(0x1, 0x120f0138);
                //writel(0x1, 0x120f013c);
                //writel(0x1, 0x120f0140);
                /* SDK BUG */
                writel(0x3f, 0x1204008c);

            #if 1
                PHY_ADDR = j;
                //miiphy_write(phy_name,PHY_ADDR,PHY_BMCR,PHY_BMCR_RESET);
                    miiphy_reset(higmac_board_info[0].mii_name,
                higmac_board_info[0].phy_addr);
                udelay(1000);
                miiphy_read(phy_name,PHY_ADDR,PHY_BMCR,&value);
                value |= PHY_BMCR_AUTON;
                miiphy_write(phy_name,PHY_ADDR,PHY_BMCR,value);

                miiphy_read(phy_name,PHY_ADDR,PHY_ANAR,&value);
                value |= (PHY_ANLPAR_TXFD|PHY_ANLPAR_TX|PHY_ANLPAR_10FD|PHY_ANLPAR_10);
                miiphy_write(phy_name,PHY_ADDR,PHY_ANAR,value);
                udelay(1000);

                //printf("rgmii0_col = 0x%lx\n",readl(0x200f0000+0x1b8));
                miiphy_read(phy_name,PHY_ADDR,PHY_MIPGSR,&value);
                //printf("value = 0x%lx\n",value);    
                //printf("CONFIG MII\n");
            #endif
            }
            break;
        }
        
    }

    if(j == 32)
    {
        printf("NOFOUND PHY\n");
    }
#endif

#if 0
        miiphy_reset(higmac_board_info[0].mii_name,
                higmac_board_info[0].phy_addr);

        if (CONFIG_GMAC_NUMS == 2)
            miiphy_reset(higmac_board_info[1].mii_name,
                    higmac_board_info[1].phy_addr);
#endif
        for_each_gmac_netdev_local_priv(ld, i) {
            higmac_glb_preinit_dummy(ld);

            ret = higmac_set_hwq_depth(ld);
            if (ret) {
                printf("init eth%d hw desc depth fail!\n", i);
                goto glb_init;
            }

            ret = higmac_init_hw_desc_queue(ld);
            if (ret) {
                printf("init eth%d hw desc queue fail!\n", i);
                goto hw_desc_init;
            }
        }
    }

    ret = select_current_linked_phy();
    if (ret)
        goto mdiobus_init;

    higmac_desc_enable(current_ld,
            RX_OUTCFF_WR_DESC_ENA|RX_CFF_RD_DESC_ENA);
    higmac_writel_bits(current_ld, 1, PORT_EN, BITS_RX_EN);

    higmac_writel_bits(current_ld, 1, PORT_EN, BITS_TX_EN);
    higmac_desc_enable(current_ld,
            TX_OUTCFF_WR_DESC_ENA|TX_CFF_RD_DESC_ENA);

    return 0;

hw_desc_init:
glb_init:
    higmac_mdiobus_driver_exit();

mdiobus_init:
    higmac_sys_exit();

    return ret;
}

linux驱动开发 移植三星的uboot(三) 1.网卡芯片与开发板的连接方式 网卡芯片要通过SROM Controller来连接,网卡接在SROM中,好处就是网卡芯片好像一个存储芯 片一样被扩展在SoC的一个地址空间中,主机SoC可以直接用一个地址来访问网卡芯片内部寄存 器。 总结:实际上也是一种总线式连接方式。优势是SoC内部不需要内置网卡控制器,所有的SFR全都 在外部网卡芯片中,而且还可以通过地址直接访问(IO与内存统一编址),不用像Nand/SD接口一 样使用时序来访问。 2.原理图浏览 网线有8根线,但是实际只有. 阅读详情

相关推荐

一次 MDIO 配置 switch 的调试过程,88e1512 switch mv88e6xxx

# 一次 MDIO 配置 switch 的调试过程 ## 1、什么是 MDIO 1. 物理层时序 总线的电平协议类似 IIC 的协议。有两线通讯,一条时钟 MDC,一条数据 MDIO。但是数据的表示和 IIC 有些许差异。 2. 使用场景 用于读写每个PHY的控制寄存器和状态寄存器,以达到控制PHY行为和监控PHY状态的目的。这是一个总线,可以挂32个不同地址的器件,通过不同的地址和对应的器件进行通讯。 3. 使用方法

qq_29832469的博客 4394

uboot网卡驱动移植

u-boot ethernet

jongzai的博客 283

【uboot】imx6ull uboot移植LAN8720A网卡驱动

文章目录相关文章1. 前言2. IMX6ULL Ethernet LAN8720A硬件连接3. 支持LAN8720A修改步骤4. 验证测试问题1:如何确定LAN8720A网卡PHYAD地址?问题2:如何确定device tree中对reset gpio的定义?问题3:LAN8720A网卡nINTSEL是如何配置?问题4:IMX6ULL ETH是如何被初始化的? 相关文章 1.《【uboot】imx6ull uboot 2020.04源码下载和编译环境配置》 2.《【Ethernet】以太网卡LAN8720

ZHONGCAI0901的博客 4316

phy 驱动与 switch 驱动

phy 驱动与 switch 驱动 phy 驱动 phy 与 cpu 的硬件连接 一般为 MAC-PHY 模式: MAC -PHY 之间使用 RGMII /MII 接口连接,用于传输数据。 SMI 接口,通常为 MDIO 接口或 I2C接口,用于读写PHY上面的寄存器。 - MAC-MAC 模式下一般要使用 fixed-link - switch 驱动一般注册为平台驱动 - switch 驱动核心功能是实现switch 的配置,vlan ,port 等 - swconfig 框架和 dsa 框架都是为了

我的学习笔记 1万+

为Exynos4412移植2022版U-Boot(三)——添加DM9000网卡驱动

DM9000网卡原理、基地址设置、数据读写、时序控制、驱动代码 U-Boot-2022-01的修改,支持DM9000驱动。

weixin_42408707的博客 972

荔枝派zero系列02:uboot编译及添加以太网驱动

荔枝派zero,实现uboot编译运行测试,以及添加以太网驱动

my_fly_dream的博客 513

uboot phy移植心得(基于hi3531A平台)

正常来说hi3531A提供的uboot已经可以满足正常需求,但是由于项目需求,我们会去适配不同的phy芯片。 需要修改的部分: 1.在include/configs/hi3531a.h 里有两个宏 CONFIG_HIGMAC_PHY1_ADDR 和 CONFIG_HIGMAC_PHY1_INTERFACE_MODE,分别指的是phy地址和模式。我这边需要mii模式就将这两个宏改成了 2 ,0。这个

a8411969的专栏 3600

基于Freescale的Uboot下网卡驱动详解

uboot下网卡驱动的分解,基于飞思卡尔平台,包含linux下的网卡设备抽象以及注册过程

uboot移植网络驱动配置

删掉NXP自带的网络引脚和相关函数(如果你跟NXP是一个芯片型号那就不用了)定义完事之后将其添加到对应网络复位引脚驱动中,然后在写网络IO初始化代码并且复位一下 PHY 芯片。不管你用什么板子第一步我们需要修改PHY地址,不同的板子使用不同的芯片对应的地址是不同的,我们需要打开开发板原理图进行确认然后对ENET1与ENET2的PHY地址进行赋值。我们通过改变引脚的高低电平让其复位一下,最后延时150ms,该板子使用的SR8210F,这个延时是有明确要求的,要不让将无法识别SR8210F。

zlp的博客 1417

单窗算法的地表温度反演:谷歌地球引擎GEE代码

该论文基于Statistical Mono-Window(SMW)算法,对地表温度加以求解。其中,简单地说,SMW算法即是通过简单的线性关系,对由单热红外波段所得的大气表观亮温与地表温度之间的经验关系加以表示,从而计算得到LST。

2301_78834737的博客 562

【信息学奥赛一本通】1215:迷宫(bfs版)

同时当Extense处在某个格点时,他只能移动到东南西北(或者说上下左右)四个方向之一的相邻格点上,Extense想要从点A走到点B,问在不走出迷宫的情况下能不能办到。每组测试数据的第1行是一个正整数n(1≤n≤100),表示迷宫的规模是n×n的。接下来是一个n×n的矩阵,矩阵中的元素为‘再接下来一行是4个整数ha,la,hb,lb,描述A处在第ha行, 第la列,B处在第hb行, 第lb列。一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n×n的格点组成,每个格点只有2种状态,.

chu_xiaojie的博客 946

U-Boot: 以太网驱动简介

U-Boot,以太网

JiMoKuangXiangQu的专栏 1901

VSCode搭配Keil开发STM32:从环境配置到代码跳转全流程(避坑指南)

本文详细介绍了如何使用VSCode搭配Keil进行STM32开发,从环境配置到代码跳转的全流程指南。通过安装必备插件和正确配置项目文件,开发者可以在VSCode中享受现代编辑器的便捷功能,同时保留Keil的编译调试能力,提升嵌入式开发效率。

weixin_28832121的博客 253

网卡驱动DM9000-基于uboot

1. 概念 网卡是一块被设计用来允许计算机在计算机网络上进行通讯的计算机硬件,它使得用户可以通过电缆或无线相互连接。 每一个网卡都有一个被称为MAC地址的独一无二的48位串行号,它被写在卡上的一块ROM中。在网络上的每一个计算机都必须拥有一个独一无二的MAC地址。没有任何两块被生产出来的网卡拥有同样的地址。这是因为电气电子工程师协会(IEEE)负责为网络接口控制器(网卡)销售商分配唯一的MAC地址。 网卡上面装有处理器和存储器(包括RAM和ROM)。网卡和局域网之间的通信是通过电缆或双绞线以串

四季帆的博客 816

泛微OA提交流程到下一个节点

泛微OA后端接口强制流程归档

CXYCMY的博客 2249

双目相机模型

近期想研究一下 双目相机 的内容,故先把 理论 弄清楚! 一、双目相机模型 针孔相机模型描述了 单个相机 的成像模型。然而,仅根据一个像素,我们是无法确定 这个空间点的具体位置的。这是因为,从相机光心到归一化平面连线上的所有点,都可以 投影至该像素上。只有当 P 的深度确定时(比如通过双目或 RGB-D 相机),我们才能确 切地知道它的空间位置。 测量像素距离(或深度)的方式有很多种,像人眼就可以根据左右眼看到的景物差异 (或称视差)来判断物体与我们的距离。双目相机的原理亦是如..

努力努力努力 2408

u-boot与linux下网卡MAC地址的更改

前言 ①假设有许多开发板,连接到了同一个路由器中,而路由器的dhcpd是根据MAC地址来分配一个固定的IP地址,那么就需要为每一个开发板设定一个不同的MAC地址从而获取不同的IP地址。 ②MAC地址是需要购买的(参考点1),在产品出厂之前,都需要给板子一个MAC地址(如果有对应的设备,例如网卡,Wifi)。且这个MAC地址在出厂后,我们并不期望被更改。 下面简述了嵌入式产品中如何保证IP地址不...

JK198310的专栏 2006

Cartographer实现双雷达建图

TRAJECTORY_BUILDER_2D.num_accumulated_range_data = 2 --执行一次前端匹配需要的激光扫描分段数量。关于num_subdivisions_per_laser_scan。num_laser_scans =2,--订阅激光扫描话题数量。Frame改为 前雷达laser_1 后雷达laser_2。雷达的话题由scan改为,前scan_1 后scan_2。有些人说需要改成2,但我这里改成2反而不行,1才可以。

Studying…… 1261

浅析uboot网络程序结构

这篇文章主要讲解uboo/net目录下的部分源代码。主要是 net.c,eth.c,ip3912.c 中的代码。本例用的是xxxx公司yyyy系列的zzzz的CPU, 网卡是IP173(和IP3912兼容)。   本文主要分三部分  网口设备的检测,网口设备的注册,应用程序(ping)的执行流程 (一) 检测网口设备 先从Arch/arm/lib/board.c讲起,ubo

zjy900507的博客 1769

【人工智能】Gemini怎么使用智能体的能力? Gemini Gems: 定制你的AI智能体

Gems 是 Gemini 的定制版本。你可以通过设定特定的指令(Instructions),让它变成你需要的专家。一旦创建,它会记住这些设定,你不需要在每次对话时重复输入背景信息。目前创建和使用自定义 Gems 通常需要订阅(Google One AI Premium 计划)。对于大多数用户来说,Gemini Advanced 中的 Gems是使用智能体能力的最直接方式。它能让你把重复性的提示词封装成一个好用的工具。

奶爸的编程之路,也就一周冷个三天 781

OSG第三方库编译之二十一:minizip编译(Windows、Linux、Macos环境下编译)

OSG编译;第三方库;跨平台编译;minizip编译(Windows、Linux、Macos环境下编译)

LuckyHanMo的博客 2622

uboot移植之网络驱动移植--网卡驱动如何工作--7.30

1.linux系统中网卡驱动的典型工作方式简介  (1)在linux系统中,网卡算是一个设备,这个设备驱动工作后会生成一个设备名叫ethn(n是0、1、2、····)(无线网卡名字一般叫wlan0、wlan1····)。然后linux系统用一些专用命令来操作网卡,譬如ifconfig命令。 (2)linux下的应用程序如何使用网卡驱动来进行网络通信?最通用的方法就是socket接口

西江物联的博客 5314

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

[Linux 底层]U-boot ksz9031网络驱动调试

ksz9031的介绍可以回归一下datasheet的介绍,一款很优秀的千兆以太网; 【Datasheet】PHY KSZ9031千兆网络芯片解读 系统版本:Ubuntu18.04-64 编译器版本:gcc version 7.4.0 (Ubuntu/Linaro 7.4.0-1ubuntu1~18.04.1) uboot版本:2018.07 -linux4sam_6.0 板子型号:at91sama5d3x-xplained MCU型号:sama5d36 关注微信公众号,回复“ksz9031驱动”,免费下

weixin_43771853的博客 4196

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

xilinx uboot网卡驱动分析

在大体分析代码的时候先讲一下基础知识,这也是我之前不懂的地方。 1、MAC控制器、网卡、PHY、MDIO、mii、gmii、rgmii概念扫盲          网卡在功能上包含OSI模型的两个层,数据链路层和物理层。物理层定义了数据传送与接收所需要的电与光信号、线路状态、时钟基准、数据编码和电路等,并向数据链路层设备提供标准接口。数据链路层则提供寻址机构、数据帧的构建、数据差错检查、传送控制

Gezhengzhong的专栏 4965

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Linux驱动之系统移植----uboot移植_修改网络驱动(uboot无设备树版本)

uboot移植中,修改网络驱动

qq_40684669的博客 1701

通过SMI(MDC/MDIO)读取外部PHY寄存器

通过SMI读写PHY寄存器

floenrce的博客 5412
上一篇: Hi3521A HI3520DV300 SDK osdrv 编译错误问题处理方法
下一篇: 内核ko文件和uImage不一致处理方法
wonview
博客等级 码龄19年 19粉丝 17原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值