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

发布者:w2628203123最新更新时间:2022-07-14 来源: csdn关键字:Linux  底层  U-boot  网络驱动 手机看文章 扫描二维码
随时随地手机看文章

micrel公司一款优秀的PHY芯片,关于芯片的介绍参考:


[Datasheet PHY] ksz8081数据手册解读


系统版本: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很相似,公众部分可参考:


1、如何找到uboot官网开发板默认配置文件路径


2、如何进行公共信息配置


3、如何核对开发板硬件的参数


4、如何对uboot功能进行裁剪


5、设备树文件存放位置,及IO配置


6、网卡初始化流程,程序入口如何调用驱动文件接口;


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


关注微信公众号,回复“ksz8081驱动”,免费下载ksz8081的驱动源代码。


硬件参考图如下:


1、设备树更改


phy-mode = “rmii”; PHY的接口方式为RMII 外部需要提供50MHZ时钟,或者通过内部倍频;


gpios,因为硬件设计上,把芯片的电源和RST单独控制,可给芯片复位,或者进行上下电操作;可在应用层进行调用;


            macb1: ethernet@f802c000 {

                phy-mode = "rmii";

                #address-cells = <1>;

                #size-cells = <0>;

                pinctrl-0 = <&pinctrl_mcb1_rst >;

                status = "okay";

                gpios = <

                    &pioC   18 GPIO_ACTIVE_HIGH ///poweren

                    &pioC   31 GPIO_ACTIVE_HIGH ///rst

                    >;

                ethernet-phy@1 {

                    reg = <0x1>;

                };

            };


2、驱动初始化函数入口


#ifdef CONFIG_PHY_MICREL_KSZ8XXX

    phy_micrel_ksz8xxx_init();

#endif



int phy_micrel_ksz8xxx_init(void)

{

    printf("phy_micrel_ksz8xxx_init KSZ8081_drivern");

    phy_register(&KSZ804_driver);

    phy_register(&KSZ8031_driver);

    phy_register(&KSZ8051_driver);

    phy_register(&KSZ8081_driver);

    phy_register(&KS8721_driver);

    phy_register(&ksz8895_driver);

    phy_register(&ksz886x_driver);

    return 0;

}


50MHz晶振


static struct phy_driver KSZ8081_driver = {

    .name = "Micrel KSZ8081",

    .uid = 0x221560,

    .mask = 0xfffff0,

    .features = PHY_BASIC_FEATURES,

    .config = &ksz_8081_config,  //配置函数进行了重构,因为外部使用50M晶振,官网使用25M晶振

    .startup = &genphy_startup,

    .shutdown = &genphy_shutdown,

};


static int ksz_8081_config(struct phy_device *phydev)

{

    int ret;


    int regval;


    //50M晶振配置

    regval = phy_read(phydev, MDIO_DEVAD_NONE,MII_KSZPHY_CTRL);

    regval |= KSZ8051_RMII_50MHZ_CLK;

    phy_write(phydev, MDIO_DEVAD_NONE,MII_KSZPHY_CTRL, regval);

    printf(" ksz_8081_config MII_KSZPHY_CTRL(0x1f) =0x%xn",regval);


    ret = phy_read(phydev, MDIO_DEVAD_NONE, MII_KSZPHY_OMSO);

    if (ret < 0)

        return ret;


    ret |= KSZPHY_OMSO_B_CAST_OFF;

    //ret &= ~KSZPHY_OMSO_B_CAST_OFF;

    printf(" ksz_8081_config MII_KSZPHY_OMSO(0x16) =0x%xn",ret);

    ret = phy_write(phydev, MDIO_DEVAD_NONE, MII_KSZPHY_OMSO,

            ret);

    if (ret < 0)

        return ret;



    return genphy_config(phydev);

}


int genphy_config(struct phy_device *phydev)

