在练习中,我希望从内核访问声卡的节点/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()中找到了一个,它可以完成上面提到的任务,但只能在文件系统挂载之后使用。我想在文件系统挂载之前打开一个节点。
简而言之,我的目标是了解如何在文件系统挂载之前从内核访问或打开设备节点。
发布于 2016-04-12 13:04:32
谢谢你的回复斯科特。
我可以访问设备节点/dev/controlC0,也可以从内核模块设置混频器控制设置。我遵循了下面的方法。
static struct snd_minor *snd_minors[SNDRV_OS_MINORS]中定义了一个全局结构“sound/core/sound.c”。这种结构有关于所有声音设备的少量信息。find_control_device(),它依次迭代所有设备并检查SNDRV_DEVICE_TYPE_CONTROL(声音控制设备)设备类型。函数find_control_device()返回控制设备的次要号码。snd_ctl_open(),它将为操作打开一个设备节点。snd_ctl_ioctl()函数。因此,我做了一个包装函数,它将调用内部调用snd_ctl_ioctl()并设置混频器控制值。我在module_init函数部分完成了driver.So中的所有步骤,只要驱动程序在内核树中注册,所需的微混合控件就会根据需求进行设置。
我从AOSP代码树中引用了一个tinymix.c代码来操作IOCTL的参数。
谢谢,
赫曼特
https://stackoverflow.com/questions/36565137
复制相似问题