问题描述
我目前正在编写一个 Linux 内核模块,它将创建一个虚拟的 Midi 设备,以便用户空间程序可以将 MIDI 信号发送到任何类似 DAW 的软件。我找到了一个 wonderful function 来帮助我完成任务:int register_sound_midi(const struct file_operations * fops,int dev)
。问题是这个功能在Kernel Version 4.15之后就不复存在了。从 V15 到 V16,注册和取消注册功能就消失了。我现在对如何在 4.15 之后的版本中从内核注册一个假的 midi 设备感到目瞪口呆。如何在内核版本 4.15 中注册 MIDI 设备?是否可以使模块向后兼容旧内核版本?
当前代码:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/sound.h>
#include <sound/core.h>
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Module to create dummy midi devices.");
MODULE_VERSION("0.01");
static int dummy_midi_open(struct inode *,struct file *);
static int dummy_midi_release(struct inode *,struct file *);
static ssize_t dummy_midi_read(struct file *,char *,size_t,loff_t *);
static ssize_t dummy_midi_write(struct file *,const char *,loff_t *);
static struct file_operations dummy_midi_fops = {
.owner = THIS_MODULE,.read = dummy_midi_read,.write = dummy_midi_write,.open = dummy_midi_open,.release = dummy_midi_release
};
static int minor;
static int dummy_midi_open(struct inode *midi_inode,struct file *midi_file)
{
printk(KERN_INFO"Open\n");
return 0;
}
static int dummy_midi_release(struct inode *midi_inode,struct file *midi_file)
{
printk(KERN_INFO"Release\n");
return 0;
}
static ssize_t dummy_midi_read(struct file *filp,char *buf,size_t count,loff_t *f_pos)
{
printk(KERN_INFO"Read\n");
return 0;
}
static ssize_t dummy_midi_write(struct file *filp,const char *buf,loff_t *f_pos)
{
printk(KERN_INFO"Write\n");
return 0;
}
static int __init midimodule_init(void)
{
printk(KERN_INFO"Initializing Module\n");
minor = register_sound_midi(&dummy_midi_fops,-1);
printk(KERN_INFO"Registered MIDI Device: %d\n",minor);
return 0;
}
static void __exit midimodule_exit(void)
{
printk(KERN_INFO"Leaving Now\n");
unregister_sound_midi(minor);
printk(KERN_INFO"Unregistered MIDI Device: %d\n",minor);
}
module_init(midimodule_init);
module_exit(midimodule_exit);
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)