drv_gpio.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2015-11-19 Urey the first version
  9. */
  10. #ifndef _BOARD_GPIO_H_
  11. #define _BOARD_GPIO_H_
  12. #include <stdint.h>
  13. //#define GPIO_PA(n) (0*32 + n)
  14. //#define GPIO_PB(n) (1*32 + n)
  15. //#define GPIO_PC(n) (2*32 + n)
  16. //#define GPIO_PD(n) (3*32 + n)
  17. //#define GPIO_PE(n) (4*32 + n)
  18. //#define GPIO_PF(n) (5*32 + n)
  19. //#define GPIO_PG(n) (6*32 + n)
  20. #define GPIO_PIN(n) (0x01 << n)
  21. /*************************************************************************
  22. * GPIO (General-Purpose I/O Ports)
  23. *************************************************************************/
  24. #define GPIO_PORT_OFF 0x100
  25. #define GPIO_SHADOW_OFF 0x700
  26. #define PXPIN 0x00 /* PIN Level Register */
  27. #define PXINT 0x10 /* Port Interrupt Register */
  28. #define PXINTS 0x14 /* Port Interrupt Set Register */
  29. #define PXINTC 0x18 /* Port Interrupt Clear Register */
  30. #define PXMSK 0x20 /* Port Interrupt Mask Reg */
  31. #define PXMSKS 0x24 /* Port Interrupt Mask Set Reg */
  32. #define PXMSKC 0x28 /* Port Interrupt Mask Clear Reg */
  33. #define PXPAT1 0x30 /* Port Pattern 1 Set Reg. */
  34. #define PXPAT1S 0x34 /* Port Pattern 1 Set Reg. */
  35. #define PXPAT1C 0x38 /* Port Pattern 1 Clear Reg. */
  36. #define PXPAT0 0x40 /* Port Pattern 0 Register */
  37. #define PXPAT0S 0x44 /* Port Pattern 0 Set Register */
  38. #define PXPAT0C 0x48 /* Port Pattern 0 Clear Register */
  39. #define PXFLG 0x50 /* Port Flag Register */
  40. #define PXFLGC 0x58 /* Port Flag clear Register */
  41. #define PXOENS 0x64 /* Port Output Disable Set Register */
  42. #define PXOENC 0x68 /* Port Output Disable Clear Register */
  43. #define PXPEN 0x70 /* Port Pull Disable Register */
  44. #define PXPENS 0x74 /* Port Pull Disable Set Register */
  45. #define PXPENC 0x78 /* Port Pull Disable Clear Register */
  46. #define PXDSS 0x84 /* Port Drive Strength set Register */
  47. #define PXDSC 0x88 /* Port Drive Strength clear Register */
  48. #define PZGID2LD 0xF0 /* GPIOZ Group ID to load */
  49. #define GPIO_PXPIN(n) (GPIO_BASE + (PXPIN + (n) * GPIO_PORT_OFF)) /* PIN Level Register */
  50. #define GPIO_PXINT(n) (GPIO_BASE + (PXINT + (n) * GPIO_PORT_OFF)) /* Port Interrupt Register */
  51. #define GPIO_PXINTS(n) (GPIO_BASE + (PXINTS + (n) * GPIO_PORT_OFF)) /* Port Interrupt Set Register */
  52. #define GPIO_PXINTC(n) (GPIO_BASE + (PXINTC + (n) * GPIO_PORT_OFF)) /* Port Interrupt Clear Register */
  53. #define GPIO_PXMSK(n) (GPIO_BASE + (PXMSK + (n) * GPIO_PORT_OFF)) /* Port Interrupt Mask Register */
  54. #define GPIO_PXMSKS(n) (GPIO_BASE + (PXMSKS + (n) * GPIO_PORT_OFF)) /* Port Interrupt Mask Set Reg */
  55. #define GPIO_PXMSKC(n) (GPIO_BASE + (PXMSKC + (n) * GPIO_PORT_OFF)) /* Port Interrupt Mask Clear Reg */
  56. #define GPIO_PXPAT1(n) (GPIO_BASE + (PXPAT1 + (n) * GPIO_PORT_OFF)) /* Port Pattern 1 Register */
  57. #define GPIO_PXPAT1S(n) (GPIO_BASE + (PXPAT1S + (n) * GPIO_PORT_OFF)) /* Port Pattern 1 Set Reg. */
  58. #define GPIO_PXPAT1C(n) (GPIO_BASE + (PXPAT1C + (n) * GPIO_PORT_OFF)) /* Port Pattern 1 Clear Reg. */
  59. #define GPIO_PXPAT0(n) (GPIO_BASE + (PXPAT0 + (n) * GPIO_PORT_OFF)) /* Port Pattern 0 Register */
  60. #define GPIO_PXPAT0S(n) (GPIO_BASE + (PXPAT0S + (n) * GPIO_PORT_OFF)) /* Port Pattern 0 Set Register */
  61. #define GPIO_PXPAT0C(n) (GPIO_BASE + (PXPAT0C + (n) * GPIO_PORT_OFF)) /* Port Pattern 0 Clear Register */
  62. #define GPIO_PXFLG(n) (GPIO_BASE + (PXFLG + (n) * GPIO_PORT_OFF)) /* Port Flag Register */
  63. #define GPIO_PXFLGC(n) (GPIO_BASE + (PXFLGC + (n) * GPIO_PORT_OFF)) /* Port Flag clear Register */
  64. #define GPIO_PXOENS(n) (GPIO_BASE + (PXOENS + (n) * GPIO_PORT_OFF)) /* Port Output Disable Set Register */
  65. #define GPIO_PXOENC(n) (GPIO_BASE + (PXOENC + (n) * GPIO_PORT_OFF)) /* Port Output Disable Clear Register */
  66. #define GPIO_PXPEN(n) (GPIO_BASE + (PXPEN + (n) * GPIO_PORT_OFF)) /* Port Pull Disable Register */
  67. #define GPIO_PXPENS(n) (GPIO_BASE + (PXPENS + (n) * GPIO_PORT_OFF)) /* Port Pull Disable Set Register */
  68. #define GPIO_PXPENC(n) (GPIO_BASE + (PXPENC + (n) * GPIO_PORT_OFF)) /* Port Pull Disable Clear Register */
  69. #define GPIO_PXDSS(n) (GPIO_BASE + (PXDSS + (n) * GPIO_PORT_OFF)) /* Port Drive Strength set Register */
  70. #define GPIO_PXDSC(n) (GPIO_BASE + (PXDSC + (n) * GPIO_PORT_OFF)) /* Port Drive Strength clear Register */
  71. #define GPIO_PZGID2LD(n) (GPIO_BASE + (PZGID2LD + (n) * GPIO_PORT_OFF)) /* GPIOZ Group ID to load */
  72. struct jzgpio_state {
  73. uint32_t pxint;
  74. uint32_t pxmsk;
  75. uint32_t pxpat1;
  76. uint32_t pxpat0;
  77. uint32_t pxpen;
  78. uint32_t pxignore;
  79. };
  80. enum gpio_function
  81. {
  82. GPIO_FUNC_0 = 0x00, //0000, GPIO as function 0 / device 0
  83. GPIO_FUNC_1 = 0x01, //0001, GPIO as function 1 / device 1
  84. GPIO_FUNC_2 = 0x02, //0010, GPIO as function 2 / device 2
  85. GPIO_FUNC_3 = 0x03, //0011, GPIO as function 3 / device 3
  86. GPIO_OUTPUT0 = 0x04, //0100, GPIO output low level
  87. GPIO_OUTPUT1 = 0x05, //0101, GPIO output high level
  88. GPIO_INPUT = 0x06, //0110, GPIO as input
  89. GPIO_INT_LO = 0x08, //1000, Low Level trigger interrupt
  90. GPIO_INT_HI = 0x09, //1001, High Level trigger interrupt
  91. GPIO_INT_FE = 0x0a, //1010, Fall Edge trigger interrupt
  92. GPIO_INT_RE = 0x0b, //1011, Rise Edge trigger interrupt
  93. GPIO_PULL = 0x10, //0001 0000, GPIO enable pull
  94. GPIO_INPUT_PULL = 0x16, //0001 0110, GPIO as input and enable pull
  95. };
  96. enum gpio_irq_type
  97. {
  98. IRQ_TYPE_NONE = 0x00000000,
  99. IRQ_TYPE_EDGE_RISING = 0x00000001,
  100. IRQ_TYPE_EDGE_FALLING = 0x00000002,
  101. IRQ_TYPE_EDGE_BOTH = (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING),
  102. IRQ_TYPE_LEVEL_HIGH = 0x00000004,
  103. IRQ_TYPE_LEVEL_LOW = 0x00000008,
  104. IRQ_TYPE_LEVEL_MASK = (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH),
  105. IRQ_TYPE_SENSE_MASK = 0x0000000f,
  106. IRQ_TYPE_DEFAULT = IRQ_TYPE_SENSE_MASK,
  107. IRQ_TYPE_PROBE = 0x00000010,
  108. IRQ_LEVEL = (1 << 8),
  109. };
  110. enum gpio_port {
  111. GPIO_PORT_A = 0,
  112. GPIO_PORT_B,
  113. GPIO_PORT_C,
  114. GPIO_PORT_D,
  115. /* this must be last */
  116. GPIO_NR_PORTS,
  117. GPIO_PORT_Z = 7,
  118. };
  119. //#define IS_GPIO_ALL_PORT(PORT) ( ((PORT) == GPIO_PORT_A) || \
  120. // ((PORT) == GPIO_PORT_B) || \
  121. // ((PORT) == GPIO_PORT_C) || \
  122. // ((PORT) == GPIO_PORT_D) )
  123. #define IS_GPIO_ALL_PORT(PORT) ( (PORT) < GPIO_NR_PORTS )
  124. enum gpio_pin {
  125. GPIO_Pin_0 = ((uint32_t)0x00000001), /* Pin 0 selected */
  126. GPIO_Pin_1 = ((uint32_t)0x00000002), /* Pin 1 selected */
  127. GPIO_Pin_2 = ((uint32_t)0x00000004), /* Pin 2 selected */
  128. GPIO_Pin_3 = ((uint32_t)0x00000008), /* Pin 3 selected */
  129. GPIO_Pin_4 = ((uint32_t)0x00000010), /* Pin 4 selected */
  130. GPIO_Pin_5 = ((uint32_t)0x00000020), /* Pin 5 selected */
  131. GPIO_Pin_6 = ((uint32_t)0x00000040), /* Pin 6 selected */
  132. GPIO_Pin_7 = ((uint32_t)0x00000080), /* Pin 7 selected */
  133. GPIO_Pin_8 = ((uint32_t)0x00000100), /* Pin 8 selected */
  134. GPIO_Pin_9 = ((uint32_t)0x00000200), /* Pin 9 selected */
  135. GPIO_Pin_10 = ((uint32_t)0x00000400), /* Pin 10 selected */
  136. GPIO_Pin_11 = ((uint32_t)0x00000800), /* Pin 11 selected */
  137. GPIO_Pin_12 = ((uint32_t)0x00001000), /* Pin 12 selected */
  138. GPIO_Pin_13 = ((uint32_t)0x00002000), /* Pin 13 selected */
  139. GPIO_Pin_14 = ((uint32_t)0x00004000), /* Pin 14 selected */
  140. GPIO_Pin_15 = ((uint32_t)0x00008000), /* Pin 15 selected */
  141. GPIO_Pin_16 = ((uint32_t)0x00010000), /* Pin 16 selected */
  142. GPIO_Pin_17 = ((uint32_t)0x00020000), /* Pin 17 selected */
  143. GPIO_Pin_18 = ((uint32_t)0x00040000), /* Pin 18 selected */
  144. GPIO_Pin_19 = ((uint32_t)0x00080000), /* Pin 19 selected */
  145. GPIO_Pin_20 = ((uint32_t)0x00100000), /* Pin 20 selected */
  146. GPIO_Pin_21 = ((uint32_t)0x00200000), /* Pin 21 selected */
  147. GPIO_Pin_22 = ((uint32_t)0x00400000), /* Pin 22 selected */
  148. GPIO_Pin_23 = ((uint32_t)0x00800000), /* Pin 23 selected */
  149. GPIO_Pin_24 = ((uint32_t)0x01000000), /* Pin 24 selected */
  150. GPIO_Pin_25 = ((uint32_t)0x02000000), /* Pin 25 selected */
  151. GPIO_Pin_26 = ((uint32_t)0x04000000), /* Pin 26 selected */
  152. GPIO_Pin_27 = ((uint32_t)0x08000000), /* Pin 27 selected */
  153. GPIO_Pin_28 = ((uint32_t)0x10000000), /* Pin 28 selected */
  154. GPIO_Pin_29 = ((uint32_t)0x20000000), /* Pin 29 selected */
  155. GPIO_Pin_30 = ((uint32_t)0x40000000), /* Pin 30 selected */
  156. GPIO_Pin_31 = ((uint32_t)0x80000000), /* Pin 31 selected */
  157. GPIO_Pin_All = ((uint32_t)0xFFFFFFFF), /* All pins selected */
  158. };
  159. struct jz_gpio_irq_def
  160. {
  161. void *irq_arg[32];
  162. void (*irq_cb[32]) (void *param);
  163. };
  164. void gpio_set_func (enum gpio_port port, uint32_t pins, enum gpio_function func);
  165. void gpio_set_value (enum gpio_port port, enum gpio_pin pin,int value);
  166. int gpio_get_value (enum gpio_port port, enum gpio_pin pin);
  167. int gpio_get_flag (enum gpio_port port, enum gpio_pin pin);
  168. void gpio_clear_flag (enum gpio_port port, enum gpio_pin pin);
  169. void gpio_direction_input (enum gpio_port port, enum gpio_pin pin);
  170. void gpio_direction_output (enum gpio_port port, enum gpio_pin pin,int value);
  171. void gpio_enable_pull (enum gpio_port port, enum gpio_pin pin);
  172. void gpio_disable_pull (enum gpio_port port, enum gpio_pin pin);
  173. void gpio_as_irq_high_level (enum gpio_port port, enum gpio_pin pin);
  174. void gpio_as_irq_rise_edge (enum gpio_port port, enum gpio_pin pin);
  175. void gpio_as_irq_fall_edge (enum gpio_port port, enum gpio_pin pin);
  176. void gpio_ack_irq (enum gpio_port port, enum gpio_pin pin);
  177. void gpio_set_irq_callback(enum gpio_port port, enum gpio_pin pin, void (*irq_cb)(void *),void *irq_arg);
  178. void gpio_mask_irq(enum gpio_port port, enum gpio_pin pin);
  179. void gpio_unmask_irq(enum gpio_port port, enum gpio_pin pin);
  180. #endif /* _BOARD_GPIO_H_ */