#include <stdlib.h>
#include <stdio.h>
#include "swi_uart_samd21_asf.h"
#include "basic/atca_helpers.h"
static struct usart_config config_usart;
struct port_config pin_conf;
ATCA_STATUS swi_uart_init(ATCASWIMaster_t *instance)
{
#ifdef DEBUG_PIN
port_get_config_defaults(&pin_conf);
pin_conf.direction = PORT_PIN_DIR_OUTPUT;
port_pin_set_config(DEBUG_PIN_1, &pin_conf);
port_pin_set_config(DEBUG_PIN_2, &pin_conf);
port_pin_set_output_level(DEBUG_PIN_1, HIGH);
port_pin_set_output_level(DEBUG_PIN_2, HIGH);
#endif
ATCA_STATUS status = ATCA_SUCCESS;
usart_get_config_defaults(&config_usart);
config_usart.character_size = USART_CHARACTER_SIZE_7BIT;
config_usart.parity = USART_PARITY_NONE;
config_usart.stopbits = USART_STOPBITS_1;
config_usart.baudrate = 230400;
#ifdef __SAMD21J18A__
config_usart.mux_setting = EXT3_UART_SERCOM_MUX_SETTING;
config_usart.pinmux_pad0 = EXT3_UART_SERCOM_PINMUX_PAD0;
config_usart.pinmux_pad1 = EXT3_UART_SERCOM_PINMUX_PAD1;
config_usart.pinmux_pad2 = EXT3_UART_SERCOM_PINMUX_PAD2;
config_usart.pinmux_pad3 = EXT3_UART_SERCOM_PINMUX_PAD3;
#endif
#ifdef __SAMR21G18A__
config_usart.mux_setting = EXT1_UART_SERCOM_MUX_SETTING;
config_usart.pinmux_pad0 = EXT1_UART_SERCOM_PINMUX_PAD0;
config_usart.pinmux_pad1 = EXT1_UART_SERCOM_PINMUX_PAD1;
config_usart.pinmux_pad2 = EXT1_UART_SERCOM_PINMUX_PAD2;
config_usart.pinmux_pad3 = EXT1_UART_SERCOM_PINMUX_PAD3;
#endif
switch (instance->bus_index)
{
case 0: status = usart_init(&(instance->usart_instance), SERCOM0, &config_usart); break;
case 1: status = usart_init(&(instance->usart_instance), SERCOM1, &config_usart); break;
case 2: status = usart_init(&(instance->usart_instance), SERCOM2, &config_usart); break;
case 3: status = usart_init(&(instance->usart_instance), SERCOM3, &config_usart); break;
case 4: status = usart_init(&(instance->usart_instance), SERCOM4, &config_usart); break;
case 5: status = usart_init(&(instance->usart_instance), SERCOM5, &config_usart); break;
}
usart_enable(&(instance->usart_instance));
return status;
}
ATCA_STATUS swi_uart_deinit(ATCASWIMaster_t *instance)
{
ATCA_STATUS status = ATCA_SUCCESS;
usart_reset(&(instance->usart_instance));
return status;
}
void swi_uart_setbaud(ATCASWIMaster_t *instance, uint32_t baudrate)
{
usart_disable(&(instance->usart_instance));
config_usart.baudrate = baudrate;
switch (instance->bus_index)
{
case 0: usart_init(&(instance->usart_instance), SERCOM0, &config_usart); break;
case 1: usart_init(&(instance->usart_instance), SERCOM1, &config_usart); break;
case 2: usart_init(&(instance->usart_instance), SERCOM2, &config_usart); break;
case 3: usart_init(&(instance->usart_instance), SERCOM3, &config_usart); break;
case 4: usart_init(&(instance->usart_instance), SERCOM4, &config_usart); break;
case 5: usart_init(&(instance->usart_instance), SERCOM5, &config_usart); break;
}
usart_enable(&(instance->usart_instance));
}
void swi_uart_mode(ATCASWIMaster_t *instance, uint8_t mode)
{
usart_disable(&(instance->usart_instance));
usart_enable(&(instance->usart_instance));
}
void swi_uart_discover_buses(int swi_uart_buses[], int max_buses)
{
swi_uart_buses[0] = 4; }
ATCA_STATUS swi_uart_send_byte(ATCASWIMaster_t *instance, uint8_t data)
{
int8_t retries = 90;
uint16_t bitdata = (uint16_t)data;
#ifdef DEBUG_PIN
port_pin_toggle_output_level(DEBUG_PIN_1);
#endif
while ((retries > 0) && (usart_write_wait(&(instance->usart_instance), bitdata) != STATUS_OK))
{
retries--;
}
#ifdef DEBUG_PIN
port_pin_toggle_output_level(DEBUG_PIN_1);
#endif
if (retries <= 0x00)
{
return ATCA_TIMEOUT;
}
else
{
return ATCA_SUCCESS;
}
}
ATCA_STATUS swi_uart_receive_byte(ATCASWIMaster_t *instance, uint8_t *data)
{
uint8_t retries = 100; uint16_t bitdata = 0x00;
#ifdef DEBUG_PIN
port_pin_toggle_output_level(DEBUG_PIN_2);
#endif
while ((retries > 0) && (usart_read_wait(&(instance->usart_instance), &bitdata) != STATUS_OK))
{
retries--;
}
#ifdef DEBUG_PIN
port_pin_toggle_output_level(DEBUG_PIN_2);
#endif
*data = bitdata;
if (retries <= 0x00)
{
return ATCA_TIMEOUT;
}
else
{
return ATCA_SUCCESS;
}
}