1 /*
2  * Copyright (c) 2023 ARM Limited. All rights reserved.
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Licensed under the Apache License, Version 2.0 (the License); you may
7  * not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an AS IS BASIS, WITHOUT
14  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  * $Date:        2. March 2023
19  * $Revision:    V1.0
20  *
21  * Project:      GPIO (General-purpose Input/Output) Driver definitions
22  */
23 
24 #ifndef DRIVER_GPIO_H_
25 #define DRIVER_GPIO_H_
26 
27 #ifdef  __cplusplus
28 extern "C"
29 {
30 #endif
31 
32 #include "Driver_Common.h"
33 
34 
35 /**
36 \brief GPIO Pin
37 */
38 typedef uint32_t ARM_GPIO_Pin_t;
39 
40 /**
41 \brief GPIO Direction
42 */
43 typedef enum {
44   ARM_GPIO_INPUT,                       ///< Input (default)
45   ARM_GPIO_OUTPUT                       ///< Output
46 } ARM_GPIO_DIRECTION;
47 
48 /**
49 \brief GPIO Output Mode
50 */
51 typedef enum {
52   ARM_GPIO_PUSH_PULL,                   ///< Push-pull (default)
53   ARM_GPIO_OPEN_DRAIN                   ///< Open-drain
54 } ARM_GPIO_OUTPUT_MODE;
55 
56 /**
57 \brief GPIO Pull Resistor
58 */
59 typedef enum {
60   ARM_GPIO_PULL_NONE,                   ///< None (default)
61   ARM_GPIO_PULL_UP,                     ///< Pull-up
62   ARM_GPIO_PULL_DOWN                    ///< Pull-down
63 } ARM_GPIO_PULL_RESISTOR;
64 
65 /**
66 \brief GPIO Event Trigger
67 */
68 typedef enum {
69   ARM_GPIO_TRIGGER_NONE,                ///< None (default)
70   ARM_GPIO_TRIGGER_RISING_EDGE,         ///< Rising-edge
71   ARM_GPIO_TRIGGER_FALLING_EDGE,        ///< Falling-edge
72   ARM_GPIO_TRIGGER_EITHER_EDGE          ///< Either edge (rising and falling)
73 } ARM_GPIO_EVENT_TRIGGER;
74 
75 
76 /****** GPIO Event *****/
77 #define ARM_GPIO_EVENT_RISING_EDGE      (1UL << 0)  ///< Rising-edge detected
78 #define ARM_GPIO_EVENT_FALLING_EDGE     (1UL << 1)  ///< Falling-edge detected
79 #define ARM_GPIO_EVENT_EITHER_EDGE      (1UL << 2)  ///< Either edge detected (only when hardware cannot distinguish between rising and falling edge)
80 
81 
82 /****** GPIO specific error codes *****/
83 #define ARM_GPIO_ERROR_PIN              (ARM_DRIVER_ERROR_SPECIFIC - 1) ///< Specified Pin not available
84 
85 
86 // Function documentation
87 /**
88   \fn          int32_t ARM_GPIO_Setup (ARM_GPIO_Pin_t pin, ARM_GPIO_SignalEvent_t cb_event)
89   \brief       Setup GPIO Interface.
90   \param[in]   pin  GPIO Pin
91   \param[in]   cb_event  Pointer to \ref ARM_GPIO_SignalEvent
92   \return      \ref execution_status
93 
94   \fn          int32_t ARM_GPIO_SetDirection (ARM_GPIO_Pin_t pin, ARM_GPIO_DIRECTION direction)
95   \brief       Set GPIO Direction.
96   \param[in]   pin  GPIO Pin
97   \param[in]   direction  \ref ARM_GPIO_DIRECTION
98   \return      \ref execution_status
99 
100   \fn          int32_t ARM_GPIO_SetOutputMode (ARM_GPIO_Pin_t pin, ARM_GPIO_OUTPUT_MODE mode)
101   \brief       Set GPIO Output Mode.
102   \param[in]   pin  GPIO Pin
103   \param[in]   mode  \ref ARM_GPIO_OUTPUT_MODE
104   \return      \ref execution_status
105 
106   \fn          int32_t ARM_GPIO_SetPullResistor (ARM_GPIO_Pin_t pin, ARM_GPIO_PULL_RESISTOR resistor)
107   \brief       Set GPIO Pull Resistor.
108   \param[in]   pin  GPIO Pin
109   \param[in]   resistor  \ref ARM_GPIO_PULL_RESISTOR
110   \return      \ref execution_status
111 
112   \fn          int32_t ARM_GPIO_SetEventTrigger (ARM_GPIO_Pin_t pin, ARM_GPIO_EVENT_TRIGGER trigger)
113   \brief       Set GPIO Event Trigger.
114   \param[in]   pin  GPIO Pin
115   \param[in]   trigger  \ref ARM_GPIO_EVENT_TRIGGER
116   \return      \ref execution_status
117 
118   \fn          void ARM_GPIO_SetOutput (ARM_GPIO_Pin_t pin, uint32_t val)
119   \brief       Set GPIO Output Level.
120   \param[in]   pin  GPIO Pin
121   \param[in]   val  GPIO Pin Level (0 or 1)
122 
123   \fn          uint32_t ARM_GPIO_GetInput (ARM_GPIO_Pin_t pin)
124   \brief       Get GPIO Input Level.
125   \param[in]   pin  GPIO Pin
126   \return      GPIO Pin Level (0 or 1)
127 
128   \fn          void ARM_GPIO_SignalEvent (ARM_GPIO_Pin_t pin, uint32_t event)
129   \brief       Signal GPIO Events.
130   \param[in]   pin    GPIO Pin on which event occurred
131   \param[in]   event  \ref GPIO_events notification mask
132 */
133 
134 typedef void (*ARM_GPIO_SignalEvent_t) (ARM_GPIO_Pin_t pin, uint32_t event);  /* Pointer to \ref ARM_GPIO_SignalEvent : Signal GPIO Event */
135 
136 
137 /**
138 \brief Access structure of the GPIO Driver.
139 */
140 typedef struct {
141   int32_t  (*Setup)           (ARM_GPIO_Pin_t pin, ARM_GPIO_SignalEvent_t cb_event); ///< Pointer to \ref ARM_GPIO_Setup : Setup GPIO Interface.
142   int32_t  (*SetDirection)    (ARM_GPIO_Pin_t pin, ARM_GPIO_DIRECTION direction);    ///< Pointer to \ref ARM_GPIO_SetDirection : Set GPIO Direction.
143   int32_t  (*SetOutputMode)   (ARM_GPIO_Pin_t pin, ARM_GPIO_OUTPUT_MODE mode);       ///< Pointer to \ref ARM_GPIO_SetOutputMode : Set GPIO Output Mode.
144   int32_t  (*SetPullResistor) (ARM_GPIO_Pin_t pin, ARM_GPIO_PULL_RESISTOR resistor); ///< Pointer to \ref ARM_GPIO_SetPullResistor : Set GPIO Pull Resistor.
145   int32_t  (*SetEventTrigger) (ARM_GPIO_Pin_t pin, ARM_GPIO_EVENT_TRIGGER trigger);  ///< Pointer to \ref ARM_GPIO_SetEventTrigger : Set GPIO Event Trigger.
146   void     (*SetOutput)       (ARM_GPIO_Pin_t pin, uint32_t val);                    ///< Pointer to \ref ARM_GPIO_SetOutput : Set GPIO Output Level.
147   uint32_t (*GetInput)        (ARM_GPIO_Pin_t pin);                                  ///< Pointer to \ref ARM_GPIO_GetInput : Get GPIO Input Level.
148 } const ARM_DRIVER_GPIO;
149 
150 #ifdef  __cplusplus
151 }
152 #endif
153 
154 #endif /* DRIVER_GPIO_H_ */
155