Browse Source

[dac] add get resolution method

Meco Man 3 years ago
parent
commit
175ca2ee09

+ 13 - 0
bsp/stm32/libraries/HAL_Drivers/drv_dac.c

@@ -105,6 +105,18 @@ static rt_err_t stm32_dac_disabled(struct rt_dac_device *device, rt_uint32_t cha
     return RT_EOK;
 }
 
+static rt_uint8_t stm32_dac_get_resolution(struct rt_dac_device *device)
+{
+    DAC_HandleTypeDef *stm32_dac_handler;
+
+    RT_ASSERT(device != RT_NULL);
+
+    stm32_dac_handler = device->parent.user_data;
+    (void)stm32_dac_handler;
+
+    return 12; /* TODO */
+}
+
 static rt_err_t stm32_set_dac_value(struct rt_dac_device *device, rt_uint32_t channel, rt_uint32_t *value)
 {
     uint32_t dac_channel;
@@ -162,6 +174,7 @@ static const struct rt_dac_ops stm_dac_ops =
     .disabled = stm32_dac_disabled,
     .enabled  = stm32_dac_enabled,
     .convert  = stm32_set_dac_value,
+    .get_resolution = stm32_dac_get_resolution,
 };
 
 static int stm32_dac_init(void)

+ 2 - 0
components/drivers/include/drivers/dac.h

@@ -18,6 +18,7 @@ struct rt_dac_ops
     rt_err_t (*disabled)(struct rt_dac_device *device, rt_uint32_t channel);
     rt_err_t (*enabled)(struct rt_dac_device *device, rt_uint32_t channel);
     rt_err_t (*convert)(struct rt_dac_device *device, rt_uint32_t channel, rt_uint32_t *value);
+    rt_uint8_t (*get_resolution)(struct rt_dac_device *device);
 };
 
 struct rt_dac_device
@@ -31,6 +32,7 @@ typedef enum
 {
     RT_DAC_CMD_ENABLE = RT_DEVICE_CTRL_BASE(DAC) + 0,
     RT_DAC_CMD_DISABLE = RT_DEVICE_CTRL_BASE(DAC) + 1,
+    RT_DAC_CMD_GET_RESOLUTION = RT_DEVICE_CTRL_BASE(DAC) + 2,
 } rt_dac_cmd_t;
 
 rt_err_t rt_hw_dac_register(rt_dac_device_t dac,const char *name, const struct rt_dac_ops *ops, const void *user_data);

+ 1 - 1
components/drivers/misc/adc.c

@@ -58,7 +58,7 @@ static rt_err_t _adc_control(rt_device_t dev, int cmd, void *args)
         if(resolution != 0)
         {
             *((rt_uint8_t*)args) = resolution;
-            LOG_D("ADC resolution:%d", resolution);
+            LOG_D("resolution: %d bits", resolution);
             result = RT_EOK;
         }
     }

+ 13 - 7
components/drivers/misc/dac.c

@@ -40,21 +40,27 @@ static rt_size_t _dac_write(rt_device_t dev, rt_off_t pos, const void *buffer, r
 
 static rt_err_t _dac_control(rt_device_t dev, int cmd, void *args)
 {
-    rt_err_t result = RT_EOK;
+    rt_err_t result = -RT_EINVAL;
     rt_dac_device_t dac = (struct rt_dac_device *)dev;
 
-    if (dac->ops->enabled == RT_NULL)
-    {
-        return -RT_ENOSYS;
-    }
-    if (cmd == RT_DAC_CMD_ENABLE)
+    if (cmd == RT_DAC_CMD_ENABLE && dac->ops->enabled)
     {
         result = dac->ops->enabled(dac, (rt_uint32_t)args);
     }
-    else if (cmd == RT_DAC_CMD_DISABLE)
+    else if (cmd == RT_DAC_CMD_DISABLE && dac->ops->enabled)
     {
         result = dac->ops->disabled(dac, (rt_uint32_t)args);
     }
+    else if (cmd == RT_DAC_CMD_GET_RESOLUTION && dac->ops->get_resolution)
+    {
+        rt_uint8_t resolution = dac->ops->get_resolution(dac);
+        if(resolution != 0)
+        {
+            *((rt_uint8_t*)args) = resolution;
+            LOG_D("resolution: %d bits", resolution);
+            result = RT_EOK;
+        }
+    }
 
     return result;
 }