drv_adc.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. /*
  2. * Copyright (c) 2006-2022, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2019-04-20 tyustli the first version.
  9. *
  10. */
  11. #include <rtthread.h>
  12. #ifdef BSP_USING_ADC
  13. #if !defined(BSP_USING_ADC1) && !defined(BSP_USING_ADC2)
  14. #error "Please define at least one BSP_USING_ADCx"
  15. #endif
  16. #if (defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
  17. #error "Please don't define 'FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL'!"
  18. #endif
  19. #define LOG_TAG "drv.adc"
  20. #include <drv_log.h>
  21. #include "drv_adc.h"
  22. #include "fsl_adc.h"
  23. #include <rtdevice.h>
  24. static rt_err_t imxrt_hp_adc_enabled(struct rt_adc_device *device, rt_uint32_t channel, rt_bool_t enabled)
  25. {
  26. return RT_EOK;
  27. }
  28. static rt_err_t imxrt_hp_adc_convert(struct rt_adc_device *device, rt_uint32_t channel, rt_uint32_t *value)
  29. {
  30. adc_channel_config_t adc_channel;
  31. ADC_Type *base;
  32. base = (ADC_Type *)(device->parent.user_data);
  33. adc_channel.channelNumber = channel;
  34. adc_channel.enableInterruptOnConversionCompleted = false;
  35. ADC_SetChannelConfig(base, 0, &adc_channel);
  36. while (0U == ADC_GetChannelStatusFlags(base, 0))
  37. {
  38. continue;
  39. }
  40. *value = ADC_GetChannelConversionValue(base, 0);
  41. return RT_EOK;
  42. }
  43. static struct rt_adc_ops imxrt_adc_ops =
  44. {
  45. .enabled = imxrt_hp_adc_enabled,
  46. .convert = imxrt_hp_adc_convert,
  47. };
  48. #if defined(BSP_USING_ADC1)
  49. static adc_config_t ADC1_config_value;
  50. static struct rt_adc_device adc1_device;
  51. #endif /* BSP_USING_ADC1 */
  52. #if defined(BSP_USING_ADC2)
  53. static adc_config_t ADC2_config_value;
  54. static struct rt_adc_device adc2_device;
  55. #endif /* BSP_USING_ADC2 */
  56. int rt_hw_adc_init(void)
  57. {
  58. int result = RT_EOK;
  59. #if defined(BSP_USING_ADC1)
  60. ADC_GetDefaultConfig(&ADC1_config_value);
  61. ADC_Init(ADC1, &ADC1_config_value);
  62. #if !(defined(FSL_FEATURE_ADC_SUPPORT_HARDWARE_TRIGGER_REMOVE) && FSL_FEATURE_ADC_SUPPORT_HARDWARE_TRIGGER_REMOVE)
  63. ADC_EnableHardwareTrigger(ADC1, false);
  64. #endif
  65. ADC_DoAutoCalibration(ADC1);
  66. result = rt_hw_adc_register(&adc1_device, "adc1", &imxrt_adc_ops, ADC1);
  67. if (result != RT_EOK)
  68. {
  69. LOG_E("register adc1 device failed error code = %d\n", result);
  70. }
  71. #endif /* BSP_USING_ADC1 */
  72. #if defined(BSP_USING_ADC2)
  73. ADC_GetDefaultConfig(&ADC2_config_value);
  74. ADC_Init(ADC2, &ADC2_config_value);
  75. #if !(defined(FSL_FEATURE_ADC_SUPPORT_HARDWARE_TRIGGER_REMOVE) && FSL_FEATURE_ADC_SUPPORT_HARDWARE_TRIGGER_REMOVE)
  76. ADC_EnableHardwareTrigger(ADC2, false);
  77. #endif
  78. ADC_DoAutoCalibration(ADC2);
  79. result = rt_hw_adc_register(&adc2_device, "adc2", &imxrt_adc_ops, ADC2);
  80. if (result != RT_EOK)
  81. {
  82. LOG_E("register adc2 device failed error code = %d\n", result);
  83. }
  84. #endif /* BSP_USING_ADC2 */
  85. return result;
  86. }
  87. INIT_DEVICE_EXPORT(rt_hw_adc_init);
  88. #endif /* BSP_USING_ADC */