//***************************************************************************** // // This function is called whenever serial data is received from the UART. // It is passed the accumulated error flags from each character received in // this interrupt and determines from them whether or not an interrupt // notification to the host is required. // // If a notification is required and the control interrupt endpoint is idle, // we send the notification immediately. If the endpoint is not idle, we // accumulate the errors in a global variable which will be checked on // completion of the previous notification and used to send a second one // if necessary. // //***************************************************************************** static void CheckForSerialStateChange(const tUSBDCDCDevice *psDevice, uint32_t ui32Errors) { uint16_t ui16SerialState; // // Clear our USB serial state. Since we are faking the handshakes, always // set the TXCARRIER (DSR) and RXCARRIER (DCD) bits. // ui16SerialState = USB_CDC_SERIAL_STATE_TXCARRIER | USB_CDC_SERIAL_STATE_RXCARRIER; // // Are any error bits set? // if(ui32Errors) { // // At least one error is being notified so translate from our hardware // error bits into the correct state markers for the USB notification. // if(ui32Errors & UART_DR_OE) { ui16SerialState |= USB_CDC_SERIAL_STATE_OVERRUN; } if(ui32Errors & UART_DR_PE) { ui16SerialState |= USB_CDC_SERIAL_STATE_PARITY; } if(ui32Errors & UART_DR_FE) { ui16SerialState |= USB_CDC_SERIAL_STATE_FRAMING; } if(ui32Errors & UART_DR_BE) { ui16SerialState |= USB_CDC_SERIAL_STATE_BREAK; } // // Call the CDC driver to notify the state change. // USBDCDCSerialStateChange((void *)psDevice, ui16SerialState); } }
static void CheckForSerialStateChange(const tUSBDCDCDevice *psDevice, int lErrors) { unsigned short usSerialState; /* Clear our USB serial state. Since we are faking the handshakes, always set the TXCARRIER (DSR) and RXCARRIER (DCD) bits. */ usSerialState = USB_CDC_SERIAL_STATE_TXCARRIER | USB_CDC_SERIAL_STATE_RXCARRIER; /* Are any error bits set? */ if(lErrors) { /* At least one error is being notified so translate from our hardware error bits into the correct state markers for the USB notification. */ if(lErrors & UART_OVERRUN_ERROR) { usSerialState |= USB_CDC_SERIAL_STATE_OVERRUN; } if(lErrors & UART_PARITY_ERROR) { usSerialState |= USB_CDC_SERIAL_STATE_PARITY; } if(lErrors & UART_FRAMING_ERROR) { usSerialState |= USB_CDC_SERIAL_STATE_FRAMING; } if(lErrors & UART_BREAK_DETECTED_ERROR) { usSerialState |= USB_CDC_SERIAL_STATE_BREAK; } /* Call the CDC driver to notify the state change. */ USBDCDCSerialStateChange((void *)psDevice, usSerialState); } }