历史上的今天
返回首页

历史上的今天

今天是:2024年12月29日(星期日)

2020年12月29日 | I.MX6Q(TQIMX6Q/TQE9)学习笔记——新版BSP之网卡驱动移植

2020-12-29 来源:eefocus

由于对网卡这块不是很熟悉,误以为网卡驱动也可以简单的配置下DTS就可以正常工作了,实际移植中遇到了些问题。闲话少说,下面开始tqimx6q的网卡驱动移植。


DTS编写


首先在我们的DTS中添加网卡配置,参考sabrelite的DTS,我们可以如下编写:


&fec {

    pinctrl-names = "default";

    pinctrl-0 = <&pinctrl_enet_1>;

    phy-mode = "rgmii";

    status = "okay";

};

开始以为添加以上内容后编译并烧写DTB就可以正常工作了,实则不然,还需要添加PHY相关的配置代码。

PHY配置


打开arch/arm/mach-imx/mach-imx6q.c,在宏PHY_ID_AR8031附近做如下修改:


static int ar8035_phy_fixup(struct phy_device *dev)

{

    u16 val;

    

    

    /* Ar803x phy SmartEEE feature cause link status generates glitch,

    * which cause ethernet link down/up issue, so disable SmartEEE

    */

    phy_write(dev, 0xd, 0x3);

    phy_write(dev, 0xe, 0x805d);

    phy_write(dev, 0xd, 0x4003);

    

    

    val = phy_read(dev, 0xe);

    phy_write(dev, 0xe, val & ~(1 << 8));

    

    

    /*

    * Enable 125MHz clock from CLK_25M on the AR8031.  This

    * is fed in to the IMX6 on the ENET_REF_CLK (V22) pad.

    * Also, introduce a tx clock delay.

    *

    * This is the same as is the AR8031 fixup.

    */

    ar8031_phy_fixup(dev);

    

    

    /*check phy power*/

    val = phy_read(dev, 0x0);

    if (val & BMCR_PDOWN)

        phy_write(dev, 0x0, val & ~BMCR_PDOWN);

    

    

    return 0;

}

 

#define PHY_ID_AR8035 0x004dd072

 

static void __init imx6q_enet_phy_init(void)

{

    if (IS_BUILTIN(CONFIG_PHYLIB)) {

        phy_register_fixup_for_uid(PHY_ID_KSZ9021, MICREL_PHY_ID_MASK,

                ksz9021rn_phy_fixup);

        phy_register_fixup_for_uid(PHY_ID_KSZ9031, MICREL_PHY_ID_MASK,

                ksz9031rn_phy_fixup);

        phy_register_fixup_for_uid(PHY_ID_AR8031, 0xffffffff,

                ar8031_phy_fixup);

        phy_register_fixup_for_uid(PHY_ID_AR8035, 0xffffffff,

                ar8035_phy_fixup);

    }

}

即添加AR8035的ID,并初始化AR8035的寄存器,具体的含义我还没有来得及分析,以上修改参考了:

http://lxr.free-electrons.com/source/arch/arm/mach-imx/mach-imx6q.c

完成以上修改之后重新编译uImage和dtb,然后烧写开发板即可。


测试方法


寻求网卡的测试方法目标应该很明确,就是能ping通外网即可,下面是我在tqimx6q上的测试步骤。


Step1. 查看网卡信息


执行命令:


ifconfig -a

效果如下:

@tqimx6q #ifconfig -a

eth0      Link encap:Ethernet  HWaddr AA:EF:AE:8A:EA:05  

          BROADCAST MULTICAST  MTU:1500  Metric:1

          RX packets:0 errors:0 dropped:0 overruns:0 frame:0

          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000 

          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

 

lo        Link encap:Local Loopback  

          LOOPBACK  MTU:65536  Metric:1

          RX packets:0 errors:0 dropped:0 overruns:0 frame:0

          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0 

          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

 

