static void usart_tx_interrupt_handler(struct usart_config const *config) { intptr_t base = config->hw->base; uint8_t byte; if (!(STM32_USART_SR(base) & STM32_USART_SR_TXE)) return; if (queue_remove_unit(config->consumer.queue, &byte)) { STM32_USART_TDR(base) = byte; /* * Make sure the TXE interrupt is enabled and that we won't go * into deep sleep. This invocation of the USART interrupt * handler may have been manually triggered to start * transmission. */ disable_sleep(SLEEP_MASK_UART); STM32_USART_CR1(base) |= STM32_USART_CR1_TXEIE; } else { /* * The TX queue is empty, disable the TXE interrupt and enable * deep sleep mode. The TXE interrupt will remain disabled * until a write call happens. */ enable_sleep(SLEEP_MASK_UART); STM32_USART_CR1(base) &= ~STM32_USART_CR1_TXEIE; } }
int uart_read_char(void) { char ret; ASSERT(in_interrupt_context()); queue_remove_unit(&cached_char, &ret); --char_available; return ret; }
void motion_sense_fifo_add_unit(struct ec_response_motion_sensor_data *data, struct motion_sensor_t *sensor, int valid_data) { struct ec_response_motion_sensor_data vector; int i; data->sensor_num = sensor - motion_sensors; mutex_lock(&g_sensor_mutex); if (queue_space(&motion_sense_fifo) == 0) { queue_remove_unit(&motion_sense_fifo, &vector); motion_sense_fifo_lost++; motion_sensors[vector.sensor_num].lost++; if (vector.flags & MOTIONSENSE_SENSOR_FLAG_FLUSH) CPRINTS("Lost flush for sensor %d", vector.sensor_num); } for (i = 0; i < valid_data; i++) sensor->xyz[i] = data->data[i]; mutex_unlock(&g_sensor_mutex); if (valid_data) { int ap_odr = sensor->config[SENSOR_CONFIG_AP].odr & ~ROUND_UP_FLAG; int rate = INT_TO_FP(sensor->drv->get_data_rate(sensor)); /* If the AP does not want sensor info, skip */ if (ap_odr == 0) return; /* Skip if EC is oversampling */ if (sensor->oversampling < 0) { sensor->oversampling += fp_div(INT_TO_FP(1000), rate); return; } sensor->oversampling += fp_div(INT_TO_FP(1000), rate) - fp_div(INT_TO_FP(1000), INT_TO_FP(ap_odr)); } queue_add_unit(&motion_sense_fifo, data); }