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