cuart: allow getting the icc baud rate and clock freq
Change-Id: I577907e6c60582a80666d43b17c20de4e03cc8df
This commit is contained in:
parent
587d4fbb88
commit
9970ca0be7
|
@ -30,6 +30,8 @@ enum card_uart_ctl {
|
|||
CUART_CTL_RST, /* enable/disable ICC reset */
|
||||
CUART_CTL_WTIME, /* set the waiting time (in etu) */
|
||||
CUART_CTL_SET_FD,
|
||||
CUART_CTL_GET_BAUDRATE,
|
||||
CUART_CTL_GET_CLOCK_FREQ,
|
||||
};
|
||||
|
||||
struct card_uart;
|
||||
|
@ -100,6 +102,7 @@ struct card_uart {
|
|||
uint8_t slot_nr;
|
||||
/* in us, required, no delay breaks _rx_ */
|
||||
uint32_t extrawait_after_rx;
|
||||
uint32_t current_baudrate;
|
||||
} asf4;
|
||||
} u;
|
||||
};
|
||||
|
|
|
@ -203,6 +203,9 @@ static bool slot_set_baudrate(uint8_t slotnr, uint32_t baudrate)
|
|||
if (NULL == slot) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// update cached values
|
||||
cuart->u.asf4.current_baudrate = baudrate;
|
||||
printf("(%u) switching SERCOM clock to GCLK%u (freq = %lu kHz) and baud rate to %lu bps (baud = %u)\r\n", slotnr, (best + 1) * 2, (uint32_t)(round(sercom_glck_freqs[best] / 1000)), baudrate, bauds[best]);
|
||||
while (!usart_async_is_tx_empty(slot)); // wait for transmission to complete (WARNING no timeout)
|
||||
usart_async_disable(slot); // disable SERCOM peripheral
|
||||
|
@ -404,6 +407,12 @@ static int asf4_usart_ctrl(struct card_uart *cuart, enum card_uart_ctl ctl, int
|
|||
uint32_t baudrate = (20e6/divider)/arg;
|
||||
cuart->u.asf4.extrawait_after_rx = 1./baudrate * 1000 * 1000;
|
||||
slot_set_baudrate(cuart->u.asf4.slot_nr, baudrate);
|
||||
case CUART_CTL_GET_BAUDRATE:
|
||||
return cuart->u.asf4.current_baudrate;
|
||||
break;
|
||||
case CUART_CTL_GET_CLOCK_FREQ:
|
||||
ncn8025_get(cuart->u.asf4.slot_nr, &settings);
|
||||
return 20e6 / ncn8025_div_val[settings.clkdiv];
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
|
|
Loading…
Reference in New Issue