请选择 进入手机版 | 继续访问电脑版
查看: 3768|回复: 4

【RT1052】3、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 19:19:47 | 显示全部楼层 |阅读模式


       本帖基于ok1052进一步完善音频驱动,增加音频接收部分。通过上一贴分析【飞凌RT1052】2、rt-thread 音频驱动分析,主要修改两个文件drv_codec.c和fsl_wm8960.c。
       

        1、wm8960.c主要修改WM8960_Init函数,使能音频wm8960音频输入,代码省略了不需要修改的部分。
    1. void WM8960_Init(wm8960_handle_t *handle, wm8960_config_t *config)
    2. {
    3.         ...
    4.         WM8960_WriteReg(handle, WM8960_POWER1, 0xFE);
    5.         ...
    6.         WM8960_WriteReg(handle, WM8960_POWER3, 0x3C);
    7.         ...
    8.         WM8960_WriteReg(handle, WM8960_LINPATH, 0x1B8);
    9.         WM8960_WriteReg(handle, WM8960_RINPATH, 0x138);
    10.         ...
    11.         WM8960_WriteReg(handle, WM8960_INBMIX1, 0x00);
    12.         WM8960_WriteReg(handle, WM8960_INBMIX2, 0x00);
    13.         ...
    14.         ...
    15.         WM8960_WriteReg(handle, WM8960_ADDCTL1, 0x0C0);
    16.         ...
    17.         WM8960_WriteReg(handle, WM8960_LINVOL, 0x117);
    18.         WM8960_WriteReg(handle, WM8960_RINVOL, 0x117);               
    19. }
    复制代码

        2、drv_codec.c修改,这里主要由4部分。
            a、增加音频接收需要的数据结构并增加主控音频外设初始化部分
    1.     struct imxcodec
    2.     {
    3.     ...
    4.     uint8_t rx_started;
    5.     sai_edma_handle_t rxHandle;
    6.     uint8_t rxbuff[RX_BUFFER_SIZE];
    7.     ...
    8.     edma_handle_t dmaRxHandle;
    9.     ...
    10.     };

    11.     static rt_err_t icodec_init(struct rt_audio_device *audio)
    12.     {
    13.     ...
    14.     EDMA_CreateHandle(&icodec->dmaRxHandle, EXAMPLE_DMA, EXAMPLE_RX_CHANNEL);
    15.     ...
    16.     DMAMUX_SetSource(DMAMUX0, EXAMPLE_RX_CHANNEL, EXAMPLE_SAI_RX_SOURCE);
    17.     DMAMUX_EnableChannel(DMAMUX0, EXAMPLE_RX_CHANNEL);
    18.     ...
    19.     SAI_TransferRxCreateHandleEDMA(icodec->sai, &icodec->rxHandle, saidma_callback, audio, &icodec->dmaRxHandle);
    20.     ...
    21.     SAI_TransferRxSetFormatEDMA(icodec->sai, &icodec->rxHandle, format, mclkSourceClockHz, format->masterClockHz);
    22.     ...
    23.     }
    复制代码

            b、音频设备注册时增加读权限,以便上层应用可以读取音频数据            
    1. int rt_hw_codec_init(void)
    2. {
    3.     ...
    4.     result = rt_audio_register(audio,"sound0", RT_DEVICE_FLAG_RDWR, &_g_imxcodec);
    5.     ...
    6. }
    复制代码

            c、完善音频接收部分,音频接收函数icodec_transmit和接收完成中断回调saidma_callback
    1. static rt_size_t icodec_transmit(struct rt_audio_device *audio, const void *writeBuf, void *readBuf, rt_size_t size)
    2. {
    3.     ...
    4.     else
    5.     {
    6.         sai_transfer_t xfer;

    7.         xfer.data = (uint8_t *)readBuf;
    8.         xfer.dataSize = size;
    9.         if (size%32 == 0)
    10.             icodec->rxHandle.count = 16;
    11.         else
    12.             icodec->rxHandle.count = 1;

    13.         if (SAI_TransferReceiveEDMA(icodec->sai, &icodec->rxHandle, &xfer) != kStatus_Success)
    14.             return 0;

    15.         return size;
    16.     }
    17.     ...
    18. }

    19. static void saidma_callback(I2S_Type *base, sai_edma_handle_t *handle, status_t status, void *userData)
    20. {
    21.     ...
    22.     struct rt_audio_device *audio = (struct rt_audio_device *)userData;
    23.     struct imxcodec *icodec = audio->parent.user_data;
    24.     if(handle == &icodec->txHandle)
    25.     {
    26.         ind = handle->queueDriver;
    27.         saddr = (rt_uint8_t*)handle->saiQueue[ind].data;
    28.         rt_audio_tx_complete(userData, saddr);
    29.     }
    30.     else if(handle == &icodec->rxHandle)
    31.     {
    32.         rt_audio_rx_done(userData, icodec->rxbuff, RX_BUFFER_SIZE);
    33.         if(icodec->rx_started == 1)
    34.         {
    35.             icodec_transmit(userData, RT_NULL, icodec->rxbuff, RX_BUFFER_SIZE);
    36.         }
    37.     }
    38. }
    复制代码

            d、实现音频接收功能的开始icodec_start与停止icodec_stop功能
    1. rt_err_t icodec_start(struct rt_audio_device *audio,int stream)
    2. {
    3.     struct imxcodec *icodec = audio->parent.user_data;
    4.     if(stream == AUDIO_STREAM_RECORD)
    5.     {
    6.         icodec->rx_started = 1;
    7.         icodec_transmit(audio, RT_NULL, icodec->rxbuff, RX_BUFFER_SIZE);
    8.     }
    9.     return RT_EOK;
    10. }

    11. rt_err_t icodec_stop(struct rt_audio_device *audio,int stream)
    12. {
    13.     struct imxcodec *icodec = audio->parent.user_data;
    14.     if(stream == AUDIO_STREAM_RECORD)
    15.     {
    16.         icodec->rx_started = 1;
    17.     }
    18.     return RT_EOK;
    19. }
    复制代码

        3、编写测试代码sound_test.c,测方法音频回环测试,将接收到的音频数据发送到音频播放。
    1.         
    2. while(1)
    3. {
    4.             i = rt_device_read(device, 0, read_buffer, BUFF_SIZE);
    5.             ...
    6.             rt_memcpy(write_buffer, read_buffer, BUFF_SIZE);
    7.             ...
    8.             i = rt_device_write(device, 0, write_buffer, BUFF_SIZE);
    9.             ...
    10. }
    复制代码

        4、最后附上代码,用法参考【飞凌RT1052】1、rt-thread移植适配第六部分,覆盖对应文件
            代码: imxrt1052-evk.zip (1.41 MB, 下载次数: 124)
    哎...今天够累的,签到来了~
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2020-3-29 09:54
  • 签到天数: 418 天

    [LV.9]以坛为家II

    21

    主题

    2928

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    3307
    最后登录
    2021-4-7
    发表于 2018-11-4 19:45:47 | 显示全部楼层
    学习了。
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情

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

    [LV.7]常住居民III

    38

    主题

    591

    帖子

    28

    金牌会员

    Rank: 6Rank: 6

    积分
    2193
    最后登录
    2023-12-1
    发表于 2018-11-4 20:10:07 | 显示全部楼层
    学习一波
    哎...今天够累的,签到来了~
    回复

    使用道具 举报

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

    [LV.9]以坛为家II

    14

    主题

    1049

    帖子

    5

    金牌会员

    Rank: 6Rank: 6

    积分
    2417
    最后登录
    2022-6-16
     楼主| 发表于 2018-11-4 22:25:30 | 显示全部楼层

    哈哈,相互学习,共同进步
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    1

    帖子

    0

    新手上路

    Rank: 1

    积分
    7
    最后登录
    2020-3-25
    发表于 2020-3-25 11:24:31 | 显示全部楼层
    音频播放不清晰,修改采样率 采样位 protocol 均无改善,怎么回事
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-3-29 03:42 , Processed in 0.141110 second(s), 25 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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