aboutsummaryrefslogtreecommitdiffstats
path: root/os
diff options
context:
space:
mode:
Diffstat (limited to 'os')
-rw-r--r--os/hal/include/dac.h6
-rw-r--r--os/hal/ports/STM32/LLD/DACv1/dac_lld.c24
-rw-r--r--os/hal/ports/STM32/LLD/DACv1/dac_lld.h26
-rw-r--r--os/hal/src/dac.c34
4 files changed, 83 insertions, 7 deletions
diff --git a/os/hal/include/dac.h b/os/hal/include/dac.h
index 9b892bf44..8a23ade4f 100644
--- a/os/hal/include/dac.h
+++ b/os/hal/include/dac.h
@@ -239,6 +239,12 @@ extern "C" {
void dacObjectInit(DACDriver *dacp);
void dacStart(DACDriver *dacp, const DACConfig *config);
void dacStop(DACDriver *dacp);
+ void dacPutChannel(DACDriver *dacp,
+ dacchannel_t channel,
+ dacsample_t sample);
+ void dacPutChannelI(DACDriver *dacp,
+ dacchannel_t channel,
+ dacsample_t sample);
void dacStartConversion(DACDriver *dacp, const DACConversionGroup *grpp,
const dacsample_t *samples, size_t depth);
void dacStartConversionI(DACDriver *dacp, const DACConversionGroup *grpp,
diff --git a/os/hal/ports/STM32/LLD/DACv1/dac_lld.c b/os/hal/ports/STM32/LLD/DACv1/dac_lld.c
index 8afa4e505..99ed45ef2 100644
--- a/os/hal/ports/STM32/LLD/DACv1/dac_lld.c
+++ b/os/hal/ports/STM32/LLD/DACv1/dac_lld.c
@@ -81,7 +81,9 @@ DACDriver DACD4;
/* Driver local variables. */
/*===========================================================================*/
-static const DACConfig default_config = {0};
+static const DACConfig default_config = {
+ datamode: DAC_DHRM_12BIT_RIGHT
+};
#if STM32_DAC_USE_DAC1_CH1 == TRUE
static const dacparams_t dma1_ch1_params = {
@@ -311,6 +313,24 @@ void dac_lld_stop(DACDriver *dacp) {
}
/**
+ * @brief Outputs a value directly on a DAC channel.
+ *
+ * @param[in] dacp pointer to the @p DACDriver object
+ * @param[in] channel DAC channel number
+ * @param[in] sample value to be output
+ *
+ * @api
+ */
+void dac_lld_put_channel(DACDriver *dacp,
+ dacchannel_t channel,
+ dacsample_t sample) {
+
+ (void)dacp;
+ (void)channel;
+ (void)sample;
+}
+
+/**
* @brief Starts a DAC conversion.
* @details Starts an asynchronous conversion operation.
*
@@ -322,7 +342,7 @@ void dac_lld_start_conversion(DACDriver *dacp) {
uint32_t cr, dmamode;
#if STM32_DAC_DUAL_MODE == FALSE
- switch (dacp->grpp->datamode) {
+ switch (dacp->config->datamode) {
/* Sets the DAC data register */
case DAC_DHRM_12BIT_RIGHT:
dmaStreamSetPeripheral(dacp->params->dma, &dacp->params->dac->DHR12R1 +
diff --git a/os/hal/ports/STM32/LLD/DACv1/dac_lld.h b/os/hal/ports/STM32/LLD/DACv1/dac_lld.h
index 36842f295..ddfafc256 100644
--- a/os/hal/ports/STM32/LLD/DACv1/dac_lld.h
+++ b/os/hal/ports/STM32/LLD/DACv1/dac_lld.h
@@ -226,11 +226,25 @@
#define STM32_DMA_REQUIRED
#endif
+/**
+ * @brief Max DAC channels.
+ */
+#if STM32_DAC_DUAL_MODE == FALSE
+#define DAC_MAX_CHANNELS 1
+#else
+#define DAC_MAX_CHANNELS 2
+#endif
+
/*===========================================================================*/
/* Driver data structures and types. */
/*===========================================================================*/
/**
+ * @brief Type of a DAC channel index.
+ */
+typedef uint32_t dacchannel_t;
+
+/**
* @brief DAC channel parameters type.
*/
typedef struct {
@@ -337,10 +351,6 @@ typedef struct {
dacerrorcallback_t error_cb;
/* End of the mandatory fields.*/
/**
- * @brief DAC data holding register mode.
- */
- dacdhrmode_t datamode;
- /**
* @brief DAC initialization data.
* @note This field contains the (not shifted) value to be put into the
* TSEL field of the DAC CR register during initialization. All
@@ -354,7 +364,10 @@ typedef struct {
*/
typedef struct {
/* End of the mandatory fields.*/
- uint32_t dummy;
+ /**
+ * @brief DAC data holding register mode.
+ */
+ dacdhrmode_t datamode;
} DACConfig;
/**
@@ -433,6 +446,9 @@ extern "C" {
void dac_lld_init(void);
void dac_lld_start(DACDriver *dacp);
void dac_lld_stop(DACDriver *dacp);
+ void dac_lld_put_channel(DACDriver *dacp,
+ dacchannel_t channel,
+ dacsample_t sample);
void dac_lld_start_conversion(DACDriver *dacp);
void dac_lld_stop_conversion(DACDriver *dacp);
#ifdef __cplusplus
diff --git a/os/hal/src/dac.c b/os/hal/src/dac.c
index a4e0fa672..024547b78 100644
--- a/os/hal/src/dac.c
+++ b/os/hal/src/dac.c
@@ -131,6 +131,40 @@ void dacStop(DACDriver *dacp) {
}
/**
+ * @brief Outputs a value directly on a DAC channel.
+ *
+ * @param[in] dacp pointer to the @p DACDriver object
+ * @param[in] channel DAC channel number
+ * @param[in] sample value to be output
+ *
+ * @api
+ */
+void dacPutChannel(DACDriver *dacp, dacchannel_t channel, dacsample_t sample) {
+
+ osalSysLock();
+ dacPutChannelI(dacp, channel, sample);
+ osalSysUnlock();
+}
+
+/**
+ * @brief Outputs a value directly on a DAC channel.
+ *
+ * @param[in] dacp pointer to the @p DACDriver object
+ * @param[in] channel DAC channel number
+ * @param[in] sample value to be output
+ *
+ * @iclass
+ */
+void dacPutChannelI(DACDriver *dacp, dacchannel_t channel, dacsample_t sample) {
+
+ osalDbgCheckClassI();
+ osalDbgCheck(channel < DAC_MAX_CHANNELS);
+ osalDbgAssert(dacp->state == DAC_READY, "invalid state");
+
+ dac_lld_put_channel(dacp, channel, sample);
+}
+
+/**
* @brief Starts a DAC conversion.
* @details Starts an asynchronous conversion operation.
* @note The buffer is organized as a matrix of M*N elements where M is the