serial 架构分析

一、首先看一下uart_register_driver();

int uart_register_driver(struct uart_driver *drv)
{
     struct tty_driver *normal = NULL;
     int i, retval;
 
     BUG_ON(drv->state);
 
     /*
      * Maybe we should be using a slab cache for this, especially if
      * we have a large number of ports to handle.
      */
     drv->state = kzalloc(sizeof(struct uart_state) * drv->nr, GFP_KERNEL);
     retval = -ENOMEM;
     if (!drv->state)
         goto out;
 
     normal  = alloc_tty_driver(drv->nr);
     if (!normal)
         goto out;
 
     drv->tty_driver = normal;
 
     normal->owner      = drv->owner;
     normal->driver_name    = drv->driver_name;
     normal->name       = drv->dev_name;
     normal->major      = drv->major;
     normal->minor_start    = drv->minor;
     normal->type       = TTY_DRIVER_TYPE_SERIAL;
     normal->subtype        = SERIAL_TYPE_NORMAL;
     normal->init_termios   = tty_std_termios;
     normal->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
     normal->init_termios.c_ispeed = normal->init_termios.c_ospeed = 9600;
     normal->flags      = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
     normal->driver_state    = drv;
     tty_set_operations(normal, &uart_ops);
 
     /*
      * Initialise the UART state(s).
      */
     for (i = 0; i < drv->nr; i++) {
         struct uart_state *state = drv->state + i;
 
         state->close_delay     = 500;    /* .5 seconds */
         state->closing_wait    = 30000;  /* 30 seconds */
 
         mutex_init(&state->mutex);
     }
 
     retval = tty_register_driver(normal);
 out:
     if (retval < 0) {
         put_tty_driver(normal);
         kfree(drv->state);
     }
     return retval;
}
  这里的注册了drv->nr个设备节点,主设备号为drv->major,从设备号依次从drv->minor,
tty_set_operations(normal, &uart_ops),对tty_driver操作集赋值,然后设置每个设备状态,
最后调用tty_register_driver,注册为tty设备驱动。
二、 uart_port
      调用uart_add_one_port();
     uart_port是具体设备的代表


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值