From 7ff74e24116ebbceb83bd93085c93a51047e7f70 Mon Sep 17 00:00:00 2001
From: liukang <liukang@rt-thread.com>
Date: Thu, 16 Jul 2020 18:21:01 +0800
Subject: [PATCH 1/2] [update] add dac driver.

---
 bsp_skeleton/drivers/drv_dac.c | 77 ++++++++++++++++++++++++++++++++++
 bsp_skeleton/drivers/drv_dac.h | 15 +++++++
 smp_skeleton/driver/drv_dac.c  | 77 ++++++++++++++++++++++++++++++++++
 smp_skeleton/driver/drv_dac.h  | 15 +++++++
 4 files changed, 184 insertions(+)
 create mode 100644 bsp_skeleton/drivers/drv_dac.c
 create mode 100644 bsp_skeleton/drivers/drv_dac.h
 create mode 100644 smp_skeleton/driver/drv_dac.c
 create mode 100644 smp_skeleton/driver/drv_dac.h

diff --git a/bsp_skeleton/drivers/drv_dac.c b/bsp_skeleton/drivers/drv_dac.c
new file mode 100644
index 0000000..962bedf
--- /dev/null
+++ b/bsp_skeleton/drivers/drv_dac.c
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ */
+
+#include <rtdevice.h>
+#include <rtthread.h>
+#include "board.h"
+#include "drv_dac.h"
+
+#define SKT_DAC_DEVICE(dac_dev)    (struct skt_dac_dev *)(dac_dev)
+
+struct skt_dac_dev
+{
+    struct rt_dac_device parent;
+    rt_uint32_t dac_periph;
+};
+
+static rt_err_t skt_dac_enabled(struct rt_dac_device *device, rt_uint32_t channel)
+{
+    rt_err_t ret = RT_EOK;
+    struct skt_dac_dev *dac = SKT_DAC_DEVICE(device);
+
+    RT_ASSERT(dac != RT_NULL);
+
+    /* Todo: enable dac->dac_periph */
+
+    return ret;
+}
+
+static rt_err_t skt_dac_disabled(struct rt_dac_device *device, rt_uint32_t channel)
+{
+    rt_err_t ret = RT_EOK;
+    struct skt_dac_dev *dac = SKT_DAC_DEVICE(device);
+
+    RT_ASSERT(dac != RT_NULL);
+
+    /* Todo: disable dac->dac_periph */
+
+    return ret;
+}
+
+static rt_err_t skt_dac_convert(struct rt_dac_device *device, rt_uint32_t channel, rt_uint32_t *value)
+{
+    rt_err_t ret = RT_EOK;
+    struct skt_dac_dev *dac = SKT_DAC_DEVICE(device);
+
+    RT_ASSERT(dac != RT_NULL);
+
+    /* Todo: convert dac->dac_periph */
+
+    return ret;
+}
+
+const static struct rt_dac_ops skt_dac_ops =
+{
+    skt_dac_enabled,
+    skt_dac_disabled,
+    skt_dac_convert
+};
+
+int rt_hw_dac_init(void)
+{
+    rt_err_t ret = RT_EOK;
+    static struct skt_dac_dev dac_dev0;
+
+    /* Todo: Init dac Hardware */
+
+    ret = rt_hw_dac_register(&dac_dev0.parent, "dac0", &skt_dac_ops, &dac_dev0);
+
+    return ret;
+}
+INIT_DEVICE_EXPORT(rt_hw_dac_init);
diff --git a/bsp_skeleton/drivers/drv_dac.h b/bsp_skeleton/drivers/drv_dac.h
new file mode 100644
index 0000000..f6426c3
--- /dev/null
+++ b/bsp_skeleton/drivers/drv_dac.h
@@ -0,0 +1,15 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ */
+
+#ifndef DRV_DAC_H__
+#define DRV_DAC_H__
+
+int rt_hw_dac_init(void);
+
+#endif
\ No newline at end of file
diff --git a/smp_skeleton/driver/drv_dac.c b/smp_skeleton/driver/drv_dac.c
new file mode 100644
index 0000000..962bedf
--- /dev/null
+++ b/smp_skeleton/driver/drv_dac.c
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ */
+
+#include <rtdevice.h>
+#include <rtthread.h>
+#include "board.h"
+#include "drv_dac.h"
+
+#define SKT_DAC_DEVICE(dac_dev)    (struct skt_dac_dev *)(dac_dev)
+
+struct skt_dac_dev
+{
+    struct rt_dac_device parent;
+    rt_uint32_t dac_periph;
+};
+
+static rt_err_t skt_dac_enabled(struct rt_dac_device *device, rt_uint32_t channel)
+{
+    rt_err_t ret = RT_EOK;
+    struct skt_dac_dev *dac = SKT_DAC_DEVICE(device);
+
+    RT_ASSERT(dac != RT_NULL);
+
+    /* Todo: enable dac->dac_periph */
+
+    return ret;
+}
+
+static rt_err_t skt_dac_disabled(struct rt_dac_device *device, rt_uint32_t channel)
+{
+    rt_err_t ret = RT_EOK;
+    struct skt_dac_dev *dac = SKT_DAC_DEVICE(device);
+
+    RT_ASSERT(dac != RT_NULL);
+
+    /* Todo: disable dac->dac_periph */
+
+    return ret;
+}
+
+static rt_err_t skt_dac_convert(struct rt_dac_device *device, rt_uint32_t channel, rt_uint32_t *value)
+{
+    rt_err_t ret = RT_EOK;
+    struct skt_dac_dev *dac = SKT_DAC_DEVICE(device);
+
+    RT_ASSERT(dac != RT_NULL);
+
+    /* Todo: convert dac->dac_periph */
+
+    return ret;
+}
+
+const static struct rt_dac_ops skt_dac_ops =
+{
+    skt_dac_enabled,
+    skt_dac_disabled,
+    skt_dac_convert
+};
+
+int rt_hw_dac_init(void)
+{
+    rt_err_t ret = RT_EOK;
+    static struct skt_dac_dev dac_dev0;
+
+    /* Todo: Init dac Hardware */
+
+    ret = rt_hw_dac_register(&dac_dev0.parent, "dac0", &skt_dac_ops, &dac_dev0);
+
+    return ret;
+}
+INIT_DEVICE_EXPORT(rt_hw_dac_init);
diff --git a/smp_skeleton/driver/drv_dac.h b/smp_skeleton/driver/drv_dac.h
new file mode 100644
index 0000000..f6426c3
--- /dev/null
+++ b/smp_skeleton/driver/drv_dac.h
@@ -0,0 +1,15 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ */
+
+#ifndef DRV_DAC_H__
+#define DRV_DAC_H__
+
+int rt_hw_dac_init(void);
+
+#endif
\ No newline at end of file

