/*
* This structure describes all the operations that can be
* done on the physical hardware.
*/
struct uart_ops {
unsigned int (*tx_empty)(struct uart_port *); /* 串口的Tx FIFO缓存是否为空。如果为空,函数应返回TIOCSER_TEMT,否则返回0。如果端口不支持此操作,返回TIOCSER_TEMT。*/
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 (*set_termios)(struct uart_port *, struct ktermios *new, struct ktermios *old); /* 设置串口参数 */
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 *); /* 释放串口已申请的IO端口/IO内存资源,必要时还需iounmap */
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); /* IO控制 */
};
此函数检查发送fifo和移位通过“端口”中描述的端口是否为空。如果为空,函数应返回TIOCSER_TEMT,否则返回0。如果端口不支持此操作,返回TIOCSER_TEMT。
此函数设置串口modem控制模式。mctrl相关的位是:
如果相应的位被置位,该信号应被驱动为有效;如果该位清空,该信号应被驱动为无效。
锁定:采用port->lock
中断:本地禁用
此调用不休眠。
返回modem控制输入的当前状态。不应返回输出状态,因为核心驱动追踪它们的状态。状态信息应包含:
如果信号当前是有效地,位被设置。如果端口不支持CTS、DCD 或DSR,驱动程序应指明该信号是持续有效的。如果RI不可用,该信号不应表示为有效。
停止发送字符。这可能由于CTS线路变为非活动状态,或tty层表明由于XOFF字符我们要停止传输。
驱动程序应尽快停止传输字符。
开始传输字符。
停止接收字符。端口处于即将关闭进程中。
使能modem状态中断。
此方法可被多次调用,当调用shutdown方法时,modem状态中断禁用。
控制中断信号的传输。如果ctl非零,中断信号应被传输。当另一个调用作为零ctl时,此信号应终止。
抓取任意中断资源,并初始化任一底层驱动状态。使能接收端口。不应该启用RTS和DTR;可通过一个单独的调用set_mctrl来完成。
此方法只有在端口最初打开时被调用。
禁用端口,禁用任何可能有效地中断条件,以及释放任何中断资源。不应该禁用RTS和DTR;可通过一个单独的调用set_mctrl来完成。
一旦调用完成,驱动程序不能访问port->info。
此方法只有当没有更多的用户端口时才被调用。
刷新任何写缓冲区,重置所有的DMA状态,并停止正在进行的DMA传输。
每当port->info->xmit循环缓冲区清零时都被调用。
改变端口参数,包括:字长、奇偶校验、停止位。更新read_status_mask而忽略状态掩码,表示我们有兴趣接收的事件类型。相应的termios->c_cflag位是:
CSIZE - word size
CSTOPB - 2 stop bits
PARENB - parity enable
PARODD- oddparity (when PARENB is in force)
CREAD - enable reception of characters (if not set,still receive characters from the port, but throwthem away.
CRTSCTS - if set, enable CTS status changereporting
CLOCAL - if not set, enable modem status change reporting.
相应的termios->c_iflag位是:
iflag位的相互作用如下(奇偶校验错误为例):
Parity | error | INPCK | IGNPAR |
---|---|---|---|
n/a | 0 | n/a | character received, marked as TTY_NORMAL |
None | 1 | n/a | character received, marked as TTY_NORMAL |
Yes | 1 | 0 | character received,marked as TTY_PARITY |
Yes | 1 | 1 | character discarded |
如果你的硬件支持硬件“软”流量控制,其他标志可以使用(例如,XON / XOFF字符)。
在指定的端口上执行任何电源管理有关的活动。状态表示新状态(定义为ACPI D0-D3),旧状态表示以前状态。从本质上讲,D0表示完全供电,D3指断电。
此函数不应用于抓取任何资源。
当端口最初打开,最终关闭,除非该端口也是系统控制台时,这才被调用。即使CONFIG_PM没被设置,也会发生。
返回一个指向字符串常量、描述指定端口的指针,或返回NULL,在这种情况下,字符串“unknow”被替换。
释放目前在该端口使用的任何内存和IO区域资源。
请求端口所需任意内存和IO区域资源。如果有任何失败,当该函数返回时,没有注册资源,它应该返回-EBUSY失败。
执行所需端口的自动配置步骤。type
包括所需配置的位掩码。UART_CONFIG_TYPE表示端口需要探测和识别。如果未检测到端口的类型,port->type应设置为已建立的类型或PORT_UNKNOWN。
UART_CONFIG_IRQ表示应采用标准内核自动探测技术探测的中断信号的自动配置。端口有中断的内部硬连接平台是内有必要的(例如,片上系统的实现)。
验证包含在serinfo新的串口信息适于此端口类型。
执行任何特定端口的IOCTLs。Ioctl命令使用标准编号系统定义,参见