[linux kernel] 内核下ksz9031驱动调试踩过的坑

发布者:InnovateMind最新更新时间:2022-07-13 来源: csdn关键字:linux  kernel  内核 手机看文章 扫描二维码
随时随地手机看文章

系统版本: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


内核中调试驱动,和uboot中会有些区别,因为内核启动过程是顺序启动的,硬件上电后,外部的器件要快速做好准备工作,内核代码初始化到这个器件如果器件没有完成上电复位,很可能会驱动失败,需要硬件和软件时序同步,这是非常重要的一点。


【Datasheet】PHY KSZ9031千兆网络芯片解读


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


一、PHY在内核配置中需要使能对应的芯片厂商驱动Micrel公司PHY;


make menuconfig


Device Drivers  --->

     [*] Network device support  ---> 

        [*]   Ethernet driver support  --->

        -*-   MDIO bus device drivers  ---- //MDIO控制器读取PHY寄存器

        -*-   PHY Device support and infrastructure  --->

            <*>   Micrel PHYs       //Micrel公司的ksz9031和ksz8081



二、修改设备树文件,硬件配置语言,所有的硬件相关信息都需要从设备树中获取。这是新内核的特性。


//arch/arm/boot/dts/at91-sama5d3_xplaint.dts


            macb0: ethernet@f0028000 {

                phy-mode = "rgmii";

                #address-cells = <1>;

                #size-cells = <0>;

                status = "okay";


                ethernet-phy@0 {

                    reg = <0x0>;

                };

            };


三、把编译出的zImage烧录进板子,查看打印信息


CAN device driver interface

at91_can f000c000.can: device registered (reg_base=(ptrval), irq=42)

libphy: MACB_mii_bus: probed

Generic PHY f0028000.ethernet-ffffffff:01: attached PHY driver [Generic PHY] (mii_bus:phy_addr=f0028000.ethernet-ffffffff:01, irq=POLL)

macb f0028000.ethernet eth0: Cadence GEM rev 0x00020119 at 0xf0028000 irq 43 (ee:ab:c1:d2:e6:c6)

macb f802c000.ethernet: invalid hw address, using random

libphy: MACB_mii_bus: probed

Micrel KSZ8081 or KSZ8091 f802c000.ethernet-ffffffff:01: attached PHY driver [Micrel KSZ8081 or KSZ8091] (mii_bus:phy_addr=f802c000.ethernet-ffffffff:01, irq=49)

macb f802c000.ethernet eth1: Cadence MACB rev 0x0001010c at 0xf802c000 irq 44 (36:d7:c3:e6:2a:c7)

ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver5d36


其中,Generic PHY f0028000.ethernet-ffffffff:01;获取到得ID为全FF,硬件地址01;这里获取芯片的ID错误了,可能出错的点有MDIO配置错误,或者设备树配置错误;


不用太担心,可以根据打印的信息,查找对应的代码,添加上一些标识在里面;比如:macb f0028000.ethernet: macb_probe phy_interface=2.接口方式,可以搜索出对应的代码,然后添加Jack标识,再次烧录,即可打印出添加的信息;


linux-at91-linux-4.19-at91driversnetethernetcadencemacb_main.c


static int macb_probe(struct platform_device *pdev)函数添加打印,


使用dev_info,用调试串口把信息打印出来,这是调试的必备手段;


图片


我们下面把PHY的接口方式,PHY ID都打印出来,看看和设备树是否能够对应上;


2、内核的网卡驱动找不到对应的PHY驱动

内核打印信息

macb f0028000.ethernet: Jack macb_probe phy_interface=2.

macb f0028000.ethernet: macb_mii_init name=f0028000.ethernet,id=ffffffff

libphy: MACB_mii_bus: probed

Generic PHY f0028000.ethernet-ffffffff:07: attached PHY driver [Generic PHY] (mii_bus:phy_addr=f0028000.ethernet-ffffffff:07, irq=POLL)

