mirror of https://github.com/ARMmbed/mbed-os.git
commit
f347b89d0d
|
@ -67,6 +67,35 @@ static serial_t *objs[MXC_UART_INSTANCES];
|
|||
|
||||
static void usurp_pin(PinName, int);
|
||||
|
||||
//******************************************************************************
|
||||
void uart_handler(serial_t *obj)
|
||||
{
|
||||
// clear interrupts
|
||||
volatile uint32_t flags = obj->uart->int_fl;
|
||||
|
||||
if (flags & UART_ER_IE) {
|
||||
// clear error flags
|
||||
obj->uart->int_fl = UART_ER_IE;
|
||||
}
|
||||
|
||||
if (flags & UART_RX_IE) {
|
||||
obj->uart->int_fl = UART_RX_IE;
|
||||
if (obj && irq_handler) {
|
||||
irq_handler(obj->id, RxIrq);
|
||||
}
|
||||
}
|
||||
|
||||
if (flags & UART_TX_IE) {
|
||||
obj->uart->int_fl = UART_TX_IE;
|
||||
if (obj && irq_handler) {
|
||||
irq_handler(obj->id, TxIrq);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void uart0_handler(void) { uart_handler(objs[0]); }
|
||||
void uart1_handler(void) { uart_handler(objs[1]); }
|
||||
|
||||
//******************************************************************************
|
||||
void serial_init(serial_t *obj, PinName tx, PinName rx)
|
||||
{
|
||||
|
@ -106,6 +135,19 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
|
|||
|
||||
MXC_UART_Init (obj->uart, DEFAULT_BAUD, obj->map);
|
||||
//MBED_ASSERT(retval == E_NO_ERROR);
|
||||
|
||||
switch (obj->index) {
|
||||
case 0:
|
||||
NVIC_SetVector(UART0_IRQn, (uint32_t)uart0_handler);
|
||||
NVIC_EnableIRQ(UART0_IRQn);
|
||||
break;
|
||||
case 1:
|
||||
NVIC_SetVector(UART1_IRQn, (uint32_t)uart1_handler);
|
||||
NVIC_EnableIRQ(UART1_IRQn);
|
||||
break;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void serial_free(serial_t *obj)
|
||||
|
@ -158,35 +200,6 @@ void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_b
|
|||
}
|
||||
}
|
||||
|
||||
//******************************************************************************
|
||||
void uart_handler(serial_t *obj)
|
||||
{
|
||||
// clear interrupts
|
||||
volatile uint32_t flags = obj->uart->int_fl;
|
||||
|
||||
if (flags & UART_ER_IE) {
|
||||
// clear error flags
|
||||
obj->uart->int_fl = UART_ER_IE;
|
||||
}
|
||||
|
||||
if (flags & UART_RX_IE) {
|
||||
obj->uart->int_fl = UART_RX_IE;
|
||||
if (obj && irq_handler) {
|
||||
irq_handler(obj->id, RxIrq);
|
||||
}
|
||||
}
|
||||
|
||||
if (flags & UART_TX_IE) {
|
||||
obj->uart->int_fl = UART_TX_IE;
|
||||
if (obj && irq_handler) {
|
||||
irq_handler(obj->id, TxIrq);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void uart0_handler(void) { uart_handler(objs[0]); }
|
||||
void uart1_handler(void) { uart_handler(objs[1]); }
|
||||
|
||||
//******************************************************************************
|
||||
void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id)
|
||||
{
|
||||
|
@ -200,22 +213,6 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
|
|||
MBED_ASSERT(obj->index < MXC_UART_INSTANCES);
|
||||
objs[obj->index] = obj;
|
||||
|
||||
switch (obj->index) {
|
||||
case 0:
|
||||
NVIC_SetVector(UART0_IRQn, (uint32_t)uart0_handler);
|
||||
NVIC_EnableIRQ(UART0_IRQn);
|
||||
break;
|
||||
case 1:
|
||||
NVIC_SetVector(UART1_IRQn, (uint32_t)uart1_handler);
|
||||
NVIC_EnableIRQ(UART1_IRQn);
|
||||
break;
|
||||
default:
|
||||
MBED_ASSERT(0);
|
||||
}
|
||||
|
||||
// Clear pending interrupts
|
||||
obj->uart->int_fl = obj->uart->int_fl;
|
||||
|
||||
// Set TX Almost Empty level to interrupt when empty
|
||||
obj->uart->ctrl1 = (MXC_F_UART_THRESH_CTRL_RX_FIFO_DEFAULT_THRESH_VAL | MXC_F_UART_THRESH_CTRL_TX_FIFO_DEFAULT_THRESH_VAL);
|
||||
|
||||
|
|
|
@ -63,6 +63,37 @@ static serial_t *objs[MXC_UART_INSTANCES];
|
|||
|
||||
static void usurp_pin(PinName, int);
|
||||
|
||||
//******************************************************************************
|
||||
void uart_handler(serial_t *obj)
|
||||
{
|
||||
// clear interrupts
|
||||
volatile uint32_t flags = obj->uart->int_fl;
|
||||
|
||||
if (flags & UART_ER_IE) {
|
||||
// clear error flags
|
||||
obj->uart->int_fl = UART_ER_IE;
|
||||
}
|
||||
|
||||
if (flags & UART_RX_IE) {
|
||||
obj->uart->int_fl = UART_RX_IE;
|
||||
if (obj && irq_handler) {
|
||||
irq_handler(obj->id, RxIrq);
|
||||
}
|
||||
}
|
||||
|
||||
if (flags & UART_TX_IE) {
|
||||
obj->uart->int_fl = UART_TX_IE;
|
||||
if (obj && irq_handler) {
|
||||
irq_handler(obj->id, TxIrq);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void uart0_handler(void) { uart_handler(objs[0]); }
|
||||
void uart1_handler(void) { uart_handler(objs[1]); }
|
||||
void uart2_handler(void) { uart_handler(objs[2]); }
|
||||
void uart3_handler(void) { uart_handler(objs[3]); }
|
||||
|
||||
//******************************************************************************
|
||||
void serial_init(serial_t *obj, PinName tx, PinName rx)
|
||||
{
|
||||
|
@ -101,6 +132,27 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
|
|||
|
||||
MXC_UART_Init (obj->uart, DEFAULT_BAUD, MXC_UART_APB_CLK, obj->map);
|
||||
//MBED_ASSERT(retval == E_NO_ERROR);
|
||||
|
||||
switch (obj->index) {
|
||||
case 0:
|
||||
NVIC_SetVector(UART0_IRQn, (uint32_t)uart0_handler);
|
||||
NVIC_EnableIRQ(UART0_IRQn);
|
||||
break;
|
||||
case 1:
|
||||
NVIC_SetVector(UART1_IRQn, (uint32_t)uart1_handler);
|
||||
NVIC_EnableIRQ(UART1_IRQn);
|
||||
break;
|
||||
case 2:
|
||||
NVIC_SetVector(UART2_IRQn, (uint32_t)uart2_handler);
|
||||
NVIC_EnableIRQ(UART2_IRQn);
|
||||
break;
|
||||
case 3:
|
||||
NVIC_SetVector(UART3_IRQn, (uint32_t)uart3_handler);
|
||||
NVIC_EnableIRQ(UART3_IRQn);
|
||||
break;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void serial_free(serial_t *obj)
|
||||
|
@ -153,37 +205,6 @@ void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_b
|
|||
}
|
||||
}
|
||||
|
||||
//******************************************************************************
|
||||
void uart_handler(serial_t *obj)
|
||||
{
|
||||
// clear interrupts
|
||||
volatile uint32_t flags = obj->uart->int_fl;
|
||||
|
||||
if (flags & UART_ER_IE) {
|
||||
// clear error flags
|
||||
obj->uart->int_fl = UART_ER_IE;
|
||||
}
|
||||
|
||||
if (flags & UART_RX_IE) {
|
||||
obj->uart->int_fl = UART_RX_IE;
|
||||
if (obj && irq_handler) {
|
||||
irq_handler(obj->id, RxIrq);
|
||||
}
|
||||
}
|
||||
|
||||
if (flags & UART_TX_IE) {
|
||||
obj->uart->int_fl = UART_TX_IE;
|
||||
if (obj && irq_handler) {
|
||||
irq_handler(obj->id, TxIrq);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void uart0_handler(void) { uart_handler(objs[0]); }
|
||||
void uart1_handler(void) { uart_handler(objs[1]); }
|
||||
void uart2_handler(void) { uart_handler(objs[2]); }
|
||||
void uart3_handler(void) { uart_handler(objs[3]); }
|
||||
|
||||
//******************************************************************************
|
||||
void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id)
|
||||
{
|
||||
|
@ -197,30 +218,6 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
|
|||
MBED_ASSERT(obj->index < MXC_UART_INSTANCES);
|
||||
objs[obj->index] = obj;
|
||||
|
||||
switch (obj->index) {
|
||||
case 0:
|
||||
NVIC_SetVector(UART0_IRQn, (uint32_t)uart0_handler);
|
||||
NVIC_EnableIRQ(UART0_IRQn);
|
||||
break;
|
||||
case 1:
|
||||
NVIC_SetVector(UART1_IRQn, (uint32_t)uart1_handler);
|
||||
NVIC_EnableIRQ(UART1_IRQn);
|
||||
break;
|
||||
case 2:
|
||||
NVIC_SetVector(UART2_IRQn, (uint32_t)uart2_handler);
|
||||
NVIC_EnableIRQ(UART2_IRQn);
|
||||
break;
|
||||
case 3:
|
||||
NVIC_SetVector(UART3_IRQn, (uint32_t)uart3_handler);
|
||||
NVIC_EnableIRQ(UART3_IRQn);
|
||||
break;
|
||||
default:
|
||||
MBED_ASSERT(0);
|
||||
}
|
||||
|
||||
// Clear pending interrupts
|
||||
obj->uart->int_fl = obj->uart->int_fl;
|
||||
|
||||
// Set TX Almost Empty level to interrupt when empty
|
||||
MXC_UART_SetRXThreshold(obj->uart, 1);
|
||||
|
||||
|
|
Loading…
Reference in New Issue