sunxi_hal_cir.h 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. /*
  2. * ===========================================================================================
  3. *
  4. * Filename: sunxi_hal_spi.h
  5. *
  6. * Description: SPI HAL definition.
  7. *
  8. * Version: Melis3.0
  9. * Create: 2020-04-08 11:11:56
  10. * Revision: none
  11. * Compiler: GCC:version 9.2.1
  12. *
  13. * Author: bantao@allwinnertech.com
  14. * Organization: SWC-BPD
  15. * Last Modified: 2020-04-08 16:02:11
  16. *
  17. * ===========================================================================================
  18. */
  19. #ifndef _CIR_H_
  20. #define _CIR_H_
  21. #include "hal_clk.h"
  22. #include "hal_reset.h"
  23. #ifdef __cplusplus
  24. extern "C"
  25. {
  26. #endif
  27. /* Registers */
  28. #define CIR_CTRL (0x00) /* IR Control */
  29. #define CIR_RXCTRL (0x10) /* Rx Config */
  30. #define CIR_RXFIFO (0x20) /* Rx Data */
  31. #define CIR_RXINT (0x2C) /* Rx Interrupt Enable */
  32. #define CIR_RXSTA (0x30) /* Rx Interrupt Status */
  33. #define CIR_CONFIG (0x34) /* IR Sample Config */
  34. /*CIR_CTRL*/
  35. #define GEN_OFFSET 0
  36. #define RXEN_OFFSET 1
  37. #define CIR_ENABLE_OFFSET 4
  38. #define CIR_MODE_OFFSET 6
  39. /*global enable*/
  40. #define GEN (0x01 << GEN_OFFSET)
  41. /*receiver block enable*/
  42. #define RXEN (0x01 << RXEN_OFFSET)
  43. /*cir enable*/
  44. #define CIR_ENABLE (0x03 << CIR_ENABLE_OFFSET)
  45. /*active pulse accept mode*/
  46. #define CIR_MODE (0x03 << CIR_MODE_OFFSET)
  47. /*CIR_RXCTRL*/
  48. #define RPPI_OFFSET 2
  49. #define RPPI (0x01 << RPPI_OFFSET) /*receiver pulse polarity invert*/
  50. /*CIR_RXINT*/
  51. #define ROI_EN_OFFSET 0
  52. #define PREI_EN_OFFSET 1
  53. #define RAI_EN_OFFSET 4
  54. #define DRQ_EN_OFFSET 5
  55. #define RAL_OFFSET 8
  56. /*receiver fifo overrun interrupt enable*/
  57. #define ROI_EN (0x01 << ROI_EN_OFFSET)
  58. /*receiver packet end interrupt enable*/
  59. #define PREI_EN (0x01 << PREI_EN_OFFSET)
  60. /*rx fifo available interrupt enable*/
  61. #define RAI_EN (0x01 << RAI_EN_OFFSET)
  62. /*rx fifo dma enable*/
  63. #define DRQ_EN (0x01 << DRQ_EN_OFFSET)
  64. /*rx fifo available received byte level*/
  65. #define RAL (0x3f << RAL_OFFSET)
  66. #define IRQ_MASK (0x3f)
  67. /*CIR_RXSTA*/
  68. #define ROI_OFFSET 0
  69. #define RPE_OFFSET 1
  70. #define RA_OFFSET 4
  71. #define STAT_OFFSET 7
  72. #define RAC_OFFSET 8
  73. #define ROI (0x01 << ROI_OFFSET) /*receiver fifo overrun*/
  74. #define RPE (0x01 << RPE_OFFSET) /*receiver packet end reg*/
  75. #define RA (0x01 << RA_OFFSET) /*rx fifo available*/
  76. #define STAT (0x01 << STAT_OFFSET) /*status of cir, 0:idle, 1:busy*/
  77. #define RAC (0x7f << RAC_OFFSET) /*rx fifo available counter*/
  78. /*CIR_CONFIG*/
  79. #define SCS_OFFSET 0
  80. #define NTHR_OFFSET 2
  81. #define ITHR_OFFSET 8
  82. #define ATHR_OFFSET 16
  83. #define ATHC_OFFSET 23
  84. #define SCS2_OFFSET 24
  85. #define SCS (0x03 << SCS_OFFSET) /*sample clk select for cir*/
  86. #define NTHR (0x3f << NTHR_OFFSET) /*noise threshold for cir*/
  87. #define ITHR (0xff << ITHR_OFFSET) /*idle threshold for cir*/
  88. #define ATHR (0x7f << ATHR_OFFSET) /*active threshold for cir*/
  89. #define ATHC (0x01 << ATHC_OFFSET) /*active threshold control for cir*/
  90. #define SCS2 (0x01 << SCS2_OFFSET) /*bit2 of sample clock select for cir*/
  91. #define CIR_NOISE_THR_NEC 32
  92. #define CIR_NOISE_THR_RC5 22
  93. typedef enum {
  94. CIR_MASTER_0 = 0,
  95. CIR_MASTER_NUM,
  96. } cir_port_t;
  97. typedef enum {
  98. CIR_BOTH_PULSE = 0x01, /*both positive and negative pulses*/
  99. CIR_LOW_PULSE = 0x02, /*only negative pulse*/
  100. CIR_HIGH_PULSE = 0x03, /*only positive pulse*/
  101. } cir_mode_t;
  102. typedef enum {
  103. CIR_PIN_ERR = -4,
  104. CIR_CLK_ERR = -3,
  105. CIR_IRQ_ERR = -2,
  106. CIR_PORT_ERR = -1,
  107. CIR_OK = 0,
  108. } cir_status_t;
  109. typedef enum {
  110. CIR_CLK_DIV64 = 0x0,
  111. CIR_CLK_DIV128 = 0x01,
  112. CIR_CLK_DIV256 = 0x02,
  113. CIR_CLK_DIV512 = 0x03,
  114. CIR_CLK = 0x04,
  115. } cir_sample_clock_t;
  116. typedef struct {
  117. uint32_t gpio;
  118. uint8_t enable_mux;
  119. uint8_t disable_mux;
  120. } cir_gpio_t;
  121. typedef struct {
  122. uint32_t bus_clk;
  123. uint32_t mclk;
  124. uint32_t pclk;
  125. } cir_clk_t;
  126. typedef int (*cir_callback_t)(cir_port_t port, uint32_t data_type, uint32_t data);
  127. typedef struct {
  128. cir_port_t port;
  129. unsigned long base;
  130. uint32_t irq;
  131. cir_clk_t *clk;
  132. cir_gpio_t *pin;
  133. cir_callback_t callback;
  134. uint8_t status;
  135. hal_clk_t bclk;
  136. hal_clk_t pclk;
  137. hal_clk_t mclk;
  138. hal_clk_t test_clk;
  139. hal_clk_id_t m_clk_id;
  140. hal_clk_id_t p_clk_id;
  141. hal_clk_id_t b_clk_id;
  142. hal_clk_id_t test_clk_id;
  143. hal_clk_type_t cir_clk_type_R;
  144. hal_clk_type_t cir_clk_type_FIXED;
  145. hal_clk_type_t test_clk_type;
  146. struct reset_control *cir_reset;
  147. } sunxi_cir_t;
  148. void sunxi_cir_callback_register(cir_port_t port, cir_callback_t callback);
  149. void sunxi_cir_mode_enable(cir_port_t port, uint8_t enable);
  150. void sunxi_cir_mode_config(cir_port_t port, cir_mode_t mode);
  151. void sunxi_cir_sample_clock_select(cir_port_t port, cir_sample_clock_t div);
  152. void sunxi_cir_sample_noise_threshold(cir_port_t port, int8_t threshold);
  153. void sunxi_cir_sample_idle_threshold(cir_port_t port, int8_t threshold);
  154. void sunxi_cir_sample_active_threshold(cir_port_t port, int8_t threshold);
  155. void sunxi_cir_sample_active_thrctrl(cir_port_t port, int8_t enable);
  156. void sunxi_cir_fifo_level(cir_port_t port, int8_t size);
  157. void sunxi_cir_irq_enable(cir_port_t port, int enable);
  158. void sunxi_cir_irq_disable(cir_port_t port);
  159. void sunxi_cir_signal_invert(cir_port_t port, uint8_t invert);
  160. void sunxi_cir_module_enable(cir_port_t port, int8_t enable);
  161. cir_status_t sunxi_cir_init(cir_port_t port);
  162. void sunxi_cir_deinit(cir_port_t port);
  163. #ifdef CONFIG_STANDBY
  164. void sunxi_cir_suspend(cir_port_t port);
  165. void sunxi_cir_resume(cir_port_t port);
  166. #endif
  167. #ifdef __cplusplus
  168. }
  169. #endif
  170. #endif