static int pl050_first_open(int major, int minor, void *arg) { rtems_libio_open_close_args_t *oc = (rtems_libio_open_close_args_t *) arg; struct rtems_termios_tty *tty = (struct rtems_termios_tty *) oc->iop->data1; console_data *cd = &Console_Port_Data[minor]; const console_tbl *ct = Console_Port_Tbl[minor]; volatile pl050 *regs = pl050_get_regs(minor); rtems_status_code sc; cd->termios_data = tty; rtems_termios_set_initial_baud(tty, (rtems_termios_baud_t) ct->pDeviceParams); regs->kmicr = PL050_KMICR_KMIEN | PL050_KMICR_KMIRXINTREN; sc = rtems_interrupt_handler_install( ct->ulIntVector, ct->sDeviceName, RTEMS_INTERRUPT_UNIQUE, pl050_interrupt, (void *) minor ); assert(sc == RTEMS_SUCCESSFUL); return 0; }
int ns16550_open( int major, int minor, void *arg ) { rtems_libio_open_close_args_t *oc = (rtems_libio_open_close_args_t *) arg; struct rtems_termios_tty *tty = (struct rtems_termios_tty *) oc->iop->data1; console_tbl *c = Console_Port_Tbl [minor]; console_data *d = &Console_Port_Data [minor]; d->termios_data = tty; /* Assert DTR */ if (c->pDeviceFlow != &ns16550_flow_DTRCTS) { ns16550_assert_DTR( minor); } /* Set initial baud */ rtems_termios_set_initial_baud( tty, (intptr_t) c->pDeviceParams); if (c->pDeviceFns->deviceOutputUsesInterrupts) { ns16550_initialize_interrupts( minor); ns16550_enable_interrupts( c, NS16550_ENABLE_ALL_INTR_EXCEPT_TX); } return RTEMS_SUCCESSFUL; }
rtems_device_driver termios_test_driver_open( rtems_device_major_number major, rtems_device_minor_number minor, void * arg ) { rtems_status_code sc; int rc; rtems_libio_open_close_args_t *args = arg; static const rtems_termios_callbacks Callbacks = { NULL, /* firstOpen */ NULL, /* lastClose */ termios_test_driver_inbyte_nonblocking, /* pollRead */ termios_test_driver_write_support, /* write */ termios_test_driver_set_attributes, /* setAttributes */ NULL, /* stopRemoteTx */ NULL, /* startRemoteTx */ 0 /* outputUsesInterrupts */ }; if ( minor > 2 ) { puts( "ERROR - Termios_testdriver - only 1 minor supported" ); rtems_test_exit(0); } sc = rtems_termios_open (major, minor, arg, &Callbacks); directive_failed( sc, "rtems_termios_open" ); puts( "Termios_test_driver - rtems_set_initial_baud - bad baud - OK" ); rc = rtems_termios_set_initial_baud( args->iop->data1, 5000 ); if ( rc != -1 ) { printf( "ERROR - return %d\n", rc ); rtems_test_exit(0); } puts( "Termios_test_driver - rtems_set_initial_baud - 38400 - OK" ); rc = rtems_termios_set_initial_baud( args->iop->data1, 38400 ); if ( rc ) { printf( "ERROR - return %d\n", rc ); rtems_test_exit(0); } return RTEMS_SUCCESSFUL; }
static int first_open(int major, int minor, void *arg) { rtems_libio_open_close_args_t *oc = (rtems_libio_open_close_args_t *) arg; struct rtems_termios_tty *tty = (struct rtems_termios_tty *) oc->iop->data1; console_data *cd = &Console_Port_Data [minor]; cd->termios_data = tty; rtems_termios_set_initial_baud(tty, LM3S69XX_UART_BAUD); return 0; }
static bool t32_console_first_open( rtems_termios_tty *tty, rtems_termios_device_context *base, struct termios *term, rtems_libio_open_close_args_t *args ) { rtems_termios_set_initial_baud(tty, 115200); return true; }
static int zynq_uart_first_open(int major, int minor, void *arg) { rtems_libio_open_close_args_t *oc = (rtems_libio_open_close_args_t *) arg; struct rtems_termios_tty *tty = (struct rtems_termios_tty *) oc->iop->data1; console_data *cd = &Console_Port_Data[minor]; const console_tbl *ct = Console_Port_Tbl[minor]; cd->termios_data = tty; rtems_termios_set_initial_baud(tty, (rtems_termios_baud_t) ct->pDeviceParams); return 0; }
static int lpc32xx_hsu_first_open(int major, int minor, void *arg) { rtems_libio_open_close_args_t *oca = arg; struct rtems_termios_tty *tty = oca->iop->data1; console_tbl *ct = Console_Port_Tbl [minor]; console_data *cd = &Console_Port_Data [minor]; volatile lpc32xx_hsu *hsu = (volatile lpc32xx_hsu *) ct->ulCtrlPort1; cd->termios_data = tty; rtems_termios_set_initial_baud(tty, (int32_t) ct->pDeviceParams); hsu->ctrl = HSU_CTRL_RX_INTR_ENABLED; return 0; }
static int erc32_console_first_open(int major, int minor, void *arg) { /* Check minor number */ if (minor < 0 || minor > 1) { return -1; } rtems_libio_open_close_args_t *oca = arg; struct rtems_termios_tty *tty = oca->iop->data1; console_tbl *ct = &Console_Port_Tbl [minor]; console_data *cd = &Console_Port_Data [minor]; cd->termios_data = tty; rtems_termios_set_initial_baud(tty, (int32_t)ct->pDeviceParams); return 0; }
static int first_open(int major, int minor, void *arg) { rtems_libio_open_close_args_t *oc = (rtems_libio_open_close_args_t *) arg; struct rtems_termios_tty *tty = (struct rtems_termios_tty *) oc->iop->data1; console_data *cd = &Console_Port_Data [minor]; volatile lm3s69xx_uart *uart = get_uart_regs(minor); cd->termios_data = tty; rtems_termios_set_initial_baud(tty, LM3S69XX_UART_BAUD); /* Drain the RX FIFO. */ while ((uart->fr & UARTFR_RXFE) == 0) (void)uart->dr; uart->im = UARTI_RX | UARTI_RT; return 0; }
static bool atsam_uart_first_open( rtems_termios_tty *tty, rtems_termios_device_context *base, struct termios *term, rtems_libio_open_close_args_t *args ) { atsam_uart_context *ctx = (atsam_uart_context *) base; Uart *regs = ctx->regs; #ifdef ATSAM_CONSOLE_USE_INTERRUPTS rtems_status_code sc; #endif regs->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RSTSTA; regs->UART_IDR = 0xffffffff; PMC_EnablePeripheral(ctx->id); rtems_termios_set_initial_baud(tty, ATSAM_CONSOLE_BAUD); atsam_uart_set_attributes(base, term); #ifdef ATSAM_CONSOLE_USE_INTERRUPTS regs->UART_IER = UART_IDR_RXRDY; sc = rtems_interrupt_handler_install( ctx->irq, "UART", RTEMS_INTERRUPT_SHARED, atsam_uart_interrupt, tty ); if (sc != RTEMS_SUCCESSFUL) { return false; } #endif return true; }
rtems_device_driver termios_test_driver_open( rtems_device_major_number major, rtems_device_minor_number minor, void * arg ) { rtems_status_code sc; int rc; rtems_libio_open_close_args_t *args = arg; void *alloc_ptr = (void *)0; static int test = 0; size_t freeMemory; static const rtems_termios_callbacks Callbacks = { NULL, /* firstOpen */ NULL, /* lastClose */ termios_test_driver_inbyte_nonblocking, /* pollRead */ termios_test_driver_write_support, /* write */ termios_test_driver_set_attributes, /* setAttributes */ NULL, /* stopRemoteTx */ NULL, /* startRemoteTx */ 0 /* outputUsesInterrupts */ }; if ( minor > 2 ) { puts( "ERROR - Termios_testdriver - only 1 minor supported" ); rtems_test_exit(0); } freeMemory = malloc_free_space(); if( test == 0 ) { alloc_ptr = malloc( freeMemory - 4 ); sc = rtems_termios_open (major, minor, arg, &Callbacks); rtems_test_assert( sc == RTEMS_NO_MEMORY ); free( alloc_ptr ); alloc_ptr = malloc( freeMemory - 4 - 10 - sizeof( struct rtems_termios_tty ) ); sc = rtems_termios_open (major, minor, arg, &Callbacks); rtems_test_assert( sc == RTEMS_NO_MEMORY ); free( alloc_ptr ); alloc_ptr = malloc( freeMemory - 4 - 20 - sizeof( struct rtems_termios_tty ) - 128 ); sc = rtems_termios_open (major, minor, arg, &Callbacks); rtems_test_assert( sc == RTEMS_NO_MEMORY ); free( alloc_ptr ); alloc_ptr = malloc( freeMemory - 4 - 20 - sizeof( struct rtems_termios_tty ) - 128 - 80 ); sc = rtems_termios_open (major, minor, arg, &Callbacks); rtems_test_assert( sc == RTEMS_NO_MEMORY ); free( alloc_ptr ); test = 1; } sc = rtems_termios_open (major, minor, arg, &Callbacks); directive_failed( sc, "rtems_termios_open" ); puts( "Termios_test_driver - rtems_set_initial_baud - bad baud - OK" ); rc = rtems_termios_set_initial_baud( args->iop->data1, 5000 ); if ( rc != -1 ) { printf( "ERROR - return %d\n", rc ); rtems_test_exit(0); } puts( "Termios_test_driver - rtems_set_initial_baud - 38400 - OK" ); rc = rtems_termios_set_initial_baud( args->iop->data1, 38400 ); if ( rc ) { printf( "ERROR - return %d\n", rc ); rtems_test_exit(0); } return RTEMS_SUCCESSFUL; }
rtems_device_driver termios_test_driver_open( rtems_device_major_number major, rtems_device_minor_number minor, void * arg ) { rtems_status_code sc; int rc; rtems_libio_open_close_args_t *args = arg; static bool firstCall = true; static const rtems_termios_callbacks Callbacks = { NULL, /* firstOpen */ NULL, /* lastClose */ termios_test_driver_inbyte_nonblocking, /* pollRead */ termios_test_driver_write_support, /* write */ termios_test_driver_set_attributes, /* setAttributes */ NULL, /* stopRemoteTx */ NULL, /* startRemoteTx */ 0 /* outputUsesInterrupts */ }; if ( minor > 2 ) { puts( "ERROR - Termios_testdriver - only 1 minor supported" ); rtems_test_exit(0); } if( firstCall ) { static const uintptr_t allocSizes [] = { sizeof( struct rtems_termios_tty ), 128, 64, 256 }; size_t i; firstCall = false; for (i = 0; i < sizeof( allocSizes ) / sizeof( allocSizes [0] ); ++i) { void *opaque = rtems_heap_greedy_allocate( allocSizes, i ); sc = rtems_termios_open( major, minor, arg, &Callbacks ); rtems_test_assert( sc == RTEMS_NO_MEMORY ); rtems_heap_greedy_free( opaque ); } } sc = rtems_termios_open (major, minor, arg, &Callbacks); directive_failed( sc, "rtems_termios_open" ); puts( "Termios_test_driver - rtems_set_initial_baud - bad baud - OK" ); rc = rtems_termios_set_initial_baud( args->iop->data1, 5000 ); if ( rc != -1 ) { printf( "ERROR - return %d\n", rc ); rtems_test_exit(0); } puts( "Termios_test_driver - rtems_set_initial_baud - 38400 - OK" ); rc = rtems_termios_set_initial_baud( args->iop->data1, 38400 ); if ( rc ) { printf( "ERROR - return %d\n", rc ); rtems_test_exit(0); } return RTEMS_SUCCESSFUL; }
static int mmconsole_first_open(int major, int minor, void *arg) { tty = ((rtems_libio_open_close_args_t *) arg)->iop->data1; return rtems_termios_set_initial_baud(tty, UART_BAUD_RATE); }
static int mpc55xx_esci_set_attributes(int minor, const struct termios *t) { mpc55xx_esci_context *self = console_generic_get_context(minor); volatile struct ESCI_tag *regs = self->regs; union ESCI_CR1_tag cr1 = { .R = regs->CR1.R }; union ESCI_CR2_tag cr2 = MPC55XX_ZERO_FLAGS; rtems_termios_baud_t br = rtems_termios_baud_to_number(t->c_cflag); /* Enable module */ cr2.B.MDIS = 0; /* Interrupts */ cr1.B.TCIE = 0; cr1.B.ILIE = 0; cr2.B.IEBERR = 0; cr2.B.ORIE = 0; cr2.B.NFIE = 0; cr2.B.FEIE = 0; cr2.B.PFIE = 0; /* Disable receiver wake-up standby */ cr1.B.RWU = 0; /* Disable DMA channels */ cr2.B.RXDMA = 0; cr2.B.TXDMA = 0; /* Idle line type */ cr1.B.ILT = 0; /* Disable loops */ cr1.B.LOOPS = 0; /* Enable or disable receiver */ cr1.B.RE = (t->c_cflag & CREAD) ? 1 : 0; /* Enable transmitter */ cr1.B.TE = 1; /* Baud rate */ if (br > 0) { br = bsp_clock_speed / (16 * br); br = (br > 8191) ? 8191 : br; } else { br = 0; } cr1.B.SBR = br; /* Number of data bits */ if ((t->c_cflag & CSIZE) != CS8) { return -1; } cr1.B.M = 0; /* Parity */ cr1.B.PE = (t->c_cflag & PARENB) ? 1 : 0; cr1.B.PT = (t->c_cflag & PARODD) ? 1 : 0; /* Stop bits */ if (t->c_cflag & CSTOPB ) { /* Two stop bits */ return -1; } /* Disable LIN */ regs->LCR.R = 0; /* Set control registers */ regs->CR2.R = cr2.R; regs->CR1.R = cr1.R; return 0; } static int mpc55xx_esci_first_open(int major, int minor, void *arg) { rtems_status_code sc = RTEMS_SUCCESSFUL; int rv = 0; mpc55xx_esci_context *self = console_generic_get_context(minor); struct rtems_termios_tty *tty = console_generic_get_tty_at_open(arg); self->tty = tty; rv = rtems_termios_set_initial_baud(tty, 115200); if (rv != 0) { rtems_fatal_error_occurred(0xdeadbeef); } rv = mpc55xx_esci_set_attributes(minor, &tty->termios); if (rv != 0) { rtems_fatal_error_occurred(0xdeadbeef); } sc = mpc55xx_interrupt_handler_install( self->irq, "eSCI", RTEMS_INTERRUPT_UNIQUE, MPC55XX_INTC_DEFAULT_PRIORITY, mpc55xx_esci_interrupt_handler, self ); if (sc != RTEMS_SUCCESSFUL) { rtems_fatal_error_occurred(0xdeadbeef); } mpc55xx_esci_interrupts_clear_and_enable(self); self->transmit_in_progress = false; return 0; }