从一般的角度来看,我试图弄清楚如何从用户空间访问平台设备。更具体地说,我有一个EMIF控制器和SoC,我已将其添加到我的设备树中,我相信它已正确绑定到预先编写的EMIF平台设备驱动程序。现在我想弄清楚如何从用户空间应用程序访问这个EMIF设备。我遇到了几个与这个问题似乎有某些联系的不同主题,但我无法找到它们之间的关系。
1)正如我所读到的那样,大多数I / O都是通过使用由mknod()
创建的设备节点来完成的,我是否需要创建设备节点才能访问此设备?
2)我已经阅读了几个讨论写入内核模块(Character?,Block?)的线程,它可以与用户空间和平台设备驱动程序连接,并将其用作中介。
3)我已经读过使用mmap()
将我的平台设备的内存映射到我的虚拟内存空间的可能性。这可能吗?
4)似乎在实例化EMIF驱动程序时,它会调用probe()
函数。用户空间应用程序在驱动程序中调用哪些函数?
答案 0 :(得分:2)
不完全清楚你需要做什么(我应该警告我没有EMIF或平台设备的经验,特别是#34;但是这里&#39 ;一些概述,以帮助您入门:
是的,提供设备访问的常用方法是通过设备节点。通常这种访问是由角色设备驱动程序提供的,除非有更具体的提供方式。大多数情况下,如果应用程序正在直接和#34;对你的司机来说,它是一个角色设备。大多数其他类型的设备用于与其他内核子系统连接:例如,块设备通常用于提供从文件系统驱动程序(例如)到底层磁盘驱动器的访问;网络驱动程序提供从内核中的TCP / IP堆栈等对网络的访问。
您的驱动程序可以支持多种char设备方法或入口点,但最常见的是" read" (即如果用户空间程序打开你的设备并从中读取(2)),"写" (类似于写(2))和" ioctl" (通常用于配置/管理任务,不会自然地落入读取或写入)。请注意,mknod(2)仅创建设备的用户空间。内核中需要有相应的设备驱动程序("主要设备号"在mknod调用中给出用户空间节点与驱动程序链接)。
如果在设置设备时调用正确的内核函数,则可以自动创建文件系统中的设备节点(即节点将自动显示在/ dev中)。有一个特殊的守护进程从内核获取通知,并通过执行mknod(2)系统调用来响应。
内核模块只是一种动态加载的方式来创建驱动程序或其他内核扩展。它可以创建一个字符,块或网络设备(等),但静态链接的模块也可以。功能上存在一些差异,主要是因为并非您可能想要使用的所有内核功能都是"导出"动态加载模块(即可见)。
可以支持将设备内存映射到用户虚拟内存空间。这将由另一个驱动程序入口点(mmap)实现。有关char驱动程序可以支持的所有入口点,请参阅struct file_operations。
这完全取决于您:它取决于应用程序需要做什么。内核中有许多驱动程序不向用户空间提供任何直接功能,仅提供给其他内核代码。对于" probe",在各种接口中定义了许多探测功能。在大多数情况下,这些都是由内核调用的(或者可能是由更高级别的"类"驱动程序')来允许特定的驱动程序发现,识别和"声明" 34;个人设备。它们(探测功能)通常与提供用户空间访问没有任何直接关系,但我可能会在特定界面中遗漏某些内容。
答案 1 :(得分:0)
您需要创建设备节点才能访问设备。
当驱动程序找到匹配的设备时,将调用probe函数。
有关平台设备API的信息,以下文章可能很有用。