sit0      Link encap:IPv6-in-IPv4  

          NOARP  MTU:1480  Metric:1

          RX packets:0 errors:0 dropped:0 overruns:0 frame:0

          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0 

          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Step2. 使能网卡eth0,执行命令:

ifconfig eth0 up

效果如下:

@tqimx6q #ifconfig eth0 up

fec 2188000.ethernet eth0: Freescale FEC PHY driver [Generic PHY] (mii_bus:phy_addr=2188000.ethernet:00, irq=-1)

IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready

@tqimx6q #libphy: 2188000.ethernet:00 - Link is Up - 100/Full

IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready

Step3. 动态获取IP,执行指令:

udhcpc

效果如下:

@tqimx6q #udhcpc

udhcpc (v1.22.1) started

Sending discover...

Sending select for 192.168.0.106...

Lease of 192.168.0.106 obtained, lease time 86400

Step4. 将动态获取的IP设置给网卡eth0,执行指令:

ifconfig eth0 192.168.0.106

之后可以通过命令查看网卡配置信息:

ifconfig eth0

效果如下:

@tqimx6q #ifconfig eth0 192.168.0.106

@tqimx6q #ifconfig eth0

eth0      Link encap:Ethernet  HWaddr AA:EF:AE:8A:EA:05  

          inet addr:192.168.0.106  Bcast:192.168.0.255  Mask:255.255.255.0

          inet6 addr: fe80::a8ef:aeff:fe8a:ea05/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:253 errors:0 dropped:0 overruns:0 frame:0

          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000 

          RX bytes:24238 (23.6 KiB)  TX bytes:1152 (1.1 KiB)

Step5. 设置网关,执行指令:

route add default gw 192.168.0.1

Step6. 通过ping指令测试网络状态,执行指令:

ping 8.8.8.8

效果如下:

@tqimx6q #ping 8.8.8.8

PING 8.8.8.8 (8.8.8.8): 56 data bytes

64 bytes from 8.8.8.8: seq=0 ttl=43 time=77.409 ms

64 bytes from 8.8.8.8: seq=1 ttl=43 time=83.292 ms

64 bytes from 8.8.8.8: seq=2 ttl=43 time=88.236 ms

64 bytes from 8.8.8.8: seq=3 ttl=43 time=80.713 ms

64 bytes from 8.8.8.8: seq=4 ttl=43 time=74.452 ms

64 bytes from 8.8.8.8: seq=5 ttl=43 time=78.627 ms

可见,tqimx6q已经可以ping通谷歌的DNS服务器了。至此,网卡的移植工作就完成了,


推荐阅读

史海拾趣

Advanced Thermal Products Inc公司的发展小趣事

为了保持技术领先,ATP公司积极与高校、科研机构等进行技术合作。他们共同研发新的热管理技术,不断推动产品升级换代。同时,公司还加大研发投入,引进先进的研发设备和人才,为公司的技术创新提供了有力支持。这些举措使得ATP公司在热管理领域的技术实力得到了显著提升。

迈翔科技(COILMX)公司的发展小趣事

迈翔科技(COILMX)的创始人看到了电子行业,特别是电感器市场的巨大潜力。1996年,公司正式成立,初期主要专注于SMD电感的设计、制造和销售。公司从香港起步,逐步在深圳设立工厂,引进先进的生产设备和技术,为未来的发展奠定了坚实的基础。

3E SECURITY公司的发展小趣事

为了进一步提升竞争力,3E SECURITY公司开始实施产业链整合战略。公司通过收购、兼并等方式,整合了上下游产业链资源,形成了从研发、生产到销售、服务的完整产业链体系。这一举措不仅降低了公司的运营成本,还提高了产品的质量和服务的效率,为公司的发展注入了新的动力。

Elytone Electronics Co Ltd公司的发展小趣事

