コード例 #1
0
ファイル: serial_api.c プロジェクト: DanKupiniak/mbed
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++;
}
コード例 #2
0
ファイル: serial_api.c プロジェクト: Josnaky/mbed
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();
        }
    }
}
コード例 #3
0
ファイル: serial_api.c プロジェクト: StefanRastocky/mbed-os
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();
        }
    }
}
コード例 #4
0
ファイル: rt_MemBox.c プロジェクト: Babody/mbed
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);
}
コード例 #5
0
ファイル: rt_MemBox.c プロジェクト: Babody/mbed
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);
}
コード例 #6
0
ファイル: serial_api.c プロジェクト: Josnaky/mbed
/******************************************************************************
 * 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;
}
コード例 #7
0
ファイル: serial_api.c プロジェクト: Josnaky/mbed
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();
    }
}
コード例 #8
0
ファイル: serial_api.c プロジェクト: Josnaky/mbed
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();
    }
}
コード例 #9
0
ファイル: serial_api.c プロジェクト: Josnaky/mbed
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();
    }
}
コード例 #10
0
ファイル: serial_api.c プロジェクト: Josnaky/mbed
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();
    }
}
コード例 #11
0
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. */
    }
}