diff --git a/Libraries/PeriphDrivers/Include/MAX32655/mxc_pins.h b/Libraries/PeriphDrivers/Include/MAX32655/mxc_pins.h index 9a27f0ef18..e416b397a4 100644 --- a/Libraries/PeriphDrivers/Include/MAX32655/mxc_pins.h +++ b/Libraries/PeriphDrivers/Include/MAX32655/mxc_pins.h @@ -28,6 +28,8 @@ #include "gpio.h" +typedef enum { MAP_A, MAP_B, MAP_INVALID } sys_map_t; + /***** Global Variables *****/ // Predefined GPIO Configurations extern const mxc_gpio_cfg_t gpio_cfg_extclk; @@ -37,16 +39,16 @@ extern const mxc_gpio_cfg_t gpio_cfg_i2c2; extern const mxc_gpio_cfg_t gpio_cfg_i2c2b; extern const mxc_gpio_cfg_t gpio_cfg_i2c2c; -extern const mxc_gpio_cfg_t gpio_cfg_uart0; -extern const mxc_gpio_cfg_t gpio_cfg_uart0_flow; -extern const mxc_gpio_cfg_t gpio_cfg_uart0_flow_disable; -extern const mxc_gpio_cfg_t gpio_cfg_uart1; -extern const mxc_gpio_cfg_t gpio_cfg_uart1_flow; -extern const mxc_gpio_cfg_t gpio_cfg_uart1_flow_disable; -extern const mxc_gpio_cfg_t gpio_cfg_uart2; -extern const mxc_gpio_cfg_t gpio_cfg_uart2_flow; -extern const mxc_gpio_cfg_t gpio_cfg_uart2_flow_disable; -extern const mxc_gpio_cfg_t gpio_cfg_uart3; +extern const mxc_gpio_cfg_t gpio_cfg_uart0[]; +extern const mxc_gpio_cfg_t gpio_cfg_uart0_flow[]; +extern const mxc_gpio_cfg_t gpio_cfg_uart0_flow_disable[]; +extern const mxc_gpio_cfg_t gpio_cfg_uart1[]; +extern const mxc_gpio_cfg_t gpio_cfg_uart1_flow[]; +extern const mxc_gpio_cfg_t gpio_cfg_uart1_flow_disable[]; +extern const mxc_gpio_cfg_t gpio_cfg_uart2[]; +extern const mxc_gpio_cfg_t gpio_cfg_uart2_flow[]; +extern const mxc_gpio_cfg_t gpio_cfg_uart2_flow_disable[]; +extern const mxc_gpio_cfg_t gpio_cfg_uart3[]; extern const mxc_gpio_cfg_t antenna_ctrl0; extern const mxc_gpio_cfg_t antenna_ctrl1; diff --git a/Libraries/PeriphDrivers/Include/MAX32655/uart.h b/Libraries/PeriphDrivers/Include/MAX32655/uart.h index 92f1fcfc2b..5c5fdbf3cb 100644 --- a/Libraries/PeriphDrivers/Include/MAX32655/uart.h +++ b/Libraries/PeriphDrivers/Include/MAX32655/uart.h @@ -256,6 +256,26 @@ int MXC_UART_SetFlowCtrl(mxc_uart_regs_t *uart, mxc_uart_flow_t flowCtrl, int rt * for a list of return codes. */ int MXC_UART_SetClockSource(mxc_uart_regs_t *uart, mxc_uart_clock_t clock); +/** + * @brief Sets the clock source for the baud rate generator + * + * @param uart Pointer to UART registers (selects the UART block used.) + * @param map Pin MAP for UART + * + * @return E_NO_ERROR if successful, otherwise see \ref MXC_Error_Codes + * + */ +int MXC_UART_SetPinMap(mxc_uart_regs_t *uart, sys_map_t map); + +/** + * @brief Sets the clock source for the baud rate generator + * + * @return map + * + * @note Assertion triggered in debug mode if invalid uart is passed. + * + */ +int MXC_UART_GetPinMap(mxc_uart_regs_t *uart); /** * @brief Gets the clock source used for the UART instance diff --git a/Libraries/PeriphDrivers/Source/SYS/pins_me17.c b/Libraries/PeriphDrivers/Source/SYS/pins_me17.c index 1fc25547f8..705b99fc85 100644 --- a/Libraries/PeriphDrivers/Source/SYS/pins_me17.c +++ b/Libraries/PeriphDrivers/Source/SYS/pins_me17.c @@ -25,7 +25,7 @@ #include "gpio.h" #include "mxc_device.h" - +#include "mxc_pins.h" /***** Definitions *****/ /***** Global Variables *****/ @@ -41,26 +41,70 @@ const mxc_gpio_cfg_t gpio_cfg_i2c1 = { MXC_GPIO0, (MXC_GPIO_PIN_16 | MXC_GPIO_PI const mxc_gpio_cfg_t gpio_cfg_i2c2 = { MXC_GPIO0, (MXC_GPIO_PIN_30 | MXC_GPIO_PIN_31), MXC_GPIO_FUNC_ALT1, MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_uart0 = { MXC_GPIO0, (MXC_GPIO_PIN_0 | MXC_GPIO_PIN_1), MXC_GPIO_FUNC_ALT1, - MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_uart0_flow = { MXC_GPIO0, (MXC_GPIO_PIN_2 | MXC_GPIO_PIN_3), MXC_GPIO_FUNC_ALT2, - MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_uart0_flow_disable = { MXC_GPIO0, (MXC_GPIO_PIN_2 | MXC_GPIO_PIN_3), MXC_GPIO_FUNC_IN, - MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_uart1 = { MXC_GPIO0, (MXC_GPIO_PIN_12 | MXC_GPIO_PIN_13), MXC_GPIO_FUNC_ALT1, - MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_uart1_flow = { MXC_GPIO0, (MXC_GPIO_PIN_14 | MXC_GPIO_PIN_15), MXC_GPIO_FUNC_ALT2, - MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_uart1_flow_disable = { MXC_GPIO0, (MXC_GPIO_PIN_14 | MXC_GPIO_PIN_15), MXC_GPIO_FUNC_IN, - MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_uart2 = { MXC_GPIO1, (MXC_GPIO_PIN_0 | MXC_GPIO_PIN_1), MXC_GPIO_FUNC_ALT1, - MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_uart2_flow = { MXC_GPIO0, (MXC_GPIO_PIN_30 | MXC_GPIO_PIN_31), MXC_GPIO_FUNC_ALT2, - MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_uart2_flow_disable = { MXC_GPIO0, (MXC_GPIO_PIN_30 | MXC_GPIO_PIN_31), MXC_GPIO_FUNC_IN, - MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; -const mxc_gpio_cfg_t gpio_cfg_uart3 = { MXC_GPIO2, (MXC_GPIO_PIN_6 | MXC_GPIO_PIN_7), MXC_GPIO_FUNC_ALT2, - MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; + + +const mxc_gpio_cfg_t gpio_cfg_uart0[] = {[MAP_A] = { MXC_GPIO0, (MXC_GPIO_PIN_0 | MXC_GPIO_PIN_1), MXC_GPIO_FUNC_ALT1, + MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }, + + [MAP_B] = { MXC_GPIO0, (MXC_GPIO_PIN_0 | MXC_GPIO_PIN_1), MXC_GPIO_FUNC_ALT1, + MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 } + }; + +const mxc_gpio_cfg_t gpio_cfg_uart0_flow[] = {[MAP_A] = { MXC_GPIO0, (MXC_GPIO_PIN_2 | MXC_GPIO_PIN_3), MXC_GPIO_FUNC_ALT2, + MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }, + + [MAP_B] = { MXC_GPIO0, (MXC_GPIO_PIN_2 | MXC_GPIO_PIN_3), MXC_GPIO_FUNC_ALT2, + MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 } + }; + +const mxc_gpio_cfg_t gpio_cfg_uart0_flow_disable[] = {[MAP_A] = { MXC_GPIO0, (MXC_GPIO_PIN_2 | MXC_GPIO_PIN_3), MXC_GPIO_FUNC_IN, + MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }, + + [MAP_B] = {MXC_GPIO0, (MXC_GPIO_PIN_2 | MXC_GPIO_PIN_3), MXC_GPIO_FUNC_IN, + MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 + } + }; + + +const mxc_gpio_cfg_t gpio_cfg_uart1[] = {[MAP_A] = { MXC_GPIO0, (MXC_GPIO_PIN_12 | MXC_GPIO_PIN_13), MXC_GPIO_FUNC_ALT1, + MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }, + [MAP_B] = { MXC_GPIO0, (MXC_GPIO_PIN_12 | MXC_GPIO_PIN_13), MXC_GPIO_FUNC_ALT1, + MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 } + }; + +const mxc_gpio_cfg_t gpio_cfg_uart1_flow[] = {[MAP_A] = { MXC_GPIO0, (MXC_GPIO_PIN_14 | MXC_GPIO_PIN_15), MXC_GPIO_FUNC_ALT2, + MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }, + [MAP_B] = { MXC_GPIO0, (MXC_GPIO_PIN_14 | MXC_GPIO_PIN_15), MXC_GPIO_FUNC_ALT2, + MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }}; + +const mxc_gpio_cfg_t gpio_cfg_uart1_flow_disable[] = {[MAP_A] = { MXC_GPIO0, (MXC_GPIO_PIN_14 | MXC_GPIO_PIN_15), MXC_GPIO_FUNC_IN, + MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }, + [MAP_B] = { MXC_GPIO0, (MXC_GPIO_PIN_14 | MXC_GPIO_PIN_15), MXC_GPIO_FUNC_IN, + MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 } + }; + + + +const mxc_gpio_cfg_t gpio_cfg_uart2[] = {[MAP_A] = { MXC_GPIO1, (MXC_GPIO_PIN_0 | MXC_GPIO_PIN_1), MXC_GPIO_FUNC_ALT1, + MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }, + [MAP_B] = { MXC_GPIO1, (MXC_GPIO_PIN_0 | MXC_GPIO_PIN_1), MXC_GPIO_FUNC_ALT1, + MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }}; + +const mxc_gpio_cfg_t gpio_cfg_uart2_flow[] = {[MAP_A] = { MXC_GPIO0, (MXC_GPIO_PIN_30 | MXC_GPIO_PIN_31), MXC_GPIO_FUNC_ALT2, + MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }, + [MAP_B] = { MXC_GPIO0, (MXC_GPIO_PIN_30 | MXC_GPIO_PIN_31), MXC_GPIO_FUNC_ALT2, + MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }}; + +const mxc_gpio_cfg_t gpio_cfg_uart2_flow_disable[] = {[MAP_A] = { MXC_GPIO0, (MXC_GPIO_PIN_30 | MXC_GPIO_PIN_31), MXC_GPIO_FUNC_IN, + MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }, + [MAP_B] ={ MXC_GPIO0, (MXC_GPIO_PIN_30 | MXC_GPIO_PIN_31), MXC_GPIO_FUNC_IN, + MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }}; + + +const mxc_gpio_cfg_t gpio_cfg_uart3[] = {[MAP_A] = { MXC_GPIO2, (MXC_GPIO_PIN_6 | MXC_GPIO_PIN_7), MXC_GPIO_FUNC_ALT2, + MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }, + [MAP_B] = { MXC_GPIO2, (MXC_GPIO_PIN_6 | MXC_GPIO_PIN_7), MXC_GPIO_FUNC_ALT2, + MXC_GPIO_PAD_WEAK_PULL_UP, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }}; const mxc_gpio_cfg_t antenna_ctrl0 = { MXC_GPIO1, (MXC_GPIO_PIN_8 | MXC_GPIO_PIN_9), MXC_GPIO_FUNC_ALT1, MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 }; diff --git a/Libraries/PeriphDrivers/Source/UART/uart_me17.c b/Libraries/PeriphDrivers/Source/UART/uart_me17.c index 9637e2a177..c6ff1aaf5b 100644 --- a/Libraries/PeriphDrivers/Source/UART/uart_me17.c +++ b/Libraries/PeriphDrivers/Source/UART/uart_me17.c @@ -27,6 +27,14 @@ #include "lpgcr_regs.h" #include "dma.h" + +static sys_map_t uart_maps[] = { + [0] = MAP_A, + [1] = MAP_A, + [2] = MAP_A, + [3] = MAP_A, +}; + void MXC_UART_DMACallback(int ch, int error) { MXC_UART_RevB_DMACallback(ch, error); @@ -51,25 +59,27 @@ int MXC_UART_Init(mxc_uart_regs_t *uart, unsigned int baud, mxc_uart_clock_t clo if (retval) { return retval; } + + const sys_map_t map = MXC_UART_GetPinMap(uart); switch (MXC_UART_GET_IDX(uart)) { case 0: - MXC_GPIO_Config(&gpio_cfg_uart0); + MXC_GPIO_Config(&gpio_cfg_uart0[map]); MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_UART0); break; case 1: - MXC_GPIO_Config(&gpio_cfg_uart1); + MXC_GPIO_Config(&gpio_cfg_uart1[map]); MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_UART1); break; case 2: - MXC_GPIO_Config(&gpio_cfg_uart2); + MXC_GPIO_Config(&gpio_cfg_uart2[map]); MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_UART2); break; case 3: - MXC_GPIO_Config(&gpio_cfg_uart3); + MXC_GPIO_Config(&gpio_cfg_uart3[map]); MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_UART3); break; @@ -216,35 +226,38 @@ int MXC_UART_SetParity(mxc_uart_regs_t *uart, mxc_uart_parity_t parity) int MXC_UART_SetFlowCtrl(mxc_uart_regs_t *uart, mxc_uart_flow_t flowCtrl, int rtsThreshold) { + const sys_map_t map = MXC_UART_GetPinMap(uart); + if (flowCtrl == MXC_UART_FLOW_EN) { switch (MXC_UART_GET_IDX(uart)) { case 0: - MXC_GPIO_Config(&gpio_cfg_uart0_flow); + MXC_GPIO_Config(&gpio_cfg_uart0_flow[map]); break; case 1: - MXC_GPIO_Config(&gpio_cfg_uart1_flow); + MXC_GPIO_Config(&gpio_cfg_uart1_flow[map]); break; case 2: - MXC_GPIO_Config(&gpio_cfg_uart2_flow); + MXC_GPIO_Config(&gpio_cfg_uart2_flow[map]); break; default: return E_BAD_PARAM; } } else { + switch (MXC_UART_GET_IDX(uart)) { case 0: - MXC_GPIO_Config(&gpio_cfg_uart0_flow_disable); + MXC_GPIO_Config(&gpio_cfg_uart0_flow_disable[map]); break; case 1: - MXC_GPIO_Config(&gpio_cfg_uart1_flow_disable); + MXC_GPIO_Config(&gpio_cfg_uart1_flow_disable[map]); break; case 2: - MXC_GPIO_Config(&gpio_cfg_uart2_flow_disable); + MXC_GPIO_Config(&gpio_cfg_uart2_flow_disable[map]); break; default: @@ -340,6 +353,73 @@ mxc_uart_clock_t MXC_UART_GetClockSource(mxc_uart_regs_t *uart) return E_BAD_PARAM; } } +/** + * @brief Sets the clock source for the baud rate generator + * + * @param map Pin MAP for UART + * + * @return E_NO_ERROR if successful, otherwise see \ref MXC_Error_Codes + * + */ +int MXC_UART_SetPinMap(mxc_uart_regs_t *uart, sys_map_t map) +{ + if(map != MAP_A || map != MAP_B) + { + return E_BAD_PARAM; + } + const uint8_t uart_idx = MXC_UART_GET_IDX(uart); + + switch (uart_idx) { + case 0: + MXC_GPIO_Config(&gpio_cfg_uart0[map]); + break; + + case 1: + + MXC_GPIO_Config(&gpio_cfg_uart1[map]); + break; + + case 2: + MXC_GPIO_Config(&gpio_cfg_uart2[map]); + break; + + case 3: + MXC_GPIO_Config(&gpio_cfg_uart3[map]); + break; + + default: + return E_BAD_PARAM; + } + + + + uart_maps[uart_idx] = map; + + + return E_NO_ERROR; + +} + +/** + * @brief Sets the clock source for the baud rate generator + * + * @return map + * + * @note Assertion triggered in debug mode if invalid uart is passed. + * + */ +int MXC_UART_GetPinMap(mxc_uart_regs_t *uart) +{ + const int uart_idx = MXC_UART_GET_IDX(uart); + + if(uart_idx < 0) + { + return E_BAD_PARAM; + } + + return (int)uart_maps[uart_idx]; +} + int MXC_UART_GetActive(mxc_uart_regs_t *uart) {