首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从内核访问在用户空间中创建的节点?

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

Stack Overflow用户
提问于 2016-04-11 06:47:57
回答 1查看 814关注 0票数 0

在练习中,我希望从内核访问声卡的节点/dev/snd/controlC0,以便使用tinymix实用程序从内核空间而不是用户空间设置tinymix控件。现在,从tinymix实用程序的流程中,我发现在开始执行它时,它将从用户空间调用一个mixer_open()函数,该函数在内部调用kernel.Now的snd_ctl_open()函数,因为我必须从内核执行相同的操作,我的模块需要调用相同的函数。我面临的问题是函数snd_ctl_open()有参数struct inode *inode, struct file *file。那么如何在我的模块中获取节点的inode信息呢?

文件mixer.c位于external/tinyalsa/mixer.c的Android代码中。snd_ctl_open()位于sound/core/control.c的Linux内核中。

我在构建内核API filp_open()中找到了一个,它可以完成上面提到的任务,但只能在文件系统挂载之后使用。我想在文件系统挂载之前打开一个节点。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-12 13:04:32

谢谢你的回复斯科特。

我可以访问设备节点/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()并设置混频器控制值。

我在module_init函数部分完成了driver.So中的所有步骤,只要驱动程序在内核树中注册,所需的微混合控件就会根据需求进行设置。

我从AOSP代码树中引用了一个tinymix.c代码来操作IOCTL的参数。

谢谢,

赫曼特

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36565137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档