drv_dac.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2020-06-18 thread-liu the first version
  9. */
  10. #include <board.h>
  11. #if defined(BSP_USING_DAC1) || defined(BSP_USING_DAC2)
  12. #include "drv_config.h"
  13. //#define DRV_DEBUG
  14. #define LOG_TAG "drv.dac"
  15. #include <drv_log.h>
  16. static DAC_HandleTypeDef dac_config[] =
  17. {
  18. #ifdef BSP_USING_DAC1
  19. DAC1_CONFIG,
  20. #endif
  21. };
  22. struct stm32_dac
  23. {
  24. DAC_HandleTypeDef DAC_Handler;
  25. struct rt_dac_device stm32_dac_device;
  26. };
  27. static struct stm32_dac stm32_dac_obj[sizeof(dac_config) / sizeof(dac_config[0])];
  28. static rt_err_t stm32_dac_enabled(struct rt_dac_device *device, rt_uint32_t channel)
  29. {
  30. DAC_HandleTypeDef *stm32_dac_handler;
  31. RT_ASSERT(device != RT_NULL);
  32. stm32_dac_handler = device->parent.user_data;
  33. #if defined(SOC_SERIES_STM32MP1)
  34. HAL_DAC_Start(stm32_dac_handler, channel);
  35. #endif
  36. return RT_EOK;
  37. }
  38. static rt_err_t stm32_dac_disabled(struct rt_dac_device *device, rt_uint32_t channel)
  39. {
  40. DAC_HandleTypeDef *stm32_dac_handler;
  41. RT_ASSERT(device != RT_NULL);
  42. stm32_dac_handler = device->parent.user_data;
  43. #if defined(SOC_SERIES_STM32MP1)
  44. HAL_DAC_Stop(stm32_dac_handler, channel);
  45. #endif
  46. return RT_EOK;
  47. }
  48. static rt_uint32_t stm32_dac_get_channel(rt_uint32_t channel)
  49. {
  50. rt_uint32_t stm32_channel = 0;
  51. switch (channel)
  52. {
  53. case 1:
  54. stm32_channel = DAC_CHANNEL_1;
  55. break;
  56. case 2:
  57. stm32_channel = DAC_CHANNEL_2;
  58. break;
  59. default:
  60. RT_ASSERT(0);
  61. break;
  62. }
  63. return stm32_channel;
  64. }
  65. static rt_err_t stm32_set_dac_value(struct rt_dac_device *device, rt_uint32_t channel, rt_uint32_t *value)
  66. {
  67. uint32_t dac_channel;
  68. DAC_ChannelConfTypeDef DAC_ChanConf;
  69. DAC_HandleTypeDef *stm32_dac_handler;
  70. RT_ASSERT(device != RT_NULL);
  71. RT_ASSERT(value != RT_NULL);
  72. stm32_dac_handler = device->parent.user_data;
  73. rt_memset(&DAC_ChanConf, 0, sizeof(DAC_ChanConf));
  74. #if defined(SOC_SERIES_STM32MP1)
  75. if (channel <= 2 && channel > 0)
  76. {
  77. /* set stm32 dac channel */
  78. dac_channel = stm32_dac_get_channel(channel);
  79. }
  80. else
  81. {
  82. LOG_E("dac channel must be between 1 and 2.");
  83. return -RT_ERROR;
  84. }
  85. #endif
  86. #if defined(SOC_SERIES_STM32MP1)
  87. DAC_ChanConf.DAC_Trigger=DAC_TRIGGER_NONE;
  88. DAC_ChanConf.DAC_OutputBuffer=DAC_OUTPUTBUFFER_DISABLE;
  89. #endif
  90. /* config dac out channel*/
  91. if (HAL_DAC_ConfigChannel(stm32_dac_handler, &DAC_ChanConf, dac_channel) != HAL_OK)
  92. {
  93. LOG_D("Config dac out channel Error!\n");
  94. return -RT_ERROR;
  95. }
  96. /* set dac channel out value*/
  97. if (HAL_DAC_SetValue(stm32_dac_handler, dac_channel, DAC_ALIGN_12B_R, *value) != HAL_OK)
  98. {
  99. LOG_D("Setting dac channel out value Error!\n");
  100. return -RT_ERROR;
  101. }
  102. /* start dac */
  103. if (HAL_DAC_Start(stm32_dac_handler, dac_channel) != HAL_OK)
  104. {
  105. LOG_D("Start dac Error!\n");
  106. return -RT_ERROR;
  107. }
  108. return RT_EOK;
  109. }
  110. static const struct rt_dac_ops stm_dac_ops =
  111. {
  112. .disabled = stm32_dac_disabled,
  113. .enabled = stm32_dac_enabled,
  114. .convert = stm32_set_dac_value,
  115. };
  116. static int stm32_dac_init(void)
  117. {
  118. int result = RT_EOK;
  119. /* save dac name */
  120. char name_buf[5] = {'d', 'a', 'c', '0', 0};
  121. int i = 0;
  122. for (i = 0; i < sizeof(dac_config) / sizeof(dac_config[0]); i++)
  123. {
  124. /* dac init */
  125. name_buf[3] = '0';
  126. stm32_dac_obj[i].DAC_Handler = dac_config[i];
  127. #if defined(DAC1)
  128. if (stm32_dac_obj[i].DAC_Handler.Instance == DAC1)
  129. {
  130. name_buf[3] = '1';
  131. }
  132. #endif
  133. #if defined(DAC2)
  134. if (stm32_dac_obj[i].dac_Handler.Instance == DAC2)
  135. {
  136. name_buf[3] = '2';
  137. }
  138. #endif
  139. if (HAL_DAC_Init(&stm32_dac_obj[i].DAC_Handler) != HAL_OK)
  140. {
  141. LOG_E("%s init failed", name_buf);
  142. result = -RT_ERROR;
  143. }
  144. else
  145. {
  146. /* register dac device */
  147. if (rt_hw_dac_register(&stm32_dac_obj[i].stm32_dac_device, name_buf, &stm_dac_ops, &stm32_dac_obj[i].DAC_Handler) == RT_EOK)
  148. {
  149. LOG_D("%s init success", name_buf);
  150. }
  151. else
  152. {
  153. LOG_E("%s register failed", name_buf);
  154. result = -RT_ERROR;
  155. }
  156. }
  157. }
  158. return result;
  159. }
  160. INIT_DEVICE_EXPORT(stm32_dac_init);
  161. #endif /* BSP_USING_DAC */