summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Shawcroft <scott@chickadee.tech>2016-08-27 15:04:34 -0700
committerScott Shawcroft <scott@chickadee.tech>2016-08-27 15:04:34 -0700
commit16fc0455097487428c4a1b5759a18d470ebb6cc2 (patch)
tree0cdc78c2db0190c00b5fbab8c3bccb9939b9799f
parent259ae8a39d347d2c653d737f2a1aec4f03d970fc (diff)
atmel-samd: Add direct write access to the DAC output.
-rw-r--r--atmel-samd/Makefile6
-rw-r--r--atmel-samd/asf/sam0/drivers/dac/dac.h207
-rw-r--r--atmel-samd/asf/sam0/drivers/dac/dac_callback.h119
-rw-r--r--atmel-samd/asf/sam0/drivers/dac/dac_sam_d_c/dac.c779
-rw-r--r--atmel-samd/asf/sam0/drivers/dac/dac_sam_d_c/dac_callback.c435
-rw-r--r--atmel-samd/asf/sam0/drivers/dac/dac_sam_d_c/dac_feature.h634
-rw-r--r--atmel-samd/asf/sam0/drivers/dac/docimg/dac_block_diagram.svg218
-rw-r--r--atmel-samd/asf/sam0/drivers/dac/docimg/dac_block_diagram_saml.svg1303
-rw-r--r--atmel-samd/modmachine.c2
-rw-r--r--atmel-samd/mpconfigport.h2
-rw-r--r--atmel-samd/mpdac.c152
-rw-r--r--atmel-samd/mpdac.h27
12 files changed, 3883 insertions, 1 deletions
diff --git a/atmel-samd/Makefile b/atmel-samd/Makefile
index 6003c519c..ef363ef43 100644
--- a/atmel-samd/Makefile
+++ b/atmel-samd/Makefile
@@ -48,6 +48,8 @@ INC += $(addprefix -Iasf/sam0/,\
drivers/port \
drivers/system \
drivers/adc/adc_sam_d_r \
+ drivers/dac \
+ drivers/dac/dac_sam_d_c \
drivers/system/clock \
drivers/system/clock/clock_samd21_r21_da \
drivers/system/interrupt \
@@ -93,12 +95,13 @@ endif
SRC_ASF = $(addprefix asf/sam0/,\
+ drivers/adc/adc_sam_d_r/adc.c \
+ drivers/dac/dac_sam_d_c/dac.c \
drivers/port/port.c \
drivers/sercom/sercom.c \
drivers/sercom/sercom_interrupt.c \
drivers/sercom/usart/usart.c \
drivers/sercom/usart/usart_interrupt.c \
- drivers/adc/adc_sam_d_r/adc.c \
drivers/system/clock/clock_samd21_r21_da/clock.c \
drivers/system/clock/clock_samd21_r21_da/gclk.c \
drivers/system/interrupt/system_interrupt.c \
@@ -114,6 +117,7 @@ SRC_C = \
main.c \
modmachine.c \
modutime.c \
+ mpdac.c \
mphalport.c \
pin.c \
pin_named_pins.c \
diff --git a/atmel-samd/asf/sam0/drivers/dac/dac.h b/atmel-samd/asf/sam0/drivers/dac/dac.h
new file mode 100644
index 000000000..f26e08e5a
--- /dev/null
+++ b/atmel-samd/asf/sam0/drivers/dac/dac.h
@@ -0,0 +1,207 @@
+/**
+ * \file
+ *
+ * \brief SAM Peripheral Digital-to-Analog Converter Driver
+ *
+ * Copyright (C) 2012-2015 Atmel Corporation. All rights reserved.
+ *
+ * \asf_license_start
+ *
+ * \page License
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * 3. The name of Atmel may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * 4. This software may only be redistributed and used in connection with an
+ * Atmel microcontroller product.
+ *
+ * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+ * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * \asf_license_stop
+ *
+ */
+/*
+ * Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
+ */
+#ifndef DAC_H_INCLUDED
+#define DAC_H_INCLUDED
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <compiler.h>
+#include <clock.h>
+#include <gclk.h>
+
+/**
+ * \addtogroup asfdoc_sam0_dac_group
+ *
+ * @{
+ */
+
+/**
+ * Define DAC features set according to different device families.
+ * @{
+ */
+#if (SAMD21 || SAMD10 || SAMD11 || SAMDA1)
+# define FEATURE_DAC_DATABUF_WRITE_PROTECTION
+#endif
+/**@}*/
+
+#ifndef DAC_TIMEOUT
+# define DAC_TIMEOUT 0xFFFF
+#endif
+
+#if DAC_CALLBACK_MODE == true
+# include <system_interrupt.h>
+
+/** Forward definition of the device instance. */
+struct dac_module;
+
+#if !defined(__DOXYGEN__)
+extern struct dac_module *_dac_instances[DAC_INST_NUM];
+#endif
+
+/** Type definition for a DAC module callback function. */
+typedef void (*dac_callback_t)(uint8_t channel);
+
+/** Enum for the possible callback types for the DAC module. */
+enum dac_callback {
+ /** Callback type for when a DAC channel data empty condition occurs
+ * (requires event triggered mode) */
+ DAC_CALLBACK_DATA_EMPTY,
+
+ /** Callback type for when a DAC channel data underrun condition occurs
+ * (requires event triggered mode) */
+ DAC_CALLBACK_DATA_UNDERRUN,
+
+ /** Callback type for when a DAC channel write buffer job complete (requires
+ * event triggered mode) */
+ DAC_CALLBACK_TRANSFER_COMPLETE,
+#if !defined(__DOXYGEN__)
+ DAC_CALLBACK_N,
+#endif
+};
+
+#endif
+
+#include <dac_feature.h>
+
+/**
+ * \name Configuration and Initialization
+ * @{
+ */
+
+bool dac_is_syncing(
+ struct dac_module *const dev_inst);
+
+void dac_get_config_defaults(
+ struct dac_config *const config);
+
+enum status_code dac_init(
+ struct dac_module *const dev_inst,
+ Dac *const module,
+ struct dac_config *const config);
+
+void dac_reset(
+ struct dac_module *const dev_inst);
+
+void dac_enable(
+ struct dac_module *const dev_inst);
+
+void dac_disable(
+ struct dac_module *const dev_inst);
+
+void dac_enable_events(
+ struct dac_module *const module_inst,
+ struct dac_events *const events);
+
+void dac_disable_events(
+ struct dac_module *const module_inst,
+ struct dac_events *const events);
+
+/** @} */
+
+/**
+ * \name Configuration and Initialization (Channel)
+ * @{
+ */
+
+void dac_chan_get_config_defaults(
+ struct dac_chan_config *const config);
+
+void dac_chan_set_config(
+ struct dac_module *const dev_inst,
+ const enum dac_channel channel,
+ struct dac_chan_config *const config);
+
+void dac_chan_enable(
+ struct dac_module *const dev_inst,
+ enum dac_channel channel);
+
+void dac_chan_disable(
+ struct dac_module *const dev_inst,
+ enum dac_channel channel);
+
+/** @} */
+
+/**
+ * \name Channel Data Management
+ * @{
+ */
+
+enum status_code dac_chan_write(
+ struct dac_module *const dev_inst,
+ enum dac_channel channel,
+ const uint16_t data);
+
+enum status_code dac_chan_write_buffer_wait(
+ struct dac_module *const module_inst,
+ enum dac_channel channel,
+ uint16_t *buffer,
+ uint32_t length);
+
+/** @} */
+
+/**
+ * \name Status Management
+ * @{
+ */
+uint32_t dac_get_status(
+ struct dac_module *const module_inst);
+void dac_clear_status(
+ struct dac_module *const module_inst,
+ uint32_t status_flags);
+
+/** @} */
+
+#ifdef __cplusplus
+}
+#endif
+
+/** @} */
+
+
+#endif /* DAC_H_INCLUDED */
diff --git a/atmel-samd/asf/sam0/drivers/dac/dac_callback.h b/atmel-samd/asf/sam0/drivers/dac/dac_callback.h
new file mode 100644
index 000000000..0de73056b
--- /dev/null
+++ b/atmel-samd/asf/sam0/drivers/dac/dac_callback.h
@@ -0,0 +1,119 @@
+/**
+ * \file
+ *
+ * \brief SAM Digital-to-Analog Interrupt Driver
+ *
+ * Copyright (C) 2013-2015 Atmel Corporation. All rights reserved.
+ *
+ * \asf_license_start
+ *
+ * \page License
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * 3. The name of Atmel may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * 4. This software may only be redistributed and used in connection with an
+ * Atmel microcontroller product.
+ *
+ * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+ * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * \asf_license_stop
+ *
+ */
+/*
+ * Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
+ */
+#ifndef DAC_CALLBACK_H_INCLUDED
+#define DAC_CALLBACK_H_INCLUDED
+
+#include <compiler.h>
+#include "dac.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * \addtogroup asfdoc_sam0_dac_group
+ *
+ * @{
+ */
+
+/** \name Callback Configuration and Initialization
+ * @{
+ */
+enum status_code dac_chan_write_buffer_job(
+ struct dac_module *const module_inst,
+ const enum dac_channel channel,
+ uint16_t *buffer,
+ uint32_t buffer_size);
+
+enum status_code dac_chan_write_job(
+ struct dac_module *const module_inst,
+ const enum dac_channel channel,
+ uint16_t data);
+
+enum status_code dac_register_callback(
+ struct dac_module *const module,
+ const enum dac_channel channel,
+ const dac_callback_t callback,
+ const enum dac_callback type);
+
+enum status_code dac_unregister_callback(
+ struct dac_module *const module,
+ const enum dac_channel channel,
+ const enum dac_callback type);
+
+/** @} */
+
+/** \name Callback Enabling and Disabling (Channel)
+ * @{
+ */
+
+enum status_code dac_chan_enable_callback(
+ struct dac_module *const module,
+ const enum dac_channel channel,
+ const enum dac_callback type);
+
+enum status_code dac_chan_disable_callback(
+ struct dac_module *const module,
+ const enum dac_channel channel,
+ const enum dac_callback type);
+
+enum status_code dac_chan_get_job_status(
+ struct dac_module *module_inst,
+ const enum dac_channel channel);
+
+void dac_chan_abort_job(
+ struct dac_module *module_inst,
+ const enum dac_channel channel);
+
+/** @} */
+
+/** @} */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/atmel-samd/asf/sam0/drivers/dac/dac_sam_d_c/dac.c b/atmel-samd/asf/sam0/drivers/dac/dac_sam_d_c/dac.c
new file mode 100644
index 000000000..aa73badd3
--- /dev/null
+++ b/atmel-samd/asf/sam0/drivers/dac/dac_sam_d_c/dac.c
@@ -0,0 +1,779 @@
+/**
+ * \file
+ *
+ * \brief SAM Peripheral Digital-to-Analog Converter Driver
+ *
+ * Copyright (C) 2012-2016 Atmel Corporation. All rights reserved.
+ *
+ * \asf_license_start
+ *
+ * \page License
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * 3. The name of Atmel may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * 4. This software may only be redistributed and used in connection with an
+ * Atmel microcontroller product.
+ *
+ * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+ * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * \asf_license_stop
+ *
+ */
+/*
+ * Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
+ */
+#include "dac.h"
+#include <system.h>
+#include <pinmux.h>
+
+/**
+ * \internal Writes a DAC configuration to the hardware module.
+ *
+ * Writes out a given configuration to the hardware module.
+ *
+ * \param[out] module_inst Pointer to the DAC software instance struct
+ * \param[in] config Pointer to the configuration struct
+ *
+ */
+static void _dac_set_config(
+ struct dac_module *const module_inst,
+ struct dac_config *const config)
+{
+ /* Sanity check arguments */
+ Assert(module_inst);
+ Assert(config);
+ Assert(module_inst->hw);
+
+ Dac *const dac_module = module_inst->hw;
+
+ /* Set selected DAC output to be enabled when enabling the module */
+ module_inst->output = config->output;
+ module_inst->start_on_event = false;
+
+ uint32_t new_ctrla = 0;
+ uint32_t new_ctrlb = 0;
+
+ /* Enable DAC in standby sleep mode if configured */
+ if (config->run_in_standby) {
+ new_ctrla |= DAC_CTRLA_RUNSTDBY;
+ }
+
+ /* Set reference voltage */
+ new_ctrlb |= config->reference;
+
+ /* Left adjust data if configured */
+ if (config->left_adjust) {
+ new_ctrlb |= DAC_CTRLB_LEFTADJ;
+ }
+
+#ifdef FEATURE_DAC_DATABUF_WRITE_PROTECTION
+ /* Bypass DATABUF write protection if configured */
+ if (config->databuf_protection_bypass) {
+ new_ctrlb |= DAC_CTRLB_BDWP;
+ }
+#endif
+
+ /* Voltage pump disable if configured */
+ if (config->voltage_pump_disable) {
+ new_ctrlb |= DAC_CTRLB_VPD;
+ }
+
+ /* Apply the new configuration to the hardware module */
+ dac_module->CTRLA.reg = new_ctrla;
+
+ while (dac_is_syncing(module_inst)) {
+ /* Wait until the synchronization is complete */
+ }
+
+ dac_module->CTRLB.reg = new_ctrlb;
+}
+
+/**
+ * \brief Determines if the hardware module(s) are currently synchronizing to the bus.
+ *
+ * Checks to see if the underlying hardware peripheral module(s) are currently
+ * synchronizing across multiple clock domains to the hardware bus. This
+ * function can be used to delay further operations on a module until such time
+ * that it is ready, to prevent blocking delays for synchronization in the
+ * user application.
+ *
+ * \param[in] dev_inst Pointer to the DAC software instance struct
+ *
+ * \return Synchronization status of the underlying hardware module(s).
+ *
+ * \retval true If the module synchronization is ongoing
+ * \retval false If the module has completed synchronization
+ */
+bool dac_is_syncing(
+ struct dac_module *const dev_inst)
+{
+ /* Sanity check arguments */
+ Assert(dev_inst);
+
+ Dac *const dac_module = dev_inst->hw;
+
+#if (SAMC21)
+ if (dac_module->SYNCBUSY.reg) {
+#else
+ if (dac_module->STATUS.reg & DAC_STATUS_SYNCBUSY) {
+#endif
+ return true;
+ }
+
+ return false;
+}
+
+/**
+ * \brief Initializes a DAC configuration structure to defaults.
+ *
+ * Initializes a given DAC configuration structure to a set of
+ * known default values. This function should be called on any new
+ * instance of the configuration structures before being modified by the
+ * user application.
+ *
+ * The default configuration is as follows:
+ * \li 1V from internal bandgap reference
+ * \li Drive the DAC output to the VOUT pin
+ * \li Right adjust data
+ * \li GCLK generator 0 (GCLK main) clock source
+ * \li The output buffer is disabled when the chip enters STANDBY sleep
+ * mode
+ *
+ * \param[out] config Configuration structure to initialize to default values
+ */
+void dac_get_config_defaults(
+ struct dac_config *const config)
+{
+ /* Sanity check arguments */
+ Assert(config);
+
+ /* Default configuration values */
+ config->reference = DAC_REFERENCE_INT1V;
+ config->output = DAC_OUTPUT_EXTERNAL;
+ config->left_adjust = false;
+#ifdef FEATURE_DAC_DATABUF_WRITE_PROTECTION
+ config->databuf_protection_bypass = false;
+#endif
+ config->voltage_pump_disable = false;
+ config->clock_source = GCLK_GENERATOR_0;
+ config->run_in_standby = false;
+#if (SAMC21)
+ config->dither_mode = false;
+#endif
+}
+
+/**
+ * \brief Initialize the DAC device struct.
+ *
+ * Use this function to initialize the Digital to Analog Converter. Resets the
+ * underlying hardware module and configures it.
+ *
+ * \note The DAC channel must be configured separately.
+ *
+ * \param[out] module_inst Pointer to the DAC software instance struct
+ * \param[in] module Pointer to the DAC module instance
+ * \param[in] config Pointer to the config struct, created by the user
+ * application
+ *
+ * \return Status of initialization.
+ * \retval STATUS_OK Module initiated correctly
+ * \retval STATUS_ERR_DENIED If module is enabled
+ * \retval STATUS_BUSY If module is busy resetting
+ */
+enum status_code dac_init(
+ struct dac_module *const module_inst,
+ Dac *const module,
+ struct dac_config *const config)
+{
+ /* Sanity check arguments */
+ Assert(module_inst);
+ Assert(module);
+ Assert(config);
+
+ /* Initialize device instance */
+ module_inst->hw = module;
+
+ /* Turn on the digital interface clock */
+#if (SAMC21)
+ system_apb_clock_set_mask(SYSTEM_CLOCK_APB_APBC, MCLK_APBCMASK_DAC);
+#else
+ system_apb_clock_set_mask(SYSTEM_CLOCK_APB_APBC, PM_APBCMASK_DAC);
+#endif
+
+ /* Check if module is enabled. */
+ if (module->CTRLA.reg & DAC_CTRLA_ENABLE) {
+ return STATUS_ERR_DENIED;
+ }
+
+ /* Check if reset is in progress. */
+ if (module->CTRLA.reg & DAC_CTRLA_SWRST) {
+ return STATUS_BUSY;
+ }
+
+ /* Configure GCLK channel and enable clock */
+ struct system_gclk_chan_config gclk_chan_conf;
+ system_gclk_chan_get_config_defaults(&gclk_chan_conf);
+ gclk_chan_conf.source_generator = config->clock_source;
+ system_gclk_chan_set_config(DAC_GCLK_ID, &gclk_chan_conf);
+ system_gclk_chan_enable(DAC_GCLK_ID);
+
+ /* MUX the DAC VOUT pin */
+ struct system_pinmux_config pin_conf;
+ system_pinmux_get_config_defaults(&pin_conf);
+
+ /* Set up the DAC VOUT pin */
+ pin_conf.mux_position = MUX_PA02B_DAC_VOUT;
+ pin_conf.direction = SYSTEM_PINMUX_PIN_DIR_INPUT;
+ pin_conf.input_pull = SYSTEM_PINMUX_PIN_PULL_NONE;
+ system_pinmux_pin_set_config(PIN_PA02B_DAC_VOUT, &pin_conf);
+
+ /* Write configuration to module */
+ _dac_set_config(module_inst, config);
+
+ /* Store reference selection for later use */
+ module_inst->reference = config->reference;
+
+#if DAC_CALLBACK_MODE == true
+ for (uint8_t i = 0; i < DAC_CALLBACK_N; i++) {
+ module_inst->callback[i] = NULL;
+ };
+
+ _dac_instances[0] = module_inst;
+#endif
+
+ return STATUS_OK;
+}
+
+/**
+ * \brief Resets the DAC module.
+ *
+ * This function will reset the DAC module to its power on default values and
+ * disable it.
+ *
+ * \param[in] module_inst Pointer to the DAC software instance struct
+ */
+void dac_reset(
+ struct dac_module *const module_inst)
+{
+ /* Sanity check arguments */
+ Assert(module_inst);
+ Assert(module_inst->hw);
+
+ Dac *const dac_module = module_inst->hw;
+
+ while (dac_is_syncing(module_inst)) {
+ /* Wait until the synchronization is complete */
+ }
+
+ /* Software reset the module */
+ dac_module->CTRLA.reg |= DAC_CTRLA_SWRST;
+}
+
+/**
+ * \brief Enable the DAC module.
+ *
+ * Enables the DAC interface and the selected output. If any internal reference
+ * is selected it will be enabled.
+ *
+ * \param[in] module_inst Pointer to the DAC software instance struct
+ *
+ */
+void dac_enable(
+ struct dac_module *const module_inst)
+{
+ /* Sanity check arguments */
+ Assert(module_inst);
+ Assert(module_inst->hw);
+
+ Dac *const dac_module = module_inst->hw;
+
+ /* Enable selected output */
+ dac_module->CTRLB.reg |= module_inst->output;
+
+ while (dac_is_syncing(module_inst)) {
+ /* Wait until the synchronization is complete */
+ }
+
+ /* Enable the module */
+ dac_module->CTRLA.reg |= DAC_CTRLA_ENABLE;
+
+ /* Enable internal bandgap reference if selected in the configuration */
+ if (module_inst->reference == DAC_REFERENCE_INT1V) {
+#if (SAMC21)
+ system_voltage_reference_enable(SYSTEM_VOLTAGE_REFERENCE_OUTPUT);
+ }
+
+ if(dac_module->CTRLA.reg & DAC_CTRLA_ENABLE) {
+ while(! (dac_module->STATUS.reg & DAC_STATUS_READY)) {
+ };
+ }
+#else
+ system_voltage_reference_enable(SYSTEM_VOLTAGE_REFERENCE_BANDGAP);
+ }
+
+#endif
+}
+
+/**
+ * \brief Disable the DAC module.
+ *
+ * Disables the DAC interface and the output buffer.
+ *
+ * \param[in] module_inst Pointer to the DAC software instance struct
+ *
+ */
+void dac_disable(
+ struct dac_module *const module_inst)
+{
+ /* Sanity check arguments */
+ Assert(module_inst);
+ Assert(module_inst->hw);
+
+ Dac *const dac_module = module_inst->hw;
+
+ /* Wait until the synchronization is complete */
+ while (dac_is_syncing(module_inst)) {
+ };
+
+ /* Disbale interrupt */
+ dac_module->INTENCLR.reg = DAC_INTENCLR_MASK;
+ /* Clear interrupt flag */
+ dac_module->INTFLAG.reg = DAC_INTFLAG_MASK;
+
+ /* Disable DAC */
+ dac_module->CTRLA.reg &= ~DAC_CTRLA_ENABLE;
+}
+
+/**
+ * \brief Enables a DAC event input or output.
+ *
+ * Enables one or more input or output events to or from the DAC module. See
+ * \ref dac_events "dac_events" for a list of events this module supports.
+ *
+ * \note Events cannot be altered while the module is enabled.
+ *
+ * \param[in] module_inst Software instance for the DAC peripheral
+ * \param[in] events Struct containing flags of events to enable
+ */
+void dac_enable_events(
+ struct dac_module *const module_inst,
+ struct dac_events *const events)
+{
+ /* Sanity check arguments */
+ Assert(module_inst);
+ Assert(module_inst->hw);
+ Assert(events);
+
+ Dac *const dac_module = module_inst->hw;
+
+ uint32_t event_mask = 0;
+
+#if(SAMC21)
+ /* Configure Enable Inversion of input event */
+ if (events->generate_event_on_chan_falling_edge) {
+ event_mask |= DAC_EVCTRL_INVEI;
+ }
+#endif
+
+ /* Configure Buffer Empty event */
+ if (events->generate_event_on_buffer_empty) {
+ event_mask |= DAC_EVCTRL_EMPTYEO;
+ }
+
+ /* Configure Conversion Start event */
+ if (events->on_event_start_conversion) {
+ event_mask |= DAC_EVCTRL_STARTEI;
+ module_inst->start_on_event = true;
+ }
+
+ dac_module->EVCTRL.reg |= event_mask;
+}
+
+/**
+ * \brief Disables a DAC event input or output.
+ *
+ * Disables one or more input or output events to or from the DAC module. See
+ * \ref dac_events "dac_events" for a list of events this module supports.
+ *
+ * \note Events cannot be altered while the module is enabled.
+ *
+ * \param[in] module_inst Software instance for the DAC peripheral
+ * \param[in] events Struct containing flags of events to disable
+ */
+void dac_disable_events(
+ struct dac_module *const module_inst,
+ struct dac_events *const events)
+{
+ /* Sanity check arguments */
+ Assert(module_inst);
+ Assert(module_inst->hw);
+ Assert(events);
+
+ Dac *const dac_module = module_inst->hw;
+
+ uint32_t event_mask = 0;
+
+ /* Configure Buffer Empty event */
+ if (events->generate_event_on_buffer_empty) {
+ event_mask |= DAC_EVCTRL_EMPTYEO;
+ }
+
+ /* Configure Conversion Start event */
+ if (events->on_event_start_conversion) {
+ event_mask |= DAC_EVCTRL_STARTEI;
+ module_inst->start_on_event = false;
+ }
+
+ dac_module->EVCTRL.reg &= ~event_mask;
+}
+
+/**
+ * \brief Initializes a DAC channel configuration structure to defaults.
+ *
+ * Initializes a given DAC channel configuration structure to a set of
+ * known default values. This function should be called on any new
+ * instance of the configuration structures before being modified by the
+ * user application.
+ *
+ * The default configuration is as follows:
+ * \li Start Conversion Event Input enabled
+ * \li Start Data Buffer Empty Event Output disabled
+ *
+ * \param[out] config Configuration structure to initialize to default values
+ */
+void dac_chan_get_config_defaults(
+ struct dac_chan_config *const config)
+{
+ /* Sanity check arguments */
+ Assert(config);
+}
+
+/**
+ * \brief Writes a DAC channel configuration to the hardware module.
+ *
+ * Writes a given channel configuration to the hardware module.
+ *
+ * \note The DAC device instance structure must be initialized before calling
+ * this function.
+ *
+ * \param[in] module_inst Pointer to the DAC software instance struct
+ * \param[in] channel Channel to configure
+ * \param[in] config Pointer to the configuration struct
+ *
+ */
+void dac_chan_set_config(
+ struct dac_module *const module_inst,
+ const enum dac_channel channel,
+ struct dac_chan_config *const config)
+{
+ /* No channel support yet */
+ UNUSED(channel);
+}
+
+/**
+ * \brief Enable a DAC channel.
+ *
+ * Enables the selected DAC channel.
+ *
+ * \param[in] module_inst Pointer to the DAC software instance struct
+ * \param[in] channel Channel to enable
+ *
+ */
+void dac_chan_enable(
+ struct dac_module *const module_inst,
+ enum dac_channel channel)
+{
+ /* No channel support yet */
+ UNUSED(channel);
+}
+
+/**
+ * \brief Disable a DAC channel.
+ *
+ * Disables the selected DAC channel.
+ *
+ * \param[in] module_inst Pointer to the DAC software instance struct
+ * \param[in] channel Channel to disable
+ *
+ */
+void dac_chan_disable(
+ struct dac_module *const module_inst,
+ enum dac_channel channel)
+{
+ /* No channel support yet */
+ UNUSED(channel);
+}
+
+/**
+ * \brief Enable the output buffer.
+ *
+ * Enables the output buffer and drives the DAC output to the VOUT pin.
+ *
+ * \param[in] module_inst Pointer to the DAC software instance struct
+ * \param[in] channel DAC channel to alter
+ */
+void dac_chan_enable_output_buffer(
+ struct dac_module *const module_inst,
+ enum dac_channel channel)
+{
+ /* Sanity check arguments */
+ Assert(module_inst);
+ Assert(module_inst->hw);
+
+ /* No channel support yet */
+ UNUSED(channel);
+
+ Dac *const dac_module = module_inst->hw;
+
+ /* Enable output buffer */
+ dac_module->CTRLB.reg |= DAC_OUTPUT_EXTERNAL;
+}
+
+/**
+ * \brief Disable the output buffer.
+ *
+ * Disables the output buffer.
+ *
+ * \note The output buffer(s) should be disabled when a channel's output is not
+ * currently needed, as it will draw current even if the system is in
+ * sleep mode.
+ *
+ * \param[in] module_inst Pointer to the DAC software instance struct
+ * \param[in] channel DAC channel to alter
+ */
+void dac_chan_disable_output_buffer(
+ struct dac_module *const module_inst,
+ enum dac_channel channel)
+{
+ /* Sanity check arguments*/
+ Assert(module_inst);
+ Assert(module_inst->hw);
+
+ /* No channel support yet */
+ UNUSED(channel);
+
+ Dac *const dac_module = module_inst->hw;
+
+ /* Disable output buffer */
+ dac_module->CTRLB.reg &= ~DAC_OUTPUT_EXTERNAL;
+}
+
+/**
+ * \brief Write to the DAC.
+ *
+ * This function writes to the DATA or DATABUF register.
+ * If the conversion is not event-triggered, the data will be written to
+ * the DATA register and the conversion will start.
+ * If the conversion is event-triggered, the data will be written to DATABUF
+ * and transferred to the DATA register and converted when a Start Conversion
+ * Event is issued.
+ * Conversion data must be right or left adjusted according to configuration
+ * settings.
+ * \note To be event triggered, the enable_start_on_event must be
+ * enabled in the configuration.
+ *
+ * \param[in] module_inst Pointer to the DAC software device struct
+ * \param[in] channel DAC channel to write to
+ * \param[in] data Conversion data
+ *
+ * \return Status of the operation.
+ * \retval STATUS_OK If the data was written
+ */
+enum status_code dac_chan_write(
+ struct dac_module *const module_inst,
+ enum dac_channel channel,
+ const uint16_t data)
+{
+ /* Sanity check arguments */
+ Assert(module_inst);
+ Assert(module_inst->hw);
+
+ /* No channel support yet */
+ UNUSED(channel);
+
+ Dac *const dac_module = module_inst->hw;
+
+ /* Wait until the synchronization is complete */
+ while (dac_is_syncing(module_inst)) {
+ };
+
+ if (module_inst->start_on_event) {
+ /* Write the new value to the buffered DAC data register */
+ dac_module->DATABUF.reg = data;
+ } else {
+ /* Write the new value to the DAC data register */
+ dac_module->DATA.reg = data;
+ }
+
+ return STATUS_OK;
+}
+
+/**
+ * \brief Write to the DAC.
+ *
+ * This function converts a specific number of digital data.
+ * The conversion should be event-triggered, the data will be written to DATABUF
+ * and transferred to the DATA register and converted when a Start Conversion
+ * Event is issued.
+ * Conversion data must be right or left adjusted according to configuration
+ * settings.
+ * \note To be event triggered, the enable_start_on_event must be
+ * enabled in the configuration.
+ *
+ * \param[in] module_inst Pointer to the DAC software device struct
+ * \param[in] channel DAC channel to write to
+ * \param[in] buffer Pointer to the digital data write buffer to be converted
+ * \param[in] length Length of the write buffer
+ *
+ * \return Status of the operation.
+ * \retval STATUS_OK If the data was written or no data conversion required
+ * \retval STATUS_ERR_UNSUPPORTED_DEV The DAC is not configured as using event trigger
+ * \retval STATUS_BUSY The DAC is busy to convert
+ */
+enum status_code dac_chan_write_buffer_wait(
+ struct dac_module *const module_inst,
+ enum dac_channel channel,
+ uint16_t *buffer,
+ uint32_t length)
+{
+ /* Sanity check arguments */
+ Assert(module_inst);
+ Assert(module_inst->hw);
+
+ /* No channel support yet */
+ UNUSED(channel);
+
+ Dac *const dac_module = module_inst->hw;
+
+ /* Wait until the synchronization is complete */
+ while (dac_is_syncing(module_inst)) {
+ };
+
+ /* Zero length request */
+ if (length == 0) {
+ /* No data to be converted */
+ return STATUS_OK;
+ }
+
+#if DAC_CALLBACK_MODE == true
+ /* Check if busy */
+ if (module_inst->job_status == STATUS_BUSY) {
+ return STATUS_BUSY;
+ }
+#endif
+
+ /* Only support event triggered conversion */
+ if (module_inst->start_on_event == false) {
+ return STATUS_ERR_UNSUPPORTED_DEV;
+ }
+
+ /* Blocks while buffer is being transferred */
+ while (length--) {
+ /* Convert one data */
+ dac_chan_write(module_inst, channel, buffer[length]);
+
+ /* Wait until Transmit is complete or timeout */
+ for (uint32_t i = 0; i <= DAC_TIMEOUT; i++) {
+ if (dac_module->INTFLAG.reg & DAC_INTFLAG_EMPTY) {
+ break;
+ } else if (i == DAC_TIMEOUT) {
+ return STATUS_ERR_TIMEOUT;
+ }
+ }
+ }
+
+ return STATUS_OK;
+}
+
+/**
+ * \brief Retrieves the current module status
+ *
+ * Checks the status of the module and returns it as a bitmask of status
+ * flags.
+ *
+ * \param[in] module_inst Pointer to the DAC software device struct
+ *
+ * \return Bitmask of status flags.
+ *
+ * \retval DAC_STATUS_CHANNEL_0_EMPTY Data has been transferred from DATABUF
+ * to DATA by a start conversion event
+ * and DATABUF is ready for new data
+ * \retval DAC_STATUS_CHANNEL_0_UNDERRUN A start conversion event has occurred
+ * when DATABUF is empty
+ *
+ */
+uint32_t dac_get_status(
+ struct dac_module *const module_inst)
+{
+ /* Sanity check arguments */
+ Assert(module_inst);
+ Assert(module_inst->hw);
+
+ Dac *const dac_module = module_inst->hw;
+
+ uint8_t intflags = dac_module->INTFLAG.reg;
+ uint32_t status_flags = 0;
+
+ if (intflags & DAC_INTFLAG_EMPTY) {
+ status_flags |= DAC_STATUS_CHANNEL_0_EMPTY;
+ }
+
+ if (intflags & DAC_INTFLAG_UNDERRUN) {
+ status_flags |= DAC_STATUS_CHANNEL_0_UNDERRUN;
+ }
+
+ return status_flags;
+}
+
+/**
+ * \brief Clears a module status flag
+ *
+ * Clears the given status flag of the module.
+ *
+ * \param[in] module_inst Pointer to the DAC software device struct
+ * \param[in] status_flags Bit mask of status flags to clear
+ *
+ */
+void dac_clear_status(
+ struct dac_module *const module_inst,
+ uint32_t status_flags)
+{
+ /* Sanity check arguments */
+ Assert(module_inst);
+ Assert(module_inst->hw);
+
+ Dac *const dac_module = module_inst->hw;
+
+ uint32_t intflags = 0;
+
+ if (status_flags & DAC_STATUS_CHANNEL_0_EMPTY) {
+ intflags |= DAC_INTFLAG_EMPTY;
+ }
+
+ if (status_flags & DAC_STATUS_CHANNEL_0_UNDERRUN) {
+ intflags |= DAC_INTFLAG_UNDERRUN;
+ }
+
+ dac_module->INTFLAG.reg = intflags;
+}
diff --git a/atmel-samd/asf/sam0/drivers/dac/dac_sam_d_c/dac_callback.c b/atmel-samd/asf/sam0/drivers/dac/dac_sam_d_c/dac_callback.c
new file mode 100644
index 000000000..d49fc09cb
--- /dev/null
+++ b/atmel-samd/asf/sam0/drivers/dac/dac_sam_d_c/dac_callback.c
@@ -0,0 +1,435 @@
+/**
+ * \file
+ *
+ * \brief SAM Digital-to-Analog Interrupt Driver
+ *
+ * Copyright (C) 2013-2015 Atmel Corporation. All rights reserved.
+ *
+ * \asf_license_start
+ *
+ * \page License
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * 3. The name of Atmel may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * 4. This software may only be redistributed and used in connection with an
+ * Atmel microcontroller product.
+ *
+ * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+ * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * \asf_license_stop
+ *
+ */
+/*
+ * Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
+ */
+#include "dac.h"
+#include "dac_callback.h"
+
+struct dac_module *_dac_instances[DAC_INST_NUM];
+
+/**
+ * \brief Convert a specific number digital data to analog through DAC.
+ *
+ * This function will perform a conversion of specific number of digital data.
+ * The conversion should be event-triggered, the data will be written to DATABUF
+ * and transferred to the DATA register and converted when a Start Conversion
+ * Event is issued.
+ * Conversion data must be right or left adjusted according to configuration
+ * settings.
+ * \note To be event triggered, the enable_start_on_event must be
+ * enabled in the configuration.
+ *
+ * \param[in] module_inst Pointer to the DAC software device struct
+ * \param[in] channel DAC channel to write to
+ * \param[in] buffer Pointer to the digital data write buffer to be converted
+ * \param[in] length Size of the write buffer
+ *
+ * \return Status of the operation.
+ * \retval STATUS_OK If the data was written
+ * \retval STATUS_ERR_UNSUPPORTED_DEV If a callback that requires event driven
+ * mode was specified with a DAC instance
+ * configured in non-event mode
+ * \retval STATUS_BUSY The DAC is busy to accept new job
+ */
+enum status_code dac_chan_write_buffer_job(
+ struct dac_module *const module_inst,
+ const enum dac_channel channel,
+ uint16_t *buffer,
+ uint32_t length)
+{
+ /* Sanity check arguments */
+ Assert(module_inst);
+ Assert(module_inst->hw);
+ Assert(buffer);
+
+ UNUSED(channel);
+
+ Dac *const dac_module = module_inst->hw;
+
+ /* DAC interrupts require it to be driven by events to work, fail if in
+ * unbuffered (polled) mode */
+ if (module_inst->start_on_event == false) {
+ return STATUS_ERR_UNSUPPORTED_DEV;
+ }
+
+ if(module_inst->remaining_conversions != 0 ||
+ module_inst->job_status == STATUS_BUSY){
+ return STATUS_BUSY;
+ }
+
+ /* Wait until the synchronization is complete */
+ while (dac_is_syncing(module_inst)) {
+ };
+
+ module_inst->job_status = STATUS_BUSY;
+
+ module_inst->remaining_conversions = length;
+ module_inst->job_buffer = buffer;
+ module_inst->transferred_conversions = 0;
+
+ /* Enable interrupt */
+ system_interrupt_enable(SYSTEM_INTERRUPT_MODULE_DAC);
+ dac_module->INTFLAG.reg = DAC_INTFLAG_UNDERRUN | DAC_INTFLAG_EMPTY;
+ dac_module->INTENSET.reg = DAC_INTENSET_UNDERRUN | DAC_INTENSET_EMPTY;
+
+ return STATUS_OK;
+}
+
+/**
+ * \brief Convert one digital data job.
+ *
+ * This function will perform a conversion of specfic number of digital data.
+ * The conversion is event-triggered, the data will be written to DATABUF
+ * and transferred to the DATA register and converted when a Start Conversion
+ * Event is issued.
+ * Conversion data must be right or left adjusted according to configuration
+ * settings.
+ * \note To be event triggered, the enable_start_on_event must be
+ * enabled in the configuration.
+ *
+ * \param[in] module_inst Pointer to the DAC software device struct
+ * \param[in] channel DAC channel to write to
+ * \param[in] data Digital data to be converted
+ *
+ * \return Status of the operation.
+ * \retval STATUS_OK If the data was written
+ * \retval STATUS_ERR_UNSUPPORTED_DEV If a callback that requires event driven
+ * mode was specified with a DAC instance
+ * configured in non-event mode
+ * \retval STATUS_BUSY The DAC is busy to accept new job
+ */
+enum status_code dac_chan_write_job(
+ struct dac_module *const module_inst,
+ const enum dac_channel channel,
+ uint16_t data)
+{
+ /* Sanity check arguments */
+ Assert(module_inst);
+ Assert(module_inst->hw);
+
+ UNUSED(channel);
+
+ /* DAC interrupts require it to be driven by events to work, fail if in
+ * unbuffered (polled) mode */
+ if (module_inst->start_on_event == false) {
+ return STATUS_ERR_UNSUPPORTED_DEV;
+ }
+
+ if(module_inst->remaining_conversions != 0 ||
+ module_inst->job_status == STATUS_BUSY){
+ return STATUS_BUSY;
+ }
+
+ dac_chan_write_buffer_job(module_inst, channel, &data, 1);
+
+ return STATUS_OK;
+}
+
+/**
+ * \brief Registers an asynchronous callback function with the driver.
+ *
+ * Registers an asynchronous callback with the DAC driver, fired when a callback
+ * condition occurs.
+ *
+ * \param[in,out] module_inst Pointer to the DAC software instance struct
+ * \param[in] callback Pointer to the callback function to register
+ * \param[in] channel Logical channel to register callback function
+ * \param[in] type Type of callback function to register
+ *
+ * \return Status of the registration operation.
+ * \retval STATUS_OK The callback was registered successfully
+ * \retval STATUS_ERR_INVALID_ARG If an invalid callback type was supplied
+ * \retval STATUS_ERR_UNSUPPORTED_DEV If a callback that requires event driven
+ * mode was specified with a DAC instance
+ * configured in non-event mode
+ */
+enum status_code dac_register_callback(
+ struct dac_module *const module_inst,
+ const enum dac_channel channel,
+ const dac_callback_t callback,
+ const enum dac_callback type)
+{
+ /* Sanity check arguments */
+ Assert(module_inst);
+ Assert(callback);
+
+ UNUSED(channel);
+
+ /* DAC interrupts require it to be driven by events to work, fail if in
+ * unbuffered (polled) mode */
+ if (module_inst->start_on_event == false) {
+ return STATUS_ERR_UNSUPPORTED_DEV;
+ }
+
+ if ((uint8_t)type < DAC_CALLBACK_N) {
+ module_inst->callback[(uint8_t)type] = callback;
+ return STATUS_OK;
+ }
+
+ return STATUS_ERR_INVALID_ARG;
+}
+
+/**
+ * \brief Unregisters an asynchronous callback function with the driver.
+ *
+ * Unregisters an asynchronous callback with the DAC driver, removing it
+ * from the internal callback registration table.
+ *
+ * \param[in,out] module_inst Pointer to the DAC software instance struct
+ * \param[in] channel Logical channel to unregister callback function
+ * \param[in] type Type of callback function to unregister
+ *
+ * \return Status of the de-registration operation.
+ * \retval STATUS_OK The callback was unregistered successfully
+ * \retval STATUS_ERR_INVALID_ARG If an invalid callback type was supplied
+ * \retval STATUS_ERR_UNSUPPORTED_DEV If a callback that requires event driven
+ * mode was specified with a DAC instance
+ * configured in non-event mode
+ */
+enum status_code dac_unregister_callback(
+ struct dac_module *const module_inst,
+ const enum dac_channel channel,
+ const enum dac_callback type)
+{
+ /* Sanity check arguments */
+ Assert(module_inst);
+
+ UNUSED(channel);
+
+ /* DAC interrupts require it to be driven by events to work, fail if in
+ * unbuffered (polled) mode */
+ if (module_inst->start_on_event == false) {
+ return STATUS_ERR_UNSUPPORTED_DEV;
+ }
+
+ if ((uint8_t)type < DAC_CALLBACK_N) {
+ module_inst->callback[(uint8_t)type] = NULL;
+ return STATUS_OK;
+ }
+
+ return STATUS_ERR_INVALID_ARG;
+}
+
+/**
+ * \brief Enables asynchronous callback generation for a given channel and type.
+ *
+ * Enables asynchronous callbacks for a given logical DAC channel and type. This
+ * must be called before a DAC channel will generate callback events.
+ *
+ * \param[in,out] dac_module Pointer to the DAC software instance struct
+ * \param[in] channel Logical channel to enable callback function
+ * \param[in] type Type of callback function callbacks to enable
+ *
+ * \return Status of the callback enable operation.
+ * \retval STATUS_OK The callback was enabled successfully
+ * \retval STATUS_ERR_UNSUPPORTED_DEV If a callback that requires event driven
+ * mode was specified with a DAC instance
+ * configured in non-event mode
+ */
+enum status_code dac_chan_enable_callback(
+ struct dac_module *const module_inst,
+ const enum dac_channel channel,
+ const enum dac_callback type)
+{
+ /* Sanity check arguments */
+ Assert(module_inst);
+
+ UNUSED(channel);
+
+ /* DAC interrupts require it to be driven by events to work, fail if in
+ * unbuffered (polled) mode */
+ if (module_inst->start_on_event == false) {
+ return STATUS_ERR_UNSUPPORTED_DEV;
+ }
+
+ module_inst->callback_enable[type] = true;
+
+ return STATUS_OK;
+}
+
+/**
+ * \brief Disables asynchronous callback generation for a given channel and type.
+ *
+ * Disables asynchronous callbacks for a given logical DAC channel and type.
+ *
+ * \param[in,out] dac_module Pointer to the DAC software instance struct
+ * \param[in] channel Logical channel to disable callback function
+ * \param[in] type Type of callback function callbacks to disable
+ *
+ * \return Status of the callback disable operation.
+ * \retval STATUS_OK The callback was disabled successfully
+ * \retval STATUS_ERR_UNSUPPORTED_DEV If a callback that requires event driven
+ * mode was specified with a DAC instance
+ * configured in non-event mode
+ */
+enum status_code dac_chan_disable_callback(
+ struct dac_module *const module_inst,
+ const enum dac_channel channel,
+ const enum dac_callback type)
+{
+ /* Sanity check arguments */
+ Assert(module_inst);
+
+ UNUSED(channel);
+
+ /* DAC interrupts require it to be driven by events to work, fail if in
+ * unbuffered (polled) mode */
+ if (module_inst->start_on_event == false) {
+ return STATUS_ERR_UNSUPPORTED_DEV;
+ }
+
+ module_inst->callback_enable[type] = false;
+
+ return STATUS_OK;
+}
+
+/** \internal
+ * Internal handler for DAC module interrupts.
+ *
+ * \param[in] instance DAC instance number
+ */
+static void _dac_interrupt_handler(const uint8_t instance)
+{
+ struct dac_module *module = _dac_instances[instance];
+ Dac *const dac_hw = module->hw;
+
+ if (dac_hw->INTFLAG.reg & DAC_INTFLAG_UNDERRUN) {
+ dac_hw->INTFLAG.reg = DAC_INTFLAG_UNDERRUN;
+
+ if ((module->callback) &&
+ (module->callback_enable[DAC_CALLBACK_DATA_UNDERRUN])){
+ module->callback[DAC_CALLBACK_DATA_UNDERRUN](0);
+ }
+ }
+
+ if (dac_hw->INTFLAG.reg & DAC_INTFLAG_EMPTY) {
+ dac_hw->INTFLAG.reg = DAC_INTFLAG_EMPTY;
+
+ /* If in a write buffer job */
+ if (module->remaining_conversions) {
+
+ /* Fill the data buffer with next data in write buffer */
+ dac_hw->DATABUF.reg =
+ module->job_buffer[module->transferred_conversions++];
+
+ /* Write buffer size decrement */
+ module->remaining_conversions --;
+
+ /* If in a write buffer job and all the data are converted */
+ if (module->remaining_conversions == 0) {
+ module->job_status = STATUS_OK;
+
+ /* Disable interrupt */
+ dac_hw->INTENCLR.reg = DAC_INTENCLR_EMPTY;
+ dac_hw->INTFLAG.reg = DAC_INTFLAG_EMPTY;
+ system_interrupt_disable(SYSTEM_INTERRUPT_MODULE_DAC);
+
+ if ((module->callback) &&
+ (module->callback_enable[DAC_CALLBACK_TRANSFER_COMPLETE])) {
+ module->callback[DAC_CALLBACK_TRANSFER_COMPLETE](0);
+ }
+ }
+ }
+
+ if ((module->callback) &&
+ (module->callback_enable[DAC_CALLBACK_DATA_EMPTY])) {
+ module->callback[DAC_CALLBACK_DATA_EMPTY](0);
+ }
+ }
+}
+
+/** Handler for the DAC hardware module interrupt. */
+void DAC_Handler(void)
+{
+ _dac_interrupt_handler(0);
+}
+
+/**
+ * \brief Gets the status of a job
+ *
+ * Gets the status of an ongoing or the last job.
+ *
+ * \param[in] module_inst Pointer to the DAC software instance struct
+ * \param[in] channel Logical channel to enable callback function
+ *
+ * \return Status of the job.
+ */
+enum status_code dac_chan_get_job_status(
+ struct dac_module *module_inst,
+ const enum dac_channel channel)
+{
+ /* Sanity check arguments */
+ Assert(module_inst);
+
+ UNUSED(channel);
+
+ return module_inst->job_status;
+}
+
+/**
+ * \brief Aborts an ongoing job
+ *
+ * Aborts an ongoing job.
+ *
+ * \param[in] module_inst Pointer to the DAC software instance struct
+ * \param[in] channel Logical channel to enable callback function
+ */
+void dac_chan_abort_job(
+ struct dac_module *module_inst,
+ const enum dac_channel channel)
+{
+ /* Sanity check arguments */
+ Assert(module_inst);
+
+ UNUSED(channel);
+
+ /* Disable interrupt */
+ module_inst->hw->INTFLAG.reg = DAC_INTFLAG_UNDERRUN | DAC_INTFLAG_EMPTY;
+ module_inst->hw->INTENCLR.reg = DAC_INTENCLR_UNDERRUN | DAC_INTENCLR_EMPTY;
+
+ /* Mark job as aborted */
+ module_inst->job_status = STATUS_ABORTED;
+ module_inst->remaining_conversions = 0;
+
+}
diff --git a/atmel-samd/asf/sam0/drivers/dac/dac_sam_d_c/dac_feature.h b/atmel-samd/asf/sam0/drivers/dac/dac_sam_d_c/dac_feature.h
new file mode 100644
index 000000000..ae7ce8d65
--- /dev/null
+++ b/atmel-samd/asf/sam0/drivers/dac/dac_sam_d_c/dac_feature.h
@@ -0,0 +1,634 @@
+/**
+ * \file
+ *
+ * \brief SAM Peripheral Digital-to-Analog Converter Driver
+ *
+ * Copyright (C) 2012-2015 Atmel Corporation. All rights reserved.
+ *
+ * \asf_license_start
+ *
+ * \page License
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * 3. The name of Atmel may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * 4. This software may only be redistributed and used in connection with an
+ * Atmel microcontroller product.
+ *
+ * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+ * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * \asf_license_stop
+ *
+ */
+/*
+ * Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
+ */
+#ifndef DAC_FEATURE_H_INCLUDED
+#define DAC_FEATURE_H_INCLUDED
+
+/**
+ * \defgroup asfdoc_sam0_dac_group SAM Digital-to-Analog (DAC) Driver
+ *
+ * This driver for Atmel&reg; | SMART ARM&reg;-based microcontrollers provides an interface for the conversion of
+ * digital values to analog voltage. The following driver API modes are covered
+ * by this manual:
+ *
+ * - Polled APIs
+ * \if DAC_CALLBACK_MODE
+ * - Callback APIs
+ * \endif
+ *
+ * The following peripheral is used by this module:
+ * - DAC (Digital-to-Analog Converter)
+ *
+ * The following devices can use this module:
+ * - Atmel | SMART SAM D20/D21
+ * - Atmel | SMART SAM D10/D11
+ * - Atmel | SMART SAM DA1
+ * - Atmel | SMART SAM C21
+ *
+ * The outline of this documentation is as follows:
+ * - \ref asfdoc_sam0_dac_prerequisites
+ * - \ref asfdoc_sam0_dac_module_overview
+ * - \ref asfdoc_sam0_dac_special_considerations
+ * - \ref asfdoc_sam0_dac_extra_info
+ * - \ref asfdoc_sam0_dac_examples
+ * - \ref asfdoc_sam0_dac_api_overview
+ *
+ *
+ * \section asfdoc_sam0_dac_prerequisites Prerequisites
+ *
+ * There are no prerequisites for this module.
+ *
+ *
+ * \section asfdoc_sam0_dac_module_overview Module Overview
+ *
+ * The Digital-to-Analog converter converts a digital value to analog voltage.
+ * The SAM DAC module has one channel with 10-bit resolution,
+ * and is capable of converting up to 350k samples per second (ksps).
+ *
+ * A common use of DAC is to generate audio signals by connecting the DAC
+ * output to a speaker, or to generate a reference voltage; either for an
+ * external circuit or an internal peripheral such as the Analog Comparator.
+ *
+ * After being set up, the DAC will convert new digital values written to the
+ * conversion data register (DATA) to an analog value either on the VOUT pin of
+ * the device, or internally for use as an input to the AC, ADC, and other analog
+ * modules.
+ *
+ * Writing the DATA register will start a new conversion. It is also possible
+ * to trigger the conversion from the event system.
+ *
+ * A simplified block diagram of the DAC can be seen in
+ * \ref asfdoc_sam0_dac_module_block_diagram "the figure below".
+ *
+ * \anchor asfdoc_sam0_dac_module_block_diagram
+ * \image html dac_block_diagram.svg "DAC Block Diagram"
+ *
+ * \subsection asfdoc_sam0_dac_conversion_range Conversion Range
+ * The conversion range is between GND and the selected voltage reference.
+ * Available voltage references are:
+ * \li AVCC voltage reference
+ * \li Internal 1V reference (INT1V)
+ * \li External voltage reference (AREF)
+ *
+ * \note Internal references will be enabled by the driver, but not disabled.
+ * Any reference not used by the application should be disabled by the application.
+ *
+ * The output voltage from a DAC channel is given as:
+ * \f[
+ * V_{OUT} = \frac{DATA}{0x3FF} \times VREF
+ * \f]
+ *
+ * \subsection asfdoc_sam0_dac_conversion Conversion
+ * The digital value written to the conversion data register (DATA) will be
+ * converted to an analog value.
+ * Writing the DATA register will start a new conversion.
+ * It is also possible to write the conversion data to the DATABUF register,
+ * the writing of the DATA register can then be triggered from the event
+ * system, which will load the value from DATABUF to DATA.
+ *
+ * \subsection asfdoc_sam0_dac_analog_output Analog Output
+ * The analog output value can be output to either the VOUT pin or internally,
+ * but not both at the same time.
+ *
+ * \subsubsection asfdoc_sam0_dac_analog_output_external External Output
+ * The output buffer must be enabled in order to drive the DAC output to the
+ * VOUT pin. Due to the output buffer, the DAC has high drive strength, and is
+ * capable of driving both resistive and capacitive loads, as well as loads
+ * which combine both.
+ *
+ * \subsubsection asfdoc_sam0_dac_analog_output_internal Internal Output
+ * The analog value can be internally available for use as input to the
+ * AC or ADC modules.
+ *
+ * \subsection asfdoc_sam0_dac_events Events
+ * Events generation and event actions are configurable in the DAC.
+ * The DAC has one event line input and one event output: <i>Start Conversion</i>
+ * and <i>Data Buffer Empty</i>.
+ *
+ * If the Start Conversion input event is enabled in the module configuration,
+ * an incoming event will load data from the data buffer to the data register
+ * and start a new conversion. This method synchronizes conversions with
+ * external events (such as those from a timer module) and ensures regular and
+ * fixed conversion intervals.
+ *
+ * If the Data Buffer Empty output event is enabled in the module configuration,
+ * events will be generated when the DAC data buffer register becomes empty and
+ * new data can be loaded to the buffer.
+ *
+ * \note The connection of events between modules requires the use of the event
+ * driver to route output event of one module to the input event of another.
+ * For more information on event routing, refer to the documentation
+ * \ref asfdoc_sam0_events_group "SAM Event System (EVENTS) Driver".
+ *
+ * \subsection asfdoc_sam0_dac_data_adjust Left and Right Adjusted Values
+ * The 10-bit input value to the DAC is contained in a 16-bit register. This
+ * can be configured to be either left or right adjusted. In
+ * \ref asfdoc_sam0_dac_module_adj_modes "the figure below" both options are
+ * shown, and the position of the most (MSB) and the least (LSB) significant bits
+ * are indicated. The unused bits should always be written to zero.
+ *
+ * \anchor asfdoc_sam0_dac_module_adj_modes
+ * \dot
+ * digraph {
+ * subgraph cluster_right {
+ * msbl [label="MSB", shape=none, group="msbl"];
+ * lsbl [label="LSB", shape=none];
+ * node [shape=none];
+ * color="white";
+ * reg_left [label=<
+ * <table cellspacing="0" cellpadding="2" width="100%">
+ * <tr>
+ * <td port="msb">15</td>
+ * <td>14</td>
+ * <td>13</td>
+ * <td>12</td>
+ * <td>11</td>
+ * <td>10</td>
+ * <td>9</td>
+ * <td>8</td>
+ * <td>7</td>
+ * <td port="lsb">6</td>
+ * <td>5</td>
+ * <td>4</td>
+ * <td>3</td>
+ * <td>2</td>
+ * <td>1</td>
+ * <td>0</td>
+ * </tr>
+ * <tr>
+ * <td COLSPAN="10"> DATA[9:0] </td>
+ * <td BGCOLOR="lightgray"> </td>
+ * <td BGCOLOR="lightgray"> </td>
+ * <td BGCOLOR="lightgray"> </td>
+ * <td BGCOLOR="lightgray"> </td>
+ * <td BGCOLOR="lightgray"> </td>
+ * <td BGCOLOR="lightgray"> </td>
+ * </tr>
+ * </table>
+ * >];
+ * msbl -> reg_left:msb:n;
+ * lsbl -> reg_left:lsb;
+ * label ="Left adjusted.\n";
+ * }
+ * subgraph cluster_left {
+ * rankdir=TB;
+ * msb [label="MSB", shape=none];
+ * lsb [label="LSB", shape=none];
+ * color="white";
+ * node [shape=none];
+ * reg_right [label=<
+ * <table cellspacing="0" cellpadding="2">
+ * <tr>
+ * <td>15</td>
+ * <td>14</td>
+ * <td>13</td>
+ * <td>12</td>
+ * <td>11</td>
+ * <td>10</td>
+ * <td port="msb">9</td>
+ * <td>8</td>
+ * <td>7</td>
+ * <td>6</td>
+ * <td>5</td>
+ * <td>4</td>
+ * <td>3</td>
+ * <td>2</td>
+ * <td>1</td>
+ * <td port="lsb">0</td>
+ * </tr>
+ * <tr>
+ * <td BGCOLOR="lightgray"></td>
+ * <td BGCOLOR="lightgray"></td>
+ * <td BGCOLOR="lightgray"></td>
+ * <td BGCOLOR="lightgray"></td>
+ * <td BGCOLOR="lightgray"></td>
+ * <td BGCOLOR="lightgray"></td>
+ * <td COLSPAN="10"> DATA[9:0] </td>
+ * </tr>
+ * </table>
+ * >];
+ * msb -> reg_right:msb;
+ * lsb -> reg_right:lsb:n;
+ * label = "Right adjusted.\n";
+ * graph [shape=none];
+ * }
+ * }
+ * \enddot
+ *
+ * \subsection asfdoc_sam0_dac_clk_sources Clock Sources
+ * The clock for the DAC interface (CLK_DAC) is generated by the Power Manager.
+ * This clock is turned on by default, and can be enabled and disabled in the
+ * Power Manager.
+ *
+ * Additionally, an asynchronous clock source (GCLK_DAC) is required.
+ * These clocks are normally disabled by default. The selected clock source
+ * must be enabled in the Power Manager before it can be used by the DAC.
+ * The DAC core operates asynchronously from the user interface and
+ * peripheral bus. As a consequence, the DAC needs two clock cycles of both
+ * CLK_DAC and GCLK_DAC to synchronize the values written to some of the
+ * control and data registers.
+ * The oscillator source for the GCLK_DAC clock is selected in the System
+ * Control Interface (SCIF).
+ *
+ * \section asfdoc_sam0_dac_special_considerations Special Considerations
+ *
+ * \subsection asfdoc_sam0_dac_special_considerations_output_buffer Output Driver
+ * The DAC can only do conversions in Active or Idle modes. However, if the
+ * output buffer is enabled it will draw current even if the system is in
+ * sleep mode. Therefore, always make sure that the output buffer is not
+ * enabled when it is not needed, to ensure minimum power consumption.
+ *
+ * \subsection asfdoc_sam0_dac_special_considerations_conversion_time Conversion Time
+ * DAC conversion time is approximately 2.85µs. The user must ensure that new
+ * data is not written to the DAC before the last conversion is complete.
+ * Conversions should be triggered by a periodic event from a Timer/Counter or
+ * another peripheral.
+ *
+ *
+ * \section asfdoc_sam0_dac_extra_info Extra Information
+ *
+ * For extra information, see \ref asfdoc_sam0_dac_extra. This includes:
+ * - \ref asfdoc_sam0_dac_extra_acronyms
+ * - \ref asfdoc_sam0_dac_extra_dependencies
+ * - \ref asfdoc_sam0_dac_extra_errata
+ * - \ref asfdoc_sam0_dac_extra_history
+ *
+ *
+ * \section asfdoc_sam0_dac_examples Examples
+ *
+ * For a list of examples related to this driver, see
+ * \ref asfdoc_sam0_dac_exqsg.
+ *
+ *
+ * \section asfdoc_sam0_dac_api_overview API Overview
+ * @{
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <compiler.h>
+#include <clock.h>
+#include <gclk.h>
+
+
+/**
+ * \name DAC Status Flags
+ *
+ * DAC status flags, returned by \ref dac_get_status() and cleared by
+ * \ref dac_clear_status().
+ * @{
+ */
+
+/** Data Buffer Empty Channel 0 - Set when data is transferred from DATABUF
+ * to DATA by a start conversion event and DATABUF is ready for new data.
+ */
+#define DAC_STATUS_CHANNEL_0_EMPTY (1UL << 0)
+
+/** Under-run Channel 0 - Set when a start conversion event occurs when
+ * DATABUF is empty.
+ */
+#define DAC_STATUS_CHANNEL_0_UNDERRUN (1UL << 1)
+
+/** @} */
+
+/**
+ * \brief DAC reference voltage enum.
+ *
+ * Enum for the possible reference voltages for the DAC.
+ */
+enum dac_reference {
+ /** 1V from the internal band-gap reference*/
+ DAC_REFERENCE_INT1V = DAC_CTRLB_REFSEL(0),
+ /** Analog V<SUB>CC</SUB> as reference */
+ DAC_REFERENCE_AVCC = DAC_CTRLB_REFSEL(1),
+ /** External reference on AREF */
+ DAC_REFERENCE_AREF = DAC_CTRLB_REFSEL(2),
+};
+
+/**
+ * \brief DAC output selection enum.
+ *
+ * Enum for the DAC output selection.
+ */
+enum dac_output {
+ /** DAC output to VOUT pin */
+ DAC_OUTPUT_EXTERNAL = DAC_CTRLB_EOEN,
+ /** DAC output as internal reference */
+ DAC_OUTPUT_INTERNAL = DAC_CTRLB_IOEN,
+ /** No output */
+ DAC_OUTPUT_NONE = 0,
+};
+
+/**
+ * \brief DAC channel selection enum.
+ *
+ * Enum for the DAC channel selection.
+ */
+enum dac_channel {
+ /** DAC output channel 0 */
+ DAC_CHANNEL_0,
+};
+
+/**
+ * \brief DAC software device instance structure.
+ *
+ * DAC software instance structure, used to retain software state information
+ * of an associated hardware module instance.
+ *
+ * \note The fields of this structure should not be altered by the user
+ * application; they are reserved for module-internal use only.
+ */
+struct dac_module {
+#if !defined(__DOXYGEN__)
+ /** DAC hardware module */
+ Dac *hw;
+ /** DAC output selection */
+ enum dac_output output;
+ /** Reference selection */
+ enum dac_reference reference;
+ /** DAC event selection */
+ bool start_on_event;
+# if DAC_CALLBACK_MODE == true
+ /** Pointer to buffer used for ADC results */
+ volatile uint16_t *job_buffer;
+ /** Remaining number of conversions in current job */
+ volatile uint16_t remaining_conversions;
+ /** Transferred number of conversions in current job */
+ volatile uint16_t transferred_conversions;
+ /** DAC callback enable */
+ bool callback_enable[DAC_CALLBACK_N];
+ /** DAC registered callback functions */
+ dac_callback_t callback[DAC_CALLBACK_N];
+ /** Holds the status of the ongoing or last conversion job */
+ volatile enum status_code job_status;
+# endif
+#endif
+};
+
+/**
+ * \brief DAC configuration structure.
+ *
+ * Configuration structure for a DAC instance. This structure should be
+ * initialized by the \ref dac_get_config_defaults()
+ * function before being modified by the user application.
+ */
+struct dac_config {
+ /** Reference voltage */
+ enum dac_reference reference;
+ /** Select DAC output */
+ enum dac_output output;
+ /** Left adjusted data */
+ bool left_adjust;
+ /** GCLK generator used to clock the peripheral */
+ enum gclk_generator clock_source;
+#ifdef FEATURE_DAC_DATABUF_WRITE_PROTECTION
+ /** Bypass DATABUF write protection */
+ bool databuf_protection_bypass;
+#endif
+ /** Voltage pump disable */
+ bool voltage_pump_disable;
+ /**
+ * The DAC behaves as in normal mode when the chip enters STANDBY sleep
+ * mode
+ */
+ bool run_in_standby;
+#if (SAMC21)
+ /** Dither mode enable data */
+ bool dither_mode;
+#endif
+};
+
+/**
+ * \brief DAC event enable/disable structure.
+ *
+ * Event flags for the DAC module. This is used to enable and
+ * disable events via \ref dac_enable_events() and \ref dac_disable_events().
+ */
+struct dac_events {
+ /** Start a new DAC conversion */
+ bool on_event_start_conversion;
+ /** Enable event generation on data buffer empty */
+ bool generate_event_on_buffer_empty;
+#if (SAMC21)
+ /** Enable the falling edge of the input event for DAC1 */
+ bool generate_event_on_chan_falling_edge;
+#endif
+};
+
+/**
+ * \brief DAC channel configuration structure
+ *
+ * Configuration for a DAC channel. This structure should be initialized by the
+ * \ref dac_chan_get_config_defaults() function before being modified by the
+ * user application.
+ */
+struct dac_chan_config {
+#if !defined(__DOXYGEN__)
+ /** Dummy value to ensure the struct has at least one member */
+ uint8_t _dummy;
+#endif
+};
+
+/**
+ * \name Configuration and Initialization (Channel)
+ * @{
+ */
+
+void dac_chan_enable_output_buffer(
+ struct dac_module *const dev_inst,
+ const enum dac_channel channel);
+
+void dac_chan_disable_output_buffer(
+ struct dac_module *const dev_inst,
+ const enum dac_channel channel);
+
+/** @} */
+
+/** @} */
+
+/**
+ * \page asfdoc_sam0_dac_extra Extra Information for DAC Driver
+ *
+ * \section asfdoc_sam0_dac_extra_acronyms Acronyms
+ * The table below presents the acronyms used in this module:
+ *
+ * <table>
+ * <tr>
+ * <th>Acronym</th>
+ * <th>Description</th>
+ * </tr>
+ * <tr>
+ * <td>ADC</td>
+ * <td>Analog-to-Digital Converter</td>
+ * </tr>
+ * <tr>
+ * <td>AC</td>
+ * <td>Analog Comparator</td>
+ * </tr>
+ * <tr>
+ * <td>DAC</td>
+ * <td>Digital-to-Analog Converter</td>
+ * </tr>
+ * <tr>
+ * <td>LSB</td>
+ * <td>Least Significant Bit</td>
+ * </tr>
+ * <tr>
+ * <td>MSB</td>
+ * <td>Most Significant Bit</td>
+ * </tr>
+ * <tr>
+ * <td>DMA</td>
+ * <td>Direct Memory Access</td>
+ * </tr>
+ * </table>
+ *
+ *
+ * \section asfdoc_sam0_dac_extra_dependencies Dependencies
+ * This driver has the following dependencies:
+ *
+ * - \ref asfdoc_sam0_system_pinmux_group "System Pin Multiplexer Driver"
+ *
+ *
+ * \section asfdoc_sam0_dac_extra_errata Errata
+ * There are no errata related to this driver.
+ *
+ *
+ * \section asfdoc_sam0_dac_extra_history Module History
+ * An overview of the module history is presented in the table below, with
+ * details on the enhancements and fixes made to the module since its first
+ * release. The current version of this corresponds to the newest version in
+ * the table.
+ *
+ * <table>
+ * <tr>
+ * <th>Changelog</th>
+ * </tr>
+ * <tr>
+ * <td>Add configuration for using 14-bit hardware dithering (SAMC21 support)</td>
+ * </tr>
+ * <tr>
+ * <td>Added new configuration parameters \c databuf_protection_bypass,
+ * \c voltage_pump_disable. Added new callback functions
+ * \c dac_chan_write_buffer_wait,
+ * \c dac_chan_write_buffer_job, \c dac_chan_write_job,
+ * \c dac_get_job_status, \c dac_abort_job and new callback type
+ * \c DAC_CALLBACK_TRANSFER_COMPLETE for DAC conversion job</td>
+ * </tr>
+ * <tr>
+ * <td>Initial Release</td>
+ * </tr>
+ * </table>
+ */
+
+/**
+ * \page asfdoc_sam0_dac_exqsg Examples for DAC Driver
+ *
+ * This is a list of the available Quick Start guides (QSGs) and example
+ * applications for \ref asfdoc_sam0_dac_group. QSGs are simple examples with
+ * step-by-step instructions to configure and use this driver in a selection of
+ * use cases. Note that a QSG can be compiled as a standalone application or be
+ * added to the user application.
+ *
+ * - \subpage asfdoc_sam0_dac_basic_use_case
+ * \if DAC_CALLBACK_MODE
+ * - \subpage asfdoc_sam0_dac_basic_use_case_callback
+ * \endif
+ * \if DAC_DMA_USE_MODE_SELECTION
+ * - \subpage asfdoc_sam0_adc_dma_use_case_dac_in_dma
+ * \endif
+ *
+ * \if DAC_DMA_USE_MODE_SELECTION
+ * \page asfdoc_sam0_adc_dma_use_case_dac_in_dma Quick Start Guide for Using DMA with ADC/DAC
+ * For this examples, see
+ * \ref asfdoc_sam0_adc_dma_use_case
+ * \endif
+ *
+ * \page asfdoc_sam0_dac_document_revision_history Document Revision History
+ *
+ * <table>
+ * <tr>
+ * <th>Doc. Rev.</td>
+ * <th>Date</td>
+ * <th>Comments</td>
+ * </tr>
+ * <tr>
+ * <td>42110E</td>
+ * <td>09/2015</td>
+ * <td>Add SAM C21 and SAM DA1 support</td>
+ * </tr>
+ * <tr>
+ * <td>42110D</td>
+ * <td>12/2014</td>
+ * <td>Add SAM D10/D11 support</td>
+ * </tr>
+ * <tr>
+ * <td>42110C</td>
+ * <td>01/2014</td>
+ * <td>Add SAM D21 support</td>
+ * </tr>
+ * <tr>
+ * <td>42110B</td>
+ * <td>06/2013</td>
+ * <td>Added additional documentation on the event system. Corrected
+ * documentation typos.</td>
+ * </tr>
+ * <tr>
+ * <td>42110A</td>
+ * <td>06/2013</td>
+ * <td>Initial document release</td>
+ * </tr>
+ * </table>
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* DAC_FEATURE_H_INCLUDED */
+
diff --git a/atmel-samd/asf/sam0/drivers/dac/docimg/dac_block_diagram.svg b/atmel-samd/asf/sam0/drivers/dac/docimg/dac_block_diagram.svg
new file mode 100644
index 000000000..0b064257a
--- /dev/null
+++ b/atmel-samd/asf/sam0/drivers/dac/docimg/dac_block_diagram.svg
@@ -0,0 +1,218 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ id="svg2985"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ width="500"
+ height="290"
+ sodipodi:docname="dac_block_diagram.gif">
+ <metadata
+ id="metadata2991">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs2989" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1397"
+ inkscape:window-height="1023"
+ id="namedview2987"
+ showgrid="false"
+ inkscape:zoom="2.168"
+ inkscape:cx="250"
+ inkscape:cy="145"
+ inkscape:window-x="0"
+ inkscape:window-y="100"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg2985" />
+ <image
+ width="500"
+ height="290"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfQAAAEiCAIAAACA07fvAAAAA3NCSVQICAjb4U/gAAAgAElEQVR4
+nO3dL5Ta2t4+8Ce/9RMHV3eQu4pUlaqOG1yD46hBjroEdXGXUW3VcF2OIrxqJKOKI3UZN68qVc2o
+ieS6urmOVwRCgAQCE/Jn5/msrq6ZsBMCAw9fdnZ2lMViASIiksv/y3oHiIgoeQx3IiIJMdyJiCTE
+cCcikhDDnYhIQgx3IiIJMdyJiCTEcCcikhDDnYhIQgx3IiIJMdyJiCTEcCcikhDDnYhIQgx3IiIJ
+MdypBFyzoWxomK6/fPmzx9IVRdGt3VV0a3crqxs272hjAVFWGO5UDpfD58WarYvV8kuMLXfVypo4
+l5chqzwPnabu6Pbyl8v1TdNFs7NKc9e8HrefTS29R0UU6ehwDyld5HWOZ5xP9Ssl/TS326qf7tbE
+abfVkEZCa186rhtyizaaKk3dwjLa7/xPDaJssXKncnjovg18QgS7TrTWKt2tidPWRNjarjV+UEXo
+TdDMKQamaw0Y7ZQn///E9aYvie5G/jQrWe/BivRPdXyv+aNcDp/tiOjVWmrDcnXdmTjtvsBstfyh
++1bprn7pTBeR3S2a2deVQf3ZDt8+URZYuRN5tftO3b7RTX+gJ32BWkRhT5QNhjsRtJY6vh5E9ckQ
+FRHDncphs899c/wjoLXUB6SQ7Wc4IEwUTlksFset4L06pe8IblYAHPvkJKssT3V8OfijvJIf7oV+
+FFQIrNyJ0uP132M1zjXr3SGZMdxLxjXQrGz8m1joVfAYbGSh2YAb2thZLnwMNu4BDnqVkMYUhhFP
+KTh1KCQVV+0WRm9jSbWDRwsXq/EgjxY+9SEAN6yxa6H2EWMDF8HlKowXAHANGNheJVHypaGiHN07
+SnRQKpV7aAHo1XqhBSMAw2/sxURYYWj0tpc8Aq6BnpHGg0pO9uXbhYbvgbN6HkfroA/XQmPCwpwo
+z9LqlqndYvqy/tdSARXtDh6DmeIVjA56FYgfy5afgWZvWRhOXzC8XW+qJTY2O7zF1zMWjOeWXsQ/
+3Wx/IkLDp9Hyg9Y14N7iYk9jAEDLhK0vP4nTtZDC1mPJ4Hkk2WXa5x5aMLoWcIvWaoKPCwNDLZMQ
+SU3wvZ1Gvm990Ho53rrF2ACA2QQN7UBjAFDRa8Eo2JekPPA/xZnpdFZphXt4ARhWMM4mEJtTNwkN
+IsZmuzf4XNSsCZZv2fTSCA2YwHVgA/WwqbNCVumhMdnsWKMD/FhnstO5ZdQt4xeAuwVjtX7KZj8B
+nR+BujIZic5meNjWXSf8YA5Q0QAmJkQ/8qN0V6uPr3+dbZckxFin1GQ9FHK3YKwKuJtH6owYg+p6
+3zD6wCoylq1vUf7x53oL33cOpUY1XtLwuZPOXhPRUTIfCrlTMAoN+ICJtux2f+zhewfTgx0FGjof
+MTaQ6CHVlIusra7YsxTvoodpxHO0e1NU42DCXxiYbq5S1L4xIqlk1OceLAC3C0YVxg/YH5YtvwLT
+eGnRMoEbTNyN+yrIsEgeZEuPpa87wsKup6esJ56x9OAcNDsNl5foiFydKEucWyZCitOYRMV6WZ7q
++BL4o1gd5dtfi5FXSljeLOzeNO+u2bjGXXDOd0tvTKDW+2ZoA9dsvJ31/amAd1cnylTWfe7Eg2xp
+ct2nyw9+H59mLqLT2DUHTrvfr48HvOA1FRHDncpE6Hft8ds4nSeuNVb7uhBa2xn4LYPzBr/tqlNe
+C5vyi+Eute1ZHHaXV9bnGcScDmx3yof9m83ZYQ+h295Xpf7srbJ5MdUga9BVWxoAobXhX0B7dW2m
+aQeXw2dGO+UZw11WobM4AACMCvBtdc7BN3xdBbE3HdiGnVkfgtM/bE35ELXZvNLMxWLaGU1C092a
+jDBqLiv0h4fuVteMZk7V7tuoDwaiPGC4SypqFgfvTOCeX3NqGK7OI3vNdGD7Npsnm+NfAFyGnY7r
+mgMneP3UkM8ArT+8HA04LIbyi+EuqahZHObuznIVT+7y5zjTgYVO+bB/s2eze2bvAZr5vOpzVxRF
+mbTCDqhat91aP7hc6w+dgbn5qSf0uyG614x3yqvMT2Ki86jWwzN6PoPQo1dbTQdmRJ815s/wblQg
+VlM+HNhs8k4+w0vo9iJ0T4Vu295P2mihhd6ma1sLA1tar06UC6zcJRU1i0O9BXuzh8F1UBPrX+NP
+Bxac8uHgZpMTrNY5ipQoCsNdUkIDbtYd6N4sDi0VogdxA8MPYgvdG7Q3x9LEnQ5sNeUDEGuziWKs
+E+3HbhlZqTB+oPcBI+/XznoWh94LjAqa3i8fMXxZXlFvTcPnDr7GuJOWCXs1EVDUZp9u0LxZtt+9
+aF98zUrwt9RnzTwvflBR4k6dfqAcsn3LcfqBbZv5LhOGOyWOlXskvt/yabFYcJI1ooOODne+oyhz
+3ouQEU+0Bw+oUlF5x1RL1U9IFB/DnYqNlTtRKIY7EZGEGO5ERBI6eigkpYa9yaH4iiWKg5U7FQmT
+nSgmVu50WHAul2z3hIhiYuVORCQhhjsdwK5/oiJiuNMRGPRERcFwp314ij9RQTHc6Tgs3okKgeFO
+kXbLdpbwREXBcKejsXgnyr+jp/wtzxubVWroM8CnhagQWLkTEUno1CsxyX3tN3kv50ZEJcHKnYhI
+Qgx3IiIJMdyJiCTEcCcikhDDnYhIQgx3IiIJMdyJiCTEcCciktDZwt010Kys//WMzZstNBtw/V8d
+9Cob7ZsVTJyQllGbdY3Nu7DQ7G03blbweJ4HS0SUM6eeoRpH7RZGb/nzpIEe1r8+WvhUx8yBUAEA
+KowXAHANGIFmIS03N2tUMNHQUhEl2JiIqDTS6pZpmcBkVYA7GM/Q0mGbh1Y72PIj6tHJTkRUVqn1
+uasQ/4s5AMC1IPoQKhqzVd9LhNCWTzfrbpbvh+422NiwXv8wiIgKIYsDqpMbXGgAUG/B3hu4oS1r
+t5i+LP91gMneLQQb97REdp+IKP/O2ee+wYH7ES0AFr4D3wPTLj72cBG6SljL6maTan3Z1SNUPLEw
+T1joBVR5VVWiQkircp/oQAsCmAzQ+bGupj938BgRynFazmcQAgAgUButB8NMBqiJczwOIqJCOGe4
+B/u77RaMHmBhVN8Y3HKhwx0ExkT6IlrOdzbb8sfbfMPX1fJRnYNkXs8rz4PX3mLZTlQUyrFv1OVb
+vQQX62CEIZDmwYjnM0OUfzxDlfbZLd6Z7HmgKEp5rmZMp2G4ExUV8532YLjTAcFSnWV7rgx/XTHf
+KQrDnajAvHxnxNOu1Ma5U4F5B1RZtufT8NcVAP6BaAvDPddyVZHlamc8jDOf30XD54Q87JahAsvh
+502G/BI+6x2hXGDlXgDem5ZCsTsiKJjvfFpK7tRwb1YOtyE6P687gkEWNPx11X13z6el5Fi5h+O7
+okCY77tYwtPRfe6LdGVypwu+GYqGI75DsRe+zFi5kyRYv4fiQMnS4mgZkgfr9yg816mEGO4kFeZ7
+FHbRlA27ZUg27J+JwqOspcLKnSTE+n0PlvAlwcqd5MT6fQ+W8GWQx8o96sgPaw06Cuv3/VjCyy2/
+lftW2cWXIJ2A9ft+LOEllsfKPepFxhcfnYD1+0Es4aWU38odgVcbX3b0GqzfD2IJL588Vu4Ie3nx
+BUevwfo9DpbwMslpuIOX7iTKgp/vjPiiy2+4EyWLxXtMw19XLOElcHS4KynK5E5Dd2DFNRu6FfjF
+a9Yw3ROffkoX8z0+lvBFx8o9PktX3nYfVr+55nVXnS4Wi8Vze3zNeC8K5nt8LOEL7dTRMtOXRHcj
+f7YvNeWajUlrMV0o35a/W2MM7zQAEFob15ar6yLlfaTTlG/wzHzc/t0Yq9WT2vvXdQKPfhUKK/eY
+hG6bWtRtQn2YOanuDr1Ouep39/f8de1ZwhcRw51KSpJ8dx3j3X333X333aq+sGfdtuOls/Plfmz/
+tvs/n37+/Np25piP383GX+K338Be+GJhuCfAdZ3Lupr1XtDRip/vv+3+z+rwavjr6vO/fv/9JbRA
+f9MYvK+9f/952c3yhMZR7Td4+Y6clfAJDZeQDcP9REJrozuwAMAadNHWRMY7RCcpdr678xneNxoA
+UG1Ua/fzGJ2DtbrX/lq9jNV+W567aHh55CCG+6mEfjd0moqiKE1neMeDqcVV7HwPev/Hm0TaxJDD
+LprFYnFwZ/KztylguB9FGy1G/mFVodteLWAz2guuqPkuqnX8tG0AmNvzJ/VNFYD4o/bzv78BYD67
+31nl56r9nfNwVVUPto+W5xI+VNkG/OR64rCCKthryHWM5s+njUW1f/7aPoYwv7O//htX00ZD7Fk9
+ZEVgPn7nVNcrzsfvHh4iG2emmOMj3zQG743mfRcAav/8VQUAoWpX93+/ewJqV//6cw5AvKn+fPja
+xufxG6AG+77bjdn+8OjJXA2U9Ir3zHcjJ45+Ipaf0uUY537Cq+S0V3nUWt5y/yjWWbiO0ZzXA6kd
+luO/7fZsrmIu6r3rwNd6e9bt/vZbzu/sr/9+sxnZXpT/6bdxvtxb4lPv+o3z5f5vXA6/xB57nYru
+u/tcRUPSL4z5+N28fp7P1O67e5w53/c/G/7y0HwPtgnbjms23s76i8B4Z0tXBvXnAn8tZ7dMkk6u
+X/zXXB6+4VavG/+8+s/9XWAohe3eo9povHn6txs4BDcfd58uh+vPgOp1/er9k3X3e3nznd199zC/
+qtUCq8zu/6w33gBQr9/HOwCYqrz1z+TqhbFfCr3wMZ+N3c73GG9Mofc7o4m1XmBNRp1+cZMdWYa7
+a6BZWf/rGZs3W2g24Pq/OuhVNto3K5g4YS0zdnLlEqw7ktudE6mNGgLJ69hPNa1abVQv8TSzV0vd
+3/PV0IuVN43x1bq0F+rnX1e96z/Wt7u/53hTFd6tb6r4PXfP9RBOlsN8Ty7iq+1zdoWlMFAy5rMR
+zPe4JZfW+sfom5/u1mTUaUWdtlgMmVbutVtMX5b/GpONfH+08KmO9WmfKowXTF8wvF2v1VLDWmbm
+9S/oRN/GryP+CCu3q41//flgryp6979Pe4deVBvVfPW5xJa3fMfmZ3/e9i0oeJR1z36+8lHEeTa8
+fD/my7T2V+d/lrW7aw6cYb/Y2Z6fbpmWCUxWBbiD8QwtHbZ5aLX4LU8R/4SIYJnwSsF7P8eDOtb8
+znm4Ur2+l2qjWrt3bDfbPUqDl++5kvVTcoRgCb/nsaTzbMT/Mq31h87AdL2Zo4p/6kpuwh0qxP/C
+KwpdC6IPoaIxW/W9RIjfsoCyPLK3rsp/O9Z/cP/Q9c5xb/58wn9m9m8gOIROTuc9jk05JLQ2xpa7
+le3+3N6KbsE19eUUsMuf1rcqykWuZofNT7gHTG5woQFAvQXbSqblSeKc8OZFcMyW+zeydb+JP5z4
+HPsJ3qBpdz77Wfvnr6vh6t/nf/35ZM3nAES1/j7QBe+t+OW+G35SO4DNfvZg/3sueSNnEoHXvUL8
+Xdpdss11jK05YXaXnJ83cgbRj3r/rYk8G8qqQ+aYMl9obYwHg7G6PpTqmtezvnc/z/WBvpMyQrcX
+i+dhZ/i8WDzm6gBsfsLdgfsRVQAWvgNfK2hW0L3B0w0eo1aJ3/KMlCTG1QZff6/f2ivN7+y/72v/
+/FIF4Nz9xL9E8BBc9Vq9XJ4I86ah1x66tt9LM7+z/77/8+p6T097tb4ah+Pc/XzyTqLJpZyMifS7
+IA5k+h5C7R0x2e9red/wcJ4CJf6zoQS62o/Kd6G1MRqpgUOpzsz/TWhtzGan7XsGcnMS00QHWhDA
+ZIDOj+XBUgCPPTxay/J8e5XYLc8mkWT3ZZcm/7lv3gdOTvRPL5rP7v+sT7cOmlbrV/jbnrcbVTTq
+w6ljrNc9fF6S+uXy8t1D9x7rk2jyJyfJ7om1J6tTyWpXNeCP5ZK7/1bvnx7e/1lDtT1Wf3+5nzWu
+2g14Zy1g0GhgdQKaN02Yv8rViecfBAv2E1aPI86WlZ2DqIv4JzcJ3V7owQVq3RlY0DR4XfGtPiYO
+IABn5iDXh1wzDfenGzRvlj/XbmH0AAujOqaBfLjQMdbhahBbK8dveS4JHuPKMkqE2vsVFcjVdlj+
+ql+uhrFWD21Qbf+6ap+wn2kpXrKv5obsNTC/s786qz/Z/e/q9GoIx+gDgNqoLT+S3fkM1bb4bbfn
+9elVT2B+Z4/vqr3GahVx9H6mEOsxN76b7P66p5ViQr+rNxSlCQCd6ULXrMnynd+ZLsSxW0tTduEu
+epj2dpZqmG59GKow7I21jHgtU5GfFKBE5CrZ43LnM7xvNwBvOJPfK/y+qgqsTwFpVC+7c+dL9Y09
+h1av4r/2z/88+N+6rv67XuVI6SR7HFHJ/jpbxbxmLhbbg/OEburIm9x0yxRNsh0ylAeFTPYjVOtX
+DzNbVC3UB2+A+XY3mnv00Kf8xHocJxfvBZWfA6oFU56XSEkUONm35oaMbqhev5+bsxm88vyP6mqw
+k/Pl3rgrfLLHKduPHDxTbKzciYqc7EBwbsjaxkw+O0S1jp9zvVHdXAvv33/+8gZu3AGTeYt1X5z9
+KU++c1bICKfOCpksJYVZIUsvhWRPvDcgwxdGIsmebOf4aWGd+bv73Fi5U6kVvGZPWwrz+qZDgodw
+EMOdyovJHl9uu2KQy13KA4Y7lRSTPT5pCvZSYbjnwnnG51IkJntMeS7YaT8OhcyFRU6mcS8HJntM
+55slhlJwauXerCS6G7Sd73w7nQmTPQ6/YKfiYrdMpEwigCX8WTHZ42Cyy+HocOd7w8PwLRwm+0Gh
+sV6qU/Zlwj53KgUm+0FbPex8uoqO3TKvco7TDoNb5veDRDDZ99sa6bj7qmPxXkSs3PPCf0dxcEKy
+mOz7hY5h37rSRdr7RElg5Z4LHCFzJkz2PUJjPerLIov3wmG45wLfNufAZN9jz0mnoZcxSmOfKFEM
+d5ITkz3K/rkE+KRJg33uJCEmexTOElMerNxJNkz2UIz1smHlTlJhsodispcQK3eSB5N9F2O9tFi5
+kySY7LuY7GXGyp1kwGTfxeek5BjuVHhMsS0s2AknhHt5Zjvhe6MQmOxb+ISQh5U7FRiDLIgFOwWd
+Gu7Tl0R3I2dydp0pXjwhCoPMx8852sLKnajYWLBTKIZ7ruXkHRucjjjbPaEtLNgpytHTeC7f5yXo
+ltn/zJRqkl6G+yslPl9uOn+R873IS/X2yQpPYqIDguOjyjNWqhDKE47HXDLe0pWG6QYWuGZDCdi8
+0dL9G3QruR3OA4Y7HVaeECmQUv1R/KtOHo54a+J01Jnlbiy8HD4vlp7b47fLfHfNhjKor26ZoilX
+vjPcaZ/Qy2lmsicUVKpk9/iXn9wb8a45cNr9fn08iIppod8NMbZcwLXGGN7pYnmDZj4/t1Q34d3O
+UEYHVI0Kvns/dTA1AAe9D3jabPOpg++jjSWfX1A1YABGb2eLFpoDDG2IM+1xeW1dTpPhTkk54VDE
+Vr5vr+5aY7VvC+G2nWvT1fzg3iCE+jBx4LrjB7UvNm7QjtqZnEu/cnfQq0D8wPQF0xd8Bpo9QIXx
+gukLhreo3S5vaon1z95NX3czfeXRwqc6Zk6KD0R+ey6nmfKekKyUkwRXD27NGnTVlgZAaG2vOt9D
+CPUcjyg/Ug931wJu0Vo9rRcGhhrcV27UwXiGlg7bfOWGKMj/InxwIVEmNl+K1mSEUVNRFEV52314
+6EZ0zbiuc1lXAbV+6bhucP3tQ7HFlnq4zybY+sAUWmRfytMNmpXlv+4NPhvhzVwLog+hojHDhMU7
+Ud4tTrK7heAS1xw46+Omi8W0M5qEpLtrXnfR1oRX3nev/TS39Oao0w/vySmk1MO9Wj+isd8t8wno
+/MBFRLPJDS40AKi3YMt0uJuIloJD+8O+O1q33dpGNGv9oTNYRvdD9+2qS+ftuP1se+2Ebj+3x6tb
+mpguTJk63VM/oFoVcB0g8BwaFYgf646aUL1vaH5A9QXV3dssfAe+B2aDeexFfgwQUQHFOOlJGy22
+klnotg0A0O2FHrGW2HNb0aVeuQsNuFl3njz28L1zINkBQEPnI8Zh3TKTATo/1sddP3fwyOKdSCo8
+0nOC9IdCqjB+oPcBy1GO3lDIGFom7A+YdPA0QvNmubD2EU91TAOfDRc6xjrc6H58IjqEA6IkwLll
+wsSe8rc81USak4HsJkvRn+fE55Y5K/me/3LiGaqUL6wZs8XnXxqc8jcSqxUiT7G+eZCH4Z53uaqk
+stqZXD0Jp5HgIVCxsFuGiA5g2V5ErNyLIfN3V2oHVEMr3Mwf/isVqFuD3zCkwcqd8qUoISir0BP9
+s9oZeg1W7pRrTBai07Byp9zxA53JnhWeESoBhjsRkYQY7kREEmK4ExFJ6NS5ZUogJ32OaU7qkp/d
+yMmjTkqBhkIGSfZXKBtW7uH4giaiQjt6KCRTj4go/1i5ExFJiOFORCQhhjsRkYQY7kREEmK4ExFJ
+iOFORCQhhjsRkYQY7kREEmK4ExFJiOFORGuKouzOHxW6kHKO4U5E23ajnPOOFA7DnYjWdkM8Ts3O
+uj6HGO5EFCKY13vKdr/HhvmeNwx3ItoQswdmqyOe/TZ5c/SUv+X5fOaLlQgxOmr4Tsmno8N9afqS
+6G7kTLOS9R4QZWmxWISWcYz1Ajk13ImoTBjrhcM+dyIK4cW39/9W3zqTvRBYuRNRuK3OGWZ6sTDc
+iSgEY73oGO5EtIGxLgeGOxEtMdZlwgOqRATIluyWrjRMd3vRim5ls1epYrgTlV3wXFNJBsNYE6ej
+zix39btrNpRB/dl7dIspmiXId+XYP+TyRfDKk5iMCr57P3Uw1dH7gKfNBp86+D7aWPL5BVUDBmD0
+1gtdA92b9a+1241bT5a/k5gyf795f/fUdiPluzs3RTn6jZbsvfs/b+1G4tX6+cr/Y14Srtm4xt0d
+rgfCNjV/ga0Lv4VrAZoQkZuQQPp97g56H9D4gakKAI89NM3lR4UbyG7XgBtIatdAt4ehCNleMNCN
+CiYaWmoiOypNslCZbZ185H/MnCOFo+4rEd64zFgR71pjtW8L4bada9PVdOFa4we1LwJNhNCS2rHc
+Sr1bxrWA23X+XhgYanCT2vpH1JNJdiIJRE0hcI5OmBRmnfJ3df99WYOu2tIACK2NseUCQpQxFlKv
+3GcTiP7GkqiP0KcbNANdLp9fAONQs49oJbGTRLJL54tp4v1R/teO6BLemowwGil+r+7A0k21fum4
+LiD8RroyqD8H+mkklHrlXq3HbVm7xfQF0xd8Ajo/cHGo2fQFHWAi/WESKiQlC1k/aOA8Dzy48a27
+c82BM1wdOF0sFtPOaGJBaG10r/3RM5beHHX6Uic7sgh3AdfZWGJUMHEiWgMAet8w+oDHOBuP/clB
+RMW3U7lbt93aRmpr/aEzMF2h28/t8dvlh0MT04Upfad76t0yQgM+rA97PvbwvbM8uBpJQ+cjxgYO
+DoSZzyD0hHaUKDFZHZyPKt7T3J8E70s5fBBYGy22Qlvotr36YVGqdEh/nLsK4wfsD2hW0KzgKzAN
+60nf0jKBG0xcPN0sV2xW0DMAbCyxW0kNlSGSQGgCninZz31fMZKdNmQ0zj3nmhXwBbRJOf/AcyVw
+8C14d0qmg8QlkGYsnu++UngFSoZnqFKO5OQYoGT88Y4pJKN/R4nflySnzqaI4U55EfrW3VO252pM
+SP6lloyM4JxguFO+xAlrZjrRQQx3ypHdmU92lzDWieLgfO6UO6HxzUwnOgord8qXYKm+da45EcXH
+yp3yi5lOdDJW7pQ7HG5B9HoMd8qX13fCsN4nAsOd8iORWD9/sgcvzumaja3LtYVcupMoE6dOP1AC
+7BwIOuvJ3698UXnX6An++uo9imbpjQnUet/0ph60dGXSWs8wuPUrUXZYuYdjsqcjkVrb38L5z1B3
+zYHT7vfr48GyXtda/xh982t3azLqtJjslAuckoliSbxyz/9XwJAH65qNgbBNLXi95XWxvnMVZqIM
+sXInimv34pzwrwYBuNYYbU1kuH9EAQx3KrytEnuRkJ37sSYjjJqKoijK2+7DQ3fZNbNM+q1sd82G
+1+fkHXDd+pXo7BjuJINgHJ+pwyf84pzAMt0Hg7G6vr6ba17P+ovFYrF4rk9Md+vXc+we0Rb2uVMs
+ee5z351cbHfhq1kd5dtfi1HgaGmgi901G2+76jQ4akaHuR40s/UrUQoY7hRLgcI9D1ZHXpc/3dUH
+wV9t5jydH+eWIUqe0O/qDUVpAuhMF7qAGvw1672jUmDlTrGwcicqFh5QJSKSEMOdiEhCDHciIgkx
+3ImIJMRwJyKSEMOdiEhCDHciIgkdfRJT/mdqTQpHTxeUovDsDSJW7iSRc15mz+ooHcs1GxvzOlod
+pWOtZ3xcW11qzzUbusWr8VEWTp1+YPqS6G7kTLOS9R7QcdK7zN7lpTMwXS14RQ6h2wsduxfrsHSl
+OUJnCqH3O8rEMjV/XrHJqNNfCBCdDyt3OsJ2gfoKye6V98P5L7MHoN1vj68PV92u2Zi0FtN/YAHw
+anyUAYY7ySPBz549Hz+qfhcj3oW+Mfej9lfnf5bTv7vmwBn2me10Zgx3iiWpyxtFX+eoQESseN/E
+q/FRyhjuVHj+R0V6Hz9Cv2uPB0ddMS/8anxE58L53EkGXhYrZ7kGUzih96E0/wedv2KvobVxPRhA
+7dvijDtG5GHlTvLwKu7ED9hG0Mxp56gVhNbGaKTyUCql4ujTPZZvmxIMhSx4v3DeJZi//EsR7WLl
+TkQkobTC/bGHZmX5z/COQznoVdYLvX8TBwBgodmAi8hmRg89I7B1C81exL0QEZVROgdULXwN9OQY
+FUx+oKXCeAEA14ABGL1180cLn+qYORAqENbM+znmvRARlU8q4e46qIn1r739/fUOxjP0TBgmWiER
+ntC9EJEkTjt+I/2hmlS6ZUQPjclmx0s014LoQ6hozA43PvleiIikllafe8vG9AXTF7gf0KzgMbrl
+5AYXGgDUW7CP7DePfy9EJB3ZT40+TuonMfVecNHDo7VM8G0WvgPfA1oo778AAAKjSURBVJMyPvZw
+sdNKqHjam/sH7oWIZOOd4rA/vr0GqZwGkb1UKvfHrcEtgBDhLScDdH4sq+/pCz538Bga4gK10bow
+nwxQE0fcCxGVT3SmR0+4vzNXv26FLFzOzb/b2Nxaoqc5hi+VcL8w1r3hzQoetYhBLBZG9Y2bLnS4
+g9WYyCAVxjd8XW1wVIfRi30vRCSng1V5RF0v9H5nNAkErzUZdfrLifkvh89+n87z0Gnq1tbCxWI9
+h//mclPbWOKvnY60umVaNloRN4nealyjhulWL4oKw95p5jfeGQ+z516oHA5+MSe5RXXOHHhhaK1/
+NL/5l1OxJqNOy0x834TWvhy7LiAS33QYnqFKkkhrShnKu936PcZHfvSE+w/dt363ytuuOjW1rYXB
+3pbg8p0i3bXGD2p6ncUMdyo8P9bLNhyCogTzPeaXucgJ91f9KtMOLofPyyuw7Ha/YGe5tzQQ9/5H
+QzoY7iQDxjrtOu7L3KEJ9zVzqnbfHt1nvvExkGK0cz53ykqyI9LYIUNb/BdY7E/9gxPua/3h5duB
+2b9Lah/Pi5U7ZYblNuXKwQn3hX43RPd6MNvqc1+NhcwXzucehvO5p+71pTf/XqUVWqH7Xe27fe5H
+VvRFxcqdcuE1Vby3LkfLkG93tExWe5IhhjvlSCIRn+wuUeFsFeaLwPV1S+XUbpkSkP5bW87Ff6Xx
+L1VywTSP6nKJ00YyrNzDSf+Hzz8ebqVj7UntEr6Wjh4KWcLniDJU2u/UdJo9ARU1M4GsWLlTAbCK
+p4NiVgDlKRQY7lQYjHja7+DLo1SvH56hSgXDjhqKwldFUIl6oIiIyoPdMkREEmK4ExFJiOFORCQh
+hjsRkYQY7kREEmK4ExFJiOFORCQhhjsRkYQY7kREEmK4ExFJ6P8AiPh3kkqHPTkAAAAASUVORK5C
+YII=
+"
+ id="image2993"
+ x="0"
+ y="0" />
+</svg>
diff --git a/atmel-samd/asf/sam0/drivers/dac/docimg/dac_block_diagram_saml.svg b/atmel-samd/asf/sam0/drivers/dac/docimg/dac_block_diagram_saml.svg
new file mode 100644
index 000000000..0ed3f88e7
--- /dev/null
+++ b/atmel-samd/asf/sam0/drivers/dac/docimg/dac_block_diagram_saml.svg
@@ -0,0 +1,1303 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ id="svg2985"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ width="792"
+ height="421"
+ sodipodi:docname="dac_block_diagram_saml.gif">
+ <metadata
+ id="metadata2991">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs2989" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="945"
+ inkscape:window-height="1005"
+ id="namedview2987"
+ showgrid="false"
+ inkscape:zoom="0.4280303"
+ inkscape:cx="396"
+ inkscape:cy="210.5"
+ inkscape:window-x="0"
+ inkscape:window-y="100"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg2985" />
+ <image
+ width="792"
+ height="421"
+ xlink:href="data:image/png;base64,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
+"
+ id="image2993"
+ x="0"
+ y="0" />
+</svg>
diff --git a/atmel-samd/modmachine.c b/atmel-samd/modmachine.c
index 1471ca981..6a8256753 100644
--- a/atmel-samd/modmachine.c
+++ b/atmel-samd/modmachine.c
@@ -32,6 +32,7 @@
#include "py/runtime.h"
#include "adc.h"
+#include "mpdac.h"
#include "pin.h"
#if MICROPY_PY_MACHINE
@@ -39,6 +40,7 @@
STATIC const mp_rom_map_elem_t machine_module_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_umachine) },
{ MP_ROM_QSTR(MP_QSTR_ADC), MP_ROM_PTR(&adc_type) },
+ { MP_ROM_QSTR(MP_QSTR_DAC), MP_ROM_PTR(&dac_type) },
{ MP_ROM_QSTR(MP_QSTR_Pin), MP_ROM_PTR(&pin_type) },
};
diff --git a/atmel-samd/mpconfigport.h b/atmel-samd/mpconfigport.h
index 545b2c40d..7682997ad 100644
--- a/atmel-samd/mpconfigport.h
+++ b/atmel-samd/mpconfigport.h
@@ -56,6 +56,8 @@
#define MICROPY_PY_MACHINE (1)
#define MICROPY_MODULE_WEAK_LINKS (1)
#define MICROPY_REPL_AUTO_INDENT (1)
+#define MICROPY_HW_ENABLE_DAC (1)
+#define MICROPY_ENABLE_FINALISER (1)
// type definitions for the specific machine
diff --git a/atmel-samd/mpdac.c b/atmel-samd/mpdac.c
new file mode 100644
index 000000000..5f3308b93
--- /dev/null
+++ b/atmel-samd/mpdac.c
@@ -0,0 +1,152 @@
+/*
+ * This file is part of the Micro Python project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2013, 2014 Damien P. George
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+
+//
+// #include "py/nlr.h"
+#include "py/runtime.h"
+// #include "timer.h"
+#include "mpdac.h"
+// #include "dma.h"
+// #include "pin.h"
+// #include "genhdr/pins.h"
+
+#include "asf/sam0/drivers/dac/dac.h"
+
+/// \moduleref machine
+/// \class DAC - digital to analog conversion
+///
+/// The DAC is used to output analog values (a specific voltage) on pin PA02
+/// (Arduino Zero A0, Feather MO Bluefruit A0).
+/// The voltage will be between 0 and 3.3V.
+///
+/// *This module will undergo changes to the API.*
+///
+/// Example usage:
+///
+/// from machine import DAC
+///
+/// dac = DAC() # create DAC 1 on pin PA02
+/// dac.write(512) # write a value to the DAC (makes PA02 1.65V)
+/// dac.write_mv(1650) # Also results in PA02 being 1.65V
+
+/******************************************************************************/
+// Micro Python bindings
+
+typedef struct _dac_obj_t {
+ mp_obj_base_t base;
+ struct dac_module dac_instance;
+} dac_obj_t;
+
+// create the dac object
+
+/// \classmethod \constructor()
+/// Construct a new DAC object for pin PA02.
+STATIC mp_obj_t dac_make_new(const mp_obj_type_t *type, mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args) {
+ // check arguments
+ mp_arg_check_num(n_args, n_kw, 0, MP_OBJ_FUN_ARGS_MAX, true);
+
+ dac_obj_t *dac = m_new_obj(dac_obj_t);
+ dac->base.type = &dac_type;
+
+ struct dac_config config_dac;
+ dac_get_config_defaults(&config_dac);
+ config_dac.reference = DAC_REFERENCE_AVCC;
+ enum status_code status = dac_init(&dac->dac_instance, DAC, &config_dac);
+ if (status != STATUS_OK) {
+ // Throw error.
+ return mp_const_none;
+ }
+
+ struct dac_chan_config config_dac_chan;
+ dac_chan_get_config_defaults(&config_dac_chan);
+ dac_chan_set_config(&dac->dac_instance, DAC_CHANNEL_0, &config_dac_chan);
+ dac_chan_enable(&dac->dac_instance, DAC_CHANNEL_0);
+
+ dac_enable(&dac->dac_instance);
+
+ // return object
+ return dac;
+}
+
+/// \method deinit()
+/// Turn off the DAC, enable other use of pin.
+STATIC mp_obj_t dac_del(mp_obj_t self_in) {
+ dac_obj_t *self = self_in;
+
+ dac_disable(&self->dac_instance);
+ dac_chan_disable(&self->dac_instance, DAC_CHANNEL_0);
+
+ return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(dac_del_obj, dac_del);
+
+/// \method write(value)
+/// Direct access to the DAC output (10 bit).
+STATIC mp_obj_t dac_write(mp_obj_t self_in, mp_obj_t val) {
+ dac_obj_t *self = self_in;
+
+ dac_chan_write(&self->dac_instance, DAC_CHANNEL_0, mp_obj_get_int(val));
+
+ return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(dac_write_obj, dac_write);
+
+/// \method write_mv(value)
+/// Direct access to the DAC output by specifying millivolts.
+STATIC mp_obj_t dac_write_mv(mp_obj_t self_in, mp_obj_t val_mv) {
+ dac_obj_t *self = self_in;
+ // TODO(tannewt): Sanity check that the mv value is less than the reference
+ // voltage.
+ // Dividing by 3301 instead of 3300 ensures that val_mv of 3300 actually
+ // produces a value of 1023 instead of 1024 which is out of range of the
+ // DAC.
+ uint16_t val = ((uint32_t) mp_obj_get_int(val_mv)) * 1024 / 3301;
+
+ dac_chan_write(&self->dac_instance, DAC_CHANNEL_0, val);
+
+ return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(dac_write_mv_obj, dac_write_mv);
+
+STATIC const mp_map_elem_t dac_locals_dict_table[] = {
+ // instance methods
+ { MP_OBJ_NEW_QSTR(MP_QSTR___del__), (mp_obj_t)&dac_del_obj },
+ { MP_OBJ_NEW_QSTR(MP_QSTR_write), (mp_obj_t)&dac_write_obj },
+ { MP_OBJ_NEW_QSTR(MP_QSTR_write_mv), (mp_obj_t)&dac_write_mv_obj },
+};
+
+STATIC MP_DEFINE_CONST_DICT(dac_locals_dict, dac_locals_dict_table);
+
+const mp_obj_type_t dac_type = {
+ { &mp_type_type },
+ .name = MP_QSTR_DAC,
+ .make_new = dac_make_new,
+ .locals_dict = (mp_obj_t)&dac_locals_dict,
+};
diff --git a/atmel-samd/mpdac.h b/atmel-samd/mpdac.h
new file mode 100644
index 000000000..931987cd9
--- /dev/null
+++ b/atmel-samd/mpdac.h
@@ -0,0 +1,27 @@
+/*
+ * This file is part of the Micro Python project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2013, 2014 Damien P. George
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+extern const mp_obj_type_t dac_type;