如何从内核访问用户空间中创建的节点?

时间:2016-04-11 06:47:58

标签: linux drivers alsa

我正在做一个练习,我想从内核访问声卡的节点/dev/snd/controlC0,使用tinymix实用程序从内核空间而不是用户空间设置tinymix控件。现在从tinymix实用程序的流程中我发现它在执行时会从用户空间调用mixer_open()函数,该函数在内部调用内核的snd_ctl_open()函数。现在我必须从内核做同样的事情我的模块需要调用相同的函数。我面临的问题是函数snd_ctl_open()有参数struct inode *inode, struct file *file。那么如何才能获得模块中节点的inode信息呢?

文件mixer.c位于{A <1}}的Android AOSP代码中。 external/tinyalsa/mixer.c位于snd_ctl_open()的Linux内核中。

我在构建内核API sound/core/control.c中找到了一个可以执行上述任务但可以在仅安装文件系统之后使用的内核API filp_open()。我想在文件系统安装之前打开一个节点。

简而言之,我的目标是了解在文件系统安装之前如何从内核访问或打开设备节点。

1 个答案:

答案 0 :(得分:0)

感谢scott的回复。

我能够访问设备节点/dev/controlC0,并能够从内核模块设置混音器控制设置。我遵循了下面的方法。

  1. static struct snd_minor *snd_minors[SNDRV_OS_MINORS]中定义了一个全局结构“sound/core/sound.c”。该结构具有关于所有声音设备的次要数量的信息。
  2. 我找到了一种从设备次要编号中查找设备节点和文件指针结构的方法。所以我所做的是从驱动程序调用函数find_control_device(),然后迭代所有设备并检查SNDRV_DEVICE_TYPE_CONTROL(声音控制设备)设备类型。函数find_control_device()返回控制设备的次要编号。
  3. 从设备辅助设备中,我无法获取设备节点和文件结构信息。
  4. 获得上述信息后,我调用snd_ctl_open(),这将打开设备节点进行操作。
  5. 当用户空间应用程序使用IOCTL与内核空间交互时。要设置混音器设置,tinymix会调用snd_ctl_ioctl()函数。所以我创建了一个包装函数,它将调用内部调用snd_ctl_ioctl()并设置混音器控件值。
  6. 我在驱动程序的module_init函数部分完成了上述所有步骤。因此,只要驱动程序在内核树中注册,就会根据需要设置所需的tinymix控件。

    我已经从AOSP代码树中引用了tinymix.c的代码来操纵IOCTL的参数。

    谢谢,

    与Hemant