macb f0028000.ethernet eth0: Cadence GEM rev 0x00020119 at 0xf0028000 irq 46 (ee:ab:c1:d2:e6:c6)

macb f802c000.ethernet: invalid hw address, using random

macb f802c000.ethernet: Jack macb_probe phy_interface=7.

macb f802c000.ethernet: macb_mii_init name=f802c000.ethernet,id=ffffffff

libphy: MACB_mii_bus: probed

Generic PHY f802c000.ethernet-ffffffff:01: attached PHY driver [Generic PHY] (mii_bus:phy_addr=f802c000.ethernet-ffffffff:01, irq=POLL)

macb f802c000.ethernet eth1: Cadence MACB rev 0x0001010c at 0xf802c000 irq 47 (06:50:95:f8:63:dc)


全是id=ffffffff,怀疑是MDIO有问题

这里只匹配了Ksz8081的驱动;


phy_interface = 2;代表是MII接口


图片


四、继续添加打印信息,PHY外部最多可挂载32个PHY设备,内核是如何做识别的呢,使用for循环扫描的,如果读取到ID不为全FF,则认为是有效的设备,会对该设备进行驱动配对;再往前添加一些打印信息,看看扫描的过程是如何的;


libphy: mdiobus_scan i= 0

libphy: get_phy_device addr=0,get_phy_id=-1,

libphy: mdiobus_scan i= 1

libphy: get_phy_device addr=1,get_phy_id=-1,

libphy: mdiobus_scan i= 2

libphy: get_phy_device addr=2,get_phy_id=-1,

libphy: mdiobus_scan i= 3

libphy: get_phy_device addr=3,get_phy_id=-1,

libphy: mdiobus_scan i= 4

libphy: get_phy_device addr=4,get_phy_id=-1,

libphy: mdiobus_scan i= 5

libphy: get_phy_device addr=5,get_phy_id=-1,

libphy: mdiobus_scan i= 6

libphy: get_phy_device addr=6,get_phy_id=-1,

libphy: mdiobus_scan i= 7

libphy: get_phy_device addr=7,get_phy_id=-1,

libphy: mdiobus_scan i= 8

libphy: get_phy_device addr=8,get_phy_id=-1,

libphy: mdiobus_scan i= 9

libphy: get_phy_device addr=9,get_phy_id=-1,

libphy: mdiobus_scan i= 10

libphy: get_phy_device addr=10,get_phy_id=-1,

libphy: mdiobus_scan i= 11

libphy: get_phy_device addr=11,get_phy_id=-1,

libphy: mdiobus_scan i= 12

libphy: get_phy_device addr=12,get_phy_id=-1,

libphy: mdiobus_scan i= 13

libphy: get_phy_device addr=13,get_phy_id=-1,

libphy: mdiobus_scan i= 14

libphy: get_phy_device addr=14,get_phy_id=-1,

libphy: mdiobus_scan i= 15

libphy: get_phy_device addr=15,get_phy_id=-1,

libphy: mdiobus_scan i= 16

libphy: get_phy_device addr=16,get_phy_id=-1,

libphy: mdiobus_scan i= 17

libphy: get_phy_device addr=17,get_phy_id=-1,

libphy: mdiobus_scan i= 18

libphy: get_phy_device addr=18,get_phy_id=-1,

libphy: mdiobus_scan i= 19

libphy: get_phy_device addr=19,get_phy_id=-1,

libphy: mdiobus_scan i= 20

libphy: get_phy_device addr=20,get_phy_id=-1,

libphy: mdiobus_scan i= 21

libphy: get_phy_device addr=21,get_phy_id=-1,

libphy: mdiobus_scan i= 22

libphy: get_phy_device addr=22,get_phy_id=-1,

libphy: mdiobus_scan i= 23

libphy: get_phy_device addr=23,get_phy_id=-1,

libphy: mdiobus_scan i= 24

