@@ -12,11 +12,16 @@ ap3_gpio_isr_entry_t gpio_isr_entries[AP3_GPIO_MAX_PADS] = {NULL};
12
12
uint8_t gpio_num_isr = 0 ;
13
13
14
14
// *****************************************************************************
15
- // Local defines. Copied from am_hal_gpio.c
15
+ // Local function declarations
16
+ // *****************************************************************************
17
+ uint32_t ap3_get_funct_sel (ap3_gpio_pad_t pad);
18
+
19
+ // *****************************************************************************
20
+ // Local defines.
16
21
// *****************************************************************************
17
22
//
18
23
// Generally define GPIO PADREG and GPIOCFG bitfields
19
- //
24
+ // Copied from am_hal_gpio.c
20
25
#define PADREG_FLD_76_S 6
21
26
#define PADREG_FLD_FNSEL_S 3
22
27
#define PADREG_FLD_DRVSTR_S 2
@@ -27,6 +32,11 @@ uint8_t gpio_num_isr = 0;
27
32
#define GPIOCFG_FLD_OUTCFG_S 1
28
33
#define GPIOCFG_FLD_INCFG_S 0
29
34
35
+ // Additional Defines
36
+ #define PADREG_FNSEL_Msk 0x38
37
+ #define GPIO_FUNCTION 3
38
+ #
39
+
30
40
ap3_gpio_pad_t ap3_gpio_pin2pad (ap3_gpio_pin_t pin)
31
41
{
32
42
return ap3_variant_pinmap[pin];
@@ -76,32 +86,34 @@ void padMode(uint8_t pad, am_hal_gpio_pincfg_t mode)
76
86
}
77
87
78
88
// translate Arduino style pin mode function to apollo3 implementation
79
- void pinMode (uint8_t pin, uint8_t mode) {
89
+ void pinMode (uint8_t pin, uint8_t mode)
90
+ {
80
91
81
92
am_hal_gpio_pincfg_t pinmode = AP3_GPIO_PINCFG_NULL;
82
93
83
- switch (mode) {
84
- case INPUT:
85
- pinmode = AP3_PINCFG_INPUT;
86
- break ;
87
- case OUTPUT:
88
- pinmode = AP3_PINCFG_OUTPUT;
89
- break ;
90
- case INPUT_PULLUP:
91
- pinmode = AP3_PINCFG_INPUT_PULLUP;
92
- break ;
93
- case INPUT_PULLDOWN:
94
- pinmode = AP3_PINCFG_INPUT_PULLDOWN;
95
- break ;
96
- case OPEN_DRAIN:
97
- pinmode = AP3_PINCFG_OPEN_DRAIN;
98
- break ;
99
- case TRISTATE:
100
- pinmode = AP3_PINCFG_TRISTATE;
101
- break ;
102
- default :
103
- // no match, just do nothing
104
- return ;
94
+ switch (mode)
95
+ {
96
+ case INPUT:
97
+ pinmode = AP3_PINCFG_INPUT;
98
+ break ;
99
+ case OUTPUT:
100
+ pinmode = AP3_PINCFG_OUTPUT;
101
+ break ;
102
+ case INPUT_PULLUP:
103
+ pinmode = AP3_PINCFG_INPUT_PULLUP;
104
+ break ;
105
+ case INPUT_PULLDOWN:
106
+ pinmode = AP3_PINCFG_INPUT_PULLDOWN;
107
+ break ;
108
+ case OPEN_DRAIN:
109
+ pinmode = AP3_PINCFG_OPEN_DRAIN;
110
+ break ;
111
+ case TRISTATE:
112
+ pinmode = AP3_PINCFG_TRISTATE;
113
+ break ;
114
+ default :
115
+ // no match, just do nothing
116
+ return ;
105
117
}
106
118
107
119
pinMode (pin, pinmode);
@@ -125,6 +137,10 @@ extern void digitalWrite(uint8_t pin, uint8_t val)
125
137
{
126
138
return ;
127
139
}
140
+ if (ap3_get_funct_sel (pad) != GPIO_FUNCTION)
141
+ {
142
+ pinMode (pin, OUTPUT);
143
+ }
128
144
if (val)
129
145
{
130
146
am_hal_gpio_output_set (ap3_gpio_pin2pad (pin));
@@ -135,6 +151,16 @@ extern void digitalWrite(uint8_t pin, uint8_t val)
135
151
}
136
152
}
137
153
154
+ uint32_t ap3_get_funct_sel (ap3_gpio_pad_t pad)
155
+ {
156
+ uint32_t padregAddr = AM_REGADDR (GPIO, PADREGA) + (pad & ~0x3 );
157
+ uint32_t padShft = ((pad & 0x3 ) << 3 );
158
+ uint32_t functSelShift = PADREG_FLD_FNSEL_S;
159
+ uint32_t functSelMask = PADREG_FNSEL_Msk;
160
+
161
+ return (((AM_REGVAL (padregAddr) >> padShft) & functSelMask) >> functSelShift);
162
+ }
163
+
138
164
extern int digitalRead (uint8_t pin)
139
165
{
140
166
ap3_gpio_pad_t pad = ap3_gpio_pin2pad (pin);
0 commit comments