mirror of https://github.com/ARMmbed/mbed-os.git
parent
6392162d32
commit
ae108230e6
|
@ -145,7 +145,6 @@ void analogin_init(analogin_t *obj, PinName pin)
|
||||||
{
|
{
|
||||||
uint32_t pos_input;
|
uint32_t pos_input;
|
||||||
static uint8_t init_flag = 0;
|
static uint8_t init_flag = 0;
|
||||||
struct system_pinmux_config config;
|
|
||||||
|
|
||||||
switch(pin) {
|
switch(pin) {
|
||||||
case PA04:
|
case PA04:
|
||||||
|
|
|
@ -35,4 +35,5 @@ void port_write(port_t *obj, int value)
|
||||||
|
|
||||||
int port_read(port_t *obj)
|
int port_read(port_t *obj)
|
||||||
{
|
{
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -104,6 +104,8 @@ static inline void reset_usart(serial_t *obj)
|
||||||
|
|
||||||
uint32_t serial_find_mux_settings (serial_t *obj)
|
uint32_t serial_find_mux_settings (serial_t *obj)
|
||||||
{
|
{
|
||||||
|
/* Sanity check arguments */
|
||||||
|
MBED_ASSERT(obj);
|
||||||
uint32_t mux_setting = 0;
|
uint32_t mux_setting = 0;
|
||||||
uint32_t pinpad[4] = {0};
|
uint32_t pinpad[4] = {0};
|
||||||
uint8_t i = 0;
|
uint8_t i = 0;
|
||||||
|
@ -144,9 +146,10 @@ uint32_t serial_find_mux_settings (serial_t *obj)
|
||||||
return mux_setting;
|
return mux_setting;
|
||||||
}
|
}
|
||||||
|
|
||||||
static enum status_code usart_set_config_default( serial_t *obj)
|
static enum status_code usart_set_config_default(serial_t *obj)
|
||||||
{
|
{
|
||||||
|
/* Sanity check arguments */
|
||||||
|
MBED_ASSERT(obj);
|
||||||
/* Index for generic clock */
|
/* Index for generic clock */
|
||||||
uint32_t sercom_index = _sercom_get_sercom_inst_index(pUSART_S(obj));
|
uint32_t sercom_index = _sercom_get_sercom_inst_index(pUSART_S(obj));
|
||||||
uint32_t gclk_index = sercom_index + SERCOM0_GCLK_ID_CORE;
|
uint32_t gclk_index = sercom_index + SERCOM0_GCLK_ID_CORE;
|
||||||
|
@ -209,6 +212,8 @@ static enum status_code usart_set_config_default( serial_t *obj)
|
||||||
|
|
||||||
void get_default_serial_values(serial_t *obj)
|
void get_default_serial_values(serial_t *obj)
|
||||||
{
|
{
|
||||||
|
/* Sanity check arguments */
|
||||||
|
MBED_ASSERT(obj);
|
||||||
/* Set default config to object */
|
/* Set default config to object */
|
||||||
pSERIAL_S(obj)->parity = USART_PARITY_NONE;
|
pSERIAL_S(obj)->parity = USART_PARITY_NONE;
|
||||||
pSERIAL_S(obj)->stopbits = USART_STOPBITS_1;
|
pSERIAL_S(obj)->stopbits = USART_STOPBITS_1;
|
||||||
|
@ -219,6 +224,8 @@ void get_default_serial_values(serial_t *obj)
|
||||||
|
|
||||||
void serial_init(serial_t *obj, PinName tx, PinName rx)
|
void serial_init(serial_t *obj, PinName tx, PinName rx)
|
||||||
{
|
{
|
||||||
|
/* Sanity check arguments */
|
||||||
|
MBED_ASSERT(obj);
|
||||||
if (g_sys_init == 0) {
|
if (g_sys_init == 0) {
|
||||||
system_init();
|
system_init();
|
||||||
g_sys_init = 1;
|
g_sys_init = 1;
|
||||||
|
@ -242,7 +249,7 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
|
||||||
|
|
||||||
muxsetting = serial_find_mux_settings(obj); // getting mux setting from pins
|
muxsetting = serial_find_mux_settings(obj); // getting mux setting from pins
|
||||||
sercom_index = pinmap_merge_sercom(tx, rx); // same variable sercom_index reused for optimization
|
sercom_index = pinmap_merge_sercom(tx, rx); // same variable sercom_index reused for optimization
|
||||||
if (sercom_index == NC) {
|
if (sercom_index == (uint32_t)NC) {
|
||||||
/*expecting a valid value for sercom index*/
|
/*expecting a valid value for sercom index*/
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -279,11 +286,10 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
|
||||||
pin_conf.input_pull = SYSTEM_PINMUX_PIN_PULL_NONE;
|
pin_conf.input_pull = SYSTEM_PINMUX_PIN_PULL_NONE;
|
||||||
pin_conf.powersave = false;
|
pin_conf.powersave = false;
|
||||||
|
|
||||||
uint32_t mux_func;
|
|
||||||
/* Configure the SERCOM pins according to the user configuration */
|
/* Configure the SERCOM pins according to the user configuration */
|
||||||
for (uint8_t pad = 0; pad < 4; pad++) {
|
for (uint8_t pad = 0; pad < 4; pad++) {
|
||||||
uint32_t current_pin = pSERIAL_S(obj)->pins[pad];
|
uint32_t current_pin = pSERIAL_S(obj)->pins[pad];
|
||||||
if (current_pin != NC) {
|
if (current_pin != (uint32_t)NC) {
|
||||||
pin_conf.mux_position = pinmap_function_sercom(current_pin, sercom_index);
|
pin_conf.mux_position = pinmap_function_sercom(current_pin, sercom_index);
|
||||||
if ((uint8_t)NC != pin_conf.mux_position) {
|
if ((uint8_t)NC != pin_conf.mux_position) {
|
||||||
system_pinmux_pin_set_config(current_pin, &pin_conf);
|
system_pinmux_pin_set_config(current_pin, &pin_conf);
|
||||||
|
@ -304,12 +310,16 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
|
||||||
|
|
||||||
void serial_free(serial_t *obj)
|
void serial_free(serial_t *obj)
|
||||||
{
|
{
|
||||||
|
/* Sanity check arguments */
|
||||||
|
MBED_ASSERT(obj);
|
||||||
serial_irq_ids[serial_get_index(obj)] = 0;
|
serial_irq_ids[serial_get_index(obj)] = 0;
|
||||||
disable_usart(obj);
|
disable_usart(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
void serial_baud(serial_t *obj, int baudrate)
|
void serial_baud(serial_t *obj, int baudrate)
|
||||||
{
|
{
|
||||||
|
/* Sanity check arguments */
|
||||||
|
MBED_ASSERT(obj);
|
||||||
MBED_ASSERT((baudrate == 110) || (baudrate == 150) || (baudrate == 300) || (baudrate == 1200) ||
|
MBED_ASSERT((baudrate == 110) || (baudrate == 150) || (baudrate == 300) || (baudrate == 1200) ||
|
||||||
(baudrate == 2400) || (baudrate == 4800) || (baudrate == 9600) || (baudrate == 19200) || (baudrate == 38400) ||
|
(baudrate == 2400) || (baudrate == 4800) || (baudrate == 9600) || (baudrate == 19200) || (baudrate == 38400) ||
|
||||||
(baudrate == 57600) || (baudrate == 115200) || (baudrate == 230400) || (baudrate == 460800) || (baudrate == 921600) );
|
(baudrate == 57600) || (baudrate == 115200) || (baudrate == 230400) || (baudrate == 460800) || (baudrate == 921600) );
|
||||||
|
@ -348,6 +358,8 @@ void serial_baud(serial_t *obj, int baudrate)
|
||||||
|
|
||||||
void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits)
|
void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits)
|
||||||
{
|
{
|
||||||
|
/* Sanity check arguments */
|
||||||
|
MBED_ASSERT(obj);
|
||||||
MBED_ASSERT((stop_bits == 1) || (stop_bits == 2));
|
MBED_ASSERT((stop_bits == 1) || (stop_bits == 2));
|
||||||
MBED_ASSERT((parity == ParityNone) || (parity == ParityOdd) || (parity == ParityEven));
|
MBED_ASSERT((parity == ParityNone) || (parity == ParityOdd) || (parity == ParityEven));
|
||||||
MBED_ASSERT((data_bits == 5) || (data_bits == 6) || (data_bits == 7) || (data_bits == 8) /*|| (data_bits == 9)*/);
|
MBED_ASSERT((data_bits == 5) || (data_bits == 6) || (data_bits == 7) || (data_bits == 8) /*|| (data_bits == 9)*/);
|
||||||
|
@ -439,9 +451,10 @@ void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_b
|
||||||
|
|
||||||
void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, PinName txflow)
|
void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, PinName txflow)
|
||||||
{
|
{
|
||||||
|
/* Sanity check arguments */
|
||||||
|
MBED_ASSERT(obj);
|
||||||
uint32_t muxsetting = 0;
|
uint32_t muxsetting = 0;
|
||||||
uint32_t sercom_index = 0;
|
uint32_t sercom_index = 0;
|
||||||
uint32_t mux_func;
|
|
||||||
IRQn_Type irq_n = (IRQn_Type)0;
|
IRQn_Type irq_n = (IRQn_Type)0;
|
||||||
uint32_t vector = 0;
|
uint32_t vector = 0;
|
||||||
|
|
||||||
|
@ -449,7 +462,7 @@ void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, Pi
|
||||||
pSERIAL_S(obj)->pins[USART_TXFLOW_INDEX] = txflow;
|
pSERIAL_S(obj)->pins[USART_TXFLOW_INDEX] = txflow;
|
||||||
muxsetting = serial_find_mux_settings(obj); // getting mux setting from pins
|
muxsetting = serial_find_mux_settings(obj); // getting mux setting from pins
|
||||||
sercom_index = pinmap_merge_sercom(pSERIAL_S(obj)->pins[USART_TX_INDEX], pSERIAL_S(obj)->pins[USART_RX_INDEX]); // same variable sercom_index reused for optimization
|
sercom_index = pinmap_merge_sercom(pSERIAL_S(obj)->pins[USART_TX_INDEX], pSERIAL_S(obj)->pins[USART_RX_INDEX]); // same variable sercom_index reused for optimization
|
||||||
if (sercom_index == NC) {
|
if (sercom_index == (uint32_t)NC) {
|
||||||
/*expecting a valid value for sercom index*/
|
/*expecting a valid value for sercom index*/
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -470,7 +483,7 @@ void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, Pi
|
||||||
|
|
||||||
for (uint8_t pad = 0; pad < 2; pad++) { // setting for rx and tx
|
for (uint8_t pad = 0; pad < 2; pad++) { // setting for rx and tx
|
||||||
uint32_t current_pin = pSERIAL_S(obj)->pins[pad];
|
uint32_t current_pin = pSERIAL_S(obj)->pins[pad];
|
||||||
if (current_pin != NC) {
|
if (current_pin != (uint32_t)NC) {
|
||||||
pin_conf.mux_position = pinmap_function_sercom(current_pin, sercom_index);
|
pin_conf.mux_position = pinmap_function_sercom(current_pin, sercom_index);
|
||||||
if ((uint8_t)NC != pin_conf.mux_position) {
|
if ((uint8_t)NC != pin_conf.mux_position) {
|
||||||
system_pinmux_pin_set_config(current_pin, &pin_conf);
|
system_pinmux_pin_set_config(current_pin, &pin_conf);
|
||||||
|
@ -504,6 +517,8 @@ void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, Pi
|
||||||
|
|
||||||
void serial_break_set(serial_t *obj)
|
void serial_break_set(serial_t *obj)
|
||||||
{
|
{
|
||||||
|
/* Sanity check arguments */
|
||||||
|
MBED_ASSERT(obj);
|
||||||
struct system_pinmux_config pin_conf;
|
struct system_pinmux_config pin_conf;
|
||||||
pin_conf.direction = SYSTEM_PINMUX_PIN_DIR_OUTPUT;
|
pin_conf.direction = SYSTEM_PINMUX_PIN_DIR_OUTPUT;
|
||||||
pin_conf.input_pull = SYSTEM_PINMUX_PIN_PULL_NONE;
|
pin_conf.input_pull = SYSTEM_PINMUX_PIN_PULL_NONE;
|
||||||
|
@ -517,6 +532,8 @@ void serial_break_set(serial_t *obj)
|
||||||
|
|
||||||
void serial_break_clear(serial_t *obj)
|
void serial_break_clear(serial_t *obj)
|
||||||
{
|
{
|
||||||
|
/* Sanity check arguments */
|
||||||
|
MBED_ASSERT(obj);
|
||||||
uint32_t sercom_index = pinmap_merge_sercom(pSERIAL_S(obj)->pins[USART_TX_INDEX], pSERIAL_S(obj)->pins[USART_RX_INDEX]);
|
uint32_t sercom_index = pinmap_merge_sercom(pSERIAL_S(obj)->pins[USART_TX_INDEX], pSERIAL_S(obj)->pins[USART_RX_INDEX]);
|
||||||
|
|
||||||
struct system_pinmux_config pin_conf;
|
struct system_pinmux_config pin_conf;
|
||||||
|
@ -537,6 +554,8 @@ void serial_break_clear(serial_t *obj)
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
inline uint8_t serial_get_index(serial_t *obj)
|
inline uint8_t serial_get_index(serial_t *obj)
|
||||||
{
|
{
|
||||||
|
/* Sanity check arguments */
|
||||||
|
MBED_ASSERT(obj);
|
||||||
switch ((int)pUSART_S(obj)) {
|
switch ((int)pUSART_S(obj)) {
|
||||||
case UART_0:
|
case UART_0:
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -556,6 +575,7 @@ inline uint8_t serial_get_index(serial_t *obj)
|
||||||
|
|
||||||
static inline void uart_irq(SercomUsart *const usart, uint32_t index)
|
static inline void uart_irq(SercomUsart *const usart, uint32_t index)
|
||||||
{
|
{
|
||||||
|
MBED_ASSERT(usart != (void*)0);
|
||||||
uint16_t interrupt_status;
|
uint16_t interrupt_status;
|
||||||
interrupt_status = usart->INTFLAG.reg;
|
interrupt_status = usart->INTFLAG.reg;
|
||||||
interrupt_status &= usart->INTENSET.reg;
|
interrupt_status &= usart->INTENSET.reg;
|
||||||
|
@ -604,6 +624,8 @@ void uart5_irq()
|
||||||
|
|
||||||
uint32_t get_serial_vector (serial_t *obj)
|
uint32_t get_serial_vector (serial_t *obj)
|
||||||
{
|
{
|
||||||
|
/* Sanity check arguments */
|
||||||
|
MBED_ASSERT(obj);
|
||||||
uint32_t vector = 0;
|
uint32_t vector = 0;
|
||||||
switch ((int)pUSART_S(obj)) {
|
switch ((int)pUSART_S(obj)) {
|
||||||
case UART_0:
|
case UART_0:
|
||||||
|
@ -630,12 +652,16 @@ uint32_t get_serial_vector (serial_t *obj)
|
||||||
|
|
||||||
void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id)
|
void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id)
|
||||||
{
|
{
|
||||||
|
/* Sanity check arguments */
|
||||||
|
MBED_ASSERT(obj);
|
||||||
irq_handler = handler;
|
irq_handler = handler;
|
||||||
serial_irq_ids[serial_get_index(obj)] = id;
|
serial_irq_ids[serial_get_index(obj)] = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
IRQn_Type get_serial_irq_num (serial_t *obj)
|
IRQn_Type get_serial_irq_num (serial_t *obj)
|
||||||
{
|
{
|
||||||
|
/* Sanity check arguments */
|
||||||
|
MBED_ASSERT(obj);
|
||||||
switch ((int)pUSART_S(obj)) {
|
switch ((int)pUSART_S(obj)) {
|
||||||
case UART_0:
|
case UART_0:
|
||||||
return SERCOM0_IRQn;
|
return SERCOM0_IRQn;
|
||||||
|
@ -652,10 +678,13 @@ IRQn_Type get_serial_irq_num (serial_t *obj)
|
||||||
default:
|
default:
|
||||||
MBED_ASSERT(0);
|
MBED_ASSERT(0);
|
||||||
}
|
}
|
||||||
|
return SERCOM0_IRQn; // to avoid warning
|
||||||
}
|
}
|
||||||
|
|
||||||
void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
|
void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
|
||||||
{
|
{
|
||||||
|
/* Sanity check arguments */
|
||||||
|
MBED_ASSERT(obj);
|
||||||
IRQn_Type irq_n = (IRQn_Type)0;
|
IRQn_Type irq_n = (IRQn_Type)0;
|
||||||
uint32_t vector = 0;
|
uint32_t vector = 0;
|
||||||
|
|
||||||
|
@ -692,12 +721,16 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
int serial_getc(serial_t *obj)
|
int serial_getc(serial_t *obj)
|
||||||
{
|
{
|
||||||
|
/* Sanity check arguments */
|
||||||
|
MBED_ASSERT(obj);
|
||||||
while (!serial_readable(obj));
|
while (!serial_readable(obj));
|
||||||
return _USART(obj).DATA.reg ;
|
return _USART(obj).DATA.reg ;
|
||||||
}
|
}
|
||||||
|
|
||||||
void serial_putc(serial_t *obj, int c)
|
void serial_putc(serial_t *obj, int c)
|
||||||
{
|
{
|
||||||
|
/* Sanity check arguments */
|
||||||
|
MBED_ASSERT(obj);
|
||||||
uint16_t q = (c & SERCOM_USART_DATA_MASK);
|
uint16_t q = (c & SERCOM_USART_DATA_MASK);
|
||||||
while (!serial_writable(obj));
|
while (!serial_writable(obj));
|
||||||
_USART(obj).DATA.reg = q;
|
_USART(obj).DATA.reg = q;
|
||||||
|
@ -706,6 +739,8 @@ void serial_putc(serial_t *obj, int c)
|
||||||
|
|
||||||
int serial_readable(serial_t *obj)
|
int serial_readable(serial_t *obj)
|
||||||
{
|
{
|
||||||
|
/* Sanity check arguments */
|
||||||
|
MBED_ASSERT(obj);
|
||||||
uint32_t status = 1;
|
uint32_t status = 1;
|
||||||
if (!(_USART(obj).INTFLAG.reg & SERCOM_USART_INTFLAG_RXC)) {
|
if (!(_USART(obj).INTFLAG.reg & SERCOM_USART_INTFLAG_RXC)) {
|
||||||
status = 0;
|
status = 0;
|
||||||
|
@ -717,6 +752,8 @@ int serial_readable(serial_t *obj)
|
||||||
|
|
||||||
int serial_writable(serial_t *obj)
|
int serial_writable(serial_t *obj)
|
||||||
{
|
{
|
||||||
|
/* Sanity check arguments */
|
||||||
|
MBED_ASSERT(obj);
|
||||||
uint32_t status = 1;
|
uint32_t status = 1;
|
||||||
if (!(_USART(obj).INTFLAG.reg & SERCOM_USART_INTFLAG_DRE)) {
|
if (!(_USART(obj).INTFLAG.reg & SERCOM_USART_INTFLAG_DRE)) {
|
||||||
status = 0;
|
status = 0;
|
||||||
|
@ -737,6 +774,8 @@ int serial_writable(serial_t *obj)
|
||||||
***********************************/
|
***********************************/
|
||||||
void serial_tx_enable_event(serial_t *obj, int event, uint8_t enable)
|
void serial_tx_enable_event(serial_t *obj, int event, uint8_t enable)
|
||||||
{
|
{
|
||||||
|
/* Sanity check arguments */
|
||||||
|
MBED_ASSERT(obj);
|
||||||
if(enable) {
|
if(enable) {
|
||||||
pSERIAL_S(obj)->events |= event;
|
pSERIAL_S(obj)->events |= event;
|
||||||
} else {
|
} else {
|
||||||
|
@ -746,6 +785,8 @@ void serial_tx_enable_event(serial_t *obj, int event, uint8_t enable)
|
||||||
|
|
||||||
void serial_rx_enable_event(serial_t *obj, int event, uint8_t enable)
|
void serial_rx_enable_event(serial_t *obj, int event, uint8_t enable)
|
||||||
{
|
{
|
||||||
|
/* Sanity check arguments */
|
||||||
|
MBED_ASSERT(obj);
|
||||||
if(enable) {
|
if(enable) {
|
||||||
pSERIAL_S(obj)->events |= event;
|
pSERIAL_S(obj)->events |= event;
|
||||||
} else {
|
} else {
|
||||||
|
@ -755,6 +796,9 @@ void serial_rx_enable_event(serial_t *obj, int event, uint8_t enable)
|
||||||
|
|
||||||
void serial_tx_buffer_set(serial_t *obj, void *tx, int tx_length, uint8_t width)
|
void serial_tx_buffer_set(serial_t *obj, void *tx, int tx_length, uint8_t width)
|
||||||
{
|
{
|
||||||
|
/* Sanity check arguments */
|
||||||
|
MBED_ASSERT(obj);
|
||||||
|
MBED_ASSERT(tx != (void*)0);
|
||||||
// We only support byte buffers for now
|
// We only support byte buffers for now
|
||||||
MBED_ASSERT(width == 8);
|
MBED_ASSERT(width == 8);
|
||||||
|
|
||||||
|
@ -769,6 +813,9 @@ void serial_tx_buffer_set(serial_t *obj, void *tx, int tx_length, uint8_t width)
|
||||||
|
|
||||||
void serial_rx_buffer_set(serial_t *obj, void *rx, int rx_length, uint8_t width)
|
void serial_rx_buffer_set(serial_t *obj, void *rx, int rx_length, uint8_t width)
|
||||||
{
|
{
|
||||||
|
/* Sanity check arguments */
|
||||||
|
MBED_ASSERT(obj);
|
||||||
|
MBED_ASSERT(rx != (void*)0);
|
||||||
// We only support byte buffers for now
|
// We only support byte buffers for now
|
||||||
MBED_ASSERT(width == 8);
|
MBED_ASSERT(width == 8);
|
||||||
|
|
||||||
|
@ -783,6 +830,8 @@ void serial_rx_buffer_set(serial_t *obj, void *rx, int rx_length, uint8_t width)
|
||||||
|
|
||||||
void serial_set_char_match(serial_t *obj, uint8_t char_match)
|
void serial_set_char_match(serial_t *obj, uint8_t char_match)
|
||||||
{
|
{
|
||||||
|
/* Sanity check arguments */
|
||||||
|
MBED_ASSERT(obj);
|
||||||
if (char_match != SERIAL_RESERVED_CHAR_MATCH) {
|
if (char_match != SERIAL_RESERVED_CHAR_MATCH) {
|
||||||
obj->char_match = char_match;
|
obj->char_match = char_match;
|
||||||
}
|
}
|
||||||
|
@ -793,6 +842,8 @@ void serial_set_char_match(serial_t *obj, uint8_t char_match)
|
||||||
***********************************/
|
***********************************/
|
||||||
int serial_tx_asynch(serial_t *obj, const void *tx, size_t tx_length, uint8_t tx_width, uint32_t handler, uint32_t event, DMAUsage hint)
|
int serial_tx_asynch(serial_t *obj, const void *tx, size_t tx_length, uint8_t tx_width, uint32_t handler, uint32_t event, DMAUsage hint)
|
||||||
{
|
{
|
||||||
|
/* Sanity check arguments */
|
||||||
|
MBED_ASSERT(obj);
|
||||||
MBED_ASSERT(tx != (void*)0);
|
MBED_ASSERT(tx != (void*)0);
|
||||||
if(tx_length == 0) return 0;
|
if(tx_length == 0) return 0;
|
||||||
|
|
||||||
|
@ -815,6 +866,8 @@ int serial_tx_asynch(serial_t *obj, const void *tx, size_t tx_length, uint8_t tx
|
||||||
|
|
||||||
void serial_rx_asynch(serial_t *obj, void *rx, size_t rx_length, uint8_t rx_width, uint32_t handler, uint32_t event, uint8_t char_match, DMAUsage hint)
|
void serial_rx_asynch(serial_t *obj, void *rx, size_t rx_length, uint8_t rx_width, uint32_t handler, uint32_t event, uint8_t char_match, DMAUsage hint)
|
||||||
{
|
{
|
||||||
|
/* Sanity check arguments */
|
||||||
|
MBED_ASSERT(obj);
|
||||||
MBED_ASSERT(rx != (void*)0);
|
MBED_ASSERT(rx != (void*)0);
|
||||||
|
|
||||||
serial_rx_enable_event(obj, SERIAL_EVENT_RX_ALL, false);
|
serial_rx_enable_event(obj, SERIAL_EVENT_RX_ALL, false);
|
||||||
|
@ -837,16 +890,22 @@ void serial_rx_asynch(serial_t *obj, void *rx, size_t rx_length, uint8_t rx_widt
|
||||||
|
|
||||||
uint8_t serial_tx_active(serial_t *obj)
|
uint8_t serial_tx_active(serial_t *obj)
|
||||||
{
|
{
|
||||||
|
/* Sanity check arguments */
|
||||||
|
MBED_ASSERT(obj);
|
||||||
return ((obj->tx_buff.length > 0) ? true : false);
|
return ((obj->tx_buff.length > 0) ? true : false);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t serial_rx_active(serial_t *obj)
|
uint8_t serial_rx_active(serial_t *obj)
|
||||||
{
|
{
|
||||||
|
/* Sanity check arguments */
|
||||||
|
MBED_ASSERT(obj);
|
||||||
return ((obj->rx_buff.length > 0) ? true : false);
|
return ((obj->rx_buff.length > 0) ? true : false);
|
||||||
}
|
}
|
||||||
|
|
||||||
int serial_tx_irq_handler_asynch(serial_t *obj)
|
int serial_tx_irq_handler_asynch(serial_t *obj)
|
||||||
{
|
{
|
||||||
|
/* Sanity check arguments */
|
||||||
|
MBED_ASSERT(obj);
|
||||||
_USART(obj).INTENCLR.reg = SERCOM_USART_INTFLAG_TXC;
|
_USART(obj).INTENCLR.reg = SERCOM_USART_INTFLAG_TXC;
|
||||||
serial_tx_abort_asynch(obj);
|
serial_tx_abort_asynch(obj);
|
||||||
return SERIAL_EVENT_TX_COMPLETE & obj->serial.events;
|
return SERIAL_EVENT_TX_COMPLETE & obj->serial.events;
|
||||||
|
@ -854,6 +913,8 @@ int serial_tx_irq_handler_asynch(serial_t *obj)
|
||||||
|
|
||||||
int serial_rx_irq_handler_asynch(serial_t *obj)
|
int serial_rx_irq_handler_asynch(serial_t *obj)
|
||||||
{
|
{
|
||||||
|
/* Sanity check arguments */
|
||||||
|
MBED_ASSERT(obj);
|
||||||
int event = 0;
|
int event = 0;
|
||||||
/* This interrupt handler is called from USART irq */
|
/* This interrupt handler is called from USART irq */
|
||||||
uint8_t *buf = (uint8_t*)obj->rx_buff.buffer;
|
uint8_t *buf = (uint8_t*)obj->rx_buff.buffer;
|
||||||
|
@ -915,6 +976,8 @@ int serial_rx_irq_handler_asynch(serial_t *obj)
|
||||||
int serial_irq_handler_asynch(serial_t *obj)
|
int serial_irq_handler_asynch(serial_t *obj)
|
||||||
{
|
{
|
||||||
//TODO: DMA to be implemented
|
//TODO: DMA to be implemented
|
||||||
|
/* Sanity check arguments */
|
||||||
|
MBED_ASSERT(obj);
|
||||||
uint16_t interrupt_status;
|
uint16_t interrupt_status;
|
||||||
uint8_t *buf = obj->tx_buff.buffer;
|
uint8_t *buf = obj->tx_buff.buffer;
|
||||||
|
|
||||||
|
@ -948,6 +1011,8 @@ int serial_irq_handler_asynch(serial_t *obj)
|
||||||
void serial_tx_abort_asynch(serial_t *obj)
|
void serial_tx_abort_asynch(serial_t *obj)
|
||||||
{
|
{
|
||||||
//TODO: DMA to be implemented
|
//TODO: DMA to be implemented
|
||||||
|
/* Sanity check arguments */
|
||||||
|
MBED_ASSERT(obj);
|
||||||
_USART(obj).INTFLAG.reg = SERCOM_USART_INTFLAG_TXC;
|
_USART(obj).INTFLAG.reg = SERCOM_USART_INTFLAG_TXC;
|
||||||
obj->tx_buff.length = 0;
|
obj->tx_buff.length = 0;
|
||||||
obj->rx_buff.pos = 0;
|
obj->rx_buff.pos = 0;
|
||||||
|
@ -957,6 +1022,8 @@ void serial_tx_abort_asynch(serial_t *obj)
|
||||||
void serial_rx_abort_asynch(serial_t *obj)
|
void serial_rx_abort_asynch(serial_t *obj)
|
||||||
{
|
{
|
||||||
//TODO: DMA to be implemented
|
//TODO: DMA to be implemented
|
||||||
|
/* Sanity check arguments */
|
||||||
|
MBED_ASSERT(obj);
|
||||||
_USART(obj).INTFLAG.reg = SERCOM_USART_INTFLAG_RXC;
|
_USART(obj).INTFLAG.reg = SERCOM_USART_INTFLAG_RXC;
|
||||||
obj->rx_buff.length = 0;
|
obj->rx_buff.length = 0;
|
||||||
obj->rx_buff.pos = 0;
|
obj->rx_buff.pos = 0;
|
||||||
|
|
Loading…
Reference in New Issue