微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Linux下的串口总线驱动(三)

Linux下的串口总线驱动(三)

时间:11-22 来源:互联网 点击:

mutex_init(&tty->echo_lock);

spin_lock_init(&tty->read_lock);

spin_lock_init(&tty->ctrl_lock);

INIT_LIST_HEAD(&tty->tty_files);

INIT_WORK(&tty->SAK_work, do_SAK_work);

tty->driver = driver;

tty->ops = driver->ops;

tty->index = idx;

tty_line_name(driver, idx, tty->name);

}

我们继续跟踪initialize_tty_struct函数中的tty_ldisc_init(tty)函数

void tty_ldisc_init(struct tty_struct *tty)

{

struct tty_ldisc *ld = tty_ldisc_get(N_TTY); //设置线路规程N_TTY

if (IS_ERR(ld))

panic("n_tty: init_tty");

tty_ldisc_assign(tty, ld);

}

在tty_ldisc_init里,我们终于找到了N_TTY,这是默认的线路规程。

继续看tty_init_dev,我们发现retval = tty_ldisc_setup(tty, tty->link);继续跟踪

int tty_ldisc_setup(struct tty_struct *tty, struct tty_struct *o_tty)

{

struct tty_ldisc *ld = tty->ldisc;

int retval;

retval = tty_ldisc_open(tty, ld);

if (retval)

return retval;

if (o_tty) {

retval = tty_ldisc_open(o_tty, o_tty->ldisc);

if (retval) {

tty_ldisc_close(tty, ld);

return retval;

}

tty_ldisc_enable(o_tty);

}

tty_ldisc_enable(tty);

return 0;

}

然后我们跟踪tty_ldisc_setup函数中的tty_ldisc_open函数

static int tty_ldisc_open(struct tty_struct *tty, struct tty_ldisc *ld)

{

WARN_ON(test_and_set_bit(TTY_LDISC_OPEN, &tty->flags));

if (ld->ops->open)

return ld->ops->open(tty); //打开ldisc下的open,进行链路的初始化

return 0;

}

在tty_ldisc_open这里已经通过相应tty_ldisc结构所提供的函数指针调用了与链路规则有关的open操作。

前面tty_open函数中也有个open调用,这是为什么呢?因为具体的终端类型也可能有需要在打开文件时加以调用的函数。对于用作控制台的虚拟终端,其tty_driver数据结构为console_driver,其open函数则为con_open()。

综上,我们可以把tty_io.c看作是tty核心,然后tty核心里调用ldisc中的open,ldisc里的open调用tty层的open,tty层的open调用uart层的open,最终实现打开操作。

最后再次总结如下几点:

其一,内核中有一个链表tty_drivers,系统在初始化时,或者安装某种终端设备的驱动模块时,通过函数tty_register_driver()将各种终端设备的tty_driver结构登记到这个链表中。每当新打开一个终端设备时,就要根据其设备号通过函数get_tty_driver()在这个链表中找到的tty_driver结构,并把它复制到具体的tty_struct结构体中。

其二,当新创建一个tty_struct结构时,就把相应的tty_ldisc结构复制到tty_struct结构体中的这个成员中。

其三,另外内核中的一个重要指针termios,这个数据结构在某种程度上可以看作是对tty_ldisc结构的补充,它规定了对接口上输入和输出的每个字符所作的处理以及传输的速度,即波特率。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top