tty_ldisc线路规程简述

一:tty线路规程概念:

    tty : 作为 tty 系统通讯转换层,负责格式化 底层 uart_driver 与 核心层 tty_driver 之间的
    通讯协议的转换  

二:线路规程启动位置:

    在Linux 初始化的过程中,在调用 console_init 之前是没有任何输出的,直到 控制台console 串口
        初始化之后才会有输出

    /kernel/init/main.c
    start_kernel{
        ...
        console_init();
        ...
    }


    /kernel/driver/tty/tty_io.c
    void __init console_init(void)
    {
        initcall_t *call;

        //创建默认的 tty 线路规程
        tty_ldisc_begin();

        //创建 控制台设备,用来打印内核信息
        call = __con_initcall_start;
        while (call < __con_initcall_end) {
            (*call)();
            call++;
        }
    }

三:线路规程创建过程:

    /kernel/include/uapi/linux/tty.h
    //线路规程 协议标号
    #define NR_LDISCS       30
    #define N_TTY       0
    #define N_SLIP      1
    #define N_MOUSE     2
       ....


    /kernel/drivers/tty/n_tty.c
    //线路规程函数操作集
    struct tty_ldisc_ops tty_ldisc_N_TTY = {
        .magic           = TTY_LDISC_MAGIC,
        .name            = "n_tty",
        .open            = n_tty_open,
        .close           = n_tty_close,
        .flush_buffer    = n_tty_flush_buffer,
        .chars_in_buffer = n_tty_chars_in_buffer,
        .read            = n_tty_read,
        .write           = n_tty_write,
        .ioctl           = n_tty_ioctl,
        .set_termios     = n_tty_set_termios,
        .poll            = n_tty_poll,
        .receive_buf     = n_tty_receive_buf,
        .write_wakeup    = n_tty_write_wakeup,
        .fasync      = n_tty_fasync,
        .receive_buf2    = n_tty_receive_buf2,
    };


    /kernel/tty/tty_ldisc.c
      //该数组有内核定义 存放协议标号以及各个线路规程操作集
    1 static struct tty_ldisc_ops *tty_ldiscs[NR_LDISCS];

    2 void tty_ldisc_begin(void)
        {
            //注册线路规程,这里只是注册了一个线路规程,tty并没有调用该线路规程,
            (void) tty_register_ldisc(N_TTY, &tty_ldisc_N_TTY);
        }


         //根据数组下标 N_TTY(代表协议) 存放对应的线路规程的操作集 tty_ldisc_N_TTY
    3   int tty_register_ldisc(int disc, struct tty_ldisc_ops *new_ldisc)
        {
            unsigned long flags;
            int ret = 0;
          //判断编号是否符合
            if (disc < N_TTY || disc >= NR_LDISCS)
                return -EINVAL;

            raw_spin_lock_irqsave(&tty_ldiscs_lock, flags);
            tty_ldiscs[disc] = new_ldisc;
            new_ldisc->num = disc;
            new_ldisc->refcount = 0;
            raw_spin_unlock_irqrestore(&tty_ldiscs_lock, flags);

            return ret;
        }
        EXPORT_SYMBOL(tty_register_ldisc);

四 tty线路规程 小结:

    start_kernel{
        ...
        console_init()
        {
            tty_ldisc_begin()
            {
                 tty_register_ldisc(N_TTY, &tty_ldisc_N_TTY);
                 {
                        unsigned long flags;
                        int ret = 0;
                      //判断编号是否符合
                        if (disc < N_TTY || disc >= NR_LDISCS)
                            return -EINVAL;

                        raw_spin_lock_irqsave(&tty_ldiscs_lock, flags);
                        tty_ldiscs[disc] = new_ldisc;
                        new_ldisc->num = disc;
                        new_ldisc->refcount = 0;
                        raw_spin_unlock_irqrestore(&tty_ldiscs_lock, flags);

                        return ret;
                 }
            }
        }
        ...
    }

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

科尔沁第一狠人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值