hal_lradc.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. /* Copyright (c) 2019-2025 Allwinner Technology Co., Ltd. ALL rights reserved.
  2. * Allwinner is a trademark of Allwinner Technology Co.,Ltd., registered in
  3. * the the People's Republic of China and other countries.
  4. * All Allwinner Technology Co.,Ltd. trademarks are used with permission.
  5. * DISCLAIMER
  6. * THIRD PARTY LICENCES MAY BE REQUIRED TO IMPLEMENT THE SOLUTION/PRODUCT.
  7. * IF YOU NEED TO INTEGRATE THIRD PARTY¡¯S TECHNOLOGY (SONY, DTS, DOLBY, AVS OR MPEGLA, ETC.)
  8. * IN ALLWINNERS¡¯SDK OR PRODUCTS, YOU SHALL BE SOLELY RESPONSIBLE TO OBTAIN
  9. * ALL APPROPRIATELY REQUIRED THIRD PARTY LICENCES.
  10. * ALLWINNER SHALL HAVE NO WARRANTY, INDEMNITY OR OTHER OBLIGATIONS WITH RESPECT TO MATTERS
  11. * COVERED UNDER ANY REQUIRED THIRD PARTY LICENSE.
  12. * YOU ARE SOLELY RESPONSIBLE FOR YOUR USAGE OF THIRD PARTY¡¯S TECHNOLOGY.
  13. * THIS SOFTWARE IS PROVIDED BY ALLWINNER"AS IS" AND TO THE MAXIMUM EXTENT
  14. * PERMITTED BY LAW, ALLWINNER EXPRESSLY DISCLAIMS ALL WARRANTIES OF ANY KIND,
  15. * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION REGARDING
  16. * THE TITLE, NON-INFRINGEMENT, ACCURACY, CONDITION, COMPLETENESS, PERFORMANCE
  17. * OR MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  18. * IN NO EVENT SHALL ALLWINNER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  19. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  20. * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  21. * LOSS OF USE, DATA, OR PROFITS, OR BUSINESS INTERRUPTION)
  22. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  23. * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  24. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
  25. * OF THE POSSIBILITY OF SUCH DAMAGE.
  26. */
  27. #include <sunxi_hal_lradc.h>
  28. lradc_func_data lradc_priv;
  29. static uint32_t base_addr = LRADC_BASE;
  30. static uint32_t ctrl_para = FIRST_CONCERT_DLY | ADC_CHAN_SELECT | KEY_MODE_SELECT
  31. | LRADC_HOLD_EN & LEVELB_VOL & LRADC_SAMPLE_2KHZ | LRADC_EN;
  32. static uint32_t irq_para = LRADC_ADC0_UP_EN | LRADC_ADC0_DOWN_EN | LRADC_ADC0_DATA_EN;
  33. static void lradc_ctrl_set(void)
  34. {
  35. uint32_t reg_val = 0;
  36. reg_val = hal_readl(base_addr + LRADC_CTRL_REG);
  37. reg_val |= ctrl_para;
  38. hal_writel(reg_val, base_addr + LRADC_CTRL_REG);
  39. }
  40. static void lradc_ctrl_reset(void)
  41. {
  42. uint32_t reg_val = 0;
  43. reg_val = hal_readl(base_addr + LRADC_CTRL_REG);
  44. reg_val &= ~ctrl_para;
  45. hal_writel(reg_val, base_addr + LRADC_CTRL_REG);
  46. }
  47. static void lradc_irq_set(void)
  48. {
  49. uint32_t reg_val = 0;
  50. reg_val = hal_readl(base_addr + LRADC_INTC_REG);
  51. reg_val |= irq_para;
  52. hal_writel(reg_val, base_addr + LRADC_INTC_REG);
  53. }
  54. static void lradc_irq_reset(void)
  55. {
  56. uint32_t reg_val = 0;
  57. reg_val = hal_readl(base_addr + LRADC_INTC_REG);
  58. reg_val &= ~irq_para;
  59. hal_writel(reg_val, base_addr + LRADC_INTC_REG);
  60. }
  61. static void lradc_register_callback(lradc_callback_t user_callback)
  62. {
  63. lradc_priv.func = user_callback;
  64. }
  65. static irqreturn_t lradc_irq_handler(int dummy, void *priv_data)
  66. {
  67. lradc_func_data *lradc_priv = priv_data;
  68. lradc_callback_t callback = lradc_priv->func;
  69. void *arg = lradc_priv->arg;
  70. uint32_t irq_status = hal_readl(base_addr + LRADC_INTS_REG);
  71. uint32_t reg_val = hal_readl(base_addr + LRADC_DATA0_REG);
  72. if (NULL != callback)
  73. callback(irq_status, reg_val);
  74. hal_writel(reg_val, base_addr + LRADC_INTS_REG);
  75. return 0;
  76. }
  77. static int32_t lradc_init_irq(void)
  78. {
  79. uint32_t irqn = SUNXI_IRQ_LRADC;
  80. if (request_irq(irqn, lradc_irq_handler, 0, "lradc", &lradc_priv) < 0) {
  81. return -1;
  82. }
  83. enable_irq(irqn);
  84. return 0;
  85. }
  86. hal_lradc_status_t hal_lradc_init(void)
  87. {
  88. //sunxi_clk_init();
  89. lradc_ctrl_set();
  90. lradc_irq_set();
  91. lradc_init_irq();
  92. return HAL_ADC_STATUS_OK;
  93. }
  94. hal_lradc_status_t hal_lradc_deinit(void)
  95. {
  96. lradc_irq_reset();
  97. lradc_ctrl_reset();
  98. return HAL_ADC_STATUS_OK;
  99. }
  100. hal_lradc_status_t hal_lradc_register_callback(lradc_callback_t callback)
  101. {
  102. lradc_register_callback(callback);
  103. return HAL_ADC_STATUS_OK;
  104. }