进入XXXX年代,随着电子技术的飞速发展,Elytone公司意识到技术创新是企业持续发展的关键。公司投入大量资金引进先进设备和研发人才,成功开发出一系列具有竞争力的电子产品。这些产品在市场上获得了良好的口碑,为公司的快速发展奠定了坚实基础。

Elma Electronic Inc公司的发展小趣事

在Covid-19疫情期间,Elma展现了其应对挑战的能力。公司引入了良好的保护措施,并不断调整和改进以适应疫情带来的变化。同时,Elma还积极响应市场需求,为医疗领域提供了大量旋转开关等关键设备,为欧洲和东南亚的医院做出了重大贡献。此外,公司还为瑞士的客户开发和制造了消毒设备,帮助当地进行疫情防控。

以上5个故事涵盖了Elma Electronic Inc公司在电子行业发展的多个方面,展现了其强大的实力和应对挑战的能力。

ABB公司的发展小趣事

Elma对产品质量的追求是显而易见的。通过对所有员工的培训以及遵循认证的ISO标准的系统程序,Elma达到了行业领先的质量水平。这种对质量的承诺不仅体现在产品制造过程中,更贯穿于整个公司的运营和管理中。

问答坊 | AI 解惑

南京小组DIY情人节礼物方案公布

基于TMS320F28027的语言录放模块的设计 文章介绍了这次活动中的关键模块(语音录放模块)的基本设计思路和整个系统的构架,通过一些实际参量的分析,计算,提高整个系统前期设计的可实现性,虽然这个模型还没有经过实际验证,相关的参考实例也比较少,但他 ...…

查看全部问答>

vxWorks 4G cf 分区

我有一个4G的CF卡作为vxWorks的启动盘,我想把它分成2个区,一个1G,第二个3G,请问该如何操作?怎么访问第二个分区? …

查看全部问答>

WinCE死机

为什么我用VS2008的VB编了一个时钟程序(智能设备应用程序),然后部署到WinCE 5.0上,程序跑一会自己就死机了。很奇怪。后来发现死机主要取决于Timer控件,1秒刷新一次,3分多钟后死机,如果1毫秒刷新一次,2秒后就死机。为什么?怎么解决?谢谢!…

查看全部问答>

GPRS的驱动问题

     我要用GPRS模块实现终端机和服务器的数据交换(主要就是一些用户信息的交换和图片的传输)。客户要求通过HTTP协议来实现。而我要实现底层驱动部分,因为对上层应用不了解,有几个问题需要大侠确认:    1、我 ...…

查看全部问答>

VS2005基于智能设备的程序,对话框里的组控件里最多放置几个控件

用Vs 2005开发的VC 应用程序里,组控件里最多放几个控件变量啊?我的怎么放了八个就放不下别的了,确切的说是能放下但运行的时候 根本不显示,能不能更改一些设置,让组控件放的控件变多? …

查看全部问答>

小菜鸟刚入道 问问题 希望大家能帮助

在VS。NET 环境中使用WINCE模拟器 怎么建立 SQLCE 数据库啊??…

查看全部问答>

新手提问:vxworks中BSP包中的有些配置修改了,是不是要重新做编译啊?

同上.还有不知道谁有关于vxworks中PCI驱动的编写事例,最好硬件是PPC8270或相近的CPU.万分感谢!!!…

查看全部问答>

通告:意法半导体大中华区总部将于2008年2月1日起迁入新址

注意:因为搬迁繁忙,请各位在春节后再使用下述地址电话与我们联络,谢谢!祝各位网友春节好!…

查看全部问答>

求救,关于CAN的两个接收FIFO的问题

各位前辈,香主,浪主,小弟在使用STM32的CAN时有一些问题:问题1:我所了解到的,每一个FILTER漏入的数据只能指定放在一个FIFO(0或1),而在应用中绝大多数的数据是从一个FILTER中漏入的,所以,都挤在FIFO0中,FIFO1没有什么用处,能不能把两个FIFO连 ...…

查看全部问答>