【问题标题】:Accessing Platform Device from Userpace从用户空间访问平台设备
【发布时间】:2014-04-08 17:40:46
【问题描述】:

从一般的角度来看,我试图弄清楚如何从用户空间访问平台设备。更具体地说,我有一个 EMIF 控制器和 SoC,我已将其添加到我的设备树中,我相信它已正确绑定到预先编写的 EMIF 平台设备驱动程序。现在我想弄清楚如何从用户空间应用程序访问这个 EMIF 设备。我遇到了几个不同的主题,这些主题似乎与这个问题有一些联系,但我不太清楚它们之间的关系。

1) 据我所知,似乎大多数 I/O 是通过使用由mknod() 创建的设备节点完成的,我是否需要创建一个设备节点才能访问此设备?

2) 我读过一些关于编写内核模块(字符?块?)的帖子,该模块可以与用户空间和平台设备驱动程序交互,并将其用作中介。

3) 我已经了解了使用mmap() 将我的平台设备的内存映射到我的虚拟内存空间的可能性。这可能吗?

4) 好像是在实例化EMIF驱动的时候,调用了probe()函数。用户空间应用程序会在驱动程序中调用哪些函数?

【问题讨论】:

    标签: linux-kernel driver linux-device-driver embedded-linux system-on-chip


    【解决方案1】:

    目前尚不完全清楚您需要做什么(我应该提醒您,我没有使用 EMIF 或专门使用“平台设备”的经验),但这里有一些概述可以帮助您入门:

    1. 是的,提供对设备的访问权限的常用方法是通过设备节点。通常这种访问是由字符设备驱动程序提供的,除非有一些更具体的方式来提供它。大多数情况下,如果应用程序“直接”与您的驱动程序对话,它就是一个字符设备。大多数其他类型的设备用于与其他内核子系统的接口:例如,块设备通常用于提供从文件系统驱动程序(例如)到底层磁盘驱动器的访问;网络驱动程序提供从内核 TCP/IP 堆栈等对网络的访问。

      您的驱动程序可以支持多种 char 设备方法或入口点,但最常见的是“读取”(即,如果用户空间程序打开您的设备并从中执行 read(2)), “write”(类似于 write(2))和“ioctl”(通常用于不会自然地陷入读取或写入的配置/管理任务)。请注意,mknod(2) 仅创建设备的用户空间端。内核中需要有相应的设备驱动程序(在 mknod 调用中给出的“主要设备号”将用户空间节点与驱动程序联系起来)。

      为了在文件系统中实际创建设备节点,如果您在设置设备时调用正确的内核函数,这可以自动化(即节点将自动显示在 /dev 中)。有一个特殊的守护进程从内核获取通知并通过执行 mknod(2) 系统调用来响应。

    2. 内核模块只是一种创建驱动程序或其他内核扩展的动态可加载方式。它可以创建角色、块或网络设备(等),但静态链接模块也可以。功能上存在一些差异,主要是因为并非您可能想要使用的所有内核函数都“导出”到(即可见)动态加载的模块。

    3. 可以支持将设备内存映射到用户虚拟内存空间。这将由另一个驱动程序入口点 (mmap) 实现。有关 char 驱动程序可以支持的所有入口点,请参见 struct file_operations。

    4. 这在很大程度上取决于您:这取决于应用程序需要能够做什么。内核中有许多驱动程序不向用户空间提供直接功能,只为其他内核代码提供功能。至于“probe”,各种接口中定义了很多probe函数。在大多数情况下,这些由内核(或者可能由“更高级别的“类”驱动程序')调用,以允许特定的驱动程序发现、识别和“声明”单个设备。它们(探测功能)通常与提供用户空间访问没有任何直接关系,但我很可能在特定界面中遗漏了一些东西。

    【讨论】:

    • 我想我想知道来自嵌入式微控制器世界的什么,我如何访问这个我通常(没有操作系统)只引用寄存器并读写它们的硬件?
    • 如果只是偶尔修改设置,那么支持 ioctl 的 char 设备可能是最好的。如果您需要在运行时不断处理它,并且这样做的性能很关键,那么使用 mmap 可能是有意义的。
    • "...来自嵌入式微控制器世界" -- 使用 uC 与此无关。这是缺乏SW结构。您可以将 FW 组织成层并实现资源封装。我不得不使用没有遵循 SW 结构概念的 Z80 和 8051 FW。
    • "内核模块只是一个动态可加载的..." -- 并非所有内核模块都是可加载的。模块可以静态链接到内核映像中。有些模块甚至可能没有可加载选项(例如系统控制台使用的 tty 串行端口驱动程序(模块)必须内置)。
    【解决方案2】:

    您需要创建一个设备节点才能访问该设备。

    当驱动程序找到匹配的设备时调用探测函数。

    有关平台设备 API 的信息,以下文章可能会有用。

    The platform device API Platform devices and device trees

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-01
      • 2016-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多