17
17
#include "pinmap.h"
18
18
#include "gpio_api.h"
19
19
20
+ #define MAX_GPIO_PINS 16
21
+
20
22
PinName port_pin (PortName port , int pin_n )
21
23
{
24
+ if (pin_n < 0 || pin_n > MAX_GPIO_PINS ) {
25
+ error ("Invalid GPIO pin number %d" , pin_n );
26
+ }
27
+
22
28
return (PinName )((port << PORT_SHIFT ) | pin_n );
23
29
}
24
30
25
31
void port_init (port_t * obj , PortName port , int mask , PinDirection dir )
26
32
{
27
- obj -> port = port ;
28
- obj -> mask = mask ;
33
+ uint32_t i ;
34
+ CMSDK_GPIO_TypeDef * port_reg ;
29
35
30
- CMSDK_GPIO_TypeDef * port_reg = (CMSDK_GPIO_TypeDef * )(CMSDK_GPIO0_BASE
31
- + ((int )port * 0x10 ));
36
+ switch (port ) {
37
+ case Port0 :
38
+ port_reg = (CMSDK_GPIO_TypeDef * )(CMSDK_GPIO0_BASE );
39
+ break ;
40
+ case Port1 :
41
+ port_reg = (CMSDK_GPIO_TypeDef * )(CMSDK_GPIO1_BASE );
42
+ break ;
43
+ case Port2 :
44
+ port_reg = (CMSDK_GPIO_TypeDef * )(CMSDK_GPIO2_BASE );
45
+ break ;
46
+ case Port3 :
47
+ port_reg = (CMSDK_GPIO_TypeDef * )(CMSDK_GPIO3_BASE );
48
+ break ;
49
+ }
32
50
33
- obj -> reg_in = & port_reg -> DATAOUT ;
34
- obj -> reg_dir = & port_reg -> OUTENABLESET ;
51
+ obj -> port = port ;
52
+ obj -> mask = mask ;
53
+ obj -> reg_in = & port_reg -> DATAOUT ;
54
+ obj -> reg_dir = & port_reg -> OUTENABLESET ;
35
55
obj -> reg_dirclr = & port_reg -> OUTENABLECLR ;
36
56
37
- uint32_t i ;
38
- // The function is set per pin: reuse gpio logic
39
- for (i = 0 ; i < 16 ; i ++ ) {
57
+ /* The function is set per pin: reuse gpio logic */
58
+ for (i = 0 ; i < MAX_GPIO_PINS ; i ++ ) {
40
59
if (obj -> mask & (1 <<i )) {
41
60
gpio_set (port_pin (obj -> port , i ));
42
61
}
@@ -48,9 +67,9 @@ void port_init(port_t *obj, PortName port, int mask, PinDirection dir)
48
67
void port_mode (port_t * obj , PinMode mode )
49
68
{
50
69
uint32_t i ;
51
- // The mode is set per pin: reuse pinmap logic
52
- for (i = 0 ; i < 32 ; i ++ ) {
53
- if (obj -> mask & (1 << i )) {
70
+ /* The mode is set per pin: reuse pinmap logic */
71
+ for (i = 0 ; i < MAX_GPIO_PINS ; i ++ ) {
72
+ if (obj -> mask & (1 << i )) {
54
73
pin_mode (port_pin (obj -> port , i ), mode );
55
74
}
56
75
}
0 commit comments