1 /** mbed Microcontroller Library
2 ******************************************************************************
3 * @file port_api.c
4 * @author
5 * @version V1.0.0
6 * @date 2016-08-01
7 * @brief This file provides mbed API for GPIO PORT.
8 ******************************************************************************
9 * @attention
10 *
11 * This module is a confidential and proprietary property of RealTek and
12 * possession or use of this module requires written permission of RealTek.
13 *
14 * Copyright(c) 2016, Realtek Semiconductor Corporation. All rights reserved.
15 ******************************************************************************
16 */
17
18 #include "objects.h"
19 #include "port_api.h"
20 #include "pinmap.h"
21 #include "gpio_api.h"
22 #include "PinNames.h"
23 //#include "mbed_error.h"
24
25 #define GPIO_PORT_NUM 2
26
27 /** @addtogroup AmebaD_Mbed_API
28 * @{
29 */
30
31 /** @defgroup MBED_GPIOPORT
32 * @brief MBED_GPIOPORT driver modules.
33 * @{
34 */
35
36 /** @defgroup MBED_GPIOPORT_Exported_Functions MBED_GPIOPORT Exported Functions
37 * @{
38 */
39
40 /**
41 * @brief Get GPIO port pin name
42 * @param port: PortName according to pinmux spec, this parameter can be one of the following values:
43 * @arg PortA: port number is A, has 32 pins
44 * @arg PortB: port number is B, has 32 pins
45 * @param pin_n: pin number.
46 * @retval port pin name
47 * @note pin_n must be set to a value in the 0~31 range
48 */
port_pin(PortName port,int pin_n)49 PinName port_pin(PortName port, int pin_n)
50 {
51 return (PinName)(port << 5 | pin_n);
52 }
53
54 /**
55 * @brief Initializes the GPIO device port, include data direction registers.
56 * @param obj: gpio port object define in application software.
57 * @param port: PortName according to pinmux spec, this parameter can be one of the following values:
58 * @arg PortA: port A, has 32 pins
59 * @arg PortB: port B, has 32 pins
60 * @param mask: One bit one gpio pin, select one or multiple pins of the specified port.
61 * @param dir: gpio port direction, this parameter can be one of the following values:
62 * @arg PIN_INPUT: port pins are input
63 * @arg PIN_OUTPUT: port pins are output
64 * @retval none
65 */
port_init(port_t * obj,PortName port,int mask,PinDirection dir)66 void port_init(port_t *obj, PortName port, int mask, PinDirection dir)
67 {
68 assert_param(port < GPIO_PORT_NUM);
69
70 obj->port = port;
71 obj->mask = mask;
72
73 port_dir(obj, dir);
74 }
75
76 /**
77 * @brief Set GPIO port pins data direction.
78 * @param obj: gpio port object define in application software.
79 * @param dir: this parameter can be one of the following values:
80 * @arg PIN_INPUT: port pins are input
81 * @arg PIN_OUTPUT: port pins are output
82 * @retval none
83 */
port_dir(port_t * obj,PinDirection dir)84 void port_dir(port_t *obj, PinDirection dir)
85 {
86 if (dir == PIN_OUTPUT) {
87 GPIO_PortDirection(obj->port, obj->mask, GPIO_Mode_OUT);
88 } else {
89 GPIO_PortDirection(obj->port, obj->mask, GPIO_Mode_IN);
90 }
91 }
92
93 /**
94 * @brief Configure GPIO port pins pull up/pull down.
95 * @param obj: gpio port object define in application software.
96 * @param mode: this parameter can be one of the following values:
97 * @arg PullNone: HighZ
98 * @arg PullDown: pull down
99 * @arg PullUp: pull up
100 * @retval none
101 */
port_mode(port_t * obj,PinMode mode)102 void port_mode(port_t *obj, PinMode mode)
103 {
104 uint32_t pin_idx;
105 uint32_t max_num = 32;
106
107 for (pin_idx = 0; pin_idx < max_num; pin_idx++) {
108 if (obj->mask & BIT(pin_idx)) {
109 /* PinName = (obj->port << 5 | pin_idx) */
110 pin_mode((obj->port << 5 | pin_idx), mode);
111 }
112 }
113 }
114
115 /**
116 * @brief Sets value to the selected port pins.
117 * @param obj: gpio port object define in application software.
118 * @param value: One bit one gpio pin, set value to one or multiple pins of the specified port.
119 * @note corresponding bit is 1, pin state set to high; corresponding bit is 0, pin state set to low
120 * @retval none
121 */
port_write(port_t * obj,int value)122 void port_write(port_t *obj, int value)
123 {
124 GPIO_PortWrite(obj->port, obj->mask, value);
125 }
126
127 /**
128 * @brief Reads the specified gpio port pins.
129 * @param obj: gpio port object define in application software.
130 * @retval : state of the specified gpio port pins
131 * @note corresponding bit is 1, pin state is high; corresponding bit is 0, pin state is low
132 */
port_read(port_t * obj)133 int port_read(port_t *obj)
134 {
135 u32 value = GPIO_PortRead(obj->port, obj->mask);
136
137 return value;
138 }
139 /**
140 * @}
141 */
142
143 /**
144 * @}
145 */
146
147 /**
148 * @}
149 */
150 /******************* (C) COPYRIGHT 2016 Realtek Semiconductor *****END OF FILE****/
151