基于335X的linux网口驱动分析

一、 系统构成

1、  硬件平台 AM335X

2、  LINUX内核版本 4.4.12

二、 网口驱动构架(mdio部分)

mdio网口驱动部分 使用 总线、设备、驱动模型,总结如下:

若设备和驱动匹配,则执行

davinci_mdio_probe

--> mdiobus_register

--> device_register

--> mdiobus_scan

--> get_phy_device

--> get_phy_id // 读寄存器

-->  phy_device_create // 创建phy设备

--> INIT_DELAYED_WORK(&dev->state_queue, phy_state_machine); // !!!!!!初始化状态机函数

--> phy_device_register

经过以上步骤,由davinci_mdio_driver又创建出一个mdio_bus_type类型的bus.并扫描并创建了连接在bus上的phydev.

若设备和驱动匹配,这时,也进行了phydev和phy_driver的匹配和绑定。则执行phy_probe

以上总线下的设备和驱动的匹配过程如下,以platform_bus为例,其它总线也是这个流程

platform_device跟platform_driver的匹配

drivers/base/platform.c

a. 注册 platform_driver 的过程:

platform_driver_register

__platform_driver_register

drv->driver.probe = platform_drv_probe;

driver_register

bus_add_driver

klist_add_tail(&priv->knode_bus, &bus->p->klist_drivers);    // 把 platform_driver 放入 platform_bus_type 的driver链表中

driver_attach

bus_for_each_dev(drv->bus, NULL, drv, __driver_attach);  // 对于plarform_bus_type下的每一个设备, 调用__driver_attach

__driver_attach

ret = driver_match_device(drv, dev);  // 判断dev和drv是否匹配成功

return drv->bus->match ? drv->bus->match(dev, drv) : 1;  // 调用 platform_bus_type.match

driver_probe_device(drv, dev);

really_probe

drv->probe  // platform_drv_probe

platform_drv_probe

struct platform_driver *drv = to_platform_driver(_dev->driver);

drv->probe

b. 注册 platform_device 的过程:

platform_device_register

platform_device_add

device_add

bus_add_device

klist_add_tail(&dev->p->knode_bus, &bus->p->klist_devices); // 把 platform_device 放入 platform_bus_type的device链表中

bus_probe_device(dev);

device_initial_probe

__device_attach

ret = bus_for_each_drv(dev->bus, NULL, &data, __device_attach_driver); // // 对于plarform_bus_type下的每一个driver, 调用 __device_attach_driver

__device_attach_driver

ret = driver_match_device(drv, dev);

return drv->bus->match ? drv->bus->match(dev, drv) : 1;  // 调用platform_bus_type.match

driver_probe_device

匹配函数是platform_bus_type.match, 即platform_match,

匹配过程按优先顺序罗列如下:

a. 比较 platform_dev.driver_override 和 platform_driver.drv->name

b. 比较 platform_dev.dev.of_node的compatible属性 和 platform_driver.drv->of_match_table

c. 比较 platform_dev.name 和 platform_driver.id_table

d. 比较 platform_dev.name 和 platform_driver.drv->name

有一个成功, 即匹配成功

CPSW也是一个内部设备,也遵循总线、设备、驱动模型。CPSW设备从设备树中获得,DRV则是系统注册,匹配后进行probe,其主要执行过程如下:

cpsw_probe

--> CPSW平台数据、资源、DMA初始化、赋值netdev_ops、ethtool_ops

--> 注册网络设备:register_netdev

--> cpsw_ndo_open (此处根据实际经验得到,目前还没有从源代码级别解答出调用过程)

--> cpsw_slave_open

--> phy_connect (传递cpsw_adjust_link)

--> bus_find_device_by_name (从mdio总线上查找device)

--> to_phy_device (从device结构体中找到phy_device)

--> phy_connect_direct (传递handler,初始化 ***)

--> phy_attach_direct ()

--> d->driver = &genphy_driver[GENPHY_DRV_1G].driver;(通用驱动赋值,3.17支持1G和10G)

--> d->driver->probe (这里就调用到Generic PHY的检测函数phy_probe)

--> device_bind_driver (绑定驱动到设备)

--> phydev->attached_dev = dev; (有函数使用到attached_dev指针)

--> phydev->state = PHY_READY; (将PHY状态标记为PHY_READY)

--> phy_init_hw (硬件级的初始化,最后会调用genphy_config_init)

--> phy_prepare_link (赋值cpsw_adjust_link为adjust_link)

--> phy_start_machine (启动PHY状态机 ***)

--> phy_start_interrupts (经测了,但好像没调用到这里)

--> phy_start(PHY_READY变成PHY_UP)

--> 其它的CPSW的初始化

基于335X的Linux网口驱动分析的更多相关文章

  1. 基于335X的UBOOT网口驱动分析

    基于335X的UBOOT网口驱动分析 一.软硬件平台资料 1.  开发板:创龙AM3359核心板,网口采用RMII形式 2.  UBOOT版本:U-Boot-2016.05,采用FDT和DM. 参考链 ...

  2. 基于335X平台Linux交换芯片驱动开发

    基于335X平台Linux交换芯片驱动开发   一.软硬件平台资料 1.开发板:创龙AM3359核心板,网口采用RMII形式. 2.Kernel版本:4.4.12,采用FDT 3.交换芯片MARVEL ...

  3. linux串口驱动分析

    linux串口驱动分析 硬件资源及描写叙述 s3c2440A 通用异步接收器和发送器(UART)提供了三个独立的异步串行 I/O(SIO)port,每一个port都能够在中断模式或 DMA 模式下操作 ...

  4. 基于OMAPL138的Linux字符驱动_GPIO驱动AD9833(一)之miscdevice和ioctl

    基于OMAPL138的Linux字符驱动_GPIO驱动AD9833(一)之miscdevice和ioctl 0. 导语 在嵌入式的道路上寻寻觅觅很久,进入嵌入式这个行业也有几年的时间了,从2011年后 ...

  5. 基于OMAPL138的Linux字符驱动_GPIO驱动AD9833(二)之cdev与read、write

    基于OMAPL138的Linux字符驱动_GPIO驱动AD9833(二)之cdev与read.write 0. 导语 在上一篇博客里面,基于OMAPL138的字符驱动_GPIO驱动AD9833(一)之 ...

  6. Linux spi驱动分析(二)----SPI核心(bus、device_driver和device)

    一.spi总线注册 这里所说的SPI核心,就是指/drivers/spi/目录下spi.c文件中提供给其他文件的函数,首先看下spi核心的初始化函数spi_init(void).程序如下: 点击(此处 ...

  7. Linux I2C驱动分析(三)----i2c_dev驱动和应用层分析 【转】

    本文转载自:http://blog.chinaunix.net/uid-21558711-id-3959287.html 分类: LINUX 原文地址:Linux I2C驱动分析(三)----i2c_ ...

  8. linux驱动基础系列--Linux I2c驱动分析

    前言 主要是想对Linux I2c驱动框架有一个整体的把控,因此会忽略协议上的某些细节,同时里面涉及到的一些驱动基础,比如平台驱动.设备模型.sysfs等也不进行详细说明原理,涉及到i2c协议部分也只 ...

  9. Linux gadget驱动分析1------驱动加载过程

    为了解决一个问题,简单看了一遍linux gadget驱动的加载流程.做一下记录. 使用的内核为linux 2.6.35 硬件为芯唐NUC950. gadget是在UDC驱动上面的一层,如果要编写ga ...

随机推荐

  1. .net程序反编译工具(ILSpy)

    ILSpy是SharpDevelop小组的反编译工具,ILSPY这个开源工具的目的就是代替reflector的,它可以反编译出比reflector更好的C#代码. PC官方版 C#反编译工具ilspy ...

  2. 【LeetCode算法-26】Remove Duplicates from Sorted Array

    LeetCode第26题 Given a sorted array nums, remove the duplicates in-place such that each element appear ...

  3. windows10 卓越性能模式

    打开cmd,输入 powercfg -duplicatescheme e9a42b02-d5df-448d-aa00-03f14749eb61 再到电池选项里,勾选卓越性能模式 若没出现卓越性能,创建 ...

  4. python:日期计算

    python语言中的datetime模块可以利用其中的方法获取不同的日期,比如获取当前日期.明天.昨天.上个月.下个月和明年.下面利用几个实例说明这些日期的获取方法,操作如下: 第一步,利用datet ...

  5. kali 扫描之burp Suite学习笔记1

    1 安装 2 burs功能图解 3 工具栏详解 4 实战 (1) 网络配置 一台kali 一台msf 网络采用nat nat网络设置方法: 查看路由 配置文件 (2) 代理设置 bur代理设置 浏览器 ...

  6. 「中山纪中集训省选组D1T1」最大收益 贪心

    题目描述 给出\(N\)件单位时间任务,对于第\(i\)件任务,如果要完成该任务,需要占用\([S_i, T_i]\)间的某个时刻,且完成后会有\(V_i\)的收益.求最大收益. 澄清:一个时刻只能做 ...

  7. java8新特性五-Stream

    继上次学习过Java8中的非常重要的Lambda表达式之后,接下来就要学习另一个也比较重要的知识啦,也就如标题所示:Stream,而它的学习是完全依赖于之前学习的Lambda表达式. Java 8 A ...

  8. 永久解决Sublime包管理package control 打开install package报错 There are no packages available for installation

    很多用户在使用sumblime安装插件的时候,打开package control的install package会出现报错:There are no packages available for in ...

  9. [转帖]央行推出数字货币DCEP:基于区块链技术、将取代现钞

    央行推出数字货币DCEP:基于区块链技术.将取代现钞 天天快报的内容. 密码财经 2019-10-29 18:15 关注   前不久的10月23日,Facebook的首席执行官扎克伯格在美国国会听证会 ...

  10. PMBOK(第六版) PMP备考知识总汇!

    记录本人学习PMBOK第六版的学习笔记. 备考知识总汇! PMBOK序章 PMP备考指南之相关事项介绍 PMP备考指南之第一章:引论 PMP备考指南之第二章:项目运作环境 PMP备考指南之第三章:项目 ...