/* ** =================================================================== ** Method : CsIO_UART2__read (component ConsoleIO) ** ** Description : ** _read ** This method is internal. It is used by Processor Expert only. ** =================================================================== */ int _read (int fd, const void *buf, size_t count) { size_t CharCnt = 0x00; (void)fd; /* Parameter is not used, suppress unused argument warning */ for (;count > 0x00; --count) { if ((UART_PDD_ReadInterruptStatusReg(UART2_BASE_PTR) & UART_S1_RDRF_MASK) == 0x00) { /* Any data in receiver buffer */ if (CharCnt != 0x00) { /* No, at least one char received? */ break; /* Yes, return received char(s) */ } else { /* Wait until a char is received */ while ((UART_PDD_ReadInterruptStatusReg(UART2_BASE_PTR) & UART_S1_RDRF_MASK) == 0x00) {}; } } CharCnt++; /* Increase char counter */ /* Save character received by UARTx device into the receive buffer */ *(uint8_t*)buf = (unsigned char)UART_PDD_GetChar8(UART2_BASE_PTR); /* Stop reading if CR (Ox0D) character is received */ if (*(uint8_t*)buf == 0x0DU) { /* New line character (CR) received ? */ *(uint8_t*)buf = '\n'; /* Yes, convert LF to '\n' char. */ break; /* Stop loop and return received char(s) */ } (uint8_t*)buf++; /* Increase buffer pointer */ } return 1; }
/* ** =================================================================== ** Method : CsIO_UART2___read_console (component ConsoleIO) ** ** Description : ** __read_console ** This method is internal. It is used by Processor Expert only. ** =================================================================== */ int __read_console(__file_handle handle, unsigned char* buffer, size_t * count) { size_t CharCnt = 0x00; (void)handle; /* Parameter is not used, suppress unused argument warning */ for (;*count > 0x00; --*count) { if ((UART_PDD_ReadInterruptStatusReg(UART2_BASE_PTR) & UART_S1_RDRF_MASK) == 0x00) { /* Any data in receiver buffer */ if (CharCnt != 0x00) { /* No, at least one char received? */ break; /* Yes, return received char(s) */ } else { /* Wait until a char is received */ while ((UART_PDD_ReadInterruptStatusReg(UART2_BASE_PTR) & UART_S1_RDRF_MASK) == 0x00) {}; } } CharCnt++; /* Increase char counter */ /* Save character received by UARTx device into the receive buffer */ *buffer = (unsigned char)UART_PDD_GetChar8(UART2_BASE_PTR); /* Stop reading if CR (Ox0D) character is received */ if (*buffer == 0x0DU) { /* New line character (CR) received ? */ *buffer = '\n'; /* Yes, convert LF to '\n' char. */ break; /* Stop loop and return received char(s) */ } buffer++; /* Increase buffer pointer */ } *count = CharCnt; return (__no_io_error); }
/* ** =================================================================== ** Method : CsIO_UART2__write (component ConsoleIO) ** ** Description : ** _write ** This method is internal. It is used by Processor Expert only. ** =================================================================== */ int _write (int fd, const void *buf, size_t count) { size_t CharCnt = 0x00; (void)fd; /* Parameter is not used, suppress unused argument warning */ for (;count > 0x00; --count) { /* Wait until UART is ready for saving a next character into the transmit buffer */ while ((UART_PDD_ReadInterruptStatusReg(UART2_BASE_PTR) & UART_S1_TDRE_MASK) == 0) {}; if (*(uint8_t*)buf == '\n') { /* Send '\r'(0x0D) before each '\n'(0x0A). */ /* Save a character into the transmit buffer of the UART0 device */ UART_PDD_PutChar8(UART2_BASE_PTR, 0x0DU); /* Wait until UART is ready for saving a next character into the transmit buffer */ while ((UART_PDD_ReadInterruptStatusReg(UART2_BASE_PTR) & UART_S1_TDRE_MASK) == 0) {}; } /* Save a character into the transmit buffer of the UART0 device */ UART_PDD_PutChar8(UART2_BASE_PTR, (unsigned char)*(uint8_t*)buf); (uint8_t*)buf++; /* Increase buffer pointer */ CharCnt++; /* Increase char counter */ } return count; }
/* ** =================================================================== ** Method : CsIO_UART2___write_console (component ConsoleIO) ** ** Description : ** __write_console ** This method is internal. It is used by Processor Expert only. ** =================================================================== */ int __write_console(__file_handle handle, unsigned char* buffer, size_t* count) { size_t CharCnt = 0x00; (void)handle; /* Parameter is not used, suppress unused argument warning */ for (;*count > 0x00; --*count) { /* Wait until UART is ready for saving a next character into the transmit buffer */ while ((UART_PDD_ReadInterruptStatusReg(UART2_BASE_PTR) & UART_S1_TDRE_MASK) == 0) {}; if (*buffer == '\n') { /* Send '\r'(0x0D) before each '\n'(0x0A). */ /* Save a character into the transmit buffer of the UART0 device */ UART_PDD_PutChar8(UART2_BASE_PTR, 0x0DU); /* Wait until UART is ready for saving a next character into the transmit buffer */ while ((UART_PDD_ReadInterruptStatusReg(UART2_BASE_PTR) & UART_S1_TDRE_MASK) == 0) {}; } /* Save a character into the transmit buffer of the UART0 device */ UART_PDD_PutChar8(UART2_BASE_PTR, (unsigned char)*buffer); buffer++; /* Increase buffer pointer */ CharCnt++; /* Increase char counter */ } *count = CharCnt; return(__no_io_error); }
/* ===================================================================*/ void IO1_Main(LDD_TDeviceData *DeviceDataPtr) { IO1_TDeviceDataPtr DeviceDataPrv = (IO1_TDeviceDataPtr)DeviceDataPtr; register uint32_t StatReg = UART_PDD_ReadInterruptStatusReg(UART1_BASE_PTR); /* Read status register */ if (StatReg & (UART_S1_NF_MASK | UART_S1_OR_MASK | UART_S1_FE_MASK | UART_S1_PF_MASK)) { /* Is any error flag set? */ (void)UART_PDD_GetChar8(UART1_BASE_PTR); /* Dummy read 8-bit character from receiver */ StatReg &= (uint32_t)(~(uint32_t)UART_S1_RDRF_MASK); /* Clear the receive data flag to discard the errorneous data */ } if (StatReg & UART_S1_RDRF_MASK) { /* Is the receiver's interrupt flag set? */ InterruptRx(DeviceDataPrv); /* If yes, then invoke the internal service routine. This routine is inlined. */ } if (DeviceDataPrv->SerFlag & ENABLED_TX_INT) { /* Is the transmitter interrupt enabled? */ if (StatReg & UART_S1_TDRE_MASK) { /* Is the transmitter empty? */ InterruptTx(DeviceDataPrv); /* If yes, then invoke the internal service routine. This routine is inlined. */ } } }
/* ** =================================================================== ** Method : MB_UART_Interrupt (component Serial_LDD) ** ** Description : ** The ISR function handling the device receive/transmit ** interrupt. Calls InterruptTX/InterruptRX methods. ** This method is internal. It is used by Processor Expert only. ** =================================================================== */ void MB_UART_Interrupt(LDD_RTOS_TISRParameter _isrParameter) { /* {MQXLite RTOS Adapter} ISR parameter is passed as parameter from RTOS interrupt dispatcher */ MB_UART_TDeviceDataPtr DeviceDataPrv = (MB_UART_TDeviceDataPtr)_isrParameter; register uint32_t StatReg = UART_PDD_ReadInterruptStatusReg(UART2_BASE_PTR); /* Read status register */ if (StatReg & (UART_S1_NF_MASK | UART_S1_OR_MASK | UART_S1_FE_MASK | UART_S1_PF_MASK)) { /* Is any error flag set? */ (void)UART_PDD_GetChar8(UART2_BASE_PTR); /* Dummy read 8-bit character from receiver */ StatReg &= (uint32_t)(~(uint32_t)UART_S1_RDRF_MASK); /* Clear the receive data flag to discard the errorneous data */ } if (StatReg & UART_S1_RDRF_MASK) { /* Is the receiver's interrupt flag set? */ InterruptRx(DeviceDataPrv); /* If yes, then invoke the internal service routine. This routine is inlined. */ } if (DeviceDataPrv->SerFlag & ENABLED_TX_INT) { /* Is the transmitter interrupt enabled? */ if (StatReg & UART_S1_TDRE_MASK) { /* Is the transmitter empty? */ InterruptTx(DeviceDataPrv); /* If yes, then invoke the internal service routine. This routine is inlined. */ } } }
/* ===================================================================*/ void ASerialLdd2_Main(LDD_TDeviceData *DeviceDataPtr) { ASerialLdd2_TDeviceDataPtr DeviceDataPrv = (ASerialLdd2_TDeviceDataPtr)DeviceDataPtr; register uint32_t StatReg = UART_PDD_ReadInterruptStatusReg(UART0_BASE_PTR); /* Read status register */ register uint16_t OnErrorFlags = 0U; /* Temporary variable for flags */ register uint8_t OnBreakFlag = 0U; /* Temporary variable flag for OnBreak event */ register uint16_t Data; /* Temporary variable for data */ if (StatReg & (UART_S1_NF_MASK | UART_S1_OR_MASK | UART_S1_FE_MASK | UART_S1_PF_MASK)) { /* Is any error flag set? */ Data = (uint16_t)UART_PDD_GetChar8(UART0_BASE_PTR); /* Read an 8-bit character from receiver */ if ((StatReg & UART_S1_FE_MASK) != 0U) { /* Is the framing error detected? */ if (((StatReg & UART_S1_RDRF_MASK) != 0U) && (Data == 0U)) { /* Is the zero character in the receiver? */ OnBreakFlag++; DeviceDataPrv->SerFlag |= BREAK_DETECTED; /* If yes then set the flag */ } else { OnErrorFlags |= LDD_SERIAL_FRAMING_ERROR; /* If yes then set the flag */ } } if ((StatReg & UART_S1_OR_MASK) != 0U) { /* Is the overrun error flag set? */ OnErrorFlags |= LDD_SERIAL_RX_OVERRUN; /* If yes then set the flag */ } if ((StatReg & UART_S1_PF_MASK) != 0U) { /* Is the parity error flag set? */ OnErrorFlags |= LDD_SERIAL_PARITY_ERROR; /* If yes then set the flag */ } if ((StatReg & UART_S1_NF_MASK) != 0U) { /* Is the noise error flag set? */ OnErrorFlags |= LDD_SERIAL_NOISE_ERROR; /* If yes then set the flag */ } DeviceDataPrv->ErrFlag |= OnErrorFlags; /* Copy flags status to ErrFlag status variable */ StatReg &= (uint32_t)(~(uint32_t)UART_S1_RDRF_MASK); /* Clear the receive data flag to discard the errorneous data */ if (OnBreakFlag != 0U) { ASerialLdd2_OnBreak(DeviceDataPrv->UserDataPtr); /* If yes then invoke user event */ } } if (StatReg & UART_S1_RDRF_MASK) { /* Is the receiver's interrupt flag set? */ InterruptRx(DeviceDataPrv); /* If yes, then invoke the internal service routine. This routine is inlined. */ } if (DeviceDataPrv->SerFlag & ENABLED_TX_INT) { /* Is the transmitter interrupt enabled? */ if (StatReg & UART_S1_TDRE_MASK) { /* Is the transmitter empty? */ InterruptTx(DeviceDataPrv); /* If yes, then invoke the internal service routine. This routine is inlined. */ } } }
/* ** =================================================================== ** Method : UART_A_Interrupt (component Serial_LDD) ** ** Description : ** The ISR function handling the device receive/transmit ** interrupt. Calls InterruptTX/InterruptRX methods. ** This method is internal. It is used by Processor Expert only. ** =================================================================== */ void UART_A_Interrupt(LDD_RTOS_TISRParameter _isrParameter) { /* {MQXLite RTOS Adapter} ISR parameter is passed as parameter from RTOS interrupt dispatcher */ UART_A_TDeviceDataPtr DeviceDataPrv = (UART_A_TDeviceDataPtr)_isrParameter; register uint32_t StatReg = UART_PDD_ReadInterruptStatusReg(UART3_BASE_PTR); /* Read status register */ if (StatReg & (UART_S1_NF_MASK | UART_S1_OR_MASK | UART_S1_FE_MASK | UART_S1_PF_MASK)) { /* Is any error flag set? */ (void)UART_PDD_GetChar8(UART3_BASE_PTR); /* Dummy read 8-bit character from receiver */ StatReg &= (uint32_t)(~(uint32_t)UART_S1_RDRF_MASK); /* Clear the receive data flag to discard the errorneous data */ } if (StatReg & UART_S1_RDRF_MASK) { /* Is the receiver's interrupt flag set? */ InterruptRx(DeviceDataPrv); /* If yes, then invoke the internal service routine. This routine is inlined. */ } if (DeviceDataPrv->SerFlag & ENABLED_TX_INT) { /* Is the transmitter interrupt enabled? */ if (StatReg & UART_S1_TDRE_MASK) { /* Is the transmitter empty? */ InterruptTx(DeviceDataPrv); /* If yes, then invoke the internal service routine. This routine is inlined. */ } } if ((UART_PDD_GetTxCompleteInterruptMask(UART3_BASE_PTR) != 0U) && (StatReg & UART_S1_TC_MASK)) { /* Is a transmission completed? */ UART_PDD_DisableInterrupt(UART3_BASE_PTR, UART_PDD_INTERRUPT_TRANSMITTER_COMPLETE); /* If yes then disable TX complete interrupt */ UART_A_OnTxComplete(DeviceDataPrv->UserDataPtr); /* If yes then invoke user event */ } }