static void uart_gecko_init_pins(struct device *dev) { const struct uart_gecko_config *config = dev->config->config_info; soc_gpio_configure(&config->pin_rx); soc_gpio_configure(&config->pin_tx); #ifdef CONFIG_SOC_GECKO_HAS_INDIVIDUAL_PIN_LOCATION config->base->ROUTEPEN = USART_ROUTEPEN_RXPEN | USART_ROUTEPEN_TXPEN; config->base->ROUTELOC0 = (config->loc_tx << _USART_ROUTELOC0_TXLOC_SHIFT) | (config->loc_rx << _USART_ROUTELOC0_RXLOC_SHIFT); config->base->ROUTELOC1 = _USART_ROUTELOC1_RESETVALUE; #else config->base->ROUTE = USART_ROUTE_RXPEN | USART_ROUTE_TXPEN | (config->loc << 8); #endif }
static int usart_sam_init(struct device *dev) { int retval; const struct usart_sam_dev_cfg *const cfg = DEV_CFG(dev); struct usart_sam_dev_data *const dev_data = DEV_DATA(dev); Usart *const usart = cfg->regs; /* Enable USART clock in PMC */ soc_pmc_peripheral_enable(cfg->periph_id); /* Connect pins to the peripheral */ soc_gpio_configure(&cfg->pin_rx); soc_gpio_configure(&cfg->pin_tx); /* Reset and disable USART */ usart->US_CR = US_CR_RSTRX | US_CR_RSTTX | US_CR_RXDIS | US_CR_TXDIS | US_CR_RSTSTA; /* Disable Interrupts */ usart->US_IDR = 0xFFFFFFFF; /* 8 bits of data, no parity, 1 stop bit in normal mode */ usart->US_MR = US_MR_NBSTOP_1_BIT | US_MR_PAR_NO | US_MR_CHRL_8_BIT | US_MR_USCLKS_MCK | US_MR_CHMODE_NORMAL; /* Set baud rate */ retval = baudrate_set(usart, dev_data->baud_rate, SOC_ATMEL_SAM_MCK_FREQ_HZ); if (retval != 0) { return retval; }; /* Enable receiver and transmitter */ usart->US_CR = US_CR_RXEN | US_CR_TXEN; #ifdef CONFIG_UART_INTERRUPT_DRIVEN cfg->irq_config_func(dev); #endif /* CONFIG_UART_INTERRUPT_DRIVEN */ return 0; }