136 lines
3.6 KiB
C
136 lines
3.6 KiB
C
/*
|
|
* Copyright (c) 2006-2025 RT-Thread Development Team
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*
|
|
* Change Logs:
|
|
* Date Author Notes
|
|
* 2025-05-02 wumingzi First version
|
|
*/
|
|
|
|
#include "tc_audio_common.h"
|
|
|
|
#define THREAD_PRIORITY 9
|
|
#define THREAD_TIMESLICE 5
|
|
#define thread_simulate_intr_create_stacksize 1024
|
|
static rt_thread_t thread_simulate_intr_handle;
|
|
static struct mic_device mic_dev;
|
|
|
|
/* Simulate callback function */
|
|
static void thread_simulate_intr(void *parameter)
|
|
{
|
|
/* Send the data(0xAA) from DMA buffer to kernel */
|
|
rt_memset((void*)&mic_dev.rx_fifo[0], 0xAA, RX_DMA_BLOCK_SIZE);
|
|
rt_audio_rx_done((struct rt_audio_device *)&(mic_dev.audio), mic_dev.rx_fifo, RX_DMA_BLOCK_SIZE);
|
|
audio_fsm_step = 1;
|
|
|
|
while (1)
|
|
{
|
|
if(audio_fsm_step == 2)
|
|
{
|
|
/* Send the the data(0x55) from DMA buffer to kernel */
|
|
rt_memset((void*)&mic_dev.rx_fifo[RX_DMA_BLOCK_SIZE], 0x55, RX_DMA_BLOCK_SIZE);
|
|
rt_audio_rx_done(&mic_dev.audio, &mic_dev.rx_fifo[RX_DMA_BLOCK_SIZE], RX_DMA_BLOCK_SIZE);
|
|
audio_fsm_step = 3;
|
|
break;
|
|
}
|
|
if(audio_fsm_step == 4)
|
|
{
|
|
rt_thread_mdelay(10);
|
|
rt_audio_rx_done(&mic_dev.audio, &mic_dev.rx_fifo[RX_DMA_BLOCK_SIZE], RX_DMA_BLOCK_SIZE);
|
|
break;
|
|
}
|
|
rt_thread_mdelay(10);
|
|
}
|
|
|
|
while(1)
|
|
{
|
|
rt_thread_mdelay(10);
|
|
}
|
|
}
|
|
|
|
static void thread_simulate_intr_create(void)
|
|
{
|
|
thread_simulate_intr_handle = rt_thread_create(
|
|
"thread_simulate_intr",
|
|
thread_simulate_intr,
|
|
RT_NULL,
|
|
thread_simulate_intr_create_stacksize,
|
|
THREAD_PRIORITY - 1, THREAD_TIMESLICE);
|
|
|
|
if (thread_simulate_intr_handle == RT_NULL)
|
|
{
|
|
rt_kprintf("Error: Failed to create thread!\n");
|
|
return;
|
|
}
|
|
if (rt_thread_startup(thread_simulate_intr_handle) != RT_EOK)
|
|
{
|
|
rt_kprintf("Error: Failed to start thread!\n");
|
|
thread_simulate_intr_handle = RT_NULL;
|
|
}
|
|
|
|
}
|
|
|
|
static rt_err_t mic_device_init(struct rt_audio_device *audio)
|
|
{
|
|
return RT_EOK;
|
|
}
|
|
|
|
/* Simulate DMA interrupt */
|
|
static rt_err_t mic_device_start(struct rt_audio_device *audio, int stream)
|
|
{
|
|
thread_simulate_intr_create();
|
|
return RT_EOK;
|
|
}
|
|
|
|
static rt_err_t mic_device_stop(struct rt_audio_device *audio, int stream)
|
|
{
|
|
if (thread_simulate_intr_handle != RT_NULL)
|
|
{
|
|
rt_thread_delete(thread_simulate_intr_handle);
|
|
thread_simulate_intr_handle = RT_NULL;
|
|
}
|
|
return RT_EOK;
|
|
}
|
|
|
|
static rt_err_t mic_device_getcaps(struct rt_audio_device *audio, struct rt_audio_caps *caps)
|
|
{
|
|
return RT_EOK;
|
|
}
|
|
|
|
static rt_err_t mic_device_configure(struct rt_audio_device *audio, struct rt_audio_caps *caps)
|
|
{
|
|
return RT_EOK;
|
|
}
|
|
|
|
static struct rt_audio_ops _mic_audio_ops =
|
|
{
|
|
.getcaps = mic_device_getcaps,
|
|
.configure = mic_device_configure,
|
|
.init = mic_device_init,
|
|
.start = mic_device_start,
|
|
.stop = mic_device_stop,
|
|
.transmit = RT_NULL,
|
|
.buffer_info = RT_NULL,
|
|
};
|
|
|
|
static int rt_hw_mic_init(void)
|
|
{
|
|
struct rt_audio_device *audio = &mic_dev.audio;
|
|
/* mic default */
|
|
mic_dev.rx_fifo = rt_malloc(RX_DMA_FIFO_SIZE);
|
|
if (mic_dev.rx_fifo == RT_NULL)
|
|
{
|
|
return -RT_ENOMEM;
|
|
}
|
|
mic_dev.config.channels = MIC_CHANNEL;
|
|
mic_dev.config.samplerate = MIC_SAMPLERATE;
|
|
mic_dev.config.samplebits = MIC_SAMPLEBITS;
|
|
|
|
/* register mic device */
|
|
audio->ops = &_mic_audio_ops;
|
|
rt_audio_register(audio, SOUND_MIC_DEVICE_NAME, RT_DEVICE_FLAG_RDONLY, (void *)&mic_dev);
|
|
|
|
return RT_EOK;
|
|
}
|
|
INIT_DEVICE_EXPORT(rt_hw_mic_init); |