int uartadapter_control_set_req_handle(u8 *pbuf, u32 sz) { u8 *p = pbuf; u8 type = 0, len = 0; ua_printf(UA_DEBUG, "\n===>uartadapter_control_set_req_handle()"); UA_PRINT_DATA(pbuf, sz); while(p < (pbuf+sz)){ type = *p++; len = *p++; ua_printf(UA_DEBUG, "type=%d len=%d\n", type, len); switch(type) { case UART_CTRL_TYPE_BAUD_RATE: ua_uart_config[0].hal_uart_adp.BaudRate = *(u32 *)p; ua_printf(UA_INFO, "SET UART BAUD_RATE to %d.\n", ua_uart_config[0].hal_uart_adp.BaudRate); serial_baud(&ua_sobj, ua_uart_config[0].hal_uart_adp.BaudRate); break; case UART_CTRL_TYPE_WORD_LEN: ua_uart_config[0].hal_uart_adp.WordLen = *p; ua_printf(UA_INFO, "SET UART WORD_LEN to %d.\n", ua_uart_config[0].hal_uart_adp.WordLen); serial_format(&ua_sobj, ua_uart_config[0].hal_uart_adp.WordLen, (SerialParity)ua_uart_config[0].hal_uart_adp.Parity, ua_uart_config[0].hal_uart_adp.StopBit); break; case UART_CTRL_TYPE_PARITY: ua_uart_config[0].hal_uart_adp.Parity = *p; ua_printf(UA_INFO, "SET UART PARITY to %d.\n", ua_uart_config[0].hal_uart_adp.Parity); serial_format(&ua_sobj, ua_uart_config[0].hal_uart_adp.WordLen, (SerialParity)ua_uart_config[0].hal_uart_adp.Parity, ua_uart_config[0].hal_uart_adp.StopBit); break; case UART_CTRL_TYPE_STOP_BIT: ua_uart_config[0].hal_uart_adp.StopBit = *p; ua_printf(UA_INFO, "SET UART STOP_BIT to %d.\n", ua_uart_config[0].hal_uart_adp.StopBit); serial_format(&ua_sobj, ua_uart_config[0].hal_uart_adp.WordLen, (SerialParity)ua_uart_config[0].hal_uart_adp.Parity, ua_uart_config[0].hal_uart_adp.StopBit); break; case UART_CTRL_TYPE_FLOW_CTRL: ua_uart_config[0].hal_uart_adp.FlowControl = *p; ua_printf(UA_INFO, "SET UART FLOW_CTRL to %d.\n", ua_uart_config[0].hal_uart_adp.FlowControl); ua_printf(UA_INFO, "SET UART FLOW_CTRL not support now.\n"); //TODO break; } p += len; } return 0; }
void serial_init(serial_t *obj, PinName tx, PinName rx) { int is_stdio_uart = 0; // determine the UART to use UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX); UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX); UARTName uart = (UARTName)pinmap_merge(uart_tx, uart_rx); if ((int)uart == NC) { error("Serial pinout mapping failed"); } obj->uart = (LPC_UART_TypeDef *)uart; // enable power switch (uart) { case UART_0: LPC_SC->PCONP |= 1 << 3; break; case UART_1: LPC_SC->PCONP |= 1 << 4; break; case UART_2: LPC_SC->PCONP |= 1 << 24; break; case UART_3: LPC_SC->PCONP |= 1 << 25; break; } // enable fifos and default rx trigger level obj->uart->FCR = 1 << 0 // FIFO Enable - 0 = Disables, 1 = Enabled | 0 << 1 // Rx Fifo Reset | 0 << 2 // Tx Fifo Reset | 0 << 6; // Rx irq trigger level - 0 = 1 char, 1 = 4 chars, 2 = 8 chars, 3 = 14 chars // disable irqs obj->uart->IER = 0 << 0 // Rx Data available irq enable | 0 << 1 // Tx Fifo empty irq enable | 0 << 2; // Rx Line Status irq enable // set default baud rate and format serial_baud (obj, 9600); serial_format(obj, 8, ParityNone, 1); // pinout the chosen uart pinmap_pinout(tx, PinMap_UART_TX); pinmap_pinout(rx, PinMap_UART_RX); // set rx/tx pins in PullUp mode pin_mode(tx, PullUp); pin_mode(rx, PullUp); switch (uart) { case UART_0: obj->index = 0; break; case UART_1: obj->index = 1; break; case UART_2: obj->index = 2; break; case UART_3: obj->index = 3; break; } uart_data[obj->index].sw_rts.pin = NC; uart_data[obj->index].sw_cts.pin = NC; serial_set_flow_control(obj, FlowControlNone, NC, NC); is_stdio_uart = (uart == STDIO_UART) ? (1) : (0); if (is_stdio_uart) { stdio_uart_inited = 1; memcpy(&stdio_uart, obj, sizeof(serial_t)); } }
void serial_init(serial_t *obj, PinName tx, PinName rx) { int is_stdio_uart = 0; int uart_n = get_available_uart(); if (uart_n == -1) { error("No available UART"); } obj->index = uart_n; obj->uart = (LPC_USART_TypeDef *)(LPC_USART0_BASE + (0x4000 * uart_n)); uart_used |= (1 << uart_n); const SWM_Map *swm; uint32_t regVal; swm = &SWM_UART_TX[uart_n]; regVal = LPC_SWM->PINASSIGN[swm->n] & ~(0xFF << swm->offset); LPC_SWM->PINASSIGN[swm->n] = regVal | (tx << swm->offset); swm = &SWM_UART_RX[uart_n]; regVal = LPC_SWM->PINASSIGN[swm->n] & ~(0xFF << swm->offset); LPC_SWM->PINASSIGN[swm->n] = regVal | (rx << swm->offset); /* uart clock divided by 1 */ LPC_SYSCON->UARTCLKDIV = 1; /* disable uart interrupts */ NVIC_DisableIRQ((IRQn_Type)(UART0_IRQn + uart_n)); /* Enable UART clock */ LPC_SYSCON->SYSAHBCLKCTRL |= (1 << (14 + uart_n)); /* Peripheral reset control to UART, a "1" bring it out of reset. */ LPC_SYSCON->PRESETCTRL &= ~(0x1 << (3 + uart_n)); LPC_SYSCON->PRESETCTRL |= (0x1 << (3 + uart_n)); UARTSysClk = SystemCoreClock / LPC_SYSCON->UARTCLKDIV; // set default baud rate and format serial_baud (obj, 9600); serial_format(obj, 8, ParityNone, 1); /* Clear all status bits. */ obj->uart->STAT = CTS_DELTA | DELTA_RXBRK; /* enable uart interrupts */ NVIC_EnableIRQ((IRQn_Type)(UART0_IRQn + uart_n)); /* Enable UART interrupt */ // obj->uart->INTENSET = RXRDY | TXRDY | DELTA_RXBRK; /* Enable UART */ obj->uart->CFG |= UART_EN; is_stdio_uart = ((tx == USBTX) && (rx == USBRX)); if (is_stdio_uart) { stdio_uart_inited = 1; memcpy(&stdio_uart, obj, sizeof(serial_t)); } }
int uartadapter_uart_open(char *uartname, ua_uart_set_str *puartpara) { PinName uart_tx,uart_rx; if(!strcmp("uart0", uartname)){ uart_tx = PA_7; uart_rx = PA_6; ua_uart_config[0].hal_uart_adp.BaudRate = puartpara->BaudRate; ua_uart_config[0].hal_uart_adp.FlowControl = puartpara->FlowControl; ua_uart_config[0].hal_uart_adp.WordLen = puartpara->number; ua_uart_config[0].hal_uart_adp.Parity = puartpara->parity; ua_uart_config[0].hal_uart_adp.StopBit = puartpara->StopBits; }else{ ua_printf(UA_ERROR, "please check uart name!"); return RTW_ERROR; } /*initial uart */ serial_init(&ua_sobj,uart_tx,uart_rx); serial_baud(&ua_sobj,puartpara->BaudRate); serial_format(&ua_sobj, puartpara->number, (SerialParity)puartpara->parity, puartpara->StopBits); /*uart irq handle*/ serial_irq_handler(&ua_sobj, uartadapter_uart_irq, (uint32_t)&ua_sobj); serial_irq_set(&ua_sobj, RxIrq, 1); serial_irq_set(&ua_sobj, TxIrq, 1); return 0; }
int uartadapter_uart_para(int word_len, int parity, int stop_bits) { int ret = 0; serial_format(&ua_sobj, word_len, (SerialParity)parity, stop_bits); return ret; }
void serial_init(serial_t *obj, PinName tx, PinName rx) { int is_stdio_uart = 0; // determine the UART to use UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX); UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX); UARTName uart = (UARTName)pinmap_merge(uart_tx, uart_rx); MBED_ASSERT((int)uart != NC); obj->uart = (LPC_USART_Type *)uart; LPC_SYSCON->SYSAHBCLKCTRL |= (1<<12); // [TODO] Consider more elegant approach // disconnect USBTX/RX mapping mux, for case when switching ports #ifdef USBTX pin_function(USBTX, 0); pin_function(USBRX, 0); #endif // enable fifos and default rx trigger level obj->uart->FCR = 1 << 0 // FIFO Enable - 0 = Disables, 1 = Enabled | 0 << 1 // Rx Fifo Reset | 0 << 2 // Tx Fifo Reset | 0 << 6; // Rx irq trigger level - 0 = 1 char, 1 = 4 chars, 2 = 8 chars, 3 = 14 chars // disable irqs obj->uart->IER = 0 << 0 // Rx Data available irq enable | 0 << 1 // Tx Fifo empty irq enable | 0 << 2; // Rx Line Status irq enable // set default baud rate and format serial_baud (obj, 9600); serial_format(obj, 8, ParityNone, 1); // pinout the chosen uart pinmap_pinout(tx, PinMap_UART_TX); pinmap_pinout(rx, PinMap_UART_RX); // set rx/tx pins in PullUp mode if (tx != NC) { pin_mode(tx, PullUp); } if (rx != NC) { pin_mode(rx, PullUp); } switch (uart) { case UART_0: obj->index = 0; break; } is_stdio_uart = (uart == STDIO_UART) ? (1) : (0); if (is_stdio_uart) { stdio_uart_inited = 1; memcpy(&stdio_uart, obj, sizeof(serial_t)); } }
uart_socket_t* uart_open(uart_set_str *puartpara) { PinName uart_tx = PA_7;//PA_4; //PA_7 PinName uart_rx = PA_6;//PA_0; //PA_6 uart_socket_t *u; u = (uart_socket_t *)RtlZmalloc(sizeof(uart_socket_t)); if(!u){ uart_printf("%s(): Alloc memory for uart_socket failed!\n", __func__); return NULL; } /*initial uart */ serial_init(&u->sobj, uart_tx,uart_rx); serial_baud(&u->sobj,puartpara->BaudRate); serial_format(&u->sobj, puartpara->number, (SerialParity)puartpara->parity, puartpara->StopBits); /*uart irq handle*/ serial_irq_handler(&u->sobj, uart_irq, (int)u); serial_irq_set(&u->sobj, RxIrq, 1); serial_irq_set(&u->sobj, TxIrq, 1); #if UART_SOCKET_USE_DMA_TX serial_send_comp_handler(&u->sobj, (void*)uart_send_stream_done, (uint32_t)u); #endif /*alloc a socket*/ u->fd = lwip_allocsocketsd(); if(u->fd == -1){ uart_printf("Failed to alloc uart socket!\n"); goto Exit2; } /*init uart related semaphore*/ RtlInitSema(&u->action_sema, 0); RtlInitSema(&u->tx_sema, 1); RtlInitSema(&u->dma_tx_sema, 1); /*create uart_thread to handle send&recv data*/ { #define UART_ACTION_STACKSIZE 512 #define UART_ACTION_PRIORITY 1 if(xTaskCreate(uart_action_handler, ((const char*)"uart_action"), UART_ACTION_STACKSIZE, u, UART_ACTION_PRIORITY, NULL) != pdPASS){ uart_printf("%s xTaskCreate(uart_action) failed", __FUNCTION__); goto Exit1; } } return u; Exit1: /* Free uart related semaphore */ RtlFreeSema(&u->action_sema); RtlFreeSema(&u->tx_sema); RtlFreeSema(&u->dma_tx_sema); Exit2: RtlMfree((u8*)u, sizeof(uart_socket_t)); return NULL; }
void UARTClass1::begin( const uint32_t dwBaudRate ) { serial_init(&(this->sobj),UART1_TX,UART1_RX); serial_baud(&(this->sobj),dwBaudRate); serial_format(&(this->sobj), 8, ParityNone, 1); serial_set_pullNone(); serial_irq_handler(&(this->sobj), uart_irq, (uint32_t)&(this->sobj)); serial_irq_set(&(this->sobj), RxIrq, 1); serial_irq_set(&(this->sobj), TxIrq, 1); }
IRSendRev::IRSendRev(uint8_t receivePin, uint8_t transmitPin) { this->receivePin = receivePin; this->transmitPin = transmitPin; pUART = malloc( sizeof(serial_t) ); serial_init((serial_t *)pUART, (PinName)(g_APinDescription[transmitPin].pinname), (PinName)(g_APinDescription[receivePin].pinname)); serial_baud((serial_t *)pUART, 38*1000*2); serial_format((serial_t *)pUART, 8, ParityNone, 1); // initialize receiving pGpioIrqRecv = malloc( sizeof(gpio_irq_t) ); pTimerRecv = malloc( sizeof(gtimer_t) ); }
void serial_init(serial_t *obj, PinName tx, PinName rx) { // determine the UART to use -- for mcu's with multiple uart connections UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX); UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX); UARTName uart = (UARTName)pinmap_merge(uart_tx, uart_rx); if ((int)uart == NC) { error("Serial pinout mapping failed"); } obj->uart = (NRF_UART_Type *)uart; //pin configurations -- //outputs NRF_GPIO->DIR |= (1<<tx);//TX_PIN_NUMBER); NRF_GPIO->DIR |= (1<<RTS_PIN_NUMBER); NRF_GPIO->DIR &= ~(1<<rx);//RX_PIN_NUMBER); NRF_GPIO->DIR &= ~(1<<CTS_PIN_NUMBER); obj->uart->PSELRTS = RTS_PIN_NUMBER; obj->uart->PSELTXD = tx;//TX_PIN_NUMBER; //inputs obj->uart->PSELCTS = CTS_PIN_NUMBER; obj->uart->PSELRXD = rx;//RX_PIN_NUMBER; // set default baud rate and format serial_baud (obj, 9600); serial_format(obj, 8, ParityNone, 1); obj->uart->ENABLE = (UART_ENABLE_ENABLE_Enabled << UART_ENABLE_ENABLE_Pos);; obj->uart->TASKS_STARTTX = 1; obj->uart->TASKS_STARTRX = 1; obj->uart->EVENTS_RXDRDY =0; obj->index = 0; // set rx/tx pins in PullUp mode pin_mode(tx, PullUp); pin_mode(rx, PullUp); if (uart == STDIO_UART) { stdio_uart_inited = 1; memcpy(&stdio_uart, obj, sizeof(serial_t)); } }
void serial_init(serial_t *obj, PinName tx, PinName rx) { UARTName uart = UART_0; MBED_ASSERT((int)uart != NC); obj->uart = (NRF_UART_Type *)uart; //pin configurations -- //outputs NRF_GPIO->DIR |= (1 << tx); //TX_PIN_NUMBER); NRF_GPIO->DIR |= (1 << RTS_PIN_NUMBER); NRF_GPIO->DIR &= ~(1 << rx); //RX_PIN_NUMBER); NRF_GPIO->DIR &= ~(1 << CTS_PIN_NUMBER); obj->uart->PSELRTS = RTS_PIN_NUMBER; obj->uart->PSELTXD = tx; //TX_PIN_NUMBER; //inputs obj->uart->PSELCTS = CTS_PIN_NUMBER; obj->uart->PSELRXD = rx; //RX_PIN_NUMBER; // set default baud rate and format serial_baud (obj, 9600); serial_format(obj, 8, ParityNone, 1); obj->uart->ENABLE = (UART_ENABLE_ENABLE_Enabled << UART_ENABLE_ENABLE_Pos); obj->uart->TASKS_STARTTX = 1; obj->uart->TASKS_STARTRX = 1; obj->uart->EVENTS_RXDRDY = 0; obj->index = 0; // set rx/tx pins in PullUp mode if (tx != NC) { pin_mode(tx, PullUp); } if (rx != NC) { pin_mode(rx, PullUp); } if (uart == STDIO_UART) { stdio_uart_inited = 1; memcpy(&stdio_uart, obj, sizeof(serial_t)); } }
void serial_init(serial_t *obj, PinName tx, PinName rx) { UARTName uart = UART_0; obj->uart = (NRF_UART_Type *)uart; //pin configurations -- NRF_GPIO->OUT |= (1 << tx); NRF_GPIO->OUT |= (1 << RTS_PIN_NUMBER); NRF_GPIO->DIR |= (1 << tx); //TX_PIN_NUMBER); NRF_GPIO->DIR |= (1 << RTS_PIN_NUMBER); NRF_GPIO->DIR &= ~(1 << rx); //RX_PIN_NUMBER); NRF_GPIO->DIR &= ~(1 << CTS_PIN_NUMBER); // set default baud rate and format serial_baud (obj, 9600); serial_format(obj, 8, ParityNone, 1); obj->uart->ENABLE = (UART_ENABLE_ENABLE_Enabled << UART_ENABLE_ENABLE_Pos); obj->uart->TASKS_STARTTX = 1; obj->uart->TASKS_STARTRX = 1; obj->uart->EVENTS_RXDRDY = 0; // dummy write needed or TXDRDY trails write rather than leads write. // pins are disconnected so nothing is physically transmitted on the wire obj->uart->TXD = 0; obj->index = 0; obj->uart->PSELRTS = RTS_PIN_NUMBER; obj->uart->PSELTXD = tx; //TX_PIN_NUMBER; obj->uart->PSELCTS = CTS_PIN_NUMBER; obj->uart->PSELRXD = rx; //RX_PIN_NUMBER; // set rx/tx pins in PullUp mode if (tx != NC) { pin_mode(tx, PullUp); } if (rx != NC) { pin_mode(rx, PullUp); } if (uart == STDIO_UART) { stdio_uart_inited = 1; memcpy(&stdio_uart, obj, sizeof(serial_t)); } }
void config_uart() { // setup uart serial_init(&mysobj, UART_TX, UART_RX); serial_baud(&mysobj, 38400); serial_format(&mysobj, 8, ParityNone, 1); serial_irq_handler(&mysobj, uart_irq_callback, (uint32_t)&mysobj); serial_irq_set(&mysobj, RxIrq, 1); serial_irq_set(&mysobj, TxIrq, 1); // config uart rx as gpio wakeup pin gpio_irq_t gpio_rx_wake; gpio_irq_init(&gpio_rx_wake, UART_RX, gpio_uart_rx_irq_callback, NULL); gpio_irq_set(&gpio_rx_wake, IRQ_FALL, 1); // Falling Edge Trigger gpio_irq_enable(&gpio_rx_wake); }
// This function sets the current object as the "listening" // one and returns true if it replaces another bool SoftwareSerial::listen() { bool ret = false; serial_init((serial_t *)pUART, (PinName)g_APinDescription[transmitPin].pinname, (PinName)g_APinDescription[receivePin].pinname); serial_baud((serial_t *)pUART, speed); serial_format((serial_t *)pUART, data_bits, (SerialParity)parity, stop_bits); serial_irq_handler((serial_t *)pUART, (uart_irq_handler)handle_interrupt, (uint32_t)this); serial_irq_set((serial_t *)pUART, RxIrq, 1); serial_irq_set((serial_t *)pUART, TxIrq, 1); if (flowctrl) { serial_set_flow_control((serial_t *)pUART, FlowControlRTSCTS, (PinName)0, (PinName)0); } return ret; }
/* * UART interface */ static rt_err_t ameba_uart_configure (struct rt_serial_device *serial, struct serial_configure *cfg) { rt_uint32_t baud_div; struct device_uart * uart; RT_ASSERT(serial != RT_NULL); serial->config = *cfg; uart = serial->parent.user_data; RT_ASSERT(uart != RT_NULL); /* Set databits, stopbits and parity. (8-bit data, 1 stopbit, no parity) */ serial_format(&uart->serial, 8, ParityNone, 1); /* set baudrate */ serial_baud(&uart->serial, 115200); return (RT_EOK); }
void serial_init(serial_t *obj, PinName tx, PinName rx) { int is_stdio_uart = 0; // determine the UART to use UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX); UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX); UARTName uart = (UARTName)pinmap_merge(uart_tx, uart_rx); if ((int)uart == NC) { error("Serial pinout mapping failed"); } RCC->APB2ENR |= RCC_APB2ENR_AFIOEN ; switch (uart) { case UART_1: RCC->APB2ENR |= RCC_APB2ENR_USART1EN; break; case UART_2: RCC->APB1ENR |= RCC_APB1ENR_USART2EN; break; } obj->uart = (USART_TypeDef *)uart; // set default baud rate and format serial_baud (obj, 9600); serial_format(obj, 8, ParityNone, 1); // pinout the chosen uart pinmap_pinout(tx, PinMap_UART_TX); pinmap_pinout(rx, PinMap_UART_RX); // set rx/tx pins in PullUp mode pin_mode(tx, PullUp); pin_mode(rx, PullUp); obj->uart->CR1 = USART_CR1_UE | USART_CR1_TE | USART_CR1_RE; switch (uart) { case UART_1: obj->index = 0; break; } is_stdio_uart = (uart == STDIO_UART) ? (1) : (0); if (is_stdio_uart) { stdio_uart_inited = 1; memcpy(&stdio_uart, obj, sizeof(serial_t)); } }
void main(void) { // sample text char rc; serial_t sobj; // mbed uart test serial_init(&sobj,UART_TX,UART_RX); serial_baud(&sobj,38400); serial_format(&sobj, 8, ParityNone, 1); uart_send_string(&sobj, "UART API Demo...\r\n"); uart_send_string(&sobj, "Hello World!!\r\n"); while(1){ uart_send_string(&sobj, "\r\n8195a$"); rc = serial_getc(&sobj); serial_putc(&sobj, rc); } }
void uart_socket_example_1(void *param) { // sample text char rc; serial_t sobj; // mbed uart test serial_init(&sobj,PA_7,PA_6); serial_baud(&sobj,9600); serial_format(&sobj, 8, ParityNone, 1); uart_send_string(&sobj, "UART API Demo...\r\n"); uart_send_string(&sobj, "Hello World!!\r\n"); while(1){ //uart_send_string(&sobj, "\r\n8195a$"); rc = serial_getc(&sobj); //serial_putc(&sobj, rc); printf("%x\n",rc); } }
//****************************************************************************** void serial_init(serial_t *obj, PinName tx, PinName rx) { // Determine which uart is associated with each pin UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX); UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX); UARTName uart = (UARTName)pinmap_merge(uart_tx, uart_rx); // Make sure that both pins are pointing to the same uart MBED_ASSERT(uart != (UARTName)NC); // Set the obj pointer to the proper uart obj->uart = (mxc_uart_regs_t*)uart; // Set the uart index obj->index = MXC_UART_BASE_TO_INSTANCE(obj->uart); // Configure the pins pinmap_pinout(tx, PinMap_UART_TX); pinmap_pinout(rx, PinMap_UART_RX); // Flush the RX and TX FIFOs, clear the settings obj->uart->ctrl = ( MXC_F_UART_CTRL_TX_FIFO_FLUSH | MXC_F_UART_CTRL_RX_FIFO_FLUSH); // Disable interrupts obj->uart->inten = 0; obj->uart->intfl = 0; // Configure to default settings serial_baud(obj, DEFAULT_BAUD); serial_format(obj, 8, ParityNone, 1); // Manage stdio UART if(uart == STDIO_UART) { stdio_uart_inited = 1; memcpy(&stdio_uart, obj, sizeof(serial_t)); } }
void serial_init(serial_t *obj, PinName tx, PinName rx) { volatile uint8_t dummy ; int is_stdio_uart = 0; // determine the UART to use uint32_t uart_tx = pinmap_peripheral(tx, PinMap_UART_TX); uint32_t uart_rx = pinmap_peripheral(rx, PinMap_UART_RX); uint32_t uart = pinmap_merge(uart_tx, uart_rx); MBED_ASSERT((int)uart != NC); obj->serial.uart = (struct st_scif *)SCIF[uart]; // enable power switch (uart) { case UART0: CPG.STBCR4 &= ~(1 << 7); break; case UART1: CPG.STBCR4 &= ~(1 << 6); break; case UART2: CPG.STBCR4 &= ~(1 << 5); break; case UART3: CPG.STBCR4 &= ~(1 << 4); break; case UART4: CPG.STBCR4 &= ~(1 << 3); break; case UART5: CPG.STBCR4 &= ~(1 << 2); break; case UART6: CPG.STBCR4 &= ~(1 << 1); break; case UART7: CPG.STBCR4 &= ~(1 << 0); break; } dummy = CPG.STBCR4; /* ==== SCIF initial setting ==== */ /* ---- Serial control register (SCSCR) setting ---- */ /* B'00 : Internal CLK */ obj->serial.uart->SCSCR = 0x0000u; /* SCIF transmitting and receiving operations stop */ /* ---- FIFO control register (SCFCR) setting ---- */ /* Transmit FIFO reset & Receive FIFO data register reset */ obj->serial.uart->SCFCR = 0x0006; /* ---- Serial status register (SCFSR) setting ---- */ dummy = obj->serial.uart->SCFSR; obj->serial.uart->SCFSR = (dummy & 0xFF6Cu); /* ER,BRK,DR bit clear */ /* ---- Line status register (SCLSR) setting ---- */ /* ORER bit clear */ obj->serial.uart->SCLSR = 0; /* ---- Serial extension mode register (SCEMR) setting ---- b7 BGDM - Baud rate generator double-speed mode : Normal mode b0 ABCS - Base clock select in asynchronous mode : Base clock is 16 times the bit rate */ obj->serial.uart->SCEMR = 0x0000u; /* ---- Bit rate register (SCBRR) setting ---- */ serial_baud (obj, 9600); serial_format(obj, 8, ParityNone, 1); /* ---- FIFO control register (SCFCR) setting ---- */ obj->serial.uart->SCFCR = 0x0030u; /* ---- Serial port register (SCSPTR) setting ---- b1 SPB2IO - Serial port break output : disabled b0 SPB2DT - Serial port break data : High-level */ obj->serial.uart->SCSPTR = 0x0003u; // SPB2IO = 1, SPB2DT = 1 /* ---- Line status register (SCLSR) setting ---- b0 ORER - Overrun error detect : clear */ if (obj->serial.uart->SCLSR & 0x0001) { obj->serial.uart->SCLSR = 0u; // ORER clear } // pinout the chosen uart pinmap_pinout(tx, PinMap_UART_TX); pinmap_pinout(rx, PinMap_UART_RX); switch (uart) { case UART0: obj->serial.index = 0; break; case UART1: obj->serial.index = 1; break; case UART2: obj->serial.index = 2; break; case UART3: obj->serial.index = 3; break; case UART4: obj->serial.index = 4; break; case UART5: obj->serial.index = 5; break; case UART6: obj->serial.index = 6; break; case UART7: obj->serial.index = 7; break; } uart_data[obj->serial.index].sw_rts.pin = NC; uart_data[obj->serial.index].sw_cts.pin = NC; /* ---- Serial control register (SCSCR) setting ---- */ /* Setting the TE and RE bits enables the TxD and RxD pins to be used. */ obj->serial.uart->SCSCR = 0x0070; is_stdio_uart = (uart == STDIO_UART) ? (1) : (0); if (is_stdio_uart) { stdio_uart_inited = 1; memcpy(&stdio_uart, obj, sizeof(serial_t)); } }
void SerialBase::format(int bits, Parity parity, int stop_bits) { lock(); serial_format(&_serial, bits, (SerialParity)parity, stop_bits); unlock(); }
void Serial::format(int bits, Parity parity, int stop_bits) { serial_format(&_serial, bits, (SerialParity)parity, stop_bits); }
//****************************************************************************** void serial_init(serial_t *obj, PinName tx, PinName rx) { // Determine which uart is associated with each pin UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX); UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX); UARTName uart = (UARTName)pinmap_merge(uart_tx, uart_rx); // Make sure that both pins are pointing to the same uart MBED_ASSERT(uart != (UARTName)NC); // Ensure that the UART clock is enabled switch (uart) { case UART_0: MXC_CLKMAN->clk_gate_ctrl1 |= MXC_F_CLKMAN_CLK_GATE_CTRL1_UART0_CLK_GATER; break; case UART_1: MXC_CLKMAN->clk_gate_ctrl1 |= MXC_F_CLKMAN_CLK_GATE_CTRL1_UART1_CLK_GATER; break; case UART_2: MXC_CLKMAN->clk_gate_ctrl1 |= MXC_F_CLKMAN_CLK_GATE_CTRL1_UART2_CLK_GATER; break; case UART_3: MXC_CLKMAN->clk_gate_ctrl1 |= MXC_F_CLKMAN_CLK_GATE_CTRL1_UART3_CLK_GATER; break; default: break; } // Ensure that the UART clock is enabled // But don't override the scaler // // To support the most common baud rates, 9600 and 115200, we need to // scale down the uart input clock. if (!(MXC_CLKMAN->sys_clk_ctrl_8_uart & MXC_F_CLKMAN_SYS_CLK_CTRL_8_UART_UART_CLK_SCALE)) { switch (SystemCoreClock) { case RO_FREQ: MXC_CLKMAN->sys_clk_ctrl_8_uart = MXC_S_CLKMAN_CLK_SCALE_DIV_4; break; case (RO_FREQ / 2): MXC_CLKMAN->sys_clk_ctrl_8_uart = MXC_S_CLKMAN_CLK_SCALE_DIV_2; break; default: MXC_CLKMAN->sys_clk_ctrl_8_uart = MXC_S_CLKMAN_CLK_SCALE_DIV_4; break; } } // Set the obj pointer to the proper uart obj->uart = (mxc_uart_regs_t*)uart; // Set the uart index obj->index = MXC_UART_GET_IDX(obj->uart); obj->fifo = (mxc_uart_fifo_regs_t*)MXC_UART_GET_BASE_FIFO(obj->index); // Configure the pins pinmap_pinout(tx, PinMap_UART_TX); pinmap_pinout(rx, PinMap_UART_RX); // Flush the RX and TX FIFOs, clear the settings obj->uart->ctrl &= ~(MXC_F_UART_CTRL_RX_FIFO_EN | MXC_F_UART_CTRL_TX_FIFO_EN); obj->uart->ctrl |= (MXC_F_UART_CTRL_RX_FIFO_EN | MXC_F_UART_CTRL_TX_FIFO_EN); // Disable interrupts obj->uart->inten = 0; obj->uart->intfl = obj->uart->intfl; // Configure to default settings serial_baud(obj, DEFAULT_BAUD); serial_format(obj, 8, ParityNone, 1); // Manage stdio UART if (uart == STDIO_UART) { stdio_uart_inited = 1; memcpy(&stdio_uart, obj, sizeof(serial_t)); } // Enable UART obj->uart->ctrl |= MXC_F_UART_CTRL_UART_EN; }
void serial_init(serial_t *obj, PinName tx, PinName rx) { int is_stdio_uart = 0; // determine the UART to use UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX); UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX); UARTName uart = (UARTName)pinmap_merge(uart_tx, uart_rx); MBED_ASSERT((int)uart != NC); switch (uart) { case UART_0: obj->index = 0; LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 12); break; case UART_1: obj->index = 1; LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 20); LPC_SYSCON->PRESETCTRL |= (1 << 5); break; case UART_2: obj->index = 2; LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 21); LPC_SYSCON->PRESETCTRL |= (1 << 6); break; case UART_3: obj->index = 3; LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 22); LPC_SYSCON->PRESETCTRL |= (1 << 7); break; case UART_4: obj->index = 4; LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 22); LPC_SYSCON->PRESETCTRL |= (1 << 8); break; } if (obj->index == 0) obj->uart = (LPC_USART0_Type *)uart; else obj->mini_uart = (LPC_USART4_Type *)uart; if (obj->index == 0) { // enable fifos and default rx trigger level obj->uart->FCR = 1 << 0 // FIFO Enable - 0 = Disables, 1 = Enabled | 0 << 1 // Rx Fifo Clear | 0 << 2 // Tx Fifo Clear | 0 << 6; // Rx irq trigger level - 0 = 1 char, 1 = 4 chars, 2 = 8 chars, 3 = 14 chars // disable irqs obj->uart->IER = 0 << 0 // Rx Data available irq enable | 0 << 1 // Tx Fifo empty irq enable | 0 << 2; // Rx Line Status irq enable } else { // Clear all status bits obj->mini_uart->STAT = (DELTACTS | DELTARXBRK); // Enable UART obj->mini_uart->CFG |= UART_EN; } // set default baud rate and format serial_baud (obj, 9600); serial_format(obj, 8, ParityNone, 1); // pinout the chosen uart pinmap_pinout(tx, PinMap_UART_TX); pinmap_pinout(rx, PinMap_UART_RX); // set rx/tx pins in PullUp mode if (tx != NC) { pin_mode(tx, PullUp); } if (rx != NC) { pin_mode(rx, PullUp); } is_stdio_uart = (uart == STDIO_UART) ? (1) : (0); if (is_stdio_uart && (obj->index == 0)) { stdio_uart_inited = 1; memcpy(&stdio_uart, obj, sizeof(serial_t)); } }