查看: 5679|回复: 2

【RT1052】2、rt-thread 音频驱动框架分析

[复制链接]
  • TA的每日心情
    开心
    2021-4-13 21:11
  • 签到天数: 550 天

    [LV.9]以坛为家II

    14

    主题

    1049

    帖子

    5

    金牌会员

    Rank: 6Rank: 6

    积分
    2417
    最后登录
    2022-6-16
    发表于 2018-11-4 01:05:55 | 显示全部楼层 |阅读模式


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


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


        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,相关代码如下:
               
    1. const struct rt_audio_ops       _g_audio_ops =
    2. {
    3.     .getcaps    = icodec_getcaps,
    4.     .configure  = icodec_configure,

    5.     .init       = icodec_init,
    6.     .shutdown   = icodec_shutdown,
    7.     .start      = icodec_start,
    8.     .stop       = icodec_stop,
    9.     .suspend    = icodec_suspend,
    10.     .resume     = icodec_resume,
    11.     .control    = icodec_control,

    12.     .transmit   = icodec_transmit,
    13. };

    14. int rt_hw_codec_init(void)
    15. {
    16. ...
    17. ...
    18. audio->ops = (struct rt_audio_ops*)&_g_audio_ops;
    19. ...
    20. result = rt_audio_register(audio,"sound0", RT_DEVICE_FLAG_RDWR, &_g_imxcodec);
    21. ...
    22. ...
    23. }
    复制代码


            b、上面的icodec_xxx(xxx代指init、shutdown等)函数通过调用fsl_sai.c、fsl_sai_edma.c、wm8960.c中的函数实现相关操作。如:icodec_init(主要实现了rt1052音频外设及wm8960的初始化)
                
    1. static rt_err_t icodec_init(struct rt_audio_device *audio)
    2. {
    3. ...
    4. SAI_TxInit(DEMO_SAI, &config);
    5. ...
    6. DMAMUX_Init(DMAMUX0);
    7. ...
    8.     WM8960_Init(&icodec->codecHandle, NULL);
    9. ...
    10. }
    复制代码


        3、接下来分析下音频发送及接收具体实现:
            a、发送部分是通过消息队列,相关代码在audio.c中实现(rt_data_queue_push、rt_data_queue_peak、rt_data_queue_pop),主要流程见下图:
                 2.png

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

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







    哎...今天够累的,签到来了~
    回复

    使用道具 举报

  • TA的每日心情

    2021-2-4 09:24
  • 签到天数: 190 天

    [LV.7]常住居民III

    38

    主题

    591

    帖子

    28

    金牌会员

    Rank: 6Rank: 6

    积分
    2193
    最后登录
    2023-12-1
    发表于 2018-11-4 11:52:21 | 显示全部楼层
    分析得很好,学习学习
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-4-13 21:11
  • 签到天数: 550 天

    [LV.9]以坛为家II

    14

    主题

    1049

    帖子

    5

    金牌会员

    Rank: 6Rank: 6

    积分
    2417
    最后登录
    2022-6-16
     楼主| 发表于 2018-11-4 22:24:00 | 显示全部楼层
    mzy2364 发表于 2018-11-4 11:52
    分析得很好,学习学习

    感谢支持
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-27 08:25 , Processed in 0.131791 second(s), 24 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表