{

    int val;

    u32 features;


    features = (SUPPORTED_TP | SUPPORTED_MII

            | SUPPORTED_AUI | SUPPORTED_FIBRE |

            SUPPORTED_BNC);


    /* Do we support autonegotiation? */

    val = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMSR);


    printf("genphy_config phyaddr=%d,MII_BMSR(%d)=0x%xn",phydev->addr,MII_BMSR,val);

    if (val < 0)

        return val;


    if (val & BMSR_ANEGCAPABLE)

        features |= SUPPORTED_Autoneg;


    if (val & BMSR_100FULL)

        features |= SUPPORTED_100baseT_Full;

    if (val & BMSR_100HALF)

        features |= SUPPORTED_100baseT_Half;

    if (val & BMSR_10FULL)

        features |= SUPPORTED_10baseT_Full;

    if (val & BMSR_10HALF)

        features |= SUPPORTED_10baseT_Half;


    if (val & BMSR_ESTATEN) {

        val = phy_read(phydev, MDIO_DEVAD_NONE, MII_ESTATUS);

        printf("genphy_config phyaddr=%d,MII_ESTATUS(%d)=0x%xn",phydev->addr,MII_ESTATUS,val);

        if (val < 0)

            return val;


        if (val & ESTATUS_1000_TFULL)

            features |= SUPPORTED_1000baseT_Full;

        if (val & ESTATUS_1000_THALF)

            features |= SUPPORTED_1000baseT_Half;

        if (val & ESTATUS_1000_XFULL)

            features |= SUPPORTED_1000baseX_Full;

        if (val & ESTATUS_1000_XHALF)

            features |= SUPPORTED_1000baseX_Half;

    }


    phydev->supported &= features;

    phydev->advertising &= features;


    genphy_config_aneg(phydev);


    return 0;

}


/**

 * genphy_config_aneg - restart auto-negotiation or write BMCR

 * @phydev: target phy_device struct

 *

 * Description: If auto-negotiation is enabled, we configure the

 *   advertising, and then restart auto-negotiation.  If it is not

 *   enabled, then we write the BMCR.

 */

int genphy_config_aneg(struct phy_device *phydev)

{

    int result;

    int ival = 0;


    if (phydev->autoneg != AUTONEG_ENABLE)

        return genphy_setup_forced(phydev);

#if 0

    //set loopback

    //Reg 0

    ival |= (1 << 14 );

    ival |= (1 << 6 );

    ival &= ~(1 << 13 );

    ival &= ~(1 << 12 );

    ival |= (1 << 8 );

    phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, BMCR_ANENABLE & (~(1<<6)));

#endif

    printf("genphy_config_aneg ival = 0x%x,test1111.n",ival);

    result = genphy_config_advert(phydev);


    if (result < 0) /* error */

    {

        return result;

    }


    printf("genphy_config_aneg result=%d test2222.n",result);

    if (result == 0) {

        /*

         * Advertisment hasn't changed, but maybe aneg was never on to

         * begin with?  Or maybe phy was isolated?

         */

        int ctl = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR);

        printf("genphy_config_aneg MII_BMCR, ctl=0x%xn",ctl);

        if (ctl < 0)

            return ctl;


        if (!(ctl & BMCR_ANENABLE) || (ctl & BMCR_ISOLATE))

            result = 1; /* do restart aneg */

    }


    /*

     * Only restart aneg if we are advertising something different

     * than we were before.

     */

    if (result > 0)

    {

        printf("genphy_config_aneg test3333.n");

        result = genphy_restart_aneg(phydev);

    }


    return result;

}


3、编译之后,把u-boot.bin文件下载到板子,运行打印信息如下:


U-Boot 2018.07-linux4sam_6.0 (Oct 11 2020 - 23:57:20 -0700)


CPU: SAMA5D36

Crystal frequency:       12 MHz

CPU clock        :      528 MHz

Master clock     :      132 MHz

DRAM:  256 MiB

NAND:  256 MiB

MMC:   Atmel mci: 0, Atmel mci: 1

Loading Environment from NAND... OK

In:    serial@ffffee00

Out:   serial@ffffee00

Err:   serial@ffffee00

Netjack:   macb_eth_probe phy-mode=mii,devname=ethernet@f0028000

eth0: ethernet@f0028000 [PRIME]macb_eth_probe phy-mode=rmii,devname=ethernet@f802c000

, eth1: ethernet@f802c000

Hit any key to stop autoboot:  0 

=> pri

打印出phy-mode=rmii是从设备树里面读取的信息;


使用ping命令进行验证,是否能够正常通讯;


=> ping 192.168.2.108

