void serial_putc(serial_t *obj, int c) { uint16_t dummy_read; int was_masked; #if defined ( __ICCARM__ ) was_masked = __disable_irq_iar(); #else was_masked = __disable_irq(); #endif /* __ICCARM__ */ obj->uart->SCSCR |= 0x0080; // Set TIE if (!was_masked) { __enable_irq(); } while (!serial_writable(obj)); obj->uart->SCFTDR = c; #if defined ( __ICCARM__ ) was_masked = __disable_irq_iar(); #else was_masked = __disable_irq(); #endif /* __ICCARM__ */ dummy_read = obj->uart->SCFSR; obj->uart->SCFSR = (dummy_read & 0xff9f); // Clear TEND/TDFE if (!was_masked) { __enable_irq(); } uart_data[obj->index].count++; }
void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, PinName txflow) { // determine the UART to use int was_masked; serial_flow_irq_set(obj, 0); if (type == FlowControlRTSCTS) { #if defined ( __ICCARM__ ) was_masked = __disable_irq_iar(); #else was_masked = __disable_irq(); #endif /* __ICCARM__ */ obj->serial.uart->SCFCR = 0x0008u; // CTS/RTS enable if (!was_masked) { __enable_irq(); } pinmap_pinout(rxflow, PinMap_UART_RTS); pinmap_pinout(txflow, PinMap_UART_CTS); } else { #if defined ( __ICCARM__ ) was_masked = __disable_irq_iar(); #else was_masked = __disable_irq(); #endif /* __ICCARM__ */ obj->serial.uart->SCFCR = 0x0000u; // CTS/RTS diable if (!was_masked) { __enable_irq(); } } }
static void uart_err_irq(IRQn_Type irq_num, uint32_t index) { serial_t *obj = uart_data[index].receiving_obj; int was_masked, err_read; if (obj) { serial_irq_err_set(obj, 0); if (uart_data[index].wanted_rx_events & (SERIAL_EVENT_RX_PARITY_ERROR | SERIAL_EVENT_RX_FRAMING_ERROR)) { uart_data[index].event = SERIAL_EVENT_RX_PARITY_ERROR | SERIAL_EVENT_RX_FRAMING_ERROR; if (obj->serial.uart->SCFSR & 1 << 2) { uart_data[index].event = SERIAL_EVENT_RX_PARITY_ERROR; } else if (obj->serial.uart->SCFSR & 1 << 3) { uart_data[index].event = SERIAL_EVENT_RX_FRAMING_ERROR; } ((void (*)())uart_data[index].async_rx_callback)(); } serial_rx_abort_asynch(obj); #if defined ( __ICCARM__ ) was_masked = __disable_irq_iar(); #else was_masked = __disable_irq(); #endif /* __ICCARM__ */ if (obj->serial.uart->SCFSR & 0x93) { err_read = obj->serial.uart->SCFSR; obj->serial.uart->SCFSR = (err_read & ~0x93); } if (obj->serial.uart->SCLSR & 1) { obj->serial.uart->SCLSR = 0; } if (!was_masked) { __enable_irq(); } } }
void *rt_alloc_box (void *box_mem) { /* Allocate a memory block and return start address. */ void **free; #ifndef __USE_EXCLUSIVE_ACCESS int irq_dis; #if defined (__ICCARM__) irq_dis = __disable_irq_iar(); #else irq_dis = __disable_irq (); #endif /* __ICCARM__ */ free = ((P_BM) box_mem)->free; if (free) { ((P_BM) box_mem)->free = *free; } if (!irq_dis) __enable_irq (); #else do { if ((free = (void **)__ldrex(&((P_BM) box_mem)->free)) == 0) { __clrex(); break; } } while (__strex((U32)*free, &((P_BM) box_mem)->free)); #endif return (free); }
int rt_free_box (void *box_mem, void *box) { /* Free a memory block, returns 0 if OK, 1 if box does not belong to box_mem */ #ifndef __USE_EXCLUSIVE_ACCESS int irq_dis; #endif if (box < box_mem || box >= ((P_BM) box_mem)->end) { return (1); } #ifndef __USE_EXCLUSIVE_ACCESS #if defined (__ICCARM__) irq_dis = __disable_irq_iar(); #else irq_dis = __disable_irq (); #endif /* __ICCARM__ */ *((void **)box) = ((P_BM) box_mem)->free; ((P_BM) box_mem)->free = box; if (!irq_dis) __enable_irq (); #else do { *((void **)box) = (void *)__ldrex(&((P_BM) box_mem)->free); } while (__strex ((U32)box, &((P_BM) box_mem)->free)); #endif return (0); }
/****************************************************************************** * READ/WRITE ******************************************************************************/ int serial_getc(serial_t *obj) { uint16_t err_read; int data; int was_masked; #if defined ( __ICCARM__ ) was_masked = __disable_irq_iar(); #else was_masked = __disable_irq(); #endif /* __ICCARM__ */ if (obj->serial.uart->SCFSR & 0x93) { err_read = obj->serial.uart->SCFSR; obj->serial.uart->SCFSR = (err_read & ~0x93); } obj->serial.uart->SCSCR |= 0x0040; // Set RIE if (!was_masked) { __enable_irq(); } if (obj->serial.uart->SCLSR & 0x0001) { obj->serial.uart->SCLSR = 0u; // ORER clear } while (!serial_readable(obj)); data = obj->serial.uart->SCFRDR & 0xff; #if defined ( __ICCARM__ ) was_masked = __disable_irq_iar(); #else was_masked = __disable_irq(); #endif /* __ICCARM__ */ err_read = obj->serial.uart->SCFSR; obj->serial.uart->SCFSR = (err_read & 0xfffD); // Clear RDF if (!was_masked) { __enable_irq(); } if (err_read & 0x80) { data = -1; //err } return data; }
void serial_break_clear(serial_t *obj) { int was_masked; #if defined ( __ICCARM__ ) was_masked = __disable_irq_iar(); #else was_masked = __disable_irq(); #endif /* __ICCARM__ */ obj->serial.uart->SCSCR |= 0x0020u; // TE = 1 (Output enable) obj->serial.uart->SCSPTR |= 0x0001u; // SPB2DT = 1 if (!was_masked) { __enable_irq(); } }
void serial_break_set(serial_t *obj) { int was_masked; #if defined ( __ICCARM__ ) was_masked = __disable_irq_iar(); #else was_masked = __disable_irq(); #endif /* __ICCARM__ */ // TxD Output(L) obj->serial.uart->SCSPTR &= ~0x0001u; // SPB2DT = 0 obj->serial.uart->SCSCR &= ~0x0020u; // TE = 0 (Output disable) if (!was_masked) { __enable_irq(); } }
void serial_clear(serial_t *obj) { int was_masked; #if defined ( __ICCARM__ ) was_masked = __disable_irq_iar(); #else was_masked = __disable_irq(); #endif /* __ICCARM__ */ obj->serial.uart->SCFCR |= 0x06; // TFRST = 1, RFRST = 1 obj->serial.uart->SCFCR &= ~0x06; // TFRST = 0, RFRST = 0 obj->serial.uart->SCFSR &= ~0x0093u; // ER, BRK, RDF, DR = 0 if (!was_masked) { __enable_irq(); } }
static void serial_put_done(serial_t *obj) { int was_masked; volatile uint16_t dummy_read; #if defined ( __ICCARM__ ) was_masked = __disable_irq_iar(); #else was_masked = __disable_irq(); #endif /* __ICCARM__ */ dummy_read = obj->serial.uart->SCFSR; obj->serial.uart->SCFSR = (dummy_read & 0xff9f); // Clear TEND/TDFE obj->serial.uart->SCSCR |= 0x0080; // Set TIE if (!was_masked) { __enable_irq(); } }
static void ahf_lock(AHF_S * const ahf) { if(ahf->flags & AHF_LOCKSEM) { osMutexWait(ahf->semid, 0); } else if (ahf->flags & AHF_LOCKINT) { #if defined (__ICCARM__) ahf->saved_int_mask = __disable_irq_iar(); #else ahf->saved_int_mask = __disable_irq(); #endif } else { ; /* MISRA compliance. */ } }