aboutsummaryrefslogtreecommitdiff
path: root/include/gpio.h
blob: ab793f1fc5f4d09bfbbe8d0910620285af409ac3 (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
#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)

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

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

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

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

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