drv_gpio.h 11 KB

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