drv_adc.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. /*
  2. * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd.
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2019-10-23 yuzrain the first version
  9. */
  10. #include <rthw.h>
  11. #include <rtthread.h>
  12. #include <rtdevice.h>
  13. #include "board.h"
  14. #include "drv_adc.h"
  15. #include "md_gpio.h"
  16. #include "md_adc.h"
  17. #include "md_rcu.h"
  18. #include "md_syscfg.h"
  19. #ifdef RT_USING_ADC
  20. #define BSP_ADC_CHANNEL_NUM 8
  21. /* define adc instance */
  22. static struct rt_adc_device _device_adc0;
  23. /* enable or disable adc */
  24. static rt_err_t es32f0_adc_enabled(struct rt_adc_device *device, rt_uint32_t channel, rt_bool_t enabled)
  25. {
  26. RT_ASSERT(device != RT_NULL);
  27. if (enabled)
  28. {
  29. md_adc_enable_ssen_ss0en(ADC);
  30. }
  31. else
  32. {
  33. md_adc_disable_ssen_ss0en(ADC);
  34. }
  35. return RT_EOK;
  36. }
  37. static void _adc_channel_config(rt_uint32_t channel)
  38. {
  39. /* select gpio pin as adc function */
  40. switch (channel)
  41. {
  42. case 0:
  43. md_gpio_set_mode(GPIOA, MD_GPIO_PIN_0, MD_GPIO_MODE_ANALOG);
  44. break;
  45. case 1:
  46. md_gpio_set_mode(GPIOA, MD_GPIO_PIN_1, MD_GPIO_MODE_ANALOG);
  47. break;
  48. case 2:
  49. md_gpio_set_mode(GPIOA, MD_GPIO_PIN_2, MD_GPIO_MODE_ANALOG);
  50. break;
  51. case 3:
  52. md_gpio_set_mode(GPIOA, MD_GPIO_PIN_3, MD_GPIO_MODE_ANALOG);
  53. break;
  54. case 4:
  55. md_gpio_set_mode(GPIOA, MD_GPIO_PIN_4, MD_GPIO_MODE_ANALOG);
  56. break;
  57. case 5:
  58. md_gpio_set_mode(GPIOA, MD_GPIO_PIN_5, MD_GPIO_MODE_ANALOG);
  59. break;
  60. case 6:
  61. md_gpio_set_mode(GPIOA, MD_GPIO_PIN_6, MD_GPIO_MODE_ANALOG);
  62. break;
  63. case 7:
  64. md_gpio_set_mode(GPIOA, MD_GPIO_PIN_7, MD_GPIO_MODE_ANALOG);
  65. break;
  66. default:
  67. break;
  68. }
  69. }
  70. static rt_err_t es32f0_get_adc_value(struct rt_adc_device *device, rt_uint32_t channel, rt_uint32_t *value)
  71. {
  72. rt_uint32_t chn_data[BSP_ADC_CHANNEL_NUM];
  73. rt_uint32_t i;
  74. RT_ASSERT(device != RT_NULL);
  75. RT_ASSERT(value != RT_NULL);
  76. /* config adc channel */
  77. _adc_channel_config(channel);
  78. md_adc_set_swtri_ss0(ADC);
  79. while ((ADC->RIF & ADC_RIF_SS0RIF_MSK) == 0);
  80. for (i=0; i<BSP_ADC_CHANNEL_NUM; i++)
  81. chn_data[i] = md_adc_get_ss0_data(ADC);
  82. *value = chn_data[channel];
  83. return RT_EOK;
  84. }
  85. static const struct rt_adc_ops es32f0_adc_ops =
  86. {
  87. es32f0_adc_enabled,
  88. es32f0_get_adc_value,
  89. };
  90. int rt_hw_adc_init(void)
  91. {
  92. int result = RT_EOK;
  93. md_rcu_enable_apb2en_adcen(RCU);
  94. md_syscfg_enable_cfg_currgen(SYSCFG);
  95. md_syscfg_enable_cfg_vrefen(SYSCFG);
  96. md_syscfg_set_cfg_vlrs(SYSCFG, 7);
  97. md_adc_set_ss0_con_sel(ADC, MD_ADC_SS_CON_SEL_SW);
  98. md_adc_set_ss0_con_type(ADC, MD_ADC_SS_CON_TYPE_EDGE);
  99. md_adc_set_frf_ffrst(ADC);
  100. md_adc_set_ss0_mux0_mux7(ADC, MD_ADC_SS_MUX_ADIN7);
  101. md_adc_set_ss0_mux0_mux6(ADC, MD_ADC_SS_MUX_ADIN6);
  102. md_adc_set_ss0_mux0_mux5(ADC, MD_ADC_SS_MUX_ADIN5);
  103. md_adc_set_ss0_mux0_mux4(ADC, MD_ADC_SS_MUX_ADIN4);
  104. md_adc_set_ss0_mux0_mux3(ADC, MD_ADC_SS_MUX_ADIN3);
  105. md_adc_set_ss0_mux0_mux2(ADC, MD_ADC_SS_MUX_ADIN2);
  106. md_adc_set_ss0_mux0_mux1(ADC, MD_ADC_SS_MUX_ADIN1);
  107. md_adc_set_ss0_mux0_mux0(ADC, MD_ADC_SS_MUX_ADIN0);
  108. md_adc_enable_ier_ss0ie(ADC);
  109. md_adc_set_ss0_end_end(ADC, 7);
  110. md_adc_enable_ss0_end_ie7(ADC);
  111. md_adc_set_gainl_ch7pga(ADC, MD_ADC_GAIN_CHPGA_X2);
  112. md_adc_set_gainl_ch6pga(ADC, MD_ADC_GAIN_CHPGA_X2);
  113. md_adc_set_gainl_ch5pga(ADC, MD_ADC_GAIN_CHPGA_X2);
  114. md_adc_set_gainl_ch4pga(ADC, MD_ADC_GAIN_CHPGA_X2);
  115. md_adc_set_gainl_ch3pga(ADC, MD_ADC_GAIN_CHPGA_X2);
  116. md_adc_set_gainl_ch2pga(ADC, MD_ADC_GAIN_CHPGA_X2);
  117. md_adc_set_gainl_ch1pga(ADC, MD_ADC_GAIN_CHPGA_X2);
  118. md_adc_set_gainl_ch0pga(ADC, MD_ADC_GAIN_CHPGA_X2);
  119. md_adc_set_srate(ADC, MD_ADC_SRATE_CLKDIV1 | ADC_SRATE_CKEN_MSK);
  120. rt_hw_adc_register(&_device_adc0, "adc0", &es32f0_adc_ops, ADC);
  121. return result;
  122. }
  123. INIT_BOARD_EXPORT(rt_hw_adc_init);
  124. #endif