static bool_t outint(SerialDriver *sdp) { if (sdp->com_data != INVALID_SOCKET) { int n; uint8_t data[1]; /* * Input. */ chSysLockFromIsr(); n = sdRequestDataI(sdp); chSysUnlockFromIsr(); if (n < 0) return FALSE; data[0] = (uint8_t)n; n = send(sdp->com_data, data, sizeof(data), 0); switch (n) { case 0: close(sdp->com_data); sdp->com_data = INVALID_SOCKET; chSysLockFromIsr(); chnAddFlagsI(sdp, CHN_DISCONNECTED); chSysUnlockFromIsr(); return FALSE; case INVALID_SOCKET: if (errno == EWOULDBLOCK) return FALSE; close(sdp->com_data); sdp->com_data = INVALID_SOCKET; return FALSE; } return TRUE; } return FALSE; }
static bool outint(SerialDriver *sdp) { if (sdp->com_data != INVALID_SOCKET) { int n; uint8_t data[1]; /* * Input. */ chSysLockFromISR(); n = sdRequestDataI(sdp); chSysUnlockFromISR(); if (n < 0) return false; data[0] = (uint8_t)n; n = send(sdp->com_data, (char *)data, sizeof(data), 0); switch (n) { case 0: closesocket(sdp->com_data); sdp->com_data = INVALID_SOCKET; chSysLockFromISR(); chnAddFlagsI(sdp, CHN_DISCONNECTED); chSysUnlockFromISR(); return false; case SOCKET_ERROR: if (WSAGetLastError() == WSAEWOULDBLOCK) return false; closesocket(sdp->com_data); sdp->com_data = INVALID_SOCKET; return false; } return true; } return false; }
static void notify1(GenericQueue *qp) { (void)qp; if (!(U0IE & UTXIE0)) { msg_t b = sdRequestDataI(&SD1); if (b != Q_EMPTY) { U0IE |= UTXIE0; U0TXBUF = (uint8_t)b; } } }
static void notify2(GenericQueue *qp) { (void)qp; if (!(U1IE & UTXIE1)) { msg_t b = sdRequestDataI(&SD2); if (b != Q_EMPTY) { U1IE |= UTXIE1; U1TXBUF = (uint8_t)b; } } }
static void notify4(GenericQueue *qp) { (void)qp; if (!SD4.linflexp->UARTCR.B.TXEN) { msg_t b = sdRequestDataI(&SD4); if (b != Q_EMPTY) { SD4.linflexp->UARTCR.B.TXEN = 1; SD4.linflexp->BDRL.B.DATA0 = b; } } }
static void notify10(io_queue_t *qp) { (void)qp; if (!SD10.linflexp->UARTCR.B.TXEN) { msg_t b = sdRequestDataI(&SD10); if (b != Q_EMPTY) { SD10.linflexp->UARTCR.B.TXEN = 1; SD10.linflexp->BDRL.B.DATA0 = b; } } }
static void notify3(io_queue_t *qp) { (void)qp; if (ESCI_B.SR.B.TDRE) { msg_t b = sdRequestDataI(&SD3); if (b != Q_EMPTY) { ESCI_B.SR.B.TDRE = 1; ESCI_B.CR1.B.TIE = 1; ESCI_B.DR.R = (uint16_t)b; } } }
static void notify2(GenericQueue *qp) { (void)qp; if (ESCI_B.SR.B.TDRE) { msg_t b = sdRequestDataI(&SD2); if (b != Q_EMPTY) { ESCI_B.SR.B.TDRE = 1; ESCI_B.CR1.B.TIE = 1; ESCI_B.DR.R = (uint16_t)b; } } }
void sd_lld_serve_interrupt( SerialDriver *sdp ) { if (AUX_MU_IIR_RX_IRQ) { chSysLockFromIsr(); while(!AUX_MU_LSR_RX_RDY); do { sdIncomingDataI(sdp, AUX_MU_IO_REG & 0xFF); } while (AUX_MU_LSR_RX_RDY); chSysUnlockFromIsr(); } if (AUX_MU_IIR_TX_IRQ) { chSysLockFromIsr(); while(!AUX_MU_LSR_TX_RDY); msg_t data = sdRequestDataI(sdp); if (data < Q_OK) { /* Disable tx interrupts.*/ AUX_MU_IER_REG &= ~AUX_MU_IER_TX_IRQEN; } else { mini_uart_send((uint32_t)data); } chSysUnlockFromIsr(); } }