OpenHarmony音频详解--ADM驱动框架介绍(1)

OpenHarmony音频详解--ADM驱动框架介绍(1)OpenHarmony音频驱动框架介绍_openharmony音频驱动开发

openharmony系统音频ADM框图

  1. 控制流和数据流对上接口层
    代码路径:framework\model\audio\dispatch
    这一层提供了ADM框架对上层HDI分装的接口,ADM lib 通过调用这一层里面的接口来和驱动交互。控制命令通过 audio control dispatch中的接口下发,数据流通过audio stream dispatch中的接口下发。
  2. 逻辑声卡层
    代码路径:framework\model\audio\core
    这块主要是对声卡的管理,包括声卡的加载、注册、卸载等。
  3. 逻辑设备层
    代码路径:framework\model\audio\core
    逻辑设备层主要负责对声卡codec、i2s、dma、dsp的驱动进行抽象提取适配层,也就是对上提供统一接口供逻辑声卡调用,对下提供统一接口让驱动适配。

接下来我们从代码着手看一下这几个模块。

                device_primary :: deviceNode {
                    policy = 2;
                    priority = 60;
                    preload = 0;
                    permission = 0666;
                    moduleName = "HDF_AUDIO";
                    deviceMatchAttr = "hdf_audio_driver_0";
                    serviceName = "hdf_audio_codec_primary_dev0";
                }

上面这个是audio的一个声卡的一部分配置信息,详细信息可以查看device_info.hcs,系统启动的时候会根据这个moduleName来找到对应的驱动。

/* HdfDriverEntry definitions */
struct HdfDriverEntry g_audioDriverEntry = {
    .moduleVersion = 1,
    .moduleName = "HDF_AUDIO",
    .Bind = AudioDriverBind,
    .Init = AudioDriverInit,
    .Release = AudioDriverRelease,
};
HDF_INIT(g_audioDriverEntry);

上面这是驱动代码中的一个片段,当系统启动时会工具HCS中配置的moduleName名称找到这块.moduleName相同的驱动代码执行这个里面的AudioDriverBind函数和AudioDriverInit函数。

现在我们就从声卡的启动AudioDriverBind函数和AudioDriverInit函数开始。

/* HdfDriverEntry implementations */
static int32_t AudioDriverBind(struct HdfDeviceObject *device)
{
    struct AudioHost *audioHost = NULL;

    ADM_LOG_DEBUG("entry.");
    if (device == NULL) {
        ADM_LOG_ERR("device is NULL.");
        return HDF_ERR_INVALID_OBJECT;
    }

    audioHost = AudioHostCreateAndBind(device);
    if (audioHost == NULL) {
        ADM_LOG_ERR("audioHost create failed!");
        return HDF_FAILURE;
    }

    ADM_LOG_INFO("success.");
    return HDF_SUCCESS;
}

AudioDriverBind函数很简单里面就一个AudioHostCreateAndBind函数,这个函数只是申请一些声卡的资源并创建声卡服务,这个服务就相当去Linux里面的设备节点。

static int32_t AudioDriverInit(struct HdfDeviceObject *device)
{
    struct AudioHost *audioHost = NULL;

    ADM_LOG_DEBUG("entry.");
    if (device == NULL) {
        ADM_LOG_ERR("device is NULL.");
        return HDF_ERR_INVALID_OBJECT;
    }
    if (!HdfDeviceSetClass(device, DEVICE_CLASS_AUDIO)) {
        ADM_LOG_ERR("set audio class failed.");
        return HDF_FAILURE;
    }
    audioHost = (struct AudioHost *)device->service;
    if (AudioCardInit(device, audioHost) != HDF_SUCCESS) {
        ADM_LOG_ERR("set audio class failed.");
        return HDF_FAILURE;
    }
    ADM_LOG_INFO("success.");
    return HDF_SUCCESS;
}

声卡的初始化主要在这个AudioDriverInit函数中实现,这个函数调用了AudioCardInit函数,这个函数里面就是初始化声卡资源并加载声卡的各个驱动。说到这里就需要对声卡里面涉及哪些驱动和这些驱动都是怎么管理起来的进行一个详细介绍。

声卡设备框图

由上图所示,一个声卡基本上就是有这三个模块组成的,硬件之间的链接也就如上图所示,这三个模块对应三个驱动,逻辑设备层对应的就是 codec对应codec,dai对应i2s, platform对应dma驱动。今天有点晚了,明天继续接着介绍。

今天的文章 OpenHarmony音频详解--ADM驱动框架介绍(1)分享到此就结束了,感谢您的阅读。
编程小号
上一篇 2024-10-19 09:06
下一篇 2024-10-19 08:46

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/4034.html