From 5498ceb1c6c17ef9013950fb62ed355d4e1f8f66 Mon Sep 17 00:00:00 2001
From: liukang <liukang@rt-thread.com>
Date: Mon, 10 Aug 2020 11:29:26 +0800
Subject: [PATCH 2/2] [update] add audio driver

---
 bsp_skeleton/drivers/drv_audio.c | 157 +++++++++++++++++++++++++++++++
 bsp_skeleton/drivers/drv_audio.h |  14 +++
 smp_skeleton/driver/drv_audio.c  | 157 +++++++++++++++++++++++++++++++
 smp_skeleton/driver/drv_audio.h  |  14 +++
 4 files changed, 342 insertions(+)
 create mode 100644 bsp_skeleton/drivers/drv_audio.c
 create mode 100644 bsp_skeleton/drivers/drv_audio.h
 create mode 100644 smp_skeleton/driver/drv_audio.c
 create mode 100644 smp_skeleton/driver/drv_audio.h

diff --git a/bsp_skeleton/drivers/drv_audio.c b/bsp_skeleton/drivers/drv_audio.c
new file mode 100644
index 0000000..34c3a8f
--- /dev/null
+++ b/bsp_skeleton/drivers/drv_audio.c
@@ -0,0 +1,157 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ */
+
+#include <rtdevice.h>
+#include <rtthread.h>
+#include "board.h"
+#include "drv_audio.h"
+
+#ifdef BSP_USING_AUDIO
+
+#define SKT_AUDIO_DEVICE(audio_dev)    (struct skt_audio_dev *)(audio_dev)
+
+struct skt_audio_dev
+{
+    struct rt_audio_device audio;
+    struct rt_audio_configure replay_config;
+    rt_uint8_t *tx_fifo;
+    rt_uint8_t volume;
+};
+static struct skt_audio_dev audio_dev0;
+
+static rt_err_t skt_audio_getcaps(struct rt_audio_device *device, struct rt_audio_caps *caps)
+{
+    rt_err_t result = RT_EOK;
+    struct skt_audio_device *audio = SKT_AUDIO_DEVICE(device);
+
+    RT_ASSERT(audio != RT_NULL);
+
+    switch (caps->main_type)
+    {
+        case AUDIO_TYPE_QUERY:
+        {
+            /* Todo: qurey audio types */
+            break;
+        }
+
+        case AUDIO_TYPE_OUTPUT:
+        {
+            /* Todo: get audio functional attribute */
+            break;
+        }
+
+        case AUDIO_TYPE_MIXER:
+        {
+            /* Todo : get audio mixer units */
+            break;
+        }
+
+        default:
+            break;
+    }
+
+    return result;
+}
+
+static rt_err_t skt_audio_configure(struct rt_audio_device *device, struct rt_audio_caps *caps)
+{
+    rt_err_t result = RT_EOK;
+    struct skt_audio_device *audio = SKT_AUDIO_DEVICE(device);
+
+    RT_ASSERT(audio != RT_NULL);
+
+    switch (caps->main_type)
+    {
+        case AUDIO_TYPE_MIXER:
+        {
+            /* Todo : set audio mixer units */
+            break;
+        }
+
+        case AUDIO_TYPE_OUTPUT:
+        {
+            /* Todo : set audio functional attribute */
+            break;
+        }
+
+        default:
+            break;
+    }
+
+    return result;
+}
+
+static rt_err_t skt_audio_start(struct rt_audio_device *device, int stream)
+{
+    rt_err_t result = RT_EOK;
+    struct skt_audio_device *audio = SKT_AUDIO_DEVICE(device);
+
+    RT_ASSERT(audio != RT_NULL);
+
+    /* Todo : start audio */
+
+    return result;
+}
+
+static rt_err_t skt_audio_stop(struct rt_audio_device *device, int stream)
+{
+    rt_err_t result = RT_EOK;
+    struct skt_audio_device *audio = SKT_AUDIO_DEVICE(device);
+
+    RT_ASSERT(audio != RT_NULL);
+
+    /* Todo : stop audio */
+
+    return result;
+}
+
+static rt_size_t skt_audio_transmit(struct rt_audio_device *device, const void *writeBuf, void *readBuf, rt_size_t size)
+{
+    rt_size_t tsize = 0;
+    struct skt_audio_device *audio = SKT_AUDIO_DEVICE(device);
+
+    RT_ASSERT(audio != RT_NULL);
+
+    /* Todo : transmit audio data */
+
+    return tsize;
+}
+
+static void skt_audio_buffer_info(struct rt_audio_device *device, struct rt_audio_buf_info *info)
+{
+    struct skt_audio_device *audio = SKT_AUDIO_DEVICE(device);
+
+    RT_ASSERT(audio != RT_NULL);
+
+    /* Todo : get audio buffer info */
+}
+
+static struct rt_audio_ops skt_audio_ops =
+{
+    skt_audio_getcaps,
+    skt_audio_configure,
+    skt_audio_start,
+    skt_audio_stop,
+    skt_audio_transmit,
+    skt_audio_buffer_info
+};
+
+int rt_hw_audio_init(void)
+{
+    rt_err_t ret = RT_EOK;
+
+    /* Todo: register audio device */
+    audio_dev0.audio.ops = &skt_audio_ops;
+    ret = rt_audio_register(&audio_dev0.audio, "audio0", RT_DEVICE_FLAG_RDWR, &audio_dev0);
+
+    return ret;
+}
+INIT_DEVICE_EXPORT(rt_hw_audio_init);
+
+#endif /* BSP_USING_AUDIO */
diff --git a/bsp_skeleton/drivers/drv_audio.h b/bsp_skeleton/drivers/drv_audio.h
new file mode 100644
index 0000000..cdb061b
--- /dev/null
+++ b/bsp_skeleton/drivers/drv_audio.h
@@ -0,0 +1,14 @@
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ */
+
+#ifndef DRV_AUDIO_H__
+#define DRV_AUIDO_H__
+
+int rt_hw_audio_init(void);
+
+#endif
diff --git a/smp_skeleton/driver/drv_audio.c b/smp_skeleton/driver/drv_audio.c
new file mode 100644
index 0000000..34c3a8f
--- /dev/null
+++ b/smp_skeleton/driver/drv_audio.c
@@ -0,0 +1,157 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ */
+
+#include <rtdevice.h>
+#include <rtthread.h>
+#include "board.h"
+#include "drv_audio.h"
+
+#ifdef BSP_USING_AUDIO
+
+#define SKT_AUDIO_DEVICE(audio_dev)    (struct skt_audio_dev *)(audio_dev)
+
+struct skt_audio_dev
+{
+    struct rt_audio_device audio;
+    struct rt_audio_configure replay_config;
+    rt_uint8_t *tx_fifo;
+    rt_uint8_t volume;
+};
+static struct skt_audio_dev audio_dev0;
+
+static rt_err_t skt_audio_getcaps(struct rt_audio_device *device, struct rt_audio_caps *caps)
+{
+    rt_err_t result = RT_EOK;
+    struct skt_audio_device *audio = SKT_AUDIO_DEVICE(device);
+
+    RT_ASSERT(audio != RT_NULL);
+
+    switch (caps->main_type)
+    {
+        case AUDIO_TYPE_QUERY:
+        {
+            /* Todo: qurey audio types */
+            break;
+        }
+
+        case AUDIO_TYPE_OUTPUT:
+        {
+            /* Todo: get audio functional attribute */
+            break;
+        }
+
+        case AUDIO_TYPE_MIXER:
+        {
+            /* Todo : get audio mixer units */
+            break;
+        }
+
+        default:
+            break;
+    }
+
+    return result;
+}
+
+static rt_err_t skt_audio_configure(struct rt_audio_device *device, struct rt_audio_caps *caps)
+{
+    rt_err_t result = RT_EOK;
+    struct skt_audio_device *audio = SKT_AUDIO_DEVICE(device);
+
+    RT_ASSERT(audio != RT_NULL);
+
+    switch (caps->main_type)
+    {
+        case AUDIO_TYPE_MIXER:
+        {
+            /* Todo : set audio mixer units */
+            break;
+        }
+
+        case AUDIO_TYPE_OUTPUT:
+        {
+            /* Todo : set audio functional attribute */
+            break;
+        }
+
+        default:
+            break;
+    }
+
+    return result;
+}
+
+static rt_err_t skt_audio_start(struct rt_audio_device *device, int stream)
+{
+    rt_err_t result = RT_EOK;
+    struct skt_audio_device *audio = SKT_AUDIO_DEVICE(device);
+
+    RT_ASSERT(audio != RT_NULL);
+
+    /* Todo : start audio */
+
+    return result;
+}
+
+static rt_err_t skt_audio_stop(struct rt_audio_device *device, int stream)
+{
+    rt_err_t result = RT_EOK;
+    struct skt_audio_device *audio = SKT_AUDIO_DEVICE(device);
+
+    RT_ASSERT(audio != RT_NULL);
+
+    /* Todo : stop audio */
+
+    return result;
+}
+
+static rt_size_t skt_audio_transmit(struct rt_audio_device *device, const void *writeBuf, void *readBuf, rt_size_t size)
+{
+    rt_size_t tsize = 0;
+    struct skt_audio_device *audio = SKT_AUDIO_DEVICE(device);
+
+    RT_ASSERT(audio != RT_NULL);
+
+    /* Todo : transmit audio data */
+
+    return tsize;
+}
+
+static void skt_audio_buffer_info(struct rt_audio_device *device, struct rt_audio_buf_info *info)
+{
+    struct skt_audio_device *audio = SKT_AUDIO_DEVICE(device);
+
+    RT_ASSERT(audio != RT_NULL);
+
+    /* Todo : get audio buffer info */
+}
+
+static struct rt_audio_ops skt_audio_ops =
+{
+    skt_audio_getcaps,
+    skt_audio_configure,
+    skt_audio_start,
+    skt_audio_stop,
+    skt_audio_transmit,
+    skt_audio_buffer_info
+};
+
+int rt_hw_audio_init(void)
+{
+    rt_err_t ret = RT_EOK;
+
+    /* Todo: register audio device */
+    audio_dev0.audio.ops = &skt_audio_ops;
+    ret = rt_audio_register(&audio_dev0.audio, "audio0", RT_DEVICE_FLAG_RDWR, &audio_dev0);
+
+    return ret;
+}
+INIT_DEVICE_EXPORT(rt_hw_audio_init);
+
+#endif /* BSP_USING_AUDIO */
diff --git a/smp_skeleton/driver/drv_audio.h b/smp_skeleton/driver/drv_audio.h
new file mode 100644
index 0000000..cdb061b
--- /dev/null
+++ b/smp_skeleton/driver/drv_audio.h
@@ -0,0 +1,14 @@
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ */
+
+#ifndef DRV_AUDIO_H__
+#define DRV_AUIDO_H__
+
+int rt_hw_audio_init(void);
+
+#endif