linux中serial driver理解【转】
转自:http://blog.csdn.net/laoliu_lcl/article/details/39967225
英文文档地址:myandroid/kernel_imx/Documentation/serialg/driver。译文如下:
底层串口API
本文件介绍新串口驱动某些方面的简要概述。介绍并不全,有任何问题可以访问<rmk@arm.linux.org.uk>。
参考实现包含在amba_pl011.c内。
底层串口硬件驱动
--------------------------------
底层串口硬件驱动向核心串口驱动程序提供端口信息(定义在uart_port)和一系列控制方法(定义在uart_ops)。底层驱动也可以处理中断的端口,并提供任何控制台支持。
控制台支持
--------------------------------
串口核心提供一些帮助函数,包括确定的正确端口结构(通过uart_get_console)和解码命令行参数(uart_parse_options)。
还有一个帮助函数(uart_write_console),执行每个字符写功能,换行符译成CRLF序列。驱动程序开发者建议使用此函数,而不是实现它们自己的版本。
锁
--------------------------------
底层硬件驱动程序使用port->lock来执行所需的锁定功能。有些情况例外(在下面列出的uart_ops中描述)。
有3个锁,每个端口自旋锁、每个端口tmpbuf信号和整体信号。
从核心驱动程序,port->lock锁定以下数据:
port->mctrl
port->icount
info->xmit.head(circ->head)
info->xmit.tail(circ->tail)
底层驱动程序可以随时使用该锁来提供任意额外的锁定。
核心驱动程序使用info->tmpbuf_sem锁,以防止多线程访问端口写入的使用info->tmpbuf回弹缓冲区。
port_sem信号用来防止在不恰当的时间添加/删除或重新配置端口。
uart_ops
--------------------------------
uart_ops结构是serial_core和硬件特定驱动程序之间重要接口。包含控制硬件的所有方法。
tx_empty(port)
此函数检查发送fifo和移位通过“端口”中描述的端口是否为空。如果为空,函数应返回TIOCSER_TEMT,否则返回0。如果端口不支持此操作,返回TIOCSER_TEMT。
锁:none
中断:取决于调用者;
此调用不休眠。
set_mctrl(port, mctrl)
此函数设置串口modem控制模式。mctrl相关的位是:
- TIOCM_RTS RTS signal.
- TIOCM_DTR DTR signal.
- TIOCM_OUT1 OUT1 signal.
- TIOCM_OUT2 OUT2 signal.
- TIOCM_LOOP 设置端口为回环模式
如果相应的位被置位,该信号应被驱动为有效;如果该位清空,该信号应被驱动为无效。
锁定:采用port->lock
中断:本地禁用
此调用不休眠。
get_mctrl(port)
返回modem控制输入的当前状态。不应返回输出状态,因为核心驱动追踪它们的状态。状态信息应包含:
-TIOCM_DCD state of DCD signal
-TIOCM_CTS state of CTS signal
-TIOCM_DSR state of DSR signal
-TIOCM_RI state of RI signal
如果信号当前是有效地,位被设置。如果端口不支持CTS、DCD 或DSR,驱动程序应指明该信号是持续有效的。如果RI不可用,该信号不应表示为有效。
锁定:采用port->lock
中断:本地禁用
此调用必须不休眠。
stop_tx(port)
停止发送字符。这可能由于CTS线路变为非活动状态,或tty层表明由于XOFF字符我们要停止传输。
驱动程序应尽快停止传输字符。
锁定:采用port->lock
中断:本地禁用
此调用不休眠。
start_tx(port)
开始传输字符。
锁定:采用port->lock
中断:本地禁用
此调用不休眠。
stop_rx(port)
停止接收字符。端口处于即将关闭进程中。
锁定:采用port->lock
中断:本地禁用
此调用不休眠。
enable_ms(port)
使能modem状态中断。
此方法可被多次调用,当调用shutdown方法时,modem状态中断禁用。
锁定:采用port->lock
中断:本地禁用
此调用不休眠。
break_ctl(port,ctl)
控制中断信号的传输。如果ctl非零,中断信号应被传输。当另一个调用作为零ctl时,此信号应终止。
锁定:none
中断:取决于调用者
此调用不休眠。
startup(port)
抓取任意中断资源,并初始化任一底层驱动状态。使能接收端口。不应该启用RTS和DTR;可通过一个单独的调用set_mctrl来完成。
此方法只有在端口最初打开时被调用。
锁定:采用port_sem
中断:全球禁用。
shutdown(port)
禁用端口,禁用任何可能有效地中断条件,以及释放任何中断资源。不应该禁用RTS和DTR;可通过一个单独的调用set_mctrl来完成。
一旦调用完成,驱动程序不能访问port->info。
此方法只有当没有更多的用户端口时才被调用。
锁定:采用port_sem
中断:取决于调用者
flush_buffer(port)
刷新任何写缓冲区,重置所有的DMA状态,并停止正在进行的DMA传输。
每当port->info->xmit循环缓冲区清零时都被调用。
锁定:采用port->lock
中断:本地禁用
此调用不能休眠。
set_termios(port,termios,oldtermios)
改变端口参数,包括:字长、奇偶校验、停止位。更新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位是:
INPCK - enable frame and parity error events to be
passed to the TTY layer.
BRKINT
PARMRK - both of these enable break events to be
passedto the TTY layer.
IGNPAR - ignore parity and framing errors
IGNBRK - ignore break errors, If IGNPAR is also
set,ignore overrun errors as well.
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字符)。
锁定:none
中断:取决于调用者
此调用不能休眠。
pm(port,state,oldstate)
在指定的端口上执行任何电源管理有关的活动。状态表示新状态(定义为ACPI D0-D3),旧状态表示以前状态。从本质上讲,D0表示完全供电,D3指断电。
此函数不应用于抓取任何资源。
当端口最初打开,最终关闭,除非该端口也是系统控制台时,这才被调用。即使CONFIG_PM没被设置,也会发生。
锁定:none
中断:取决于调用者。
type(port)
返回一个指向字符串常量、描述指定端口的指针,或返回NULL,在这种情况下,字符串“unknow”被替换。
锁定:none
中断:取决于调用者。
release_port(port)
释放目前在该端口使用的任何内存和IO区域资源。
锁定:none
中断:取决于调用者。
request_port(port)
请求端口所需任意内存和IO区域资源。如果有任何失败,当该函数返回时,没有注册资源,它应该返回-EBUSY失败。
锁定:none
中断:取决于调用者。
config_port(port,type)
执行所需端口的自动配置步骤。`type`包括所需配置的位掩码。UART_CONFIG_TYPE表示端口需要探测和识别。如果未检测到端口的类型,port->type应设置为已建立的类型或PORT_UNKNOWN。
UART_CONFIG_IRQ表示应采用标准内核自动探测技术探测的中断信号的自动配置。端口有中断的内部硬连接平台是内有必要的(例如,片上系统的实现)。
锁定:none
中断:取决于调用者。
verify_port(port,serinfo)
验证包含在serinfo新的串口信息适于此端口类型。
锁定:none
中断:取决于调用者。
ioctl(port,cmd,arg)
执行任何特定端口的IOCTLs。Ioctl命令使用标准编号系统定义,参见<asm/ioctl.h>。
锁定:none
中断:取决于调用者。
其他函数
---------------
uart_update_timeout(port,cflag,baud)
更新的FIFO消耗超时,port->timeout,根据位数、奇偶校验位数、停止位和波特率。
锁定:调用者预计需要port->lock
中断:n/a。
uart_get_baud_rate(port,termios,old,min,max)
返回指定termios的波特率数值,考虑到特定38400波特率,B0波特率被映射为9600波特率。
如果波特率不在min..max,旧的波特率不为null,那么原来的波特率将受到影响。如果超出min..max约束,9600波特将被退回。Termios更新到正在使用的波特率。
注意:min..max必须始终允许9600波特被选中。
锁定:取决于调用者
中断:n/a。
uart_get_divisor(port,baud)
返回除数(baud_base/波特)为指定的波特率,适当地舍入。
如果38400和自定义的除数被选中,返回自定义的除数来代替。
锁定:取决于调用者
中断:n/a。
uart_match_port(port1,port2)
该实用程序可用于确定两个uart_port结构是否拥有相同的端口。
锁定:n/a
中断:n/a。
uart_write_wakeup(port)
当发送缓冲区中的字符数已降低到低于阀值时,驱动程序将调用此函数。
锁定:使用port->lock。
中断:n/a。
uart_register_driver(drv)
向核心驱动程序注册串口驱动。我们依次注册tty层,初始化核心驱动程序每个端口的状态。
drv->port应该是NULL,调用成功后,使用uart_add_one_port函数注册每个端口结构。
锁定:none
中断:禁用。
uart_unregister_driver()
从核心驱动中删除驱动所有的声明。如果注册时使用uart_add_one_port()函数,底层驱动程序必须使用uart_remove_one_port()函数删除所有的端口。
锁定:none
中断:禁用。
uart_suspend_port()
uart_resume_port()
uart_add_one_port()
uart_remove_one_port()
其他注意事项
----------------------
它的目的是有一天从uart_port删除“未使用”的条目,底层驱动程序向核心驱动注册自己的单独uart_port。这将允许驱动程序把uart_port作为一个指向包含uart_port条目与自己的扩展结构指针来使用:
structmy_port {
structuart_port port;
int my_stuff;
};
linux中serial driver理解【转】的更多相关文章
- linux中socket的理解
对linux中socket的理解 一.socket 一般来说socket有一个别名也叫做套接字. socket起源于Unix,都可以用“打开open –> 读写write/read –> ...
- [转帖]linux中systemctl详细理解及常用命令
linux中systemctl详细理解及常用命令 2019年06月28日 16:16:52 思维的深度 阅读数 30 https://blog.csdn.net/skh2015java/article ...
- linux中systemctl详细理解及常用命令
linux中systemctl详细理解及常用命令 https://blog.csdn.net/skh2015java/article/details/94012643 一.systemctl理解 Li ...
- linux中inode的理解
一.inode是什么? 理解inode,要从文件储存说起. 文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector).每个扇区储存512字节(相当于0.5KB). 操作系统 ...
- linux中socket的理解---4
一.socket 一般来说socket有一个别名也叫做套接字. socket起源于Unix,都可以用“打 开open –> 读写write/read –> 关闭close”模式来操作.So ...
- 深入理解Linux中内存管理
前一段时间看了<深入理解Linux内核>对其中的内存管理部分花了不少时间,但是还是有很多问题不是很清楚,最近又花了一些时间复习了一下,在这里记录下自己的理解和对Linux中内存管理的一些看 ...
- 如何理解 Linux 中的 load averages
原文:https://mp.weixin.qq.com/s?src=11×tamp=1533697106&ver=1047&signature=poqrJFfcNAB ...
- 【Linux】深入理解Linux中内存管理
主题:Linux内存管理中的分段和分页技术 回顾一下历史,在早期的计算机中,程序是直接运行在物理内存上的.换句话说,就是程序在运行的过程中访问的都是物理地址. 如果这个系统只运行一个程序,那么只要这个 ...
- linux中对socket的理解 socket高并发
1.socket是什么? 其实准确的来说,socket并不仅仅用于linux而已,它也应用于TCP/IP中.笼统的来说,socket就是指的“IP地址+端口号”.比如我有一个ssh服务器A,这时候我有 ...
随机推荐
- 哥java学识有大进 干回之前的小学生系统像切菜一样简单 不说了 来代码
package runok; import java.util.*; import java.awt.*; import java.awt.event.ActionEvent; import java ...
- Daily Scrum 10.20
今天进行了团队第一次scrum meeting,在这次会议中,我们针对NABC模型以及开发前期的工作进行了探讨. 第一次会议 主要内容如下: 为了大家接下来几周的开发效率,需要共同商量团队的一些规则 ...
- appearance格式化表单元素的边框,在chrome和FF下鼠标点击时会多出一个蓝色边框
可在元素上添加样式 -webkit-appearance: none; -moz-appearance:none;outline:none; 清除掉元素所有的外貌,以便自定义风格
- Java标识符和关键字(static,final,abstract,interface)
本文的主要内容如下 1.标识符合关键字 2.Java中的关键字 3.static关键 字 4.static方法 5.静态代码块 6.static修饰符综述 7.final关键字 8.final修饰 ...
- Beta冲刺——day7
Beta冲刺--day7 作业链接 Beta冲刺随笔集 github地址 团队成员 031602636 许舒玲(队长) 031602237 吴杰婷 031602220 雷博浩 031602134 王龙 ...
- idea打jar包没有MANIFEST文件坑
看到横线处没有,将此处的main\java 删除掉 meta-inf文件夹必须在src文件夹下,才能打包成功, idea自动加了 main/java 会导致打包时,找不到该manifest文件,不会将 ...
- [转帖]"微信支付"勒索病毒制造者被锁定 传播、危害和疫情终极解密 --- 可以学习下一年火绒团队的分析原理的精神.
"微信支付"勒索病毒制造者被锁定 传播.危害和疫情终极解密 https://www.cnbeta.com/articles/tech/794851.htm 12月1日,首个要求&q ...
- oracle 每个类别取几条的语法怎么写
select *from (select t.*,row_number() over(partition by t.公司名 order by 1) rn from t)where rn<=10
- 【刷题】BZOJ 4805 欧拉函数求和
Description 给出一个数字N,求sigma(phi(i)),1<=i<=N Input 正整数N.N<=2*10^9 Output 输出答案. Sample Input 1 ...
- 获取androdmanifest里面的meta-data
/* * Copyright 2017 JessYan * * Licensed under the Apache License, Version 2.0 (the "License&qu ...