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);
|
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)
|
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);
|
MXC_UART_Init (obj->uart, DEFAULT_BAUD, obj->map);
|
||||||
//MBED_ASSERT(retval == E_NO_ERROR);
|
//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)
|
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)
|
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);
|
MBED_ASSERT(obj->index < MXC_UART_INSTANCES);
|
||||||
objs[obj->index] = obj;
|
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
|
// 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);
|
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);
|
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)
|
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);
|
MXC_UART_Init (obj->uart, DEFAULT_BAUD, MXC_UART_APB_CLK, obj->map);
|
||||||
//MBED_ASSERT(retval == E_NO_ERROR);
|
//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)
|
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)
|
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);
|
MBED_ASSERT(obj->index < MXC_UART_INSTANCES);
|
||||||
objs[obj->index] = obj;
|
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
|
// Set TX Almost Empty level to interrupt when empty
|
||||||
MXC_UART_SetRXThreshold(obj->uart, 1);
|
MXC_UART_SetRXThreshold(obj->uart, 1);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue