drv_lpadc.c 3.8 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_LPADC
  13. #if !defined(BSP_USING_LPADC1) && !defined(BSP_USING_LPADC2)
  14. #error "Please define at least one BSP_USING_LPADCx"
  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.lpadc"
  20. #include <drv_log.h>
  21. #include "drv_lpadc.h"
  22. #include "fsl_lpadc.h"
  23. #include <rtdevice.h>
  24. lpadc_config_t mLpadcConfigStruct;
  25. #if defined(BSP_USING_LPADC1)
  26. static struct rt_adc_device lpadc1_device;
  27. #endif
  28. #if defined(BSP_USING_LPADC2)
  29. static struct rt_adc_device lpadc2_device;
  30. #endif
  31. #if (defined(DEMO_LPADC_USE_HIGH_RESOLUTION) && DEMO_LPADC_USE_HIGH_RESOLUTION)
  32. uint32_t g_LpadcResultShift = 0U;
  33. #else
  34. uint32_t g_LpadcResultShift = 3U;
  35. #endif /* DEMO_LPADC_USE_HIGH_RESOLUTION */
  36. static rt_err_t imxrt_hp_adc_enabled(struct rt_adc_device *device, rt_uint32_t channel, rt_bool_t enabled)
  37. {
  38. return RT_EOK;
  39. }
  40. static rt_err_t imxrt_hp_adc_convert(struct rt_adc_device *device, rt_uint32_t channel, rt_uint32_t *value)
  41. {
  42. LPADC1_BASE *base;
  43. lpadc_conv_command_config_t mLpadcCommandConfigStruct;
  44. lpadc_conv_trigger_config_t mLpadcTriggerConfigStruct;
  45. lpadc_conv_result_t mLpadcResultConfigStruct;
  46. base = (LPADC1_BASE *)(device->parent.user_data);
  47. //ADC_SetChannelConfig(base, 0, &adc_channel);
  48. LPADC_GetDefaultConvCommandConfig(&mLpadcCommandConfigStruct);
  49. mLpadcCommandConfigStruct.channelNumber = channel;
  50. #if defined(DEMO_LPADC_USE_HIGH_RESOLUTION) && DEMO_LPADC_USE_HIGH_RESOLUTION
  51. mLpadcCommandConfigStruct.conversionResolutionMode = kLPADC_ConversionResolutionHigh;
  52. #endif /* DEMO_LPADC_USE_HIGH_RESOLUTION */
  53. LPADC_SetConvCommandConfig(base, 1U, &mLpadcCommandConfigStruct);
  54. /* Set trigger configuration. */
  55. LPADC_GetDefaultConvTriggerConfig(&mLpadcTriggerConfigStruct);
  56. mLpadcTriggerConfigStruct.targetCommandId = 1U;
  57. mLpadcTriggerConfigStruct.enableHardwareTrigger = false;
  58. LPADC_SetConvTriggerConfig(base, 0U, &mLpadcTriggerConfigStruct); /* Configurate the trigger0. */
  59. LPADC_DoSoftwareTrigger(base, 1U);
  60. #if (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2U))
  61. while (!LPADC_GetConvResult(base, &mLpadcResultConfigStruct, 0U))
  62. #else
  63. while (!LPADC_GetConvResult(base, &mLpadcResultConfigStruct))
  64. #endif /* FSL_FEATURE_LPADC_FIFO_COUNT */
  65. {
  66. }
  67. *value = (mLpadcResultConfigStruct.convValue) >> g_LpadcResultShift;
  68. return RT_EOK;
  69. }
  70. static struct rt_adc_ops imxrt_lpadc_ops =
  71. {
  72. .enabled = imxrt_hp_adc_enabled,
  73. .convert = imxrt_hp_adc_convert,
  74. };
  75. int rt_hw_adc_init(void)
  76. {
  77. int result = RT_EOK;
  78. LPADC_GetDefaultConfig(&mLpadcConfigStruct);
  79. mLpadcConfigStruct.enableAnalogPreliminary = true;
  80. #if defined(kLPADC_ReferenceVoltageAlt1)
  81. mLpadcConfigStruct.referenceVoltageSource = kLPADC_ReferenceVoltageAlt1;
  82. #endif /* DEMO_LPADC_VREF_SOURCE */
  83. #if defined(BSP_USING_LPADC1)
  84. LPADC_Init(LPADC1, &mLpadcConfigStruct);
  85. result = rt_hw_adc_register(&lpadc1_device, "lpadc1", &imxrt_lpadc_ops, LPADC1);
  86. if (result != RT_EOK)
  87. {
  88. LOG_E("register lpadc1 device failed error code = %d\n", result);
  89. }
  90. #endif
  91. #if defined(BSP_USING_LPADC2)
  92. LPADC_Init(LPADC1, &mLpadcConfigStruct);
  93. result = rt_hw_adc_register(&lpadc2_device, "lpadc2", &imxrt_lpadc_ops, LPADC2);
  94. if (result != RT_EOK)
  95. {
  96. LOG_E("register lpadc2 device failed error code = %d\n", result);
  97. }
  98. #endif
  99. return result;
  100. }
  101. INIT_DEVICE_EXPORT(rt_hw_adc_init);
  102. #endif /* BSP_USING_LPADC */