CONFIG_DM_ETH _macb_init MACB_BIT(RMII) | MACB_BIT(CLKEN)

ethernet@f802c000: PHY present at 1,phy_id=0x22,macb->phy_addr=1

macb_phy_init name=ethernet@f802c000,phy_addr=1,ret=0

 ksz_8081_config MII_KSZPHY_CTRL(0x1f) =0x8180

 ksz_8081_config MII_KSZPHY_OMSO(0x16) =0x202

ethernet@f802c000: Starting autonegotiation...

ethernet@f802c000: Autonegotiation complete

ethernet@f802c000: link up, 100Mbps full-duplex (lpa: 0xcde1)

macb_phy_init udelay(3000)

Using ethernet@f802c000 device

gmacb send

ff ff ff ff ff ff aa ab c1 d2 e6 c6 08 06 00 01 08 00 06 04 00 01 aa ab c1 d2 e6 c6 c0 a8 01 64 00 00 00 00 00 00 c0 a8 02 6c 

 _macb_recv paddr=0x2fb6bec0, length=64,phy_addr=1

 _macb_recv paddr=0x2fb6bf40, length=64,phy_addr=1

 _macb_recv paddr=0x2fb6bfc0, length=64,phy_addr=1

 _macb_recv paddr=0x2fb6c040, length=64,phy_addr=1

 _macb_recv paddr=0x2fb6c0c0, length=64,phy_addr=1

 _macb_recv paddr=0x2fb6c140, length=64,phy_addr=1

 _macb_recv paddr=0x2fb6c1c0, length=114,phy_addr=1

 _macb_recv paddr=0x2fb6c240, length=64,phy_addr=1

 _macb_recv paddr=0x2fb6c2c0, length=64,phy_addr=1

[1] [2]
关键字:Linux  底层  U-boot  网络驱动 引用地址:[Linux 底层]U-boot ksz8081网络驱动调试

上一篇:[linux 底层]u-boot EMMC驱动
下一篇:[Linux 底层]U-boot ksz9031网络驱动调试

推荐阅读最新更新时间:2024-10-30 11:19

