This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/AM3358:NDK API 参考指南- ioctl 和 NIMUioctl

Guru**** 2037690 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/778539/rtos-am3358-ndk-api-reference-guide---ioctl-and-nimuioctl

器件型号:AM3358

工具/软件:TI-RTOS

您好!

我想获取/设置模块的配置参数,并使用 ioctl。 我指的是第 182页的 NDK API 参考指南、我看到一个函数 ioctl、在第184页、我看到一个函数 NIMUIoctl。 我想知道这两个函数之间的区别是什么。 我可以使用 NIMUIoctl 获取和设置参数、但 ioctl (PG. 182)有什么作用?

此致

维沙夫  .  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    文档中对此进行了说明:

    NIMUIoctl 从 NIMU 模块和驱动程序获取/设置配置
    此函数用于获取和设置来自 Nimu 的配置参数
    连接到连接到 NIMU 模块的 NIMU 网络接口对象驱动程序。
    NIMU_IF_REQ 结构定义如下:

    驱动程序为 NDK 堆栈注册的 ioctl 回调函数、以获取/设置配置
    NDK 内核堆栈使用此 API、以便能够获取/设置驱动程序中的配置。
    该接口现在可用于配置多播地址列表、更改设备
    MAC 地址等 每个 NIMU 网络接口对象还可以标识自己的自定义
    ioctl 命令执行任何特定于器件的配置。 此函数从调用
    内核模式。

    此致、Eric
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    感谢您的回答。 根据文档、我看到 ioctl 是一个回调函数。 我想知道什么事件会调用该函数。 作为一些实验、我使用了 NIMUIoctl 函数来获取/设置配置。 我假定 ioctl 函数被调用作为对 NIMUIoctl 的回调。 事实证明、它在一定程度上是正确的。 当我使用 NIMU_GET_NUM_NIMU_obj、NIMU_GET_DEVICE_MTU、NIMU_SET_DEVICE_MTU 和 NIMU_GET_DEVICE_MAC 等命令时、不会调用 ioctl。 但是、如果我使用命令 NIMU_SET_DEVICE_MAC、则会调用 ioctl 函数。
    这使我有点困惑这两个函数之间的区别以及如何使用它们。 我的工作目标是获取/设置网络接口的配置。 如果有人可以使用示例解释它、那将是一个很好的帮助。

    此致
    Vishav
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Vishav、

    您看到的 ioctl 函数是"Nimu 注册函数"之一。 也就是说、它是 NIMU 以太网驱动器必须实现的几个功能之一。 驱动程序中的此实现用于定义特定于特定器件的驱动程序/硬件的功能。 (请注意、NDK 堆栈(上层)是通用 C 代码、用于多种器件。 以太网驱动程序是堆栈中与硬件相关的代码部分、通常在每个器件基础上实现)。

    您看到的另一个 IOCTL 函数- NIMUIoctl -是"高级"IOCTL、它是通用堆栈代码的一部分。 此 IOCTL 函数在所有器件中都是通用的、并且支持获取/设置所有情况下都可用的通用功能、而不管底层 EMAC 硬件如何。

    例如、NIMUIoctl 函数实现了接口索引的获取、因为所有 NIMU 以太网驱动程序都必须设置此设置(这在所有器件情况下都是通用的)。 您可以通过使用宏 NIMU_GET_DEVICE_INDEX 调用 NIMUIoctl()函数来获取此器件 ID。

    但是、还有一些特定于器件的设置、通用堆栈代码不知道如何为所有底层硬件获取/设置这些设置。 这是 ioctl 寄存函数发挥作用的地方。 例如、每个器件的 MAC 地址设置不同、因为它需要写入正确的寄存器。 因此,这是一个必须在驱动程序中实现的功能,因此 NIMUIoctl()将此请求传递给驱动程序的 ioctl 函数,该函数将“知道”如何正确设置 MAC 地址。 在这种情况下,应用程序将使用宏 nimu_set_device_MAC 调用 NIMUIoctl(),这将导致调用 ioctl 寄存函数。 您可以在 ti/NDK/stack/Nimu/Nimu.c 的第1037行看到这一点

    另一个用例是支持特定于器件的 IOCTL 命令。 例如、一个 EMAC 器件可能支持特定功能、例如启用协议校验和卸载到硬件。 由于并非所有器件都支持此功能、因此应在驱动程序中为支持此功能的硬件定义此功能。

    在这种情况下,应用程序将使用适当的特定于器件的宏调用 NIMUIoctl(),以启用/禁用 h/w 校验和卸载。 由于 NIMUIoctl()对于这样一个宏没有'case',这将导致代码中的缺省开关情况,而代码只是将请求传递给驱动程序(即 ioctl)。 然后驱动程序 ioctl 注册函数将处理命令。

    总之,用户应用程序应始终调用 NIMUIoctl()。 该函数能够处理通用命令列表(例如获取器件索引)。 对于它无法处理的任何内容(例如、设置 MAC 地址)或无法识别的任何内容(例如、启用 h/w 校验和卸载)、它会调用 ioctl 指向的特定于驱动程序的实现。

    Steve

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Steve、

    非常感谢。 这真的很有帮助、解决了很多困惑。

    此致
    Vishav