aboutsummaryrefslogtreecommitdiff
path: root/include/gpio.h
blob: 99b6e5f788cf19b18272a38603fdd92d8deaa37c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#pragma once

#include "ch573/gpio.h"

#define GPIO_PORT_A ch573_gpio__gpio_port_a
#define GPIO_PORT_B ch573_gpio__gpio_port_b
#define GPIO_PORT CH573_GPIO__GPIO_PORT_T_INTF
#define GPIO_I CH573_GPIO__GPIO_T_INTF
#define GPIO ch573_gpio__gpio

#define IS_PORT_B 0x80

typedef enum {
  PIN_PA4 = 4,
  PIN_PA5 = 5,

  PIN_PA8 = 8,
  PIN_PA9 = 9,
  PIN_PA10 = 10,
  PIN_PA11 = 11,
  PIN_PA12 = 12,
  PIN_PA13 = 13,
  PIN_PA14 = 14,
  PIN_PA15 = 15,

  PIN_PB0 = IS_PORT_B | 0,
  PIN_PB4 = IS_PORT_B | 4,
  PIN_PB6 = IS_PORT_B | 6,
  PIN_PB7 = IS_PORT_B | 7,

  PIN_PB10 = IS_PORT_B | 10,
  PIN_PB11 = IS_PORT_B | 11,
  PIN_PB12 = IS_PORT_B | 12,
  PIN_PB13 = IS_PORT_B | 13,
  PIN_PB14 = IS_PORT_B | 14,
  PIN_PB15 = IS_PORT_B | 15,

  PIN_PB22 = IS_PORT_B | 8,
  PIN_PB23 = IS_PORT_B | 9,
} gpio_pin_t;

typedef enum {
  PIN_CFG_INPUT_FLOATING,
  PIN_CFG_INPUT_PULL_UP,
  PIN_CFG_INPUT_PULL_DOWN,
  PIN_CFG_OUTPUT_5mA,
  PIN_CFG_OUTPUT_20mA,
} gpio_config_t;

typedef enum {
  AF_SPI = 8,
  AF_UART1 = 5,
  AF_UART0 = 4,
  AF_TMR2 = 2,
  AF_TMR1 = 1,
  AF_TMR0 = 0,
} alternate_function_t;

typedef enum {
  INT_MODE_FALLING_EDGE,
  INT_MODE_RISING_EDGE,
  INT_MODE_LEVEL_HIGH,
  INT_MODE_LEVEL_LOW
} interrupt_mode_t;

typedef void (*gpio_callback_t)(gpio_pin_t pin);

#define On_Gpio(arg)                                                          \
  static void __local_on_gpio__(gpio_pin_t pin);                              \
  __attribute__((__section__(                                                 \
      ".gpio_callbacks"))) static volatile gpio_callback_t __gpio__position = \
      __local_on_gpio__;                                                      \
  static void __local_on_gpio__(arg)

void gpio_init();

/** Configure the given gpio pin for .*/
void gpio_configure_pin(gpio_pin_t pin, gpio_config_t);

/** Read the input value of the gpio. */
int gpio_read(gpio_pin_t pin);

/** Sets the gpio pin. */
void gpio_set(gpio_pin_t pin, int high);

/** Set or unset the peripheral to the alternate set of pins. */
void gpio_enable_alternate_function(alternate_function_t af, int enable);

/** Enables the interrupt for a with the provided interrupt mode. */
void gpio_enable_interrupt(gpio_pin_t pin, interrupt_mode_t int_mode);