static void __init legacy_pty_init(void) { struct tty_driver *pty_driver, *pty_slave_driver; if (legacy_count <= 0) return; pty_driver = tty_alloc_driver(legacy_count, TTY_DRIVER_RESET_TERMIOS | TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_ALLOC); if (IS_ERR(pty_driver)) panic("Couldn't allocate pty driver"); pty_slave_driver = tty_alloc_driver(legacy_count, TTY_DRIVER_RESET_TERMIOS | TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_ALLOC); if (IS_ERR(pty_slave_driver)) panic("Couldn't allocate pty slave driver"); pty_driver->owner = THIS_MODULE; pty_driver->driver_name = "pty_master"; pty_driver->name = "pty"; pty_driver->major = PTY_MASTER_MAJOR; pty_driver->minor_start = 0; pty_driver->type = TTY_DRIVER_TYPE_PTY; pty_driver->subtype = PTY_TYPE_MASTER; pty_driver->init_termios = tty_std_termios; pty_driver->init_termios.c_iflag = 0; pty_driver->init_termios.c_oflag = 0; pty_driver->init_termios.c_cflag = B38400 | CS8 | CREAD; pty_driver->init_termios.c_lflag = 0; pty_driver->init_termios.c_ispeed = 38400; pty_driver->init_termios.c_ospeed = 38400; pty_driver->other = pty_slave_driver; tty_set_operations(pty_driver, &master_pty_ops_bsd); pty_slave_driver->owner = THIS_MODULE; pty_slave_driver->driver_name = "pty_slave"; pty_slave_driver->name = "ttyp"; pty_slave_driver->major = PTY_SLAVE_MAJOR; pty_slave_driver->minor_start = 0; pty_slave_driver->type = TTY_DRIVER_TYPE_PTY; pty_slave_driver->subtype = PTY_TYPE_SLAVE; pty_slave_driver->init_termios = tty_std_termios; pty_slave_driver->init_termios.c_cflag = B38400 | CS8 | CREAD; pty_slave_driver->init_termios.c_ispeed = 38400; pty_slave_driver->init_termios.c_ospeed = 38400; pty_slave_driver->other = pty_driver; tty_set_operations(pty_slave_driver, &slave_pty_ops_bsd); if (tty_register_driver(pty_driver)) panic("Couldn't register pty driver"); if (tty_register_driver(pty_slave_driver)) panic("Couldn't register pty slave driver"); }
static int __init ram_console_tty_init(void) { int ret = -ENOMEM; tty_port_init(&ram_console_port.port); ram_console_port.port.ops = &null_ops; mutex_init(&ram_console_port.port_write_mutex); ram_console_tty_driver = tty_alloc_driver(1, TTY_DRIVER_UNNUMBERED_NODE); if (IS_ERR(ram_console_tty_driver)) return PTR_ERR(ram_console_tty_driver); ram_console_tty_driver->driver_name = "ramconsole"; ram_console_tty_driver->name = "ttyR"; ram_console_tty_driver->major = TTYAUX_MAJOR; ram_console_tty_driver->minor_start = 4; ram_console_tty_driver->type = TTY_DRIVER_TYPE_CONSOLE; ram_console_tty_driver->init_termios = tty_std_termios; ram_console_tty_driver->init_termios.c_oflag = OPOST | OCRNL | ONOCR | ONLRET; ram_console_tty_driver->flags |= TTY_DRIVER_REAL_RAW; tty_set_operations(ram_console_tty_driver, &ram_console_tty_ops); tty_port_link_device(&ram_console_port.port, ram_console_tty_driver, 0); ret = tty_register_driver(ram_console_tty_driver); if (ret < 0) { printk(KERN_ERR "Couldn't register ram_console_tty driver\n"); goto error; } printk("Registered ram_console_tty Major %d, Minor %d\n", TTYAUX_MAJOR, 4); return 0; error: tty_unregister_driver(ram_console_tty_driver); put_tty_driver(ram_console_tty_driver); ram_console_tty_driver = NULL; return ret; }
static void __init unix98_pty_init(void) { ptm_driver = tty_alloc_driver(NR_UNIX98_PTY_MAX, TTY_DRIVER_RESET_TERMIOS | TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV | TTY_DRIVER_DEVPTS_MEM | TTY_DRIVER_DYNAMIC_ALLOC); if (IS_ERR(ptm_driver)) panic("Couldn't allocate Unix98 ptm driver"); pts_driver = tty_alloc_driver(NR_UNIX98_PTY_MAX, TTY_DRIVER_RESET_TERMIOS | TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV | TTY_DRIVER_DEVPTS_MEM | TTY_DRIVER_DYNAMIC_ALLOC); if (IS_ERR(pts_driver)) panic("Couldn't allocate Unix98 pts driver"); ptm_driver->driver_name = "pty_master"; ptm_driver->name = "ptm"; ptm_driver->major = UNIX98_PTY_MASTER_MAJOR; ptm_driver->minor_start = 0; ptm_driver->type = TTY_DRIVER_TYPE_PTY; ptm_driver->subtype = PTY_TYPE_MASTER; ptm_driver->init_termios = tty_std_termios; ptm_driver->init_termios.c_iflag = 0; ptm_driver->init_termios.c_oflag = 0; ptm_driver->init_termios.c_cflag = B38400 | CS8 | CREAD; ptm_driver->init_termios.c_lflag = 0; ptm_driver->init_termios.c_ispeed = 38400; ptm_driver->init_termios.c_ospeed = 38400; ptm_driver->other = pts_driver; tty_set_operations(ptm_driver, &ptm_unix98_ops); pts_driver->driver_name = "pty_slave"; pts_driver->name = "pts"; pts_driver->major = UNIX98_PTY_SLAVE_MAJOR; pts_driver->minor_start = 0; pts_driver->type = TTY_DRIVER_TYPE_PTY; pts_driver->subtype = PTY_TYPE_SLAVE; pts_driver->init_termios = tty_std_termios; pts_driver->init_termios.c_cflag = B38400 | CS8 | CREAD; pts_driver->init_termios.c_ispeed = 38400; pts_driver->init_termios.c_ospeed = 38400; pts_driver->other = ptm_driver; tty_set_operations(pts_driver, &pty_unix98_ops); if (tty_register_driver(ptm_driver)) panic("Couldn't register Unix98 ptm driver"); if (tty_register_driver(pts_driver)) panic("Couldn't register Unix98 pts driver"); /* Now create the /dev/ptmx special device */ tty_default_fops(&ptmx_fops); ptmx_fops.open = ptmx_open; cdev_init(&ptmx_cdev, &ptmx_fops); if (cdev_add(&ptmx_cdev, MKDEV(TTYAUX_MAJOR, 2), 1) || register_chrdev_region(MKDEV(TTYAUX_MAJOR, 2), 1, "/dev/ptmx") < 0) panic("Couldn't register /dev/ptmx driver"); device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 2), NULL, "ptmx"); }
int rpmsg_neo_tty(struct rpmsg_channel *rpmsg_chnl,rpmsg_neo_remove_t *remove_func ) { int err = 0; struct rpmsgtty_port *cport = &rpmsg_tty_port; *remove_func = rpmsg_neo_tty_remove; memset(cport, 0, sizeof(rpmsg_tty_port)); cport->rpmsg_chnl = rpmsg_chnl; cport->endpt = RPMSG_TTY_ENPT; cport->ept = rpmsg_create_ept(cport->rpmsg_chnl, rpmsg_tty_cb, cport, cport->endpt); if (!cport->ept) { pr_err("ERROR: %s %s %d Failed to create proxy service endpoint.\n", __FILE__, __FUNCTION__, __LINE__); err = -1; goto error0; } rpmsgtty_driver = tty_alloc_driver(1, TTY_DRIVER_RESET_TERMIOS | TTY_DRIVER_REAL_RAW | TTY_DRIVER_UNNUMBERED_NODE); if (IS_ERR(rpmsgtty_driver)) { pr_err("ERROR:%s %d Failed to alloc tty\n", __FUNCTION__, __LINE__); rpmsg_destroy_ept(cport->ept); return PTR_ERR(rpmsgtty_driver); } spin_lock_init(&cport->rx_lock); cport->port.low_latency = cport->port.flags | ASYNC_LOW_LATENCY; tty_port_init(&cport->port); cport->port.ops = &rpmsgtty_port_ops; rpmsgtty_driver->driver_name = "ttyrpmsg"; rpmsgtty_driver->name = "ttyrpmsg"; rpmsgtty_driver->major = TTYAUX_MAJOR; rpmsgtty_driver->minor_start = 4; rpmsgtty_driver->type = TTY_DRIVER_TYPE_CONSOLE; rpmsgtty_driver->init_termios = tty_std_termios; // rpmsgtty_driver->init_termios.c_oflag = OPOST | OCRNL | ONOCR | ONLRET; rpmsgtty_driver->init_termios.c_cflag |= CLOCAL; tty_set_operations(rpmsgtty_driver, &imxrpmsgtty_ops); tty_port_link_device(&cport->port, rpmsgtty_driver, 0); err = tty_register_driver(rpmsgtty_driver); if (err < 0) { pr_err("Couldn't install rpmsg tty driver: err %d\n", err); goto error; } else { pr_info("Install rpmsg tty driver!\n"); } return 0; error: put_tty_driver(rpmsgtty_driver); tty_port_destroy(&cport->port); rpmsgtty_driver = NULL; rpmsg_destroy_ept(cport->ept); error0: return err; }
static int __init nullmodem_init(void) { int retval; int i; dprintf("%s - \n", __FUNCTION__); init_timer(&nullmodem_timer); setup_timer(&nullmodem_timer, nullmodem_timer_proc, 0); tport = kmalloc(2*NULLMODEM_PAIRS*sizeof(struct tty_port),GFP_KERNEL); for (i = 0; i < NULLMODEM_PAIRS; ++i) { struct nullmodem_pair *pair = &pair_table[i]; memset(pair, 0, sizeof(*pair)); pair->a.other = &pair->b; pair->a.pair = pair; pair->b.other = &pair->a; pair->b.pair = pair; pair->a.char_length = 10 * FACTOR; pair->b.char_length = 10 * FACTOR; spin_lock_init(&pair->spin); init_waitqueue_head(&pair->control_lines_wait); dprintf("%s - initialized pair %d -> %p\n", __FUNCTION__, i, pair); } /* allocate the tty driver */ nullmodem_tty_driver = tty_alloc_driver(NULLMODEM_PAIRS*2, TTY_DRIVER_RESET_TERMIOS | TTY_DRIVER_REAL_RAW); if (IS_ERR(nullmodem_tty_driver)) return -ENOMEM; /* initialize the tty driver */ nullmodem_tty_driver->owner = THIS_MODULE; nullmodem_tty_driver->driver_name = "nullmodem"; nullmodem_tty_driver->name = "nmp"; /* no more devfs subsystem */ nullmodem_tty_driver->major = NULLMODEM_MAJOR; nullmodem_tty_driver->type = TTY_DRIVER_TYPE_SERIAL; nullmodem_tty_driver->subtype = SERIAL_TYPE_NORMAL; /* no more devfs subsystem */ nullmodem_tty_driver->init_termios = tty_std_termios; nullmodem_tty_driver->init_termios.c_iflag = 0; nullmodem_tty_driver->init_termios.c_oflag = 0; nullmodem_tty_driver->init_termios.c_cflag = B38400 | CS8 | CREAD; nullmodem_tty_driver->init_termios.c_lflag = 0; nullmodem_tty_driver->init_termios.c_ispeed = 38400; nullmodem_tty_driver->init_termios.c_ospeed = 38400; tty_set_operations(nullmodem_tty_driver, &serial_ops); for (i = 0; i < NULLMODEM_PAIRS; ++i) { tty_port_init(&tport[i]); tty_port_link_device(&tport[i],nullmodem_tty_driver, i); } /* register the tty driver */ retval = tty_register_driver(nullmodem_tty_driver); if (retval) { printk(KERN_ERR "failed to register nullmodem tty driver\n"); put_tty_driver(nullmodem_tty_driver); return retval; } last_timer_jiffies = jiffies; nullmodem_timer.expires = last_timer_jiffies + TIMER_INTERVAL; add_timer(&nullmodem_timer); printk(KERN_INFO DRIVER_DESC " " DRIVER_VERSION "\n"); return retval; }