From ce1b82ea2cd7e5644381118d89c1aaeea07e2810 Mon Sep 17 00:00:00 2001 From: akhilpanayam Date: Fri, 26 Jun 2015 19:19:46 +0530 Subject: [PATCH] * updated serial and peripheral files for hardware flow control --- .../TARGET_SAMR21G18A/PeripheralPins.c | 2 +- .../TARGET_Atmel/TARGET_SAM21/serial_api.c | 50 ++++++++++++++++++- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/libraries/mbed/targets/hal/TARGET_Atmel/TARGET_SAM21/TARGET_SAMR21G18A/PeripheralPins.c b/libraries/mbed/targets/hal/TARGET_Atmel/TARGET_SAM21/TARGET_SAMR21G18A/PeripheralPins.c index c1862dd152..96e870e4a3 100644 --- a/libraries/mbed/targets/hal/TARGET_Atmel/TARGET_SAM21/TARGET_SAMR21G18A/PeripheralPins.c +++ b/libraries/mbed/targets/hal/TARGET_Atmel/TARGET_SAM21/TARGET_SAMR21G18A/PeripheralPins.c @@ -469,7 +469,7 @@ uint32_t find_mux_setting (PinName output, PinName input, PinName clock, PinName mux_setting = mux_setting; // dummy condition } } else { // for hardware flow control and uart // expecting the tx in pad 0, rts in pad2 and cts in pad 3 - if((output_values.pad == 0) && (clock_values.pad/*rts pin*/ == 2) && (clock_values.pad/*cts pin*/ == 3)) { + if((output_values.pad == 0) && (clock_values.pad/*rts pin*/ == 2) && (chipsel_values.pad/*cts pin*/ == 3)) { mux_setting |= SERCOM_USART_CTRLA_TXPO(2); } } diff --git a/libraries/mbed/targets/hal/TARGET_Atmel/TARGET_SAM21/serial_api.c b/libraries/mbed/targets/hal/TARGET_Atmel/TARGET_SAM21/serial_api.c index da077a3d91..d726fb4dd9 100644 --- a/libraries/mbed/targets/hal/TARGET_Atmel/TARGET_SAM21/serial_api.c +++ b/libraries/mbed/targets/hal/TARGET_Atmel/TARGET_SAM21/serial_api.c @@ -417,6 +417,12 @@ void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_b } #ifdef DEVICE_SERIAL_FC +void uart0_irq(); +void uart1_irq(); +void uart2_irq(); +void uart3_irq(); +void uart4_irq(); +void uart5_irq(); void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, PinName txflow) { @@ -424,6 +430,36 @@ void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, Pi uint32_t sercom_index = 0; uint32_t padsetting[4] = {0}; + IRQn_Type irq_n = (IRQn_Type)0; + uint32_t vector = 0; + + switch ((int)pUSART_S(obj)) { + case UART_0: + irq_n = SERCOM0_IRQn; + vector = (uint32_t)uart0_irq; + break; + case UART_1: + irq_n = SERCOM1_IRQn; + vector = (uint32_t)uart1_irq; + break; + case UART_2: + irq_n = SERCOM2_IRQn; + vector = (uint32_t)uart2_irq; + break; + case UART_3: + irq_n = SERCOM3_IRQn; + vector = (uint32_t)uart3_irq; + break; + case UART_4: + irq_n = SERCOM4_IRQn; + vector = (uint32_t)uart4_irq; + break; + case UART_5: + irq_n = SERCOM5_IRQn; + vector = (uint32_t)uart5_irq; + break; + } + disable_usart(obj); //TODO : assert for rxflow and txflow pis to be added find_pin_settings(pSERIAL_S(obj)->txpin, pSERIAL_S(obj)->rxpin, rxflow, txflow, &padsetting[0]); // tx, rx, clk(rts), chipsel(cts) pad array // getting pads from pins @@ -435,6 +471,9 @@ void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, Pi pSERIAL_S(obj)->pinmux_pad2 = padsetting[2];//EDBG_CDC_SERCOM_PINMUX_PAD2; pSERIAL_S(obj)->pinmux_pad3 = padsetting[3];//EDBG_CDC_SERCOM_PINMUX_PAD3; + /* Set configuration according to the config struct */ + usart_set_config_default(obj); + struct system_pinmux_config pin_conf; system_pinmux_get_config_defaults(&pin_conf); pin_conf.direction = SYSTEM_PINMUX_PIN_DIR_INPUT; @@ -446,7 +485,7 @@ void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, Pi }; /* Configure the SERCOM pins according to the user configuration */ - for (uint8_t pad = 0; pad < 4; pad++) { + for (uint8_t pad = 0; pad < 3; pad++) { uint32_t current_pinmux = pad_pinmuxes[pad]; if (current_pinmux == PINMUX_DEFAULT) { @@ -458,8 +497,17 @@ void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, Pi system_pinmux_pin_set_config(current_pinmux >> 16, &pin_conf); } } + if (pSERIAL_S(obj)->pinmux_pad3 != PINMUX_UNUSED) { + pin_conf.input_pull = SYSTEM_PINMUX_PIN_PULL_UP; + pin_conf.mux_position = pSERIAL_S(obj)->pinmux_pad3 & 0xFFFF; + system_pinmux_pin_set_config(pSERIAL_S(obj)->pinmux_pad3 >> 16, &pin_conf); + } + + NVIC_SetVector(irq_n, vector); + NVIC_EnableIRQ(irq_n); enable_usart(obj); + _USART(obj).INTENSET.reg = SERCOM_USART_INTENCLR_CTSIC; } void serial_break_set(serial_t *obj)