UART

通信格式

空闲位:数据线在空闲状态的时候为逻辑“1”状态,也就是高电平,表示没有数据线空闲,没有数据传输。

起始位:当要传输数据的时候先传输一个逻辑“0”,也就是将数据线拉低,表示开始数据传输。

数据位:数据位就是实际要传输的数据,数据位数可选择 5~8 位,我们一般都是按照字节传输数据的,一个字节 8 位,因此数据位通常是 8 位的。低位在前,先传输,高位最后传输。

奇偶校验位:这是对数据中“1”的位数进行奇偶校验用的,可以不使用奇偶校验功能。

停止位:数据传输完成标志位,停止位的位数可以选择 1 位、1.5 位或 2 位高电平,一般都选择 1 位停止位。

波特率:波特率就是 UART 数据传输的速率,也就是每秒传输的数据位数,一般选择 960019200、115200 等

Uart驱动框架

串口驱动没有什么主机端和设备端之分,就只有一个串口驱动,而且这个驱动Soc官方已经编写好了,我们真正要做的就是在设备树中添加所要使用的串口节点信息。当系统启动以后串口驱动和设备匹配成功,相应的串口就会被驱动起来;uart_driver结构体表示UART 驱动,uart_driver 定义在 include/linux/serial_core.h 文件中

 

每个串口驱动都需要定义一个 uart_driver,加载驱动的时候通过 uart_register_driver 函数向系统注册这个 uart_driver,此函数原型如下: int uart_register_driver(struct uart_driver *drv),uart_port 表示一个具体的 port,uart_port 定义在 include/linux/serial_core.h 文件

ops 包含了串口的具体驱动函数,uart_driver通过int uart_add_one_port(struct uart_driver *drv, struct uart_port *uport)uart_port关联起来

驱动分析

根据uart的设备树子节点的compatible找到源文件,其驱动就是platform架构的

 

serial_imx_probe 函数具体内容

定义一个 imx_port(平台对uart_port的封装)类型的结构体指针变量sport,并为其分配内存,从设备树获取soc uart外设的寄存器首地址并内存映射,获取中断信息,初始化sport的成员变量,比如最重要的imx_opsuart_ops,这个结构体变量包含了串口最底层的操作函数,跟stm32一样,就是对uart的各种寄存器的操作,一般由soc产商实现),申请中断,使用uart_add_one_port uart_driver 添加uart_port。

posted on 2021-10-23 21:56  lzd626  阅读(269)  评论(0编辑  收藏  举报