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.
工具/软件:TI-RTOS
您好!
我想获取/设置模块的配置参数,并使用 ioctl。 我指的是第 182页的 NDK API 参考指南、我看到一个函数 ioctl、在第184页、我看到一个函数 NIMUIoctl。 我想知道这两个函数之间的区别是什么。 我可以使用 NIMUIoctl 获取和设置参数、但 ioctl (PG. 182)有什么作用?
此致
您好、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