UART
通信格式:
空闲位:数据线在空闲状态的时候为逻辑“1”状态,也就是高电平,表示没有数据线空闲,没有数据传输。
起始位:当要传输数据的时候先传输一个逻辑“0”,也就是将数据线拉低,表示开始数据传输。
数据位:数据位就是实际要传输的数据,数据位数可选择 5~8 位,我们一般都是按照字节传输数据的,一个字节 8 位,因此数据位通常是 8 位的。低位在前,先传输,高位最后传输。
奇偶校验位:这是对数据中“1”的位数进行奇偶校验用的,可以不使用奇偶校验功能。
停止位:数据传输完成标志位,停止位的位数可以选择 1 位、1.5 位或 2 位高电平,一般都选择 1 位停止位。
波特率:波特率就是 UART 数据传输的速率,也就是每秒传输的数据位数,一般选择 9600、19200、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_ops(uart_ops,这个结构体变量包含了串口最底层的操作函数,跟stm32一样,就是对uart的各种寄存器的操作,一般由soc产商实现),申请中断,使用uart_add_one_port 向 uart_driver 添加uart_port。