14.4 数据发送和接收
图 14.3 所示终端设备数据发送和接收过程中的数据流以及函数调用关系。
图 14.3 终端设备数据发送和接收过程中的数据流以及函数调用关系
用户在有数据发送给终端设备时,通过“write()系统调用 — tty 核心 — 线路规程”的层层调用,最终调用 tty_driver结构体中的 write()函数完成发送。
因为传输速度和 tty 硬件缓冲区容量的原因,不是所有的写程序要求的字符都可以在调用写函数时被发送,因此写函数应当返回能够发送给硬件的字节数以便用户程序检查是否所有的数据被真正写入。如果在 write()调用期间发生任何错误,一个负的错误码应当被返回。
tty_driver 的 write()函数接受 3 个参数 tty_struct、发送数据指针及要发送的字节数。
int (*write)(struct tty_struct * tty, const unsigned char *buf, int count);
一般首先会通过 tty_struct 的 driver_data 成员得到设备私有信息结构体,然后依次进行必要的硬件操作开始
发送,代码清单 14.6 为 tty_driver 的 write()。
代码清单 14.6 tty_driver 结构体的 write()成员函数
static int xxx_write(struct tty_struct *tty, const unsigned char *buf, int count)
{
/* 获得 tty 设备私有数据 */
struct xxx_tty *xxx = (struct xxx_tty*)tty->driver_data;
...
/* 开始发送 */
while (1) {
local_irq_save(flags); /*把中断状态保存到flags中,禁止当前处理器上的中断*/
c = min_t(int, count, min(SERIAL_XMIT_SIZE - xxx->xmit_cnt - 1,
SE