int SerialBase::write(const Buffer& buffer, const event_callback_t& callback, int event) { if (serial_tx_active(&_serial)) { return -1; // transaction ongoing } start_write(buffer, 8, callback, event); return 0; }
int SerialBase::set_dma_usage_rx(DMAUsage usage) { if (serial_tx_active(&_serial)) { return -1; } _rx_usage = usage; return 0; }
int SerialBase::write(const uint16_t *buffer, int length, const event_callback_t& callback, int event) { if (serial_tx_active(&_serial)) { return -1; // transaction ongoing } start_write((void *)buffer, length, 16, callback, event); return 0; }
/** * Configure the TX buffer for an asynchronous write serial transaction * * @param obj The serial object. * @param tx The buffer for sending. * @param tx_length The number of words to transmit. */ static void serial_tx_buffer_set(serial_t *obj, void *tx, int tx_length, uint8_t width) { (void)width; // Exit if a transmit is already on-going if (serial_tx_active(obj)) { return; } obj->tx_buff.buffer = tx; obj->tx_buff.length = tx_length; obj->tx_buff.pos = 0; }
/** Configure the TX buffer for an asynchronous write serial transaction * * @param obj The serial object. * @param tx The buffer for sending. * @param tx_length The number of words to transmit. */ static void h_serial_tx_buffer_set(serial_t *obj, void *tx, int tx_length, uint8_t width) { // We only support byte buffers for now MBED_ASSERT(width == 8); // Exit if a transmit is already on-going if (serial_tx_active(obj)) return; obj->tx_buff.buffer = tx; obj->tx_buff.length = tx_length; obj->tx_buff.pos = 0; return; }
/** Configure the TX buffer for an asynchronous write serial transaction * * @param obj The serial object. * @param tx The buffer for sending. * @param tx_length The number of words to transmit. */ static void h_serial_tx_buffer_set(serial_t *obj, void *tx, int tx_length, uint8_t width) { // We only support byte buffers for now MBED_ASSERT(width == 8); UartHandle.Instance = (USART_TypeDef *)SERIAL_OBJ(uart); // Exit if a transmit is already on-going if (serial_tx_active(obj)) return; obj->tx_buff.buffer = tx; obj->tx_buff.length = tx_length; obj->tx_buff.pos = 0; return; }
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 MBED_ASSERT(width == 8); if(serial_tx_active(obj)) return; obj->tx_buff.buffer = tx; obj->tx_buff.length = tx_length; obj->tx_buff.pos = 0; return; }
/** Begin asynchronous TX transfer. The used buffer is specified in the serial object, * tx_buff * * @param obj The serial object * @param tx The transmit buffer * @param tx_length The number of bytes to transmit * @param tx_width Deprecated argument * @param handler The serial handler * @param event The logical OR of events to be registered * @param hint A suggestion for how to use DMA with this transfer * @return Returns number of data transfered, otherwise returns 0 */ 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) { struct serial_s *p_obj = GET_SERIAL_S(obj); IRQn_Type irq = usart_irq_n[p_obj->index]; if ((tx_length == 0) || (tx_width != 8)) { return 0; } if (serial_tx_active(obj)) { /* some transmit is in progress */ return 0; } obj->tx_buff.buffer = (void *)tx; obj->tx_buff.length = tx_length; obj->tx_buff.pos = 0; /* disable all events first */ serial_event_disable(obj, SERIAL_EVENT_TX_ALL); /* enable the specific event */ serial_event_enable(obj, event); /* enable interrupt */ /* clear pending IRQ */ NVIC_ClearPendingIRQ(irq); /* disable the IRQ first */ NVIC_DisableIRQ(irq); /* set the priority and vector */ NVIC_SetPriority(irq, 1); NVIC_SetVector(irq, (uint32_t)handler); /* enable IRQ */ NVIC_EnableIRQ(irq); if (usart_tx_interrupt_preprocess(p_obj, (uint8_t *)tx, tx_length) != GD_OK) { return 0; } return tx_length; }