drv_adc.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. /*
  2. * Copyright (c) 2006-2018, Synwit Technology Co.,Ltd.
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2020-5-26 lik first version
  9. */
  10. #include "drv_adc.h"
  11. #ifdef RT_USING_ADC
  12. #ifdef BSP_USING_ADC
  13. //#define DRV_DEBUG
  14. #define LOG_TAG "drv.adc"
  15. #include <drv_log.h>
  16. static struct swm_adc_cfg adc_cfg[] =
  17. {
  18. #ifdef BSP_USING_ADC0
  19. ADC0_CFG,
  20. #endif
  21. #ifdef BSP_USING_ADC1
  22. ADC1_CFG,
  23. #endif
  24. };
  25. static struct swm_adc adc_drv[sizeof(adc_cfg) / sizeof(adc_cfg[0])];
  26. static rt_err_t swm_adc_enabled(struct rt_adc_device *adc_device, rt_uint32_t channel, rt_bool_t enabled)
  27. {
  28. struct swm_adc_cfg *cfg = RT_NULL;
  29. RT_ASSERT(adc_device != RT_NULL);
  30. cfg = adc_device->parent.user_data;
  31. if (enabled)
  32. {
  33. ADC_Open(cfg->ADCx);
  34. }
  35. else
  36. {
  37. ADC_Close(cfg->ADCx);
  38. }
  39. return RT_EOK;
  40. }
  41. static rt_uint32_t swm_adc_get_channel(rt_uint32_t channel)
  42. {
  43. rt_uint32_t swm_channel = 0;
  44. switch (channel)
  45. {
  46. case 0:
  47. swm_channel = ADC_CH0;
  48. break;
  49. case 1:
  50. swm_channel = ADC_CH1;
  51. break;
  52. case 2:
  53. swm_channel = ADC_CH2;
  54. break;
  55. case 3:
  56. swm_channel = ADC_CH3;
  57. break;
  58. case 4:
  59. swm_channel = ADC_CH4;
  60. break;
  61. case 5:
  62. swm_channel = ADC_CH5;
  63. break;
  64. case 6:
  65. swm_channel = ADC_CH6;
  66. break;
  67. case 7:
  68. swm_channel = ADC_CH7;
  69. break;
  70. }
  71. return swm_channel;
  72. }
  73. static rt_err_t swm_get_adc_value(struct rt_adc_device *adc_device, rt_uint32_t channel, rt_uint32_t *value)
  74. {
  75. uint32_t adc_chn;
  76. struct swm_adc_cfg *cfg = RT_NULL;
  77. RT_ASSERT(adc_device != RT_NULL);
  78. RT_ASSERT(value != RT_NULL);
  79. cfg = adc_device->parent.user_data;
  80. if (channel < 8)
  81. {
  82. /* set stm32 ADC channel */
  83. adc_chn = swm_adc_get_channel(channel);
  84. }
  85. else
  86. {
  87. LOG_E("ADC channel must be between 0 and 7.");
  88. return -RT_ERROR;
  89. }
  90. /* start ADC */
  91. ADC_Start(cfg->ADCx);
  92. /* Wait for the ADC to convert */
  93. while ((cfg->ADCx->CH[channel].STAT & 0x01) == 0)
  94. ;
  95. /* get ADC value */
  96. *value = (rt_uint32_t)ADC_Read(cfg->ADCx, adc_chn);
  97. return RT_EOK;
  98. }
  99. static const struct rt_adc_ops swm_adc_ops =
  100. {
  101. .enabled = swm_adc_enabled,
  102. .convert = swm_get_adc_value,
  103. };
  104. static int rt_hw_adc_init(void)
  105. {
  106. int i = 0;
  107. int result = RT_EOK;
  108. for (i = 0; i < sizeof(adc_cfg) / sizeof(adc_cfg[0]); i++)
  109. {
  110. /* ADC init */
  111. adc_drv[i].cfg = &adc_cfg[i];
  112. if (adc_drv[i].cfg->ADCx == ADC0)
  113. {
  114. #ifdef BSP_USING_ADC0_CHN0
  115. adc_drv[i].cfg->adc_initstruct.channels |= ADC_CH0;
  116. #endif
  117. #ifdef BSP_USING_ADC0_CHN1
  118. adc_drv[i].cfg->adc_initstruct.channels |= ADC_CH1;
  119. #endif
  120. #ifdef BSP_USING_ADC0_CHN2
  121. adc_drv[i].cfg->adc_initstruct.channels |= ADC_CH2;
  122. #endif
  123. #ifdef BSP_USING_ADC0_CHN3
  124. adc_drv[i].cfg->adc_initstruct.channels |= ADC_CH3;
  125. #endif
  126. #ifdef BSP_USING_ADC0_CHN4
  127. adc_drv[i].cfg->adc_initstruct.channels |= ADC_CH4;
  128. PORT_Init(PORTA, PIN12, PORTA_PIN12_ADC0_IN4, 0); //PA.12 => ADC0.CH4
  129. #endif
  130. #ifdef BSP_USING_ADC0_CHN5
  131. adc_drv[i].cfg->adc_initstruct.channels |= ADC_CH5;
  132. PORT_Init(PORTA, PIN11, PORTA_PIN11_ADC0_IN5, 0); //PA.11 => ADC0.CH5
  133. #endif
  134. #ifdef BSP_USING_ADC0_CHN6
  135. adc_drv[i].cfg->adc_initstruct.channels |= ADC_CH6;
  136. PORT_Init(PORTA, PIN10, PORTA_PIN10_ADC0_IN6, 0); //PA.10 => ADC0.CH6
  137. #endif
  138. #ifdef BSP_USING_ADC0_CHN7
  139. adc_drv[i].cfg->adc_initstruct.channels |= ADC_CH7;
  140. PORT_Init(PORTA, PIN9, PORTA_PIN9_ADC0_IN7, 0); //PA.9 => ADC0.CH7
  141. #endif
  142. }
  143. else if (adc_drv[i].cfg->ADCx == ADC1)
  144. {
  145. #ifdef BSP_USING_ADC1_CHN0
  146. adc_drv[i].cfg->adc_initstruct.channels |= ADC_CH0;
  147. PORT_Init(PORTC, PIN7, PORTC_PIN7_ADC1_IN0, 0); //PC.7 => ADC1.CH0
  148. #endif
  149. #ifdef BSP_USING_ADC1_CHN1
  150. adc_drv[i].cfg->adc_initstruct.channels |= ADC_CH1;
  151. PORT_Init(PORTC, PIN6, PORTC_PIN6_ADC1_IN1, 0); //PC.6 => ADC1.CH1
  152. #endif
  153. #ifdef BSP_USING_ADC1_CHN2
  154. adc_drv[i].cfg->adc_initstruct.channels |= ADC_CH2;
  155. PORT_Init(PORTC, PIN5, PORTC_PIN5_ADC1_IN2, 0); //PC.5 => ADC1.CH2
  156. #endif
  157. #ifdef BSP_USING_ADC1_CHN3
  158. adc_drv[i].cfg->adc_initstruct.channels |= ADC_CH3;
  159. PORT_Init(PORTC, PIN4, PORTC_PIN4_ADC1_IN3, 0); //PC.4 => ADC1.CH3
  160. #endif
  161. #ifdef BSP_USING_ADC1_CHN4
  162. adc_drv[i].cfg->adc_initstruct.channels |= ADC_CH4;
  163. PORT_Init(PORTN, PIN0, PORTN_PIN0_ADC1_IN4, 0); //PN.0 => ADC1.CH4
  164. #endif
  165. #ifdef BSP_USING_ADC1_CHN5
  166. adc_drv[i].cfg->adc_initstruct.channels |= ADC_CH5;
  167. PORT_Init(PORTN, PIN1, PORTN_PIN1_ADC1_IN5, 0); //PN.1 => ADC1.CH5
  168. #endif
  169. #ifdef BSP_USING_ADC1_CHN6
  170. adc_drv[i].cfg->adc_initstruct.channels |= ADC_CH6;
  171. PORT_Init(PORTN, PIN2, PORTN_PIN2_ADC1_IN6, 0); //PN.2 => ADC1.CH6
  172. #endif
  173. #ifdef BSP_USING_ADC1_CHN7
  174. adc_drv[i].cfg->adc_initstruct.channels |= ADC_CH7;
  175. #endif
  176. }
  177. ADC_Init(adc_drv[i].cfg->ADCx, &(adc_drv[i].cfg->adc_initstruct));
  178. ADC_Open(adc_drv[i].cfg->ADCx);
  179. /* register ADC device */
  180. if (rt_hw_adc_register(&adc_drv[i].adc_device, adc_drv[i].cfg->name, &swm_adc_ops, adc_drv[i].cfg) == RT_EOK)
  181. {
  182. LOG_D("%s init success", adc_drv[i].cfg->name);
  183. }
  184. else
  185. {
  186. LOG_E("%s register failed", adc_drv[i].cfg->name);
  187. result = -RT_ERROR;
  188. }
  189. }
  190. return result;
  191. }
  192. INIT_BOARD_EXPORT(rt_hw_adc_init);
  193. #endif /* BSP_USING_ADC */
  194. #endif /* RT_USING_ADC */