Skip to content

Commit d17823c

Browse files
author
Wayne Ren
committed
board: iotdk: implement the pinmux interface
implement the pinmux interface defined in dev_pinmux.h Signed-off-by: Wayne Ren <[email protected]>
1 parent f987132 commit d17823c

File tree

6 files changed

+348
-79
lines changed

6 files changed

+348
-79
lines changed

board/iotdk/common/iotdk_init.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,9 @@
6161

6262
static void iotdk_mux_init(void)
6363
{
64-
pmode_mux_config(PMA_GPIO | PMB_SPI | PMC_UART);
65-
arduino_pin_mux(ARDUINO_A4, ARDUINO_FUNC_2ND);
64+
io_mux_init();
65+
io_pmod_config(PMOD_B, PMOD_SPI, IO_PINMUX_ENABLE);
66+
io_pmod_config(PMOD_C, PMOD_UART, IO_PINMUX_ENABLE);
6667
}
6768

6869
/**

board/iotdk/drivers/mux/mux.c

Lines changed: 318 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,318 @@
1+
/* ------------------------------------------
2+
* Copyright (c) 2018, Synopsys, Inc. All rights reserved.
3+
4+
* Redistribution and use in source and binary forms, with or without modification,
5+
* are permitted provided that the following conditions are met:
6+
7+
* 1) Redistributions of source code must retain the above copyright notice, this
8+
* list of conditions and the following disclaimer.
9+
10+
* 2) Redistributions in binary form must reproduce the above copyright notice,
11+
* this list of conditions and the following disclaimer in the documentation and/or
12+
* other materials provided with the distribution.
13+
14+
* 3) Neither the name of the Synopsys, Inc., nor the names of its contributors may
15+
* be used to endorse or promote products derived from this software without
16+
* specific prior written permission.
17+
18+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
19+
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20+
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21+
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
22+
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24+
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
25+
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27+
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28+
*
29+
--------------------------------------------- */
30+
31+
#include "embARC_toolchain.h"
32+
#include "embARC_error.h"
33+
34+
#include "iotdk/iotdk.h"
35+
36+
#define MIKRO_MUX_CONFIG 0x13
37+
38+
int32_t io_mikro_config(uint32_t config)
39+
{
40+
if (config == IO_PINMUX_ENABLE) {
41+
sysconf_reg_ptr->ARDUINO_MUX |= MIKRO_MUX_CONFIG;
42+
} else if (config == IO_PINMUX_DISABLE) {
43+
sysconf_reg_ptr->ARDUINO_MUX &= ~MIKRO_MUX_CONFIG;
44+
} else {
45+
return E_NOSPT;
46+
}
47+
48+
return E_OK;
49+
}
50+
51+
static int32_t io_arduino_config_pwm(uint32_t num, uint32_t config)
52+
{
53+
uint32_t val = 0;
54+
55+
switch (num) {
56+
case ARDUINO_PIN_3:
57+
val = ARDUINO_MUX_PWM0;
58+
break;
59+
case ARDUINO_PIN_5:
60+
val = ARDUINO_MUX_PWM1;
61+
break;
62+
case ARDUINO_PIN_6:
63+
val = ARDUINO_MUX_PWM2;
64+
break;
65+
case ARDUINO_PIN_9:
66+
val = ARDUINO_MUX_PWM3;
67+
break;
68+
case ARDUINO_PIN_10:
69+
sysconf_reg_ptr->ARDUINO_MUX &= ~ARDUINO_MUX_SPI;
70+
val = ARDUINO_MUX_PWM4;
71+
break;
72+
case ARDUINO_PIN_11:
73+
sysconf_reg_ptr->ARDUINO_MUX &= ~ARDUINO_MUX_SPI;
74+
val = ARDUINO_MUX_PWM5;
75+
break;
76+
default:
77+
return E_PAR;
78+
break;
79+
}
80+
81+
if (config == IO_PINMUX_ENABLE) {
82+
sysconf_reg_ptr->ARDUINO_MUX |= val;
83+
} else if (config == IO_PINMUX_DISABLE) {
84+
sysconf_reg_ptr->ARDUINO_MUX &= ~val;
85+
} else {
86+
return E_NOSPT;
87+
}
88+
89+
return E_OK;
90+
}
91+
92+
static int32_t io_arduino_config_gpio(uint32_t num, uint32_t config)
93+
{
94+
uint32_t val = 0;
95+
96+
if (config != IO_PINMUX_DISABLE && config != IO_PINMUX_ENABLE) {
97+
return E_NOSPT;
98+
}
99+
100+
switch (num) {
101+
case ARDUINO_PIN_0:
102+
case ARDUINO_PIN_1:
103+
val = ARDUINO_MUX_UART;
104+
break;
105+
case ARDUINO_PIN_2:
106+
case ARDUINO_PIN_4:
107+
case ARDUINO_PIN_8:
108+
case ARDUINO_PIN_7:
109+
val = 0;
110+
break;
111+
case ARDUINO_PIN_3:
112+
val = ARDUINO_MUX_PWM0;
113+
break;
114+
case ARDUINO_PIN_5:
115+
val = ARDUINO_MUX_PWM1;
116+
break;
117+
case ARDUINO_PIN_6:
118+
val = ARDUINO_MUX_PWM2;
119+
break;
120+
case ARDUINO_PIN_9:
121+
val = ARDUINO_MUX_PWM3;
122+
break;
123+
case ARDUINO_PIN_10:
124+
val = ARDUINO_MUX_PWM4 | ARDUINO_MUX_SPI;
125+
break;
126+
case ARDUINO_PIN_11:
127+
val = ARDUINO_MUX_PWM5 | ARDUINO_MUX_SPI;
128+
break;
129+
case ARDUINO_PIN_12:
130+
case ARDUINO_PIN_13:
131+
val = ARDUINO_MUX_SPI;
132+
break;
133+
case ARDUINO_PIN_AD0:
134+
val = ARDUINO_MUX_ADC0;
135+
break;
136+
case ARDUINO_PIN_AD1:
137+
val = ARDUINO_MUX_ADC1;
138+
break;
139+
case ARDUINO_PIN_AD2:
140+
val = ARDUINO_MUX_ADC2;
141+
break;
142+
case ARDUINO_PIN_AD3:
143+
val = ARDUINO_MUX_ADC3;
144+
break;
145+
case ARDUINO_PIN_AD4:
146+
case ARDUINO_PIN_AD5:
147+
val = ARDUINO_MUX_I2C;
148+
break;
149+
default :
150+
return E_PAR;
151+
}
152+
153+
sysconf_reg_ptr->ARDUINO_MUX &= ~val;
154+
155+
return E_OK;
156+
}
157+
158+
static int32_t io_arduino_config_adc(uint32_t pin_num, uint32_t config)
159+
{
160+
uint32_t val = 0;
161+
162+
switch (pin_num) {
163+
164+
case ARDUINO_PIN_AD0:
165+
val = ARDUINO_MUX_ADC0;
166+
break;
167+
case ARDUINO_PIN_AD1:
168+
val = ARDUINO_MUX_ADC1;
169+
break;
170+
case ARDUINO_PIN_AD2:
171+
val = ARDUINO_MUX_ADC2;
172+
break;
173+
case ARDUINO_PIN_AD3:
174+
val = ARDUINO_MUX_ADC3;
175+
break;
176+
case ARDUINO_PIN_AD4:
177+
sysconf_reg_ptr->ARDUINO_MUX &= ~ARDUINO_MUX_I2C;
178+
val = ARDUINO_MUX_ADC4;
179+
break;
180+
case ARDUINO_PIN_AD5:
181+
sysconf_reg_ptr->ARDUINO_MUX &= ~ARDUINO_MUX_I2C;
182+
val = ARDUINO_MUX_ADC5;
183+
break;
184+
default :
185+
return E_PAR;
186+
}
187+
188+
if (config == IO_PINMUX_ENABLE) {
189+
sysconf_reg_ptr->ARDUINO_MUX |= val;
190+
} else if (config == IO_PINMUX_DISABLE) {
191+
sysconf_reg_ptr->ARDUINO_MUX &= ~val;
192+
} else {
193+
return E_NOSPT;
194+
}
195+
196+
return E_OK;
197+
}
198+
199+
int32_t io_arduino_config(uint32_t pin_num, uint32_t type, uint32_t config)
200+
{
201+
int32_t ret = E_PAR;
202+
203+
switch (type) {
204+
case ARDUINO_GPIO:
205+
ret = io_arduino_config_gpio(pin_num, config);
206+
break;
207+
case ARDUINO_PWM:
208+
ret = io_arduino_config_pwm(pin_num, config);
209+
break;
210+
case ARDUINO_SPI:
211+
if (pin_num == ARDUINO_PIN_10 ||
212+
pin_num == ARDUINO_PIN_11 ||
213+
pin_num == ARDUINO_PIN_12 ||
214+
pin_num == ARDUINO_PIN_13) {
215+
ret = io_arduino_config_spi(config);
216+
}
217+
break;
218+
case ARDUINO_I2C:
219+
if (pin_num == ARDUINO_PIN_AD5 ||
220+
pin_num == ARDUINO_PIN_AD4) {
221+
ret = io_arduino_config_i2c(config);
222+
}
223+
break;
224+
case ARDUINO_UART:
225+
if (pin_num == ARDUINO_PIN_0 ||
226+
pin_num == ARDUINO_PIN_1) {
227+
ret = io_arduino_config_uart(config);
228+
}
229+
break;
230+
case ARDUINO_ADC:
231+
if (pin_num >= ARDUINO_PIN_AD0 && pin_num <= ARDUINO_PIN_AD5) {
232+
ret = io_arduino_config_adc(pin_num, config);
233+
}
234+
break;
235+
default:
236+
return E_NOSPT;
237+
}
238+
239+
return ret;
240+
}
241+
242+
int32_t io_arduino_config_spi(uint32_t config)
243+
{
244+
if (config == IO_PINMUX_ENABLE) {
245+
sysconf_reg_ptr->ARDUINO_MUX |= ARDUINO_MUX_SPI;
246+
} else if (config == IO_PINMUX_DISABLE) {
247+
sysconf_reg_ptr->ARDUINO_MUX &= ~ARDUINO_MUX_SPI;
248+
} else {
249+
return E_NOSPT;
250+
}
251+
252+
return E_OK;
253+
}
254+
255+
int32_t io_arduino_config_uart(uint32_t config)
256+
{
257+
if (config == IO_PINMUX_ENABLE) {
258+
sysconf_reg_ptr->ARDUINO_MUX |= ARDUINO_MUX_UART;
259+
} else if (config == IO_PINMUX_DISABLE) {
260+
sysconf_reg_ptr->ARDUINO_MUX &= ~ARDUINO_MUX_UART;
261+
} else {
262+
return E_NOSPT;
263+
}
264+
265+
return E_OK;
266+
}
267+
268+
int32_t io_arduino_config_i2c(uint32_t config)
269+
{
270+
if (config == IO_PINMUX_ENABLE) {
271+
sysconf_reg_ptr->ARDUINO_MUX |= ARDUINO_MUX_I2C;
272+
} else if (config == IO_PINMUX_DISABLE) {
273+
sysconf_reg_ptr->ARDUINO_MUX &= ~ARDUINO_MUX_I2C;
274+
} else {
275+
return E_NOSPT;
276+
}
277+
278+
return E_OK;
279+
}
280+
281+
int32_t io_pmod_config(uint32_t pmod, uint32_t type, uint32_t config)
282+
{
283+
if (config != IO_PINMUX_DISABLE && config != IO_PINMUX_ENABLE) {
284+
return E_NOSPT;
285+
}
286+
287+
switch (pmod) {
288+
case PMOD_A:
289+
return E_PAR; /* no pmod A on iotdk */
290+
case PMOD_B:
291+
if (type == PMOD_SPI && config == IO_PINMUX_ENABLE) {
292+
sysconf_reg_ptr->PMOD_MUX &= ~PMOD_MUX_PMB;
293+
} else if (type == PMOD_GPIO || config == IO_PINMUX_DISABLE) {
294+
sysconf_reg_ptr->PMOD_MUX |= PMOD_MUX_PMB;
295+
} else {
296+
return E_PAR;
297+
}
298+
break;
299+
case PMOD_C:
300+
if (type == PMOD_UART && config == IO_PINMUX_ENABLE) {
301+
sysconf_reg_ptr->PMOD_MUX &= ~PMOD_MUX_PMC;
302+
} else if (type == PMOD_GPIO || config == IO_PINMUX_DISABLE) {
303+
sysconf_reg_ptr->PMOD_MUX |= PMOD_MUX_PMC;
304+
} else {
305+
return E_PAR;
306+
}
307+
default:
308+
return E_PAR;
309+
}
310+
311+
return E_OK;
312+
}
313+
314+
void io_mux_init(void)
315+
{
316+
sysconf_reg_ptr->PMOD_MUX = 0;
317+
sysconf_reg_ptr->ARDUINO_MUX = 0;
318+
}

board/iotdk/drivers/sysconf/sysconf.c

Lines changed: 1 addition & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535

3636
#define PLL_CLK_IN (BOARD_REF_CLK / 1000000) /* PLL clock in */
3737

38-
static SYSCONF_REG_PTR sysconf_reg_ptr = (SYSCONF_REG_PTR)(BASE_ADDR_SYSCONFIG);
38+
SYSCONF_REG_PTR sysconf_reg_ptr = (SYSCONF_REG_PTR)(BASE_ADDR_SYSCONFIG);
3939

4040

4141
typedef struct pll_conf {
@@ -349,54 +349,11 @@ void pmc_pwwtime_config(uint8_t time)
349349
sysconf_reg_ptr->PMC_PUWTIME= time;
350350
}
351351

352-
void pmode_mux_config(uint8_t val)
353-
{
354-
sysconf_reg_ptr->PMOD_MUX = val;
355-
}
356-
357352
void uart3_clk_divisor(uint8_t div)
358353
{
359354
sysconf_reg_ptr->UART3SCLK_DIV = div;
360355
}
361356

362-
void arduino_pin_mux(uint8_t pin, uint8_t function)
363-
{
364-
volatile uint32_t val;
365-
366-
if (pin > ARDUINO_A5 || function > ARDUINO_FUNC_3RD) {
367-
return;
368-
}
369-
370-
if (pin == ARDUINO_RESERVED || pin == ARDUINO_SPI_MASK ||
371-
pin == ARDUINO_IIC_MASK) {
372-
return;
373-
}
374-
375-
val = sysconf_reg_ptr->ARDUINO_MUX;
376-
377-
if (pin == ARDUINO_D10 || pin == ARDUINO_D11) {
378-
if (function == ARDUINO_FUNC_2ND) {//SPI function
379-
val |= (1 << ARDUINO_SPI_MASK);
380-
} else {
381-
val &= (~(1 << ARDUINO_SPI_MASK));
382-
}
383-
} else if (pin == ARDUINO_A4 || pin == ARDUINO_A5) {
384-
if (function == ARDUINO_FUNC_2ND) {//IIC function
385-
val |= (1 << ARDUINO_IIC_MASK);
386-
} else {
387-
val &= (~(1 << ARDUINO_IIC_MASK));
388-
}
389-
}
390-
391-
if (function == ARDUINO_FUNC_GPIO) {
392-
val &= (~(1 << pin));
393-
} else if (function == ARDUINO_FUNC_2ND || function == ARDUINO_FUNC_3RD) {
394-
val |= (1 << pin);
395-
}
396-
397-
sysconf_reg_ptr->ARDUINO_MUX = val;
398-
}
399-
400357
void reset_powerdown_vector(uint32_t addr)
401358
{
402359
sysconf_reg_ptr->RESET_PD_VECTOR = addr;

0 commit comments

Comments
 (0)