第二章、Tiny4412 U-BOOT移植二 启动分析
一、启动过程说明 讲解启动过程,首先的源头就是打开电源,这个相信没人人不知道。CPU上电后,此时SP指针指向0x0000_0000,从这个地址取第一条指令。但此时:PLL没有启动,CPU工作频率为外部输入晶振频率,非常低 (Exynos4412 芯片边上有一颗24MHz,一颗27MHz,一颗32.768KHz);CPU的工作模式、中断设置等不确定;存储空间的各个BANK(包括内存)都没有驱动,内存(tiny4412用的DDR3)不能使用。在这种情况下必须在第一条指令处做一些初始化工作,这段初始化程序与操作系统独立分开,称之为Bootloader。下面以Samsung的U-BOOT:U-Boot-samsung-dev.tar.
[单片机]
第二章、Tiny4412 <font color='red'>U-BOOT</font>移植二 启动分析
嵌入式Linux在Blackfin处理器上的应用
1  Uclinux和Blackfin简介  1. 1  UcLinux简介  Uclinux是当前广泛应用的一种嵌入式Linux操作系统,是一个完全符合GNU/GPL公约的项目,与UNIX完全兼容,完全开放源码。英文单词中u表示Micro,c表示control,所以Uclinux的意思是“微控制领域的Linux系统”。  Uclinux针对嵌入式应用的特点,对Linux的内核(所用版本为linux2.6)进行了修改和重新编译,其大小远小于原来。它包含Linux常用的API,保留了原来Linux操作系统具有的高稳定性、强大的网络功能和卓越的文件系统支持功能等优点。  1. 2  Blackfin简介  Blackfin 系列
[嵌入式]
一种基于ARM-LINUX的物流复检系统设计方案
摘要:分拣环节在现代物流中的作用显得尤为重要。为了确保分拣的准确度,提出了一种基于ARM-LINUX的物流复检系统设计方案。该系统采用主控节点和终端节点的主从架构方式,终端节点和主控节点通过CAN总线互联,通过在终端节点上采用ARM-LINUX结构和接收终端节点上的条码数据来达到处理比对条码数据库信息的目的。实际应用表明,该复检系统能够保证分拣机构精准高效运行,测试时达到了设计的要求。 随着电子商务的快速发展,物流的重要性也日益凸显,而分拣环节在物流系统中是十分关键的。因此,要有效的保证分拣机构的精准高效运行。目前分拣的识别方式主要靠条形码识别,通过光电开关触发条形码扫描设备等捕获条形码信息,然后由光电开关信号以及延时控制分拣
[单片机]
一种基于ARM-<font color='red'>LINUX</font>的物流复检系统设计方案
module方式调试驱动(Micro2440 + linux 2.6.39)
调试驱动时,为了避免每修改一次内核配置或驱动都要重新编译一次内核镜像,可以将驱动配置成模块(module)的方式进行调试,可在LINUX启动时动态地加载驱动模式到内核中,减少了编译时间,也省去了重启LINUX的时间,大大加快调试进度。 以下以Micro2440 + linux 2.6.39的RTC驱动为例子,进行动态编译。 a) 将RTC编译成module,并打开DEBUG输出 # make menuconfig Device Drivers --- * Real Time Clock --- RTC debug suppor
[单片机]
module方式调试<font color='red'>驱动</font>(Micro2440 + <font color='red'>linux</font> 2.6.39)
基于AT91SAM9260的智能保密柜设计方案
引言   金属保密柜管理模式存在人为因素的安全隐患和记录信息不够详细等缺点,若能实现对物品的智能管理,自动记录物品日志,势必能提高保密柜管理的质量和效率。   本文基于工业级AT91SAM9260处理器设计了一个智能保密柜嵌入式控制系统。系统采用指纹比对进行物品权限的管理,拍照系统自动记录物品出入情况,系统具有报警功能。该系统嵌入了高性能、多任务的实时操作系统Linux,该操作系统具备源代码开放,内核体积小,占用系统资源少等优点,保证了系统的可靠性和实时性。   1 系统硬件设计   1.1 智能保密柜硬件结构   智能保密柜系统由上位PC和下位智能保密柜组成,其硬件结构如图1所示。      上位PC机可
[单片机]
基于AT91SAM9260的智能保密柜设计方案
ARM嵌入式LINUX设备驱动设计入门学习
经过一段时间的学习之后,也开发了一些小型的驱动,正如我之前一篇中写到得,现在我就来写一下在ARM嵌入式LINUX下如何设计驱动的框架。 在这里我用的板子是micro2440板子,板子上的linux版本是2.6.13。因为我在前一篇介绍了驱动编程的两种框架设计,所以现在我就来分别写一下这两种框架设计的程序。 开发平台:RED HAT LINUX 9(Linux 2.4.18) 开发板:micro2440(友善之臂)(Linux 2.6.13) 交叉编译工具:arm-linux-gcc-3.4.1 -----------------------------------------------------------
[单片机]
ARM-Linux移植之(四)——根文件系统构建
相关工具版本: busybox-1.7.0 arm-linux-4.3.2 linux-2.6.22 1.配置busybox并安装。 在我们的根文件系统中的/bin和/sbin目录下有各种命令的应用程序,而这些程序在嵌入式系统中都是通过busybox来构建的,每一个命令实际上都是一个指向busybox的链接,busybox通过传入的参数来决定进行何种命令操作。 1)配置busybox 解压busybox-1.7.0,然后进入该目录,使用makemenuconfig进行配置。这里我们这配置两项 一是在编译选项选择动态库编译,当然你也可以选择静态,不过那样构建的根文件系统会比动态编译的的大。 - Busybox Settings
[单片机]
Linux基金会宣布举办新会议,支持开源大数据社区协作
Apache: Big Data大会,开源项目提交者将汇聚一堂,促进Apache大数据技术的应用 Marketwired 2015年5月28日美国加利福尼亚州旧金山消息―― 致力于促进Linux和协作开发发展的非营利性组织Linux基金会(The Linux Foundation)今天宣布举办一场新会议----Apache: Big Data大会,新会议将把领先的Apache大数据项目提交者汇聚到一起,促进捕捉、评估和存储海量数据的技术向前发展。 首届Apache: Big Data大会将于9月28-30日在匈牙利布达佩斯举行,替代之前的ApacheCon大会。另一场新会议ApacheCon:
[嵌入式]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved