diff --git a/cores/xmc/Arduino.h b/cores/xmc/Arduino.h index e968a47c..f2ecc3f6 100644 --- a/cores/xmc/Arduino.h +++ b/cores/xmc/Arduino.h @@ -28,7 +28,6 @@ #ifdef __cplusplus using namespace arduino; - extern "C" { #endif @@ -342,12 +341,12 @@ extern void loop(void); #ifdef __cplusplus } // extern "C" -// #include "Tone.h" -// #include "WMath.h" + // #include "Tone.h" + // #include "WMath.h" + #include "Uart.h" #endif // __cplusplus // #include "Print.h" -// #include "HardwareSerial.h" //**************************************************************************** // @Board Variant Includes diff --git a/cores/xmc/Uart.cpp b/cores/xmc/Uart.cpp new file mode 100644 index 00000000..f9e9f716 --- /dev/null +++ b/cores/xmc/Uart.cpp @@ -0,0 +1,156 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +//**************************************************************************** +// @Project Includes +//**************************************************************************** +#include "Uart.h" +#include "Arduino.h" + +//**************************************************************************** +// @Local Functions +//**************************************************************************** + +// Constructors //////////////////////////////////////////////////////////////// + +Uart::Uart(XMC_UART_t *xmc_uart_config, RingBuffer *rx_buffer) { + _XMC_UART_config = xmc_uart_config; + _rx_buffer = rx_buffer; +} + +// Public Methods ////////////////////////////////////////////////////////////// + +void Uart::begin(unsigned long baud) { begin(baud, SERIAL_8N1); } + +void Uart::begin(unsigned long baud, unsigned short config) { + begin(baud, static_cast(config)); +} + +void Uart::begin(unsigned long baud, XMC_UART_MODE_t config) { + XMC_UART_CH_CONFIG_t uart_ch_config; + uart_ch_config.oversampling = 0; // Must be 0 or valid oversample for baud rate calculations + uart_ch_config.baudrate = baud; + uart_ch_config.data_bits = (uint8_t)(config & 0x00fU); + uart_ch_config.frame_length = uart_ch_config.data_bits; // Set same as data bits length + uart_ch_config.parity_mode = (XMC_USIC_CH_PARITY_MODE_t)(config & ~0xffU); + uart_ch_config.stop_bits = (uint8_t)((config & 0x0f0U) >> 4); + + XMC_UART_CH_Init(_XMC_UART_config->channel, &uart_ch_config); + + // dx0 is UART RX: source must be set + XMC_USIC_CH_SetInputSource(_XMC_UART_config->channel, XMC_USIC_CH_INPUT_DX0, + _XMC_UART_config->input_source_dx0); + + // Additional input multiplexing + // Check if dx1 is used + if (_XMC_UART_config->input_source_dx1 != XMC_INPUT_INVALID) + XMC_USIC_CH_SetInputSource(_XMC_UART_config->channel, XMC_USIC_CH_INPUT_DX1, + _XMC_UART_config->input_source_dx1); + + // Check if dx2 is used + if (_XMC_UART_config->input_source_dx2 != XMC_INPUT_INVALID) + XMC_USIC_CH_SetInputSource(_XMC_UART_config->channel, XMC_USIC_CH_INPUT_DX2, + _XMC_UART_config->input_source_dx2); + + // Check if dx3 is used + if (_XMC_UART_config->input_source_dx3 != XMC_INPUT_INVALID) + XMC_USIC_CH_SetInputSource(_XMC_UART_config->channel, XMC_USIC_CH_INPUT_DX3, + _XMC_UART_config->input_source_dx3); + + XMC_UART_CH_EnableEvent(_XMC_UART_config->channel, XMC_UART_CH_EVENT_ALTERNATIVE_RECEIVE | + XMC_UART_CH_EVENT_STANDARD_RECEIVE); + XMC_USIC_CH_SetInterruptNodePointer(_XMC_UART_config->channel, + XMC_USIC_CH_INTERRUPT_NODE_POINTER_RECEIVE, + _XMC_UART_config->irq_service_request); + XMC_USIC_CH_SetInterruptNodePointer(_XMC_UART_config->channel, + XMC_USIC_CH_INTERRUPT_NODE_POINTER_ALTERNATE_RECEIVE, + _XMC_UART_config->irq_service_request); + XMC_USIC_CH_SetInterruptNodePointer(_XMC_UART_config->channel, + XMC_USIC_CH_INTERRUPT_NODE_POINTER_TRANSMIT_BUFFER, + _XMC_UART_config->irq_service_request); + NVIC_SetPriority(_XMC_UART_config->irq_num, 3); + NVIC_EnableIRQ(_XMC_UART_config->irq_num); + + XMC_UART_CH_Start(_XMC_UART_config->channel); + + // TX pin setup put here to avoid startup corrupted characters being first sent + XMC_GPIO_Init(_XMC_UART_config->tx.port, _XMC_UART_config->tx.pin, + &(_XMC_UART_config->tx_config)); + + XMC_GPIO_Init(_XMC_UART_config->rx.port, _XMC_UART_config->rx.pin, + &(_XMC_UART_config->rx_config)); +} + +void Uart::end(void) { + // Wait for any outstanding data to be sent + flush(); + // Disable UART interrupt in NVIC + NVIC_DisableIRQ(_XMC_UART_config->irq_num); + // Clear any received data after stopping interrupts + _rx_buffer->clear(); +} + +void Uart::setInterruptPriority(uint32_t priority) { + NVIC_SetPriority(_XMC_UART_config->irq_num, priority & 0x03); +} + +uint32_t Uart::getInterruptPriority() { return NVIC_GetPriority(_XMC_UART_config->irq_num); } + +int Uart::available(void) { return _rx_buffer->available(); } + +int Uart::availableForWrite(void) { + return 1; +} // TODO: there are no tx buffer so we awaly have 1 byte available + +int Uart::peek(void) { return _rx_buffer->peek(); } + +int Uart::read(void) { return _rx_buffer->read_char(); } + +void Uart::flush(void) { + while (XMC_USIC_CH_GetTransmitBufferStatus(_XMC_UART_config->channel) == + XMC_USIC_CH_TBUF_STATUS_BUSY) { + }; +} + +size_t Uart::write(const uint8_t uc_data) { + // For sending, write immediately + // This API already have a check for available buffer + XMC_UART_CH_Transmit(_XMC_UART_config->channel, uc_data); + return 1; +} + +void Uart::IrqHandler(void) { + // Receive data Interrupt handler + uint32_t status = XMC_UART_CH_GetStatusFlag(_XMC_UART_config->channel); + + // Did we receive data? + if ((status & (XMC_UART_CH_STATUS_FLAG_ALTERNATIVE_RECEIVE_INDICATION | + XMC_UART_CH_STATUS_FLAG_RECEIVE_INDICATION)) != 0U) { + XMC_UART_CH_ClearStatusFlag(_XMC_UART_config->channel, + (XMC_UART_CH_STATUS_FLAG_ALTERNATIVE_RECEIVE_INDICATION | + XMC_UART_CH_STATUS_FLAG_RECEIVE_INDICATION)); + + while (_XMC_UART_config->channel->RBUFSR & + (USIC_CH_RBUFSR_RDV0_Msk | USIC_CH_RBUFSR_RDV1_Msk)) + _rx_buffer->store_char(XMC_UART_CH_GetReceivedData(_XMC_UART_config->channel)); + } +} + +//**************************************************************************** +// END OF FILE +//**************************************************************************** \ No newline at end of file diff --git a/cores/xmc/Uart.h b/cores/xmc/Uart.h new file mode 100644 index 00000000..a7d26524 --- /dev/null +++ b/cores/xmc/Uart.h @@ -0,0 +1,133 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ +#pragma once + +//**************************************************************************** +// @External Prototypes +//**************************************************************************** + +#include "Arduino.h" +//**************************************************************************** +// @Project Includes +//**************************************************************************** +#include "api/HardwareSerial.h" +#include "api/RingBuffer.h" + +//**************************************************************************** +// @Typedefs +//**************************************************************************** +// Define config for Serial.begin(baud, config); +#undef SERIAL_5N1 +#undef SERIAL_6N1 +#undef SERIAL_7N1 +#undef SERIAL_8N1 +#undef SERIAL_5N2 +#undef SERIAL_6N2 +#undef SERIAL_7N2 +#undef SERIAL_8N2 +#undef SERIAL_5E1 +#undef SERIAL_6E1 +#undef SERIAL_7E1 +#undef SERIAL_8E1 +#undef SERIAL_5E2 +#undef SERIAL_6E2 +#undef SERIAL_7E2 +#undef SERIAL_8E2 +#undef SERIAL_5O1 +#undef SERIAL_6O1 +#undef SERIAL_7O1 +#undef SERIAL_8O1 +#undef SERIAL_5O2 +#undef SERIAL_6O2 +#undef SERIAL_7O2 +#undef SERIAL_8O2 + +typedef enum XMC_UART_MODE { + SERIAL_5N1 = 0x15 | XMC_USIC_CH_PARITY_MODE_NONE, + SERIAL_6N1 = 0x16 | XMC_USIC_CH_PARITY_MODE_NONE, + SERIAL_7N1 = 0x17 | XMC_USIC_CH_PARITY_MODE_NONE, + SERIAL_8N1 = 0x18 | XMC_USIC_CH_PARITY_MODE_NONE, + SERIAL_5N2 = 0x25 | XMC_USIC_CH_PARITY_MODE_NONE, + SERIAL_6N2 = 0x26 | XMC_USIC_CH_PARITY_MODE_NONE, + SERIAL_7N2 = 0x27 | XMC_USIC_CH_PARITY_MODE_NONE, + SERIAL_8N2 = 0x28 | XMC_USIC_CH_PARITY_MODE_NONE, + SERIAL_5E1 = 0x15 | XMC_USIC_CH_PARITY_MODE_EVEN, + SERIAL_6E1 = 0x16 | XMC_USIC_CH_PARITY_MODE_EVEN, + SERIAL_7E1 = 0x17 | XMC_USIC_CH_PARITY_MODE_EVEN, + SERIAL_8E1 = 0x18 | XMC_USIC_CH_PARITY_MODE_EVEN, + SERIAL_5E2 = 0x25 | XMC_USIC_CH_PARITY_MODE_EVEN, + SERIAL_6E2 = 0x26 | XMC_USIC_CH_PARITY_MODE_EVEN, + SERIAL_7E2 = 0x27 | XMC_USIC_CH_PARITY_MODE_EVEN, + SERIAL_8E2 = 0x28 | XMC_USIC_CH_PARITY_MODE_EVEN, + SERIAL_5O1 = 0x15 | XMC_USIC_CH_PARITY_MODE_ODD, + SERIAL_6O1 = 0x16 | XMC_USIC_CH_PARITY_MODE_ODD, + SERIAL_7O1 = 0x17 | XMC_USIC_CH_PARITY_MODE_ODD, + SERIAL_8O1 = 0x18 | XMC_USIC_CH_PARITY_MODE_ODD, + SERIAL_5O2 = 0x25 | XMC_USIC_CH_PARITY_MODE_ODD, + SERIAL_6O2 = 0x26 | XMC_USIC_CH_PARITY_MODE_ODD, + SERIAL_7O2 = 0x27 | XMC_USIC_CH_PARITY_MODE_ODD, + SERIAL_8O2 = 0x28 | XMC_USIC_CH_PARITY_MODE_ODD +} XMC_UART_MODE_t; + +//**************************************************************************** +// @Class Definitionsw +//**************************************************************************** +class Uart : public HardwareSerial { +public: + XMC_UART_t *_XMC_UART_config; + Uart(XMC_UART_t *xmc_uart_config, RingBuffer *rx_buffer); + + void begin(unsigned long); + void begin(unsigned long baudrate, uint16_t config) override; + void begin(unsigned long, XMC_UART_MODE_t config); + void end(); + int available(void); + int availableForWrite(void); + int peek(void); + int read(void); + void flush(void); + + // virtual size_t readBytes(char *buffer, size_t length) ; // read chars from stream into buffer + // virtual size_t readBytes(uint8_t *buffer, size_t length) ; + + size_t write(const uint8_t); + + // virtual size_t write(const uint8_t *buffer, size_t size) ; + inline size_t write(unsigned long n) { return write((uint8_t)n); } + + inline size_t write(long n) { return write((uint8_t)n); } + + inline size_t write(unsigned int n) { return write((uint8_t)n); } + + inline size_t write(int n) { return write((uint8_t)n); } + + using Print::write; // pull in write(str) and write(buf, size) from Print + + operator bool() { return true; } + + void setInterruptPriority(uint32_t priority); + uint32_t getInterruptPriority(); + + void IrqHandler(void); + +private: + RingBuffer *_rx_buffer; +}; + +extern Uart Serial; +extern Uart Serial1; diff --git a/cores/xmc/main.cpp b/cores/xmc/main.cpp index d83c4a23..98cbd07c 100644 --- a/cores/xmc/main.cpp +++ b/cores/xmc/main.cpp @@ -49,7 +49,7 @@ int main(void) { setup(); while (1) { loop(); - // serialEventRun(); + ::serialEventRun(); } } diff --git a/tests/arduino-core-tests b/tests/arduino-core-tests index 0052b910..6c109cba 160000 --- a/tests/arduino-core-tests +++ b/tests/arduino-core-tests @@ -1 +1 @@ -Subproject commit 0052b910df063e45f351575220f53b0cec295eec +Subproject commit 6c109cba84e1bb0a8e4f4a1b838cedd652a5c139 diff --git a/variants/XMC4700/config/XMC4700_Relax_Kit/pins_arduino.h b/variants/XMC4700/config/XMC4700_Relax_Kit/pins_arduino.h index 27f812db..c248be16 100644 --- a/variants/XMC4700/config/XMC4700_Relax_Kit/pins_arduino.h +++ b/variants/XMC4700/config/XMC4700_Relax_Kit/pins_arduino.h @@ -394,286 +394,280 @@ const uint8_t NUM_DIGITAL = (sizeof(mapping_port_pin) / sizeof(XMC_PORT_PIN_t)); // VADC_G2, 2, 4, DISABLED}, {VADC, 7, VADC_G2, 2, 7, DISABLED}}; // const uint8_t NUM_ANALOG_INPUTS = (sizeof(mapping_adc) / sizeof(XMC_ADC_t)); -// /* -// * UART objects -// * -// * Serial 0 is Debug port -// * Serial 1 is on-board port -// */ -// RingBuffer rx_buffer_0; -// RingBuffer tx_buffer_0; -// RingBuffer rx_buffer_1; -// RingBuffer tx_buffer_1; - -// XMC_UART_t XMC_UART_0 = { -// .channel = XMC_UART0_CH0, -// .rx = {.port = (XMC_GPIO_PORT_t *)PORT1_BASE, .pin = (uint8_t)4}, -// .rx_config = {.mode = XMC_GPIO_MODE_INPUT_TRISTATE, -// .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH, -// .output_strength = XMC_GPIO_OUTPUT_STRENGTH_STRONG_SOFT_EDGE}, -// .tx = {.port = (XMC_GPIO_PORT_t *)PORT1_BASE, .pin = (uint8_t)5}, -// .tx_config = {.mode = (XMC_GPIO_MODE_t)XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT2, -// .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH, -// .output_strength = XMC_GPIO_OUTPUT_STRENGTH_STRONG_SOFT_EDGE}, -// .input_source_dx0 = (XMC_USIC_INPUT_t)USIC0_C0_DX0_P1_4, -// .input_source_dx1 = XMC_INPUT_INVALID, -// .input_source_dx2 = XMC_INPUT_INVALID, -// .input_source_dx3 = XMC_INPUT_INVALID, -// .irq_num = USIC0_0_IRQn, -// .irq_service_request = 0}; - -// XMC_UART_t XMC_UART_1 = { -// .channel = XMC_UART1_CH0, -// .rx = {.port = (XMC_GPIO_PORT_t *)PORT2_BASE, .pin = (uint8_t)15}, -// .rx_config = {.mode = XMC_GPIO_MODE_INPUT_TRISTATE, -// .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH, -// .output_strength = XMC_GPIO_OUTPUT_STRENGTH_STRONG_SOFT_EDGE}, -// .tx = {.port = (XMC_GPIO_PORT_t *)PORT2_BASE, .pin = (uint8_t)14}, -// .tx_config = {.mode = (XMC_GPIO_MODE_t)XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT2, -// .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH, -// .output_strength = XMC_GPIO_OUTPUT_STRENGTH_STRONG_SOFT_EDGE}, -// .input_source_dx0 = (XMC_USIC_INPUT_t)USIC1_C0_DX0_P2_15, -// .input_source_dx1 = XMC_INPUT_INVALID, -// .input_source_dx2 = XMC_INPUT_INVALID, -// .input_source_dx3 = XMC_INPUT_INVALID, -// .irq_num = USIC1_0_IRQn, -// .irq_service_request = 0}; - -// // Debug port -// // HardwareSerial Serial(&XMC_UART_0, &rx_buffer_0, &tx_buffer_0); -// // On-board port -// // HardwareSerial Serial1(&XMC_UART_1, &rx_buffer_1, &tx_buffer_1); - -// // Three SPI instances possible -// XMC_SPI_t XMC_SPI_0 = { -// .channel = XMC_SPI2_CH0, -// .channel_config = {.baudrate = 20003906U, -// .bus_mode = (XMC_SPI_CH_BUS_MODE_t)XMC_SPI_CH_BUS_MODE_MASTER, -// .selo_inversion = XMC_SPI_CH_SLAVE_SEL_INV_TO_MSLS, -// .parity_mode = XMC_USIC_CH_PARITY_MODE_NONE}, -// .mosi = {.port = (XMC_GPIO_PORT_t *)PORT3_BASE, .pin = (uint8_t)8}, -// .mosi_config = {.mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT1, -// .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH, -// .output_strength = XMC_GPIO_OUTPUT_STRENGTH_MEDIUM}, -// .miso = {.port = (XMC_GPIO_PORT_t *)PORT3_BASE, .pin = (uint8_t)7}, -// .miso_config = -// { -// .mode = XMC_GPIO_MODE_INPUT_TRISTATE, -// }, -// .input_source = XMC_INPUT_C, -// .sclkout = {.port = (XMC_GPIO_PORT_t *)PORT3_BASE, .pin = (uint8_t)9}, -// .sclkout_config = {.mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT1, -// .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH, -// .output_strength = XMC_GPIO_OUTPUT_STRENGTH_MEDIUM}, -// }; - -// XMC_SPI_t XMC_SPI_1 = { -// .channel = XMC_SPI0_CH1, -// .channel_config = {.baudrate = 20003906U, -// .bus_mode = (XMC_SPI_CH_BUS_MODE_t)XMC_SPI_CH_BUS_MODE_MASTER, -// .selo_inversion = XMC_SPI_CH_SLAVE_SEL_INV_TO_MSLS, -// .parity_mode = XMC_USIC_CH_PARITY_MODE_NONE}, -// .mosi = {.port = (XMC_GPIO_PORT_t *)PORT3_BASE, .pin = (uint8_t)5}, -// .mosi_config = {.mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT4, -// .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH, -// .output_strength = XMC_GPIO_OUTPUT_STRENGTH_MEDIUM}, -// .miso = {.port = (XMC_GPIO_PORT_t *)PORT4_BASE, .pin = (uint8_t)0}, -// .miso_config = -// { -// .mode = XMC_GPIO_MODE_INPUT_TRISTATE, -// }, -// .input_source = XMC_INPUT_E, -// .sclkout = {.port = (XMC_GPIO_PORT_t *)PORT3_BASE, .pin = (uint8_t)6}, -// .sclkout_config = {.mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT4, -// .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH, -// .output_strength = XMC_GPIO_OUTPUT_STRENGTH_MEDIUM}, -// }; - -// XMC_SPI_t XMC_SPI_2 = { -// .channel = XMC_SPI2_CH1, -// .channel_config = {.baudrate = 20003906U, -// .bus_mode = (XMC_SPI_CH_BUS_MODE_t)XMC_SPI_CH_BUS_MODE_MASTER, -// .selo_inversion = XMC_SPI_CH_SLAVE_SEL_INV_TO_MSLS, -// .parity_mode = XMC_USIC_CH_PARITY_MODE_NONE}, -// .mosi = {.port = (XMC_GPIO_PORT_t *)PORT3_BASE, .pin = (uint8_t)11}, -// .mosi_config = {.mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT1, -// .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH, -// .output_strength = XMC_GPIO_OUTPUT_STRENGTH_MEDIUM}, -// .miso = {.port = (XMC_GPIO_PORT_t *)PORT3_BASE, .pin = (uint8_t)12}, -// .miso_config = -// { -// .mode = XMC_GPIO_MODE_INPUT_TRISTATE, -// }, -// .input_source = XMC_INPUT_D, -// .sclkout = {.port = (XMC_GPIO_PORT_t *)PORT3_BASE, .pin = (uint8_t)13}, -// .sclkout_config = {.mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT1, -// .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH, -// .output_strength = XMC_GPIO_OUTPUT_STRENGTH_MEDIUM}, -// }; - -// Only two serial objects are possible: Serial and Serial1 so anymore serial interfaces has to -// overwrite/reuse the existing serial objects -// Will overwrite Serial -// XMC_SPI_t XMC_SPI_3 = -//{ -// .channel = XMC_SPI0_CH0, -// .channel_config = { -// .baudrate = 20003906U, -// .bus_mode = (XMC_SPI_CH_BUS_MODE_t)XMC_SPI_CH_BUS_MODE_MASTER, -// .selo_inversion = XMC_SPI_CH_SLAVE_SEL_INV_TO_MSLS, -// .parity_mode = XMC_USIC_CH_PARITY_MODE_NONE -// }, -// .mosi = { -// .port = (XMC_GPIO_PORT_t*)PORT5_BASE, -// .pin = (uint8_t)1 -// }, -// .mosi_config = { -// .mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT1, -// .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH, -// .output_strength = XMC_GPIO_OUTPUT_STRENGTH_MEDIUM -// }, -// .miso = { -// .port = (XMC_GPIO_PORT_t*)PORT5_BASE, -// .pin = (uint8_t)0 -// }, -// .miso_config = { -// .mode = XMC_GPIO_MODE_INPUT_TRISTATE, -// }, -// .input_source = XMC_INPUT_D, -// .sclkout = { -// .port = (XMC_GPIO_PORT_t*)PORT0_BASE, -// .pin = (uint8_t)8 -// }, -// .sclkout_config = { -// .mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT2, -// .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH, -// .output_strength = XMC_GPIO_OUTPUT_STRENGTH_MEDIUM -// }, -// }; - -// Will overwrite Serial1 -// XMC_SPI_t XMC_SPI_4 = -//{ -// .channel = XMC_SPI1_CH0, -// .channel_config = { -// .baudrate = 20003906U, -// .bus_mode = (XMC_SPI_CH_BUS_MODE_t)XMC_SPI_CH_BUS_MODE_MASTER, -// .selo_inversion = XMC_SPI_CH_SLAVE_SEL_INV_TO_MSLS, -// .parity_mode = XMC_USIC_CH_PARITY_MODE_NONE -// }, -// .mosi = { -// .port = (XMC_GPIO_PORT_t*)PORT0_BASE, -// .pin = (uint8_t)5 -// }, -// .mosi_config = { -// .mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT2, -// .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH, -// .output_strength = XMC_GPIO_OUTPUT_STRENGTH_MEDIUM -// }, -// .miso = { -// .port = (XMC_GPIO_PORT_t*)PORT0_BASE, -// .pin = (uint8_t)4 -// }, -// .miso_config = { -// .mode = XMC_GPIO_MODE_INPUT_TRISTATE, -// }, -// .input_source = XMC_INPUT_A, -// .sclkout = { -// .port = (XMC_GPIO_PORT_t*)PORT0_BASE, -// .pin = (uint8_t)11 -// }, -// .sclkout_config = { -// .mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT2, -// .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH, -// .output_strength = XMC_GPIO_OUTPUT_STRENGTH_MEDIUM -// }, -//}; - -// Two I2C instances possible -// XMC_I2C_t XMC_I2C_0 = {.channel = XMC_I2C1_CH1, -// .channel_config = {.baudrate = (uint32_t)(100000U), .address = 0U}, -// .sda = {.port = (XMC_GPIO_PORT_t *)PORT3_BASE, .pin = (uint8_t)15}, -// .sda_config = {.mode = XMC_GPIO_MODE_OUTPUT_OPEN_DRAIN_ALT2, -// .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH}, -// .scl = {.port = (XMC_GPIO_PORT_t *)PORT0_BASE, .pin = (uint8_t)13}, -// .scl_config = {.mode = XMC_GPIO_MODE_OUTPUT_OPEN_DRAIN_ALT2, -// .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH}, -// .input_source_dx0 = XMC_INPUT_A, -// .input_source_dx1 = XMC_INPUT_B, -// .slave_receive_irq_num = (IRQn_Type)91, -// .slave_receive_irq_service_request = 1, -// .protocol_irq_num = (IRQn_Type)92, -// .protocol_irq_service_request = 2}; -// XMC_I2C_t XMC_I2C_1 = {.channel = XMC_I2C1_CH0, -// .channel_config = {.baudrate = (uint32_t)(100000U), .address = 0U}, -// .sda = {.port = (XMC_GPIO_PORT_t *)PORT0_BASE, .pin = (uint8_t)5}, -// .sda_config = {.mode = XMC_GPIO_MODE_OUTPUT_OPEN_DRAIN_ALT2, -// .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH}, -// .scl = {.port = (XMC_GPIO_PORT_t *)PORT0_BASE, .pin = (uint8_t)11}, -// .scl_config = {.mode = XMC_GPIO_MODE_OUTPUT_OPEN_DRAIN_ALT2, -// .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH}, -// .input_source_dx0 = XMC_INPUT_B, -// .input_source_dx1 = XMC_INPUT_A, -// .slave_receive_irq_num = (IRQn_Type)93, -// .slave_receive_irq_service_request = 3, -// .protocol_irq_num = (IRQn_Type)94, -// .protocol_irq_service_request = 4}; - -// // XMC_I2S instance -// XMC_I2S_t i2s_config = {.input_config = {.mode = XMC_GPIO_MODE_INPUT_TRISTATE, -// .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH}, -// .sclk_config = {.mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT1, -// .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH}, -// .wa_config = {.mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT1, -// .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH}, -// .protocol_irq_num = (IRQn_Type)USIC2_2_IRQn, -// .protocol_irq_service_request = 2}; - -// // XMC CAN instance -// #ifdef CAN_xmc -// XMC_ARD_CAN_t XMC_CAN_0 = {.can_node = CAN_NODE1, -// .can_node_num = XMC_NODE_NUM_1, -// .can_clock = XMC_CAN_CANCLKSRC_FPERI, -// .can_frequency = (uint32_t)144000000, -// .rx = {.port = (XMC_GPIO_PORT_t *)PORT1_BASE, .pin = (uint8_t)13}, -// .rx_config = {.mode = XMC_GPIO_MODE_INPUT_TRISTATE}, -// .tx = {.port = (XMC_GPIO_PORT_t *)PORT1_BASE, .pin = (uint8_t)12}, -// .tx_config = {.mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT2}, -// .node_input = CAN_NODE1_RXD_P1_13, -// .irq_num = CAN0_7_IRQn, -// .irq_service_request = 7u}; -// #endif +/* + * UART objects + * + * Serial 0 is Debug port + * Serial 1 is on-board port + */ +arduino::RingBuffer rx_buffer_0; +arduino::RingBuffer rx_buffer_1; + +XMC_UART_t XMC_UART_0 = { + .channel = XMC_UART0_CH0, + .rx = {.port = (XMC_GPIO_PORT_t *)PORT1_BASE, .pin = (uint8_t)4}, + .rx_config = {.mode = XMC_GPIO_MODE_INPUT_TRISTATE, + .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH, + .output_strength = XMC_GPIO_OUTPUT_STRENGTH_STRONG_SOFT_EDGE}, + .tx = {.port = (XMC_GPIO_PORT_t *)PORT1_BASE, .pin = (uint8_t)5}, + .tx_config = {.mode = (XMC_GPIO_MODE_t)XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT2, + .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH, + .output_strength = XMC_GPIO_OUTPUT_STRENGTH_STRONG_SOFT_EDGE}, + .input_source_dx0 = (XMC_USIC_INPUT_t)USIC0_C0_DX0_P1_4, + .input_source_dx1 = XMC_INPUT_INVALID, + .input_source_dx2 = XMC_INPUT_INVALID, + .input_source_dx3 = XMC_INPUT_INVALID, + .irq_num = USIC0_0_IRQn, + .irq_service_request = 0}; + +XMC_UART_t XMC_UART_1 = { + .channel = XMC_UART1_CH0, + .rx = {.port = (XMC_GPIO_PORT_t *)PORT2_BASE, .pin = (uint8_t)15}, + .rx_config = {.mode = XMC_GPIO_MODE_INPUT_TRISTATE, + .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH, + .output_strength = XMC_GPIO_OUTPUT_STRENGTH_STRONG_SOFT_EDGE}, + .tx = {.port = (XMC_GPIO_PORT_t *)PORT2_BASE, .pin = (uint8_t)14}, + .tx_config = {.mode = (XMC_GPIO_MODE_t)XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT2, + .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH, + .output_strength = XMC_GPIO_OUTPUT_STRENGTH_STRONG_SOFT_EDGE}, + .input_source_dx0 = (XMC_USIC_INPUT_t)USIC1_C0_DX0_P2_15, + .input_source_dx1 = XMC_INPUT_INVALID, + .input_source_dx2 = XMC_INPUT_INVALID, + .input_source_dx3 = XMC_INPUT_INVALID, + .irq_num = USIC1_0_IRQn, + .irq_service_request = 0}; + +// Debug port +Uart Serial(&XMC_UART_0, &rx_buffer_0); +// On-board port +Uart Serial1(&XMC_UART_1, &rx_buffer_1); + + // // Three SPI instances possible + // XMC_SPI_t XMC_SPI_0 = { + // .channel = XMC_SPI2_CH0, + // .channel_config = {.baudrate = 20003906U, + // .bus_mode = (XMC_SPI_CH_BUS_MODE_t)XMC_SPI_CH_BUS_MODE_MASTER, + // .selo_inversion = XMC_SPI_CH_SLAVE_SEL_INV_TO_MSLS, + // .parity_mode = XMC_USIC_CH_PARITY_MODE_NONE}, + // .mosi = {.port = (XMC_GPIO_PORT_t *)PORT3_BASE, .pin = (uint8_t)8}, + // .mosi_config = {.mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT1, + // .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH, + // .output_strength = XMC_GPIO_OUTPUT_STRENGTH_MEDIUM}, + // .miso = {.port = (XMC_GPIO_PORT_t *)PORT3_BASE, .pin = (uint8_t)7}, + // .miso_config = + // { + // .mode = XMC_GPIO_MODE_INPUT_TRISTATE, + // }, + // .input_source = XMC_INPUT_C, + // .sclkout = {.port = (XMC_GPIO_PORT_t *)PORT3_BASE, .pin = (uint8_t)9}, + // .sclkout_config = {.mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT1, + // .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH, + // .output_strength = XMC_GPIO_OUTPUT_STRENGTH_MEDIUM}, + // }; + + // XMC_SPI_t XMC_SPI_1 = { + // .channel = XMC_SPI0_CH1, + // .channel_config = {.baudrate = 20003906U, + // .bus_mode = (XMC_SPI_CH_BUS_MODE_t)XMC_SPI_CH_BUS_MODE_MASTER, + // .selo_inversion = XMC_SPI_CH_SLAVE_SEL_INV_TO_MSLS, + // .parity_mode = XMC_USIC_CH_PARITY_MODE_NONE}, + // .mosi = {.port = (XMC_GPIO_PORT_t *)PORT3_BASE, .pin = (uint8_t)5}, + // .mosi_config = {.mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT4, + // .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH, + // .output_strength = XMC_GPIO_OUTPUT_STRENGTH_MEDIUM}, + // .miso = {.port = (XMC_GPIO_PORT_t *)PORT4_BASE, .pin = (uint8_t)0}, + // .miso_config = + // { + // .mode = XMC_GPIO_MODE_INPUT_TRISTATE, + // }, + // .input_source = XMC_INPUT_E, + // .sclkout = {.port = (XMC_GPIO_PORT_t *)PORT3_BASE, .pin = (uint8_t)6}, + // .sclkout_config = {.mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT4, + // .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH, + // .output_strength = XMC_GPIO_OUTPUT_STRENGTH_MEDIUM}, + // }; + + // XMC_SPI_t XMC_SPI_2 = { + // .channel = XMC_SPI2_CH1, + // .channel_config = {.baudrate = 20003906U, + // .bus_mode = (XMC_SPI_CH_BUS_MODE_t)XMC_SPI_CH_BUS_MODE_MASTER, + // .selo_inversion = XMC_SPI_CH_SLAVE_SEL_INV_TO_MSLS, + // .parity_mode = XMC_USIC_CH_PARITY_MODE_NONE}, + // .mosi = {.port = (XMC_GPIO_PORT_t *)PORT3_BASE, .pin = (uint8_t)11}, + // .mosi_config = {.mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT1, + // .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH, + // .output_strength = XMC_GPIO_OUTPUT_STRENGTH_MEDIUM}, + // .miso = {.port = (XMC_GPIO_PORT_t *)PORT3_BASE, .pin = (uint8_t)12}, + // .miso_config = + // { + // .mode = XMC_GPIO_MODE_INPUT_TRISTATE, + // }, + // .input_source = XMC_INPUT_D, + // .sclkout = {.port = (XMC_GPIO_PORT_t *)PORT3_BASE, .pin = (uint8_t)13}, + // .sclkout_config = {.mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT1, + // .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH, + // .output_strength = XMC_GPIO_OUTPUT_STRENGTH_MEDIUM}, + // }; + + // Only two serial objects are possible: Serial and Serial1 so anymore serial interfaces has to + // overwrite/reuse the existing serial objects + // Will overwrite Serial + // XMC_SPI_t XMC_SPI_3 = + //{ + // .channel = XMC_SPI0_CH0, + // .channel_config = { + // .baudrate = 20003906U, + // .bus_mode = (XMC_SPI_CH_BUS_MODE_t)XMC_SPI_CH_BUS_MODE_MASTER, + // .selo_inversion = XMC_SPI_CH_SLAVE_SEL_INV_TO_MSLS, + // .parity_mode = XMC_USIC_CH_PARITY_MODE_NONE + // }, + // .mosi = { + // .port = (XMC_GPIO_PORT_t*)PORT5_BASE, + // .pin = (uint8_t)1 + // }, + // .mosi_config = { + // .mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT1, + // .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH, + // .output_strength = XMC_GPIO_OUTPUT_STRENGTH_MEDIUM + // }, + // .miso = { + // .port = (XMC_GPIO_PORT_t*)PORT5_BASE, + // .pin = (uint8_t)0 + // }, + // .miso_config = { + // .mode = XMC_GPIO_MODE_INPUT_TRISTATE, + // }, + // .input_source = XMC_INPUT_D, + // .sclkout = { + // .port = (XMC_GPIO_PORT_t*)PORT0_BASE, + // .pin = (uint8_t)8 + // }, + // .sclkout_config = { + // .mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT2, + // .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH, + // .output_strength = XMC_GPIO_OUTPUT_STRENGTH_MEDIUM + // }, + // }; + + // Will overwrite Serial1 + // XMC_SPI_t XMC_SPI_4 = + //{ + // .channel = XMC_SPI1_CH0, + // .channel_config = { + // .baudrate = 20003906U, + // .bus_mode = (XMC_SPI_CH_BUS_MODE_t)XMC_SPI_CH_BUS_MODE_MASTER, + // .selo_inversion = XMC_SPI_CH_SLAVE_SEL_INV_TO_MSLS, + // .parity_mode = XMC_USIC_CH_PARITY_MODE_NONE + // }, + // .mosi = { + // .port = (XMC_GPIO_PORT_t*)PORT0_BASE, + // .pin = (uint8_t)5 + // }, + // .mosi_config = { + // .mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT2, + // .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH, + // .output_strength = XMC_GPIO_OUTPUT_STRENGTH_MEDIUM + // }, + // .miso = { + // .port = (XMC_GPIO_PORT_t*)PORT0_BASE, + // .pin = (uint8_t)4 + // }, + // .miso_config = { + // .mode = XMC_GPIO_MODE_INPUT_TRISTATE, + // }, + // .input_source = XMC_INPUT_A, + // .sclkout = { + // .port = (XMC_GPIO_PORT_t*)PORT0_BASE, + // .pin = (uint8_t)11 + // }, + // .sclkout_config = { + // .mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT2, + // .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH, + // .output_strength = XMC_GPIO_OUTPUT_STRENGTH_MEDIUM + // }, + //}; + + // Two I2C instances possible + // XMC_I2C_t XMC_I2C_0 = {.channel = XMC_I2C1_CH1, + // .channel_config = {.baudrate = (uint32_t)(100000U), .address = 0U}, + // .sda = {.port = (XMC_GPIO_PORT_t *)PORT3_BASE, .pin = (uint8_t)15}, + // .sda_config = {.mode = XMC_GPIO_MODE_OUTPUT_OPEN_DRAIN_ALT2, + // .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH}, + // .scl = {.port = (XMC_GPIO_PORT_t *)PORT0_BASE, .pin = (uint8_t)13}, + // .scl_config = {.mode = XMC_GPIO_MODE_OUTPUT_OPEN_DRAIN_ALT2, + // .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH}, + // .input_source_dx0 = XMC_INPUT_A, + // .input_source_dx1 = XMC_INPUT_B, + // .slave_receive_irq_num = (IRQn_Type)91, + // .slave_receive_irq_service_request = 1, + // .protocol_irq_num = (IRQn_Type)92, + // .protocol_irq_service_request = 2}; + // XMC_I2C_t XMC_I2C_1 = {.channel = XMC_I2C1_CH0, + // .channel_config = {.baudrate = (uint32_t)(100000U), .address = 0U}, + // .sda = {.port = (XMC_GPIO_PORT_t *)PORT0_BASE, .pin = (uint8_t)5}, + // .sda_config = {.mode = XMC_GPIO_MODE_OUTPUT_OPEN_DRAIN_ALT2, + // .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH}, + // .scl = {.port = (XMC_GPIO_PORT_t *)PORT0_BASE, .pin = (uint8_t)11}, + // .scl_config = {.mode = XMC_GPIO_MODE_OUTPUT_OPEN_DRAIN_ALT2, + // .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH}, + // .input_source_dx0 = XMC_INPUT_B, + // .input_source_dx1 = XMC_INPUT_A, + // .slave_receive_irq_num = (IRQn_Type)93, + // .slave_receive_irq_service_request = 3, + // .protocol_irq_num = (IRQn_Type)94, + // .protocol_irq_service_request = 4}; + + // // XMC_I2S instance + // XMC_I2S_t i2s_config = {.input_config = {.mode = XMC_GPIO_MODE_INPUT_TRISTATE, + // .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH}, + // .sclk_config = {.mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT1, + // .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH}, + // .wa_config = {.mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT1, + // .output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH}, + // .protocol_irq_num = (IRQn_Type)USIC2_2_IRQn, + // .protocol_irq_service_request = 2}; + + // // XMC CAN instance + // #ifdef CAN_xmc + // XMC_ARD_CAN_t XMC_CAN_0 = {.can_node = CAN_NODE1, + // .can_node_num = XMC_NODE_NUM_1, + // .can_clock = XMC_CAN_CANCLKSRC_FPERI, + // .can_frequency = (uint32_t)144000000, + // .rx = {.port = (XMC_GPIO_PORT_t *)PORT1_BASE, .pin = (uint8_t)13}, + // .rx_config = {.mode = XMC_GPIO_MODE_INPUT_TRISTATE}, + // .tx = {.port = (XMC_GPIO_PORT_t *)PORT1_BASE, .pin = (uint8_t)12}, + // .tx_config = {.mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL_ALT2}, + // .node_input = CAN_NODE1_RXD_P1_13, + // .irq_num = CAN0_7_IRQn, + // .irq_service_request = 7u}; + // #endif + + // Serial Interrupt and event handling + #ifdef __cplusplus +extern "C" { + #endif +void serialEventRun(); +void serialEvent() __attribute__((weak)); +void serialEvent1() __attribute__((weak)); + +void serialEventRun() { + if (serialEvent) { + if (Serial.available()) + serialEvent(); + } + if (serialEvent1) { + if (Serial1.available()) + serialEvent1(); + } +} + +void USIC0_0_IRQHandler() { Serial.IrqHandler(); } + +void USIC1_0_IRQHandler() { Serial1.IrqHandler(); } + #ifdef __cplusplus +} + #endif -// // Serial Interrupt and event handling -// #ifdef __cplusplus -// extern "C" { -// #endif -// void serialEventRun(); -// void serialEvent() __attribute__((weak)); -// void serialEvent1() __attribute__((weak)); - -// void serialEventRun() { -// if (serialEvent) { -// if (Serial.available()) -// serialEvent(); -// } -// if (serialEvent1) { -// if (Serial1.available()) -// serialEvent1(); -// } -// } - -// void USIC0_0_IRQHandler() { Serial.IrqHandler(); } - -// void USIC1_0_IRQHandler() { Serial1.IrqHandler(); } -// #ifdef __cplusplus -// } -// #endif #endif /* ARDUINO_MAIN */ -// #ifdef __cplusplus -// extern HardwareSerial Serial; -// extern HardwareSerial Serial1; -// #endif /* cplusplus */ - #endif /* PINS_ARDUINO_H_ */