tty关键结构体清单及其分层简述
来源:互联网 发布:json转化为byte数组 编辑:程序博客网 时间:2024/05/29 13:50
一: 用户层:
1
//字符设备操作集 /kernel/include/linux/fs.h static const struct file_operations tty_fops = { .llseek = no_llseek, .read = tty_read, .write = tty_write, .poll = tty_poll, .unlocked_ioctl = tty_ioctl, .compat_ioctl = tty_compat_ioctl, .open = tty_open, .release = tty_release, .fasync = tty_fasync, }; 调用位置在 /kernel/driver/tty/Tty_io.c static const struct file_operations tty_fops{ ... }
二 : tty_core层:
2.1
//tty驱动结构体 /kernel/include/linux/tty_driver.h struct tty_driver { int magic; /* magic number for this structure */ struct kref kref; /* Reference management */ struct cdev **cdevs; struct module *owner; const char *driver_name; const char *name; int name_base; /* offset of printed name */ int major; /* major device number */ int minor_start; /* start of minor device number */ unsigned int num; /* number of devices allocated */ short type; /* type of tty driver */ short subtype; /* subtype of tty driver */ struct ktermios init_termios; /* Initial termios */ unsigned long flags; /* tty driver flags */ struct proc_dir_entry *proc_entry; /* /proc fs entry */ struct tty_driver *other; /* only used for the PTY driver */ struct tty_struct **ttys; struct tty_port **ports; struct ktermios **termios; void *driver_state; const struct tty_operations *ops; struct list_head tty_drivers; }; 调用位置 :/kernel/drivers/tty/serial/XXX.uart.c struct tty_driver{ ... } 在设备驱动层 注册设备驱动时 创建初始化
2.2
//tty设备驱动 操作函数 /kernel/include/linux/tty_driver.h struct tty_operations { struct tty_struct * (*lookup)(struct tty_driver *driver, struct inode *inode, int idx); int (*install)(struct tty_driver *driver, struct tty_struct *tty); void (*remove)(struct tty_driver *driver, struct tty_struct *tty); int (*open)(struct tty_struct * tty, struct file * filp); void (*close)(struct tty_struct * tty, struct file * filp); void (*shutdown)(struct tty_struct *tty); void (*cleanup)(struct tty_struct *tty); int (*write)(struct tty_struct * tty, const unsigned char *buf, int count); int (*put_char)(struct tty_struct *tty, unsigned char ch); void (*flush_chars)(struct tty_struct *tty); int (*write_room)(struct tty_struct *tty); int (*chars_in_buffer)(struct tty_struct *tty); int (*ioctl)(struct tty_struct *tty, unsigned int cmd, unsigned long arg); long (*compat_ioctl)(struct tty_struct *tty, unsigned int cmd, unsigned long arg); void (*set_termios)(struct tty_struct *tty, struct ktermios * old); void (*throttle)(struct tty_struct * tty); void (*unthrottle)(struct tty_struct * tty); void (*stop)(struct tty_struct *tty); void (*start)(struct tty_struct *tty); void (*hangup)(struct tty_struct *tty); int (*break_ctl)(struct tty_struct *tty, int state); void (*flush_buffer)(struct tty_struct *tty); void (*set_ldisc)(struct tty_struct *tty); void (*wait_until_sent)(struct tty_struct *tty, int timeout); void (*send_xchar)(struct tty_struct *tty, char ch); int (*tiocmget)(struct tty_struct *tty); int (*tiocmset)(struct tty_struct *tty, unsigned int set, unsigned int clear); int (*resize)(struct tty_struct *tty, struct winsize *ws); int (*set_termiox)(struct tty_struct *tty, struct termiox *tnew); int (*get_icount)(struct tty_struct *tty, struct serial_icounter_struct *icount); #ifdef CONFIG_CONSOLE_POLL int (*poll_init)(struct tty_driver *driver, int line, char *options); int (*poll_get_char)(struct tty_driver *driver, int line); void (*poll_put_char)(struct tty_driver *driver, int line, char ch); #endif const struct file_operations *proc_fops; }; 调用位置 : /kernel/drivers/tty/serial/serial_core.c static const struct tty_operations uart_ops { ... }
三 :线程规划层:
3.1
//给tty设备的线路规程 /kernel/include/linux : Tty_ldisc.h struct tty_ldisc { struct tty_ldisc_ops *ops; struct tty_struct *tty; };
3.2
//用来保存当前tty端口的信息 /kernel/include/linux/tty.h struct tty_struct { int magic; struct kref kref; struct device *dev; struct tty_driver *driver; const struct tty_operations *ops; int index; struct ld_semaphore ldisc_sem; struct tty_ldisc *ldisc; //具体关联的 线程 struct mutex atomic_write_lock; struct mutex legacy_mutex; struct mutex throttle_mutex; struct rw_semaphore termios_rwsem; struct mutex winsize_mutex; spinlock_t ctrl_lock; spinlock_t flow_lock; /* Termios values are protected by the termios rwsem */ struct ktermios termios, termios_locked; struct termiox *termiox; /* May be NULL for unsupported */ char name[64]; struct pid *pgrp; /* Protected by ctrl lock */ struct pid *session; unsigned long flags; int count; struct winsize winsize; /* winsize_mutex */ unsigned long stopped:1, /* flow_lock */ flow_stopped:1, unused:BITS_PER_LONG - 2; int hw_stopped; unsigned long ctrl_status:8, /* ctrl_lock */ packet:1, unused_ctrl:BITS_PER_LONG - 9; unsigned int receive_room; /* Bytes free for queue */ int flow_change; struct tty_struct *link; struct fasync_struct *fasync; int alt_speed; /* For magic substitution of 38400 bps */ wait_queue_head_t write_wait; wait_queue_head_t read_wait; struct work_struct hangup_work; void *disc_data; void *driver_data; struct list_head tty_files; #define N_TTY_BUF_SIZE 4096 int closing; unsigned char *write_buf; int write_cnt; /* If the tty has a pending do_SAK, queue it here - akpm */ struct work_struct SAK_work; struct tty_port *port; }; 调用位置 : 在上层用户 open /dev/XXX 的时候创建并初始化 tty_struct{ ... }
3.3
//线程规划ops(操作函数) /kernel/include/linux : Tty_ldisc.h 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/drivers/tty/n_tty.c struct tty_ldisc_ops tty_ldisc_N_TTY{ ... }
四 Serial_driver设备层:
4.1
//tty设备驱动结构体 /kernel/include/linux/serial_core.h struct uart_driver { struct module *owner; const char *driver_name; const char *dev_name; int major; int minor; int nr; struct console *cons; struct uart_state *state; struct tty_driver *tty_driver; }; 调用位置 : /kernel/drivers/tty/serial/uartxxx.c static struct uart_driver XXX_uart_driver
4.2
//tty设备空间 /kernel/include/linux/serial_core.h struct uart_state { struct tty_port port; enum uart_pm_state pm_state; struct circ_buf xmit; struct uart_port *uart_port; };
4.3
//tty真实的物理串口/kernel/include/linux/serial_core.hstruct uart_port { spinlock_t lock; /* port lock */ unsigned long iobase; /* io端口基地址(物理) */ unsigned char __iomem *membase; /* io内存基地址(虚拟) */ unsigned int (*serial_in)(struct uart_port *, int); void (*serial_out)(struct uart_port *, int, int); unsigned int irq; /* 中断号 */ unsigned long irqflags; /* 中断标志 */ unsigned int uartclk; /* 串口时钟 */ unsigned int fifosize; /* 串口缓冲区大小 */ unsigned char x_char; /* xon/xoff char */ unsigned char regshift; /* 寄存器位移 */ unsigned char iotype; /* IO访问方式 */ unsigned char unused1; unsigned int read_status_mask; /* 关心 Rx error status */ unsigned int ignore_status_mask; /* 忽略 Rx error status */ struct uart_state *state; /* pointer to parent state */ struct uart_icount icount; /* 串口信息计数器 */ struct console *cons; /* struct console, if any */ #if defined(CONFIG_SERIAL_CORE_CONSOLE) || defined(SUPPORT_SYSRQ) unsigned long sysrq; /* sysrq timeout */ #endif upf_t flags; unsigned int mctrl; /* 当前的Moden 设置 */ unsigned int timeout; /* character-based timeout */ unsigned int type; /* 端口类型 */ const struct uart_ops *ops; /* 串口端口操作函数 */ unsigned int custom_divisor; unsigned int line; /* 端口索引 */ resource_size_t mapbase; /* io内存物理基地址 */ struct device *dev; /* 父设备 */ unsigned char hub6; unsigned char suspended; unsigned char unused[2]; void *private_data; /* generic platform data pointer */ }; 调用位置 : /kernel/drivers/tty/serial/uartxxx.cstatic struct XXX_port { struct uart_port port ... }
4.4
//tty真实串口的操作集合 /kernel/include/linux/serial_core.h struct uart_ops { unsigned int (*tx_empty)(struct uart_port *);/* 串口的Tx FIFO缓存是否为空 */ void (*set_mctrl)(struct uart_port *, unsigned int mctrl); /* 设置串口modem控制 */ unsigned int (*get_mctrl)(struct uart_port *); /* 获取串口modem控制 */ void (*stop_tx)(struct uart_port *); /* 禁止串口发送数据 */ void (*start_tx)(struct uart_port *); /* 使能串口发送数据 */ void (*send_xchar)(struct uart_port *, char ch); /* 发送xChar */ void (*stop_rx)(struct uart_port *); /* 禁止串口接收数据 */ void (*enable_ms)(struct uart_port *); /* 使能modem的状态信号 */ void (*break_ctl)(struct uart_port *, int ctl); /* 设置break信号 */ int (*startup)(struct uart_port *); /* 启动串口,应用程序打开串口设备文件时,该函数会被调用 */ void (*shutdown)(struct uart_port *);/* 关闭串口,应用程序关闭串口设备文件时,该函数会被调用 */ void (*flush_buffer)(struct uart_port *); void (*set_termios)(struct uart_port *, struct ktermios *new, struct ktermios *old); /* 设置串口参数 */ void (*set_ldisc)(struct uart_port *);/* 设置线路规程 */ void (*pm)(struct uart_port *, unsigned int state, unsigned int oldstate); /* 串口电源管理 */ int (*set_wake)(struct uart_port *, unsigned int state); const char *(*type)(struct uart_port *); void (*release_port)(struct uart_port *); int (*request_port)(struct uart_port *); /* 申请必要的IO端口/IO内存资源,必要时还可以重新映射串口端口 */ void (*config_port)(struct uart_port *, int); /* 执行串口所需的自动配置 */ int (*verify_port)(struct uart_port *, struct serial_struct *); /* 核实新串口的信息 */ int (*ioctl)(struct uart_port *, unsigned int, unsigned long); #ifdef CONFIG_CONSOLE_POLL void (*poll_put_char)(struct uart_port *, unsigned char); int (*poll_get_char)(struct uart_port *); #endif }; 调用位置 : /kernel/drivers/tty/serial/uartxxx.c static struct uart_ops wk2xxx_pops
阅读全文
0 0
- tty关键结构体清单及其分层简述
- linux tty 之分层结构
- TTY termios 结构体
- spi 结构体清单
- 简述网络体系结构采用分层次结构的好处。
- tty系统框架简述
- ios 结构体简述
- 光纤传输网的发展及其新的分层结构
- 简述MVC分层
- tty设备驱动注册简述
- 分层结构
- 打印 DEVMODE 结构体 简述
- 预处理与结构体简述
- TTY设备驱动结构
- linux tty driver 相关结构体 整理(tty driver 自己写出来之前保持更新)
- i2c关键结构体分析
- FFMPEG关键结构体分析
- 简述结构
- linux系统网络配置问题
- Redis连接工具类
- shell 中括号命令
- 基于数据挖掘的健康饮食营养系统实现
- java判断String字符串数组中是否存在某个值
- tty关键结构体清单及其分层简述
- 加载ICON图标
- java常用的注解
- cs231n笔记(9)--目标识别RCNN
- plsql(二)--异常
- 输入一个单向链表,输出该链表中倒数第K个结点
- 使用wireshark进行安卓抓包分析
- 异常Java.net.SocketException: Unrecognized Windows Sockets error: 0: JVM_Bind处理方法
- extension block