libphy: get_phy_device addr=24,get_phy_id=-1,

libphy: mdiobus_scan i= 25

libphy: get_phy_device addr=25,get_phy_id=-1,

libphy: mdiobus_scan i= 26

libphy: get_phy_device addr=26,get_phy_id=-1,

libphy: mdiobus_scan i= 27

libphy: get_phy_device addr=27,get_phy_id=-1,

libphy: mdiobus_scan i= 28

libphy: get_phy_device addr=28,get_phy_id=-1,

libphy: mdiobus_scan i= 29

libphy: get_phy_device addr=29,get_phy_id=-1,

libphy: mdiobus_scan i= 30

libphy: get_phy_device addr=30,get_phy_id=-1,

libphy: mdiobus_scan i= 31

libphy: get_phy_device addr=31,get_phy_id=-1,

libphy: Fixed MDIO Bus: probed

CAN device driver interface

at91_can f000c000.can: device registered (reg_base=(ptrval), irq=45)

macb f0028000.ethernet: Jack macb_probe phy_interface=2.

macb f0028000.ethernet: Jack macb_is_gem gem_ethtool_ops

macb f0028000.ethernet: Jack macb_mdc_clk_div =0x100000

macb f0028000.ethernet: Jack macb_dbw =0x300000,bp->phy_interface=2

libphy: MACB_mii_bus: probed

libphy: get_phy_device addr=0,get_phy_id=25278624,

Generic PHY f0028000.ethernet-ffffffff:00: attached PHY driver [Generic PHY] (mii_bus:phy_addr=f0028000.ethernet-ffffffff:00, irq=POLL)

macb f0028000.ethernet eth0: Cadence GEM rev 0x00020119 at 0xf0028000 irq 46 (ee:ab:c1:d2:e6:c6)

macb f802c000.ethernet: invalid hw address, using random

macb f802c000.ethernet: Jack macb_probe phy_interface=7.

macb f802c000.ethernet: Jack macb_is_gem macb_ethtool_ops

macb f802c000.ethernet: Jack macb_mdc_clk_div =0xc00

macb f802c000.ethernet: Jack macb_dbw =0xc00,bp->phy_interface=7


libphy: MACB_mii_bus: probed

libphy: get_phy_device addr=0,get_phy_id=2233697,

Micrel KSZ8081 or KSZ8091 f802c000.ethernet-ffffffff:00: attached PHY driver [Micrel KSZ8081 or KSZ8091] (mii_bus:phy_addr=f802c000.ethernet-ffffffff:00, irq=POLL)

macb f802c000.ethernet eth1: Cadence MACB rev 0x0001010c at 0xf802c000 irq 44 (86:82:71:07:ba:d2)


libphy: MACB_mii_bus: probed


libphy: get_phy_device addr=0,get_phy_id=25278624;其中在地址0上面读取到了PHY的ID,转化为16进制:0xF113644,和手册上面无法对应;但是为什么就是驱动识别不了呢?


更改设备树的PHY芯片地址;


//arch/arm/boot/dts/at91-sama5d3_xplaint.dts

GMAC外部PHY的地址为7,dts中配置的地址为0,地址不匹配,读取不了数据;

            macb0: ethernet@f0028000 {

                phy-mode = "rgmii";

                #address-cells = <1>;

                #size-cells = <0>;

                status = "okay";


                ethernet-phy@0 {

                    reg = <0x0>;

                };

            };


    改为:

            macb0: ethernet@f0028000 {

                phy-mode = "mii";

                #address-cells = <1>;

                #size-cells = <0>;

                status = "okay";


                ethernet-phy@7{

                    reg = <0x7>;

                };

            };

再次下载尝试,打印识别芯片正常,驱动可以正确匹配;


libphy: MACB_mii_bus: probed

libphy: get_phy_device addr=3,get_phy_id=-1,

mdio_bus f0028000.ethernet-ffffffff: MDIO device at address 3 is missing.

libphy: get_phy_device addr=0,get_phy_id=-1,

libphy: get_phy_device addr=1,get_phy_id=-1,

libphy: get_phy_device addr=2,get_phy_id=-1,

libphy: get_phy_device addr=3,get_phy_id=-1,

libphy: get_phy_device addr=4,get_phy_id=-1,

libphy: get_phy_device addr=5,get_phy_id=-1,

libphy: get_phy_device addr=6,get_phy_id=-1,

libphy: get_phy_device addr=7,get_phy_id=2233890,

libphy: get_phy_device addr=8,get_phy_id=-1,

libphy: get_phy_device addr=9,get_phy_id=-1,

libphy: get_phy_device addr=10,get_phy_id=-1,

libphy: get_phy_device addr=11,get_phy_id=-1,

libphy: get_phy_device addr=12,get_phy_id=-1,

libphy: get_phy_device addr=13,get_phy_id=-1,

libphy: get_phy_device addr=14,get_phy_id=-1,

libphy: get_phy_device addr=15,get_phy_id=-1,

libphy: get_phy_device addr=16,get_phy_id=-1,

libphy: get_phy_device addr=17,get_phy_id=-1,

libphy: get_phy_device addr=18,get_phy_id=-1,

[1] [2]
关键字:linux  kernel  内核 引用地址:[linux kernel] 内核下ksz9031驱动调试踩过的坑

上一篇:[linux kernel] 内核下ksz8081驱动调试
下一篇:[linux kernel]内核图形化裁剪配置

推荐阅读最新更新时间:2024-11-13 16:32

基于51内核和FPGA器件实现便携式幅频特性测试仪的应用方案
在现代电力电子系统中,随着内场测试和外场维护工作量的增加,对目前通用的测试仪器也提出了新的要求,研制低成本、体积小的便携式幅频特性测试仪具有深远的现实意义。目前,结合新型微处理器芯片进行幅频特性测试仪的研制主要有三种技术途径:(1)采用单片机作为主控芯片,通过软件编程方式实现部分硬件功能,这种方案可以有效降低系统的复杂度,但在实时性上不尽人意。(2)应用可编程逻辑器件(如FPGA)进行设计可以有效解决高速数据流的实时处理问题,但在人机界面的设计中具有较大困难。(3)采用单片机与FPGA芯片结合的方式,通过外部总线连接和数据传输协议的设计,使得系统兼具两者的优势,从而成为设计人员首选的主流方案。 现代EDA(Electronic
[测试测量]
基于51<font color='red'>内核</font>和FPGA器件实现便携式幅频特性测试仪的应用方案
linux 2.6.32.2 mini2440平台移植--内核移植、yaffs2文件系统移植
1.1 获取Linux内核源代码 有很多方式可以获取Linux内核源代码,如果你的linux平台可以上互联网,可以直接在命令行输入以下命令获取到Linux-2.6.32.2: #wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.2.tar.gz 当然你也可以先在Windows系统下使用迅雷等工具下载完,再复制到linux中。 1.2 解压内核源代码 假定我们刚才把内核源代码下载到了/root/mini2440目录,执行以下解压命 令: #cd /opt/FriendlyARM/mini2440 #tar xvzf linux-
[单片机]
arm linux 启动之一:汇编启动到start_kernel
描述arm linux启动的概要过程,以S5PV210(Cortex A8)为例,本文描述第一个阶段。 一、arm linux的引导 uboot在引导arm linux(uImage镜像)到SDRAM之后,通过bootm命令对uImage镜像的64个字节头进行解释,获取linux的entry入口地址,并赋值给theKernel函数指针(一般该值是0x38),并将uboot的环境变量参数(如平台的内存块区域信息、linux启动命令信息bootargs等)按linux要求的tags形式放置在0x30100起始的地方。接着关掉MMU,清除icache,dcache,最后通过该函数将控制权交给arm linux: t
[单片机]
Linux 移植 】——4、移植 u-boot-2012.04.01 之 支持NAND启动
三、移植 u-boot-2012.04.01 之 支持NAND启动 需要进行修改和添加的文件: 1、添加的文件:init.c 包含NAND Flash 的相关配置 board/samsung/smdk2440目录, 修改Makefile 2、需要修改的文件: a、去掉-pie选项,修改arch/arm/config.mk b、start.S c、smdk2440.h d、common.h e、board.c f、arch/arm/cpu/u-boot.lds 1、添加的文件:init.c init.c 代码如下: /* NAND FLASH控制器 */ #define N
[单片机]
大量安卓12新手机受影响,Linux内核被曝高危提权漏洞
Linux 内核由于开源性质,可以让许多人修改并重新分发。然而,面对未修补的安全漏洞时,开源就像一把双刃剑。    近日,安全研究员 Max Kellermann 发现了 Linux 内核的一个高危漏洞,该漏洞被称为 Dirty Pipe(脏管道),编号 CVE-2022-0847,可以覆盖任意只读文件中的数据,并获得 root 权限。    该漏洞在 Linux 内核 5.8 版本及以上,5.16.11、5.15.25 和 5.10.102 版本以下受影响,也就是 5.8 = 影响版本 5.16.11 / 5.15.25 / 5.10.102。    而按照安卓系统的要求,大量新发布的安卓 12 手机已经用上了 Lin
[手机便携]
大量安卓12新手机受影响,<font color='red'>Linux</font><font color='red'>内核</font>被曝高危提权漏洞
linux内核移植和网卡驱动(二)
一,内核移植步骤: 1, 修改顶层目录下的 Makefile ARCH ?= $(SUBARCH) CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE: % =%) 修改为: ARCH :=arm CROSS_COMPILE :=/usr/local/arm/4.4.3/bin/arm-linux- 2, 拷贝配置文件 这里用的是 FS2410 开发板,拷贝相应的板文件到顶层目录下 cp arch/arm/configs/s3c2410_defconfig ./ 编译配置文件,生成 .config 文件: Make s3c2410_defconfig 内核配置的目的: .config
[单片机]
zigbee学习之路(二):点亮LED
一.前言 今天,我来教大家如何点亮led,这也是学习开发板最基础的步骤了。 二.原理分析 cc2530芯片跟虽然是51的内核,但是它跟51单片机还是有区别的,51单片机不需要对IO口进行配置,而cc2530芯片却需要对IO口进行配置,才能对它进行赋值,需要配置的寄存器有PXSEL,PXDIR,PXINP,x可以代表任意IO口,如P1SEL。 下面介绍PXSEL的功能: 下面介绍PXDIR的功能: 下面介绍PXINP的功能: 通过配置以上寄存器的,就可以控制IO口德输入输出状态,是否做为普通IO口。 三.程序 #include ioCC2530.h #define uint unsigned int #defi
[单片机]
zigbee学习之路(二):点亮LED
在嵌入式Linux系统中使用的摄像头
1).目前越来越多的嵌入式系统采用摄像头应用,其中主要有下面几种方式 远程监控:如闭路电视系统,操作人员通过摄像头远程监控某个特定区域,小到一个小区,达到市政公共场所,都可能有这样的应用。 监控视频录制:另外一些监控系统不一定有操作人员一直监控,则会通过录制监控视频的方式在需要的时候调出相关视频进行查阅。 嵌入式视觉系统:嵌入式视觉系统会对视频图片进行处理并提取更多复杂信息,如雷达和城市智能交通应用。 视频传感器:如临床诊断设备会对采集的视频图像进行分析来诊断,智能购物设备通过采集视频图像分析使用者特征来定向推广销售等等。 2).环境配置 ./ ARM嵌入式模块系统:Toradex VF61以及 Colib
[单片机]
在嵌入式<font color='red'>Linux</font>系统中使用的摄像头
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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