唯客微博客

专注于计算机,嵌入式领域的技术

0%

Linux驱动开发杂记(0x13) - 串口UART驱动API

串口驱动API ## 1、uart_register_driver

1
2
3
4
5
6
/* 功能:    uart_register_driver用于将串口驱动uart_driver注册到内核(串口核心层)中,通常在模块初始化函数调用该函数。
* 参数 drv:要注册的uart_driver

* 返回值: 成功,返回0;否则返回错误码
*/
int uart_register_driver(struct uart_driver *drv)
## 2、uart_unregister_driver
1
2
3
4
5
6
/* 功能:    uart_unregister_driver用于注销我们已注册的uart_driver,通常在模块卸载函数调用该函数
* 参数 drv:要注销的uart_driver

* 返回值: 成功,返回0;否则返回错误码
*/
void uart_unregister_driver(struct uart_driver *drv)

3、uart_add_one_port

1
2
3
4
5
6
7
/* 功能:    uart_add_one_port用于为串口驱动添加一个串口端口,通常在探测到设备后(驱动的设备probe方法)调用该函数
* 参数 drv:串口驱动
* port:要添加的串口端口

* 返回值: 成功,返回0;否则返回错误码
*/
int uart_add_one_port(struct uart_driver *drv, struct uart_port *port)

4、uart_remove_one_port

1
2
3
4
5
6
/* 功能:     uart_remove_one_port用于删除一个已添加到串口驱动中的串口端口,通常在驱动卸载时调用该函数
* 参数 drv: 串口驱动
* port: 要删除的串口端口
* 返回值: 成功,返回0;否则返回错误码
*/
int uart_remove_one_port(struct uart_driver *drv, struct uart_port *port)

5、uart_write_wakeup

1
2
3
4
/* 功能:     uart_write_wakeup唤醒上层因向串口端口写数据而阻塞的进程,通常在串口发送中断处理函数中调用该函数
* 参数 port:需要唤醒写阻塞进程的串口端口
*/
void uart_write_wakeup(struct uart_port *port)

6、uart_suspend_port

1
2
3
4
5
6
/* 功能:     uart_suspend_port用于挂起特定的串口端口
* 参数 drv: 要挂起的串口端口所属的串口驱动
* port:要挂起的串口端口
* 返回值: 成功返回0;否则返回错误码
*/
int uart_suspend_port(struct uart_driver *drv, struct uart_port *port)

7、uart_resume_port

1
2
3
4
5
6
/* 功能:     uart_resume_port用于恢复某一已挂起的串口
* 参数 drv: 要恢复的串口端口所属的串口驱动
* port:要恢复的串口端口
* 返回值: 成功返回0;否则返回错误码
*/
int uart_resume_port(struct uart_driver *drv, struct uart_port *port)

8、uart_get_baud_rate

1
2
3
4
5
6
7
8
9
10
11
/* 功能:        uart_get_baud_rate通过解码termios结构体来获取指定串口的波特率
* 参数 port: 要获取波特率的串口端口
* termios:当前期望的termios配置(包含串口波特率)
* old: 以前的termios配置,可以为NULL
* min: 可接受的最小波特率
* max: 可接受的最大波特率
* 返回值: 串口的波特率
*/
unsigned int
uart_get_baud_rate(struct uart_port *port, struct ktermios *termios,
struct ktermios *old, unsigned int min, unsigned int max)

9、uart_get_divisor

1
2
3
4
5
6
/* 功能:     uart_get_divisor用于计算某一波特率的串口时钟分频数(串口波特率除数)
* 参数 port:要计算时钟分频数的串口端口
* baud:期望的波特率
*返回值: 串口时钟分频数
*/
unsigned int uart_get_divisor(struct uart_port *port, unsigned int baud)

10、uart_update_timeout

1
2
3
4
5
6
/* 功能:      uart_update_timeout用于更新(设置)串口FIFO超时时间
* 参数 port: 要更新超时时间的串口端口
* cflag:termios结构体的cflag值
* baud: 串口的波特率
*/
void uart_update_timeout(struct uart_port *port, unsigned int cflag, unsigned int baud)

11、uart_match_port

1
2
3
4
5
/* 功能:uart_match_port用于判断两串口端口是否为同一端口
* 参数 port1、port2:要判断的串口端口
* 返回值:不同返回0;否则返回非0
*/
int uart_match_port(struct uart_port *port1, struct uart_port *port2)

12、uart_console_write

1
2
3
4
5
6
7
8
9
10
/* 功能:        uart_console_write用于向串口端口写一控制台信息

* 参数 port: 要写信息的串口端口
* s: 要写的信息
* count: 信息的大小
* putchar: 用于向串口端口写字符的函数,该函数函数有两个参数:串口端口和要写的字符
*/
void uart_console_write(struct uart_port *port, const char *s,
unsigned int count,
void (*putchar)(struct uart_port *, int))

13、uart_insert_char

1
2
3
4
5
6
7
8
9
10
/* 功能:        uart_insert_char用于把接收到的字符送进串口驱动的buf

* 参数 port: 要写信息的串口端口
* status: 串口RX缓冲区的状态
* overrun:@status中溢出位的掩码
* ch: 推送的字符
* flag: 该字符的标志
*/
void uart_insert_char(struct uart_port *port, unsigned int status,
unsigned int overrun, unsigned int ch, unsigned int flag)

14、uart_parse_earlycon

1
2
int uart_parse_earlycon(char *p, unsigned char *iotype, resource_size_t *addr,
char **options)

15、uart_parse_options

1
2
void uart_parse_options(const char *options, int *baud, int *parity,
int *bits, int *flow)

16、uart_set_options

1
2
int uart_set_options(struct uart_port *port, struct console *co,
int baud, int parity, int bits, int flow)

17、uart_handle_dcd_change

1
void uart_handle_dcd_change(struct uart_port *uport, unsigned int status)

18、uart_handle_cts_change

1
void uart_handle_cts_change(struct uart_port *uport, unsigned int status)

19、uart_get_rs485_mode

1
void uart_get_rs485_mode(struct device *dev, struct serial_rs485 *rs485conf)

20、circ的函数

1
2
3
4
5
6
7
8
9
10
/* 缓冲区是否为空 */
#define uart_circ_empty(circ) ((circ)->head == (circ)->tail)
/* 清除缓冲区 */
#define uart_circ_clear(circ) ((circ)->head = (circ)->tail = 0)
/* 缓冲区中有效数据的个数 */
#define uart_circ_chars_pending(circ) \
(CIRC_CNT((circ)->head, (circ)->tail, UART_XMIT_SIZE))
/* 缓冲区中空闲空间的个数 */
#define uart_circ_chars_free(circ) \
(CIRC_SPACE((circ)->head, (circ)->tail, UART_XMIT_SIZE))
-------------本文结束感谢您的阅读-------------

本文标题:Linux驱动开发杂记(0x13) - 串口UART驱动API

文章作者:Vinx

发布时间:2018年11月22日 - 15:13

最后更新:2023年09月18日 - 11:10

原始链接:https://blog.vinkvin.com/post/19/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。