rt1052 usb速率_【RT1052】2、rt-thread 音频驱动框架分析

本文分析了rt-thread音频驱动框架,重点讲解了audio.c如何为应用提供接口,以及drv_codec.c和fsl_wm8960.c中主控IMX RT1050与音频芯片WM8960的驱动实现。音频驱动通过消息队列进行发送,使用pipe进行接收,详细阐述了发送和接收的工作流程。
摘要由CSDN通过智能技术生成

上一帖子中rt-thread适配移植主要介绍了ok1052的板卡支持,但只测试了部分驱动(串口、网卡),之后测试音频的时候发现音频部分只实现了播放,录音没有实现。分析了下音频驱动部分,发现框架是完整的。本篇先从框架入手,分析一下音频驱动的工作流程。注:本章内容不只局限ok1052板卡,而是针对rt-thread系统的分析

一、首先整体框架还是比较简单的,具体见下图:

1.png (23.28 KB, 下载次数: 12)

2018-11-4 00:15 上传

1、从上图可以看到audio.c是音频设备的核心部分,起到承上启下的作用,向上为应用提供通用接口(open、read、write、control等),向下为底层驱动提供了函数(rt_audio_tx_complete、rt_audio_rx_done)及需要实现的接口(ops)

2、再来看drv_codec.c和fsl_wm8960.c,这是主控imx rt1050和音频芯片wm8960的芯片具体的驱动部分,不同板卡音频驱动主要是实现这一部分。

a、其中drv_codec.c中实现了ops的相关函数接口,并通过rt_audio_register函数注册到audio.c,相关代码如下:

const struct rt_audio_ops       _g_audio_ops =

{

.getcaps    = icodec_getcaps,

.configure  = icodec_configure,

.init       = icodec_init,

.shutdown   = icodec_shutdown,

.start      = icodec_start,

.stop       = icodec_stop,

.suspend    = icodec_suspend,

.resume     = icodec_resume,

.control    = icodec_control,

.transmit   = icodec_transmit,

};

int rt_hw_codec_init(void)

{

...

...

audio->ops = (struct rt_audio_ops*)&_g_audio_ops;

...

result = rt_audio_register(audio,"sound0", RT_DEVICE_FLAG_RDWR, &_g_imxcodec);

...

...

}复制代码

b、上面的icodec_xxx(xxx代指init、shutdown等)函数通过调用fsl_sai.c、fsl_sai_edma.c、wm8960.c中的函数实现相关操作。如:icodec_init(主要实现了rt1052音频外设及wm8960的初始化)

static rt_err_t icodec_init(struct rt_audio_device *audio)

{

...

SAI_TxInit(DEMO_SAI, &config);

...

DMAMUX_Init(DMAMUX0);

...

WM8960_Init(&icodec->codecHandle, NULL);

...

}复制代码

3、接下来分析下音频发送及接收具体实现:

a、发送部分是通过消息队列,相关代码在audio.c中实现(rt_data_queue_push、rt_data_queue_peak、rt_data_queue_pop),主要流程见下图:

2.png (18.09 KB, 下载次数: 12)

2018-11-4 00:57 上传

b、接收部分是通过pipe实现的(具体到代码在audio_pipe.c中),pipe由audio.c中创建,类型为循环覆盖(RT_PIPE_FLAG_FORCE_WR),接收的主要流程如下:

3.png (17.07 KB, 下载次数: 13)

2018-11-4 00:57 上传

二、至此,音频驱动框架部分分析完成,下一篇将会基于ok1052实现并完善rt-thread下的音频驱动。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值