0

我目前正在编写一个 Linux 内核模块,该模块将创建一个虚拟 Midi 设备,以便用户空间程序可以将 midi 信号发送到任何类似 DAW 的软件。我发现了一个很棒的功能来帮助我完成我的任务:int register_sound_midi(const struct file_operations * fops, int dev). 问题是这个函数在 Kernel Version 4.15 之后就不再存在了。从V15V16,注册和取消注册功能就消失了。我现在对如何在 4.15 之后的版本中从内核注册一个假的 midi 设备感到目瞪口呆。如何在 Kernel post 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 *, size_t, 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, size_t count, 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);
4

0 回答 0