summaryrefslogtreecommitdiffstats
path: root/EmbeddedPkg/Include/Ppi/EmbeddedGpio.h
blob: 03e512b88835b67e8cd8c1837ac64dc86e354692 (plain)
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/** @file

  Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
  Copyright (c) 2017, Linaro, Ltd. All rights reserved.<BR>

  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef __EMBEDDED_GPIO_PPI_H__
#define __EMBEDDED_GPIO_PPI_H__

//
// Protocol interface structure
//
typedef struct _EMBEDDED_GPIO_PPI   EMBEDDED_GPIO_PPI;

//
// Data Types
//
typedef UINTN EMBEDDED_GPIO_PIN;

#define GPIO(Port, Pin) ((EMBEDDED_GPIO_PIN)(((Port) << (16)) | (Pin)))
#define GPIO_PIN(x)     ((EMBEDDED_GPIO_PIN)(x) & (0xFFFF))
#define GPIO_PORT(x)    ((EMBEDDED_GPIO_PIN)(x) >> (16))

typedef enum {
  GPIO_MODE_INPUT                 = 0x00,
  GPIO_MODE_OUTPUT_0              = 0x0E,
  GPIO_MODE_OUTPUT_1              = 0x0F,
  GPIO_MODE_SPECIAL_FUNCTION_2    = 0x02,
  GPIO_MODE_SPECIAL_FUNCTION_3    = 0x03,
  GPIO_MODE_SPECIAL_FUNCTION_4    = 0x04,
  GPIO_MODE_SPECIAL_FUNCTION_5    = 0x05,
  GPIO_MODE_SPECIAL_FUNCTION_6    = 0x06,
  GPIO_MODE_SPECIAL_FUNCTION_7    = 0x07
} EMBEDDED_GPIO_MODE;

typedef enum {
  GPIO_PULL_NONE,
  GPIO_PULL_UP,
  GPIO_PULL_DOWN
} EMBEDDED_GPIO_PULL;

//
// Function Prototypes
//

/**

  Gets the state of a GPIO pin

  @param This                   Pointer to protocol
  @param Gpio                   Which pin to read
  @param Value                  State of the pin

  @retval EFI_SUCCESS           GPIO state returned in Value
  @retval EFI_INVALID_PARAMETER Value is NULL
  @retval EFI_NOT_FOUND         Pin does not exit

**/
typedef
EFI_STATUS
(EFIAPI *EMBEDDED_GPIO_GET) (
  IN  EMBEDDED_GPIO_PPI     *This,
  IN  EMBEDDED_GPIO_PIN     Gpio,
  OUT UINTN                 *Value
  );

/**

  Sets the state of a GPIO pin

  @param This                   Pointer to protocol
  @param Gpio                   Which pin to modify
  @param Mode                   Mode to set

  @retval EFI_SUCCESS           GPIO set as requested
  @retval EFI_INVALID_PARAMETER Invalid mode
  @retval EFI_NOT_FOUND         Pin does not exit

**/
typedef
EFI_STATUS
(EFIAPI *EMBEDDED_GPIO_SET) (
  IN EMBEDDED_GPIO_PPI      *This,
  IN EMBEDDED_GPIO_PIN      Gpio,
  IN EMBEDDED_GPIO_MODE     Mode
  );


/**

  Gets the mode (function) of a GPIO pin

  @param This                   Pointer to protocol
  @param Gpio                   Which pin
  @param Mode                   Pointer to output mode value

  @retval EFI_SUCCESS           Mode value retrieved
  @retval EFI_INVALID_PARAMETER Mode is NULL
  @retval EFI_NOT_FOUND         Pin does not exit

**/
typedef
EFI_STATUS
(EFIAPI *EMBEDDED_GPIO_GET_MODE) (
  IN  EMBEDDED_GPIO_PPI     *This,
  IN  EMBEDDED_GPIO_PIN     Gpio,
  OUT EMBEDDED_GPIO_MODE    *Mode
  );


/**

  Sets the pull-up / pull-down resistor of a GPIO pin

  @param This                   Pointer to PPI
  @param Gpio                   Port/pin index
  @param Pull                   The pullup/pulldown mode to set

  @retval EFI_SUCCESS           Mode was set
  @retval EFI_NOT_FOUND         Pin does not exist
  @retval EFI_UNSUPPORTED       Action not supported

**/
typedef
EFI_STATUS
(EFIAPI *EMBEDDED_GPIO_SET_PULL) (
  IN  EMBEDDED_GPIO_PPI     *This,
  IN  EMBEDDED_GPIO_PIN     Gpio,
  IN  EMBEDDED_GPIO_PULL    Direction
  );


struct _EMBEDDED_GPIO_PPI {
  EMBEDDED_GPIO_GET         Get;
  EMBEDDED_GPIO_SET         Set;
  EMBEDDED_GPIO_GET_MODE    GetMode;
  EMBEDDED_GPIO_SET_PULL    SetPull;
};

extern EFI_GUID gEmbeddedGpioPpiGuid;

#endif