在RT-Thread下为MPU手搓以太网MAC驱动-2

2024-05-25 16:44

本文主要是介绍在RT-Thread下为MPU手搓以太网MAC驱动-2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • MAC驱动兼容不同的MPU平台
      • MAC驱动中断处理代码
      • MAC驱动下MDIO访问接口的实现
    • MAC驱动支持不同的PHY芯片
      • 对PHY设备的抽象

这是个人驱动开发过程中做的一些记录,仅代表个人意见和理解,不喜勿喷

  • MAC驱动需要兼容不同的MPU平台

MAC驱动兼容不同的MPU平台

MAC驱动中断处理代码

在MAC驱动下,提供了通用的中断处理代码,在通用中断处理代码下会调用每个MAC驱动实际注册的中断处理函数:

static void h3_macplib_interrupt(int vector, void *param)
{struct h3_macplib_dev *macplib_dev;RT_ASSERT(param != RT_NULL);macplib_dev = (struct h3_macplib_dev *)param;RT_ASSERT((int)macplib_dev->irqnum == vector);macplib_dev->mac_ops->macdev_interrupt(&macplib_dev->mac_dev);
}

MAC驱动在向RT-Thread注册network device时,所提供的初始化接口的实现:

static rt_err_t h3_macplib_initial(rt_device_t dev)
{struct mac_async_filter filter = {0};struct h3_macplib_dev *macplib_dev;macplib_dev = (struct h3_macplib_dev *)dev->user_data;RT_ASSERT(macplib_dev != RT_NULL);/* Disable GMAC interrupt and register IRQ handler */rt_hw_interrupt_mask(macplib_dev->irqnum);rt_hw_interrupt_install(macplib_dev->irqnum, h3_macplib_interrupt,(void *)macplib_dev, macplib_dev->name);/* Device is ready to work after final initialization */macplib_dev->mac_ops->macdev_init(&macplib_dev->mac_dev,(void *)macplib_dev->regs);/* Register frame RX callback function to notify Ethernet driver */macplib_dev->mac_ops->macdev_register(&macplib_dev->mac_dev,MAC_ASYNC_RECEIVE_CB,h3_macplib_rxcallback);/* set MAC hardware address */memcpy(filter.mac, macplib_dev->mac_addr, 6);filter.tid_enable = false;macplib_dev->mac_ops->macdev_filter(&macplib_dev->mac_dev, 0, &filter);/* Enable GMAC device */macplib_dev->mac_ops->macdev_enable(&macplib_dev->mac_dev);/* The last should enable GMAC interrupt handler */rt_hw_interrupt_umask(macplib_dev->irqnum);return RT_EOK;
}

MAC驱动下MDIO访问接口的实现

在定义MAC驱动操作接口的抽象时,就有定义PHY的寄存器读写接口,而MDIO操作PHY寄存器时就需要用到MAC操作接口所提供的PHY读写接口:

/* RT-Thread MDIO bus operation */
static struct rt_mdio_bus_ops h3_mdiobus_ops =
{.init   = h3_mdioplib_init,.read   = h3_mdioplib_read,.write  = h3_mdioplib_write,.uninit = RT_NULL,
};

MDIO操作接口读取接口的代码实现:

static rt_size_t h3_mdioplib_read(void *bus, rt_uint32_t addr,rt_uint32_t reg, void *data, rt_uint32_t size)
{rt_uint16_t val;rt_uint32_t *data_ptr = (rt_uint32_t *)data;struct h3_macplib_dev *macplib_dev;struct rt_mdio_bus    *mdioplib_bus = (struct rt_mdio_bus *)bus;RT_ASSERT(data != NULL);RT_ASSERT(bus  != NULL);if (4 != size) {return 0;}macplib_dev = (struct h3_macplib_dev *)mdioplib_bus->hw_obj;macplib_dev->mac_ops->macdev_readphy(&macplib_dev->mac_dev,(rt_uint16_t)addr, (rt_uint16_t)reg,&val);/* Get data from MII register. */*data_ptr = (rt_uint32_t)val;return 4;
}

那到这里的话,整个MAC驱动中最重要的部分已经完成,接下来将介绍PHY驱动代码的实现。

  • MAC驱动需要支持不同的PHY芯片

MAC驱动支持不同的PHY芯片

对PHY设备的抽象

需要对PHY设备做出抽象,不同的MPU产品中会存在MAC接口外接不同的PHY芯片,那在我们系统中每个PHY芯片就会有对应数量的PHY设备实例:

struct h3_kszplib_dev
{const char    *name;uint32_t       phy_addr;struct rt_phy_device rt_phydev;
} ;

RT-Thread下对PHY设备的操作接口做出抽象,在编写MAC驱动的时候,也需要完成对PHY设备操作接口的实现:

struct rt_phy_ops
{rt_phy_status (*init)(void *object, rt_uint32_t phy_addr, rt_uint32_t src_clock_hz);rt_phy_status (*read)(rt_uint32_t reg, rt_uint32_t *data);rt_phy_status (*write)(rt_uint32_t reg, rt_uint32_t data);rt_phy_status (*loopback)(rt_uint32_t mode, rt_uint32_t speed, rt_bool_t enable);rt_phy_status (*get_link_status)(rt_bool_t *status);rt_phy_status (*get_link_speed_duplex)(rt_uint32_t *speed, rt_uint32_t *duplex);
};

RT-Thread下定义的PHY操作抽象接口并不是很合理,比如你的系统里面有2个PHY的时候,你需要对每个PHY的操作接口做独立的实现,否则你无法根据当前read操作所传入的参数来区分当前操作的是哪个PHY设备。

如果你对上述说法不是很理解,参考下前面的h3_macplib_initial()函数,可以通过函数传入的参数dev,去获取到当前ethernet device对应的具体以太网设备实例包含的私有信息,根据这个信息用户驱动可以访问到自己定义的数据结构、操作接口等。

这篇关于在RT-Thread下为MPU手搓以太网MAC驱动-2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1002058

相关文章

如何在Mac上彻底删除Edge账户? 手动卸载Edge浏览器并清理残留文件技巧

《如何在Mac上彻底删除Edge账户?手动卸载Edge浏览器并清理残留文件技巧》Mac上的Edge账户里存了不少网站密码和个人信息,结果同事一不小心打开了,简直尴尬到爆炸,想要卸载edge浏览器并清... 如果你遇到 Microsoft Edge 浏览器运行迟缓、频繁崩溃或网页加载异常等问题,可以尝试多种方

Mac系统下卸载JAVA和JDK的步骤

《Mac系统下卸载JAVA和JDK的步骤》JDK是Java语言的软件开发工具包,它提供了开发和运行Java应用程序所需的工具、库和资源,:本文主要介绍Mac系统下卸载JAVA和JDK的相关资料,需... 目录1. 卸载系统自带的 Java 版本检查当前 Java 版本通过命令卸载系统 Java2. 卸载自定

如何确定哪些软件是Mac系统自带的? Mac系统内置应用查看技巧

《如何确定哪些软件是Mac系统自带的?Mac系统内置应用查看技巧》如何确定哪些软件是Mac系统自带的?mac系统中有很多自带的应用,想要看看哪些是系统自带,该怎么查看呢?下面我们就来看看Mac系统内... 在MAC电脑上,可以使用以下方法来确定哪些软件是系统自带的:1.应用程序文件夹打开应用程序文件夹

Mac备忘录怎么导出/备份和云同步? Mac备忘录使用技巧

《Mac备忘录怎么导出/备份和云同步?Mac备忘录使用技巧》备忘录作为iOS里简单而又不可或缺的一个系统应用,上手容易,可以满足我们日常生活中各种记录的需求,今天我们就来看看Mac备忘录的导出、... 「备忘录」是 MAC 上的一款常用应用,它可以帮助我们捕捉灵感、记录待办事项或保存重要信息。为了便于在不同

电脑蓝牙连不上怎么办? 5 招教你轻松修复Mac蓝牙连接问题的技巧

《电脑蓝牙连不上怎么办?5招教你轻松修复Mac蓝牙连接问题的技巧》蓝牙连接问题是一些Mac用户经常遇到的常见问题之一,在本文章中,我们将提供一些有用的提示和技巧,帮助您解决可能出现的蓝牙连接问... 蓝牙作为一种流行的无线技术,已经成为我们连接各种设备的重要工具。在 MAC 上,你可以根据自己的需求,轻松地

如何关闭Mac的Safari通知? 3招教你关闭Safari浏览器网站通知的技巧

《如何关闭Mac的Safari通知?3招教你关闭Safari浏览器网站通知的技巧》当我们在使用Mac电脑专注做一件事情的时候,总是会被一些消息推送通知所打扰,这时候,我们就希望关闭这些烦人的Mac通... Safari 浏览器的「通知」功能本意是为了方便用户及时获取最新资讯,但很容易被一些网站滥用,导致我们

如何在Ubuntu上安装NVIDIA显卡驱动? Ubuntu安装英伟达显卡驱动教程

《如何在Ubuntu上安装NVIDIA显卡驱动?Ubuntu安装英伟达显卡驱动教程》Windows系统不同,Linux系统通常不会自动安装专有显卡驱动,今天我们就来看看Ubuntu系统安装英伟达显卡... 对于使用NVIDIA显卡的Ubuntu用户来说,正确安装显卡驱动是获得最佳图形性能的关键。与Windo

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

嵌入式Linux之使用设备树驱动GPIO的实现方式

《嵌入式Linux之使用设备树驱动GPIO的实现方式》:本文主要介绍嵌入式Linux之使用设备树驱动GPIO的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、设备树配置1.1 添加 pinctrl 节点1.2 添加 LED 设备节点二、编写驱动程序2.1

嵌入式Linux驱动中的异步通知机制详解

《嵌入式Linux驱动中的异步通知机制详解》:本文主要介绍嵌入式Linux驱动中的异步通知机制,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、异步通知的核心概念1. 什么是异步通知2. 异步通知的关键组件二、异步通知的实现原理三、代码示例分析1. 设备结构