123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- /*
- * 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);
|