RK356X UART 使用

功能特点

Rockchip UART (Universal Asynchronous Receiver/Transmitter) 基于16550A串口标准,完整模块支持以下功能:

  • 支持5、6、7、8 bits数据位
  • 支持1、1.5、2 bits停止位
  • 支持奇校验和偶校验,不支持mark校验和space校验
  • 支持接收FIFO和发送FIFO,一般为32字节或者64字节
  • 支持最高4M波特率,实际支持波特率需要芯片时钟分频策略配合
  • 支持中断传输模式和DMA传输模式
  • 支持硬件自动流控,RTS+CTS

普通串口

驱动路径

在Linux kernel 4.4和Linux kernel 4.19中,使用8250串口通用驱动,以下为主要驱动文件:

drivers/tty/serial/8250/8250_core.c # 8250串口驱动核心
drivers/tty/serial/8250/8250_dw.c # Synopsis DesignWare 8250串口驱动
drivers/tty/serial/8250/8250_dma.c # 8250串口DMA驱动
drivers/tty/serial/8250/8250_port.c # 8250串口端口操作
drivers/tty/serial/8250/8250_early.c # 8250串口early console驱动

defconfig 配置

# CONFIG_LEGACY_PTYS is not set
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y
# CONFIG_SERIAL_8250_PCI is not set
CONFIG_SERIAL_8250_NR_UARTS=10
CONFIG_SERIAL_8250_RUNTIME_UARTS=10
CONFIG_SERIAL_8250_DW=y
CONFIG_SERIAL_OF_PLATFORM=y

dts配置

普通串口设备将会根据dts中的aliase来对串口进行编号,对应注册成ttySx设备。dts中的aliases如下:

aliases {
serial0 = &uart0;
serial1 = &uart1;
serial2 = &uart2;
serial3 = &uart3;
......
 uart1: serial@fe650000 {
  compatible = "rockchip,rk3568-uart", "snps,dw-apb-uart";
  reg = <0x0 0xfe650000 0x0 0x100>;
  interrupts = <0 117 4>;
  clocks = <&cru 287>, <&cru 284>;
  clock-names = "baudclk", "apb_pclk";
  reg-shift = <2>;
  reg-io-width = <4>;
  dmas = <&dmac0 2>, <&dmac0 3>;
  pinctrl-names = "default";
  pinctrl-0 = <&uart1m0_xfer>;
  status = "okay";
 };

波特率配置

UART波特率 = 工作时钟源 / 内部分频系数 / 16
目前,UART驱动会根据配置的波特率大小自动去获取需要的工作时钟频率,可以通过以下命令查询到UART工作时钟频率:

cat /sys/kernel/debug/clk/clk_summary | grep uart

Rockchip UART对常用的波特率,如115200、460800、921600、1500000、3000000、4000000等确保稳定支持。对于一些特殊的波特率,需要修改工作时钟分频策略才能支持。

使用DMA

打开RK3568 UART1,打开dma,配置打开了硬件自动流控的UART1的tx、rx、cts、rts的iomux为group0

&uart1 {
	dma-names = "tx", "rx";
	pinctrl-names = "default";
	pinctrl-0 = <&uart1m0_xfer &uart1m0_ctsn &uart1m0_rtsn>;
	status = "okay";
};

UART使用DMA传输模式只有在数据量很大时才会产生较为明显的减轻CPU负载的效果。一般情况下,和使用中断传输模式相比,UART使用DMA传输模式并不一定能提高数据传输速度。
使用默认中断传输模式,会有以下打印:

failed to request DMA, use interrupt mode

在DMA通道资源紧张的使用场景下,可以考虑关掉TX的DMA传输,会有以下打印

got rx dma channels only

使用串口唤醒系统

串口唤醒系统功能是在系统待机时串口保持打开,并且把串口中断设置为唤醒源。使用时需要在dts中增加以下参数:

&uart1 {
	wakeup-source;
}

在dts中使能UART后,能在系统启动的log中看到以下对应的打印,表示设备正常注册:

fe650000.serial: ttyS1 at MMIO 0xfe650000 (irq = 67, base_baud = 1500000) is a16550A

版权声明:本文为CSDN博主「悲伤的小强」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_29890089/article/details/121289634

功能特点

Rockchip UART (Universal Asynchronous Receiver/Transmitter) 基于16550A串口标准,完整模块支持以下功能:

  • 支持5、6、7、8 bits数据位
  • 支持1、1.5、2 bits停止位
  • 支持奇校验和偶校验,不支持mark校验和space校验
  • 支持接收FIFO和发送FIFO,一般为32字节或者64字节
  • 支持最高4M波特率,实际支持波特率需要芯片时钟分频策略配合
  • 支持中断传输模式和DMA传输模式
  • 支持硬件自动流控,RTS+CTS

普通串口

驱动路径

在Linux kernel 4.4和Linux kernel 4.19中,使用8250串口通用驱动,以下为主要驱动文件:

drivers/tty/serial/8250/8250_core.c # 8250串口驱动核心
drivers/tty/serial/8250/8250_dw.c # Synopsis DesignWare 8250串口驱动
drivers/tty/serial/8250/8250_dma.c # 8250串口DMA驱动
drivers/tty/serial/8250/8250_port.c # 8250串口端口操作
drivers/tty/serial/8250/8250_early.c # 8250串口early console驱动

defconfig 配置

# CONFIG_LEGACY_PTYS is not set
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y
# CONFIG_SERIAL_8250_PCI is not set
CONFIG_SERIAL_8250_NR_UARTS=10
CONFIG_SERIAL_8250_RUNTIME_UARTS=10
CONFIG_SERIAL_8250_DW=y
CONFIG_SERIAL_OF_PLATFORM=y

dts配置

普通串口设备将会根据dts中的aliase来对串口进行编号,对应注册成ttySx设备。dts中的aliases如下:

aliases {
serial0 = &uart0;
serial1 = &uart1;
serial2 = &uart2;
serial3 = &uart3;
......
 uart1: serial@fe650000 {
  compatible = "rockchip,rk3568-uart", "snps,dw-apb-uart";
  reg = <0x0 0xfe650000 0x0 0x100>;
  interrupts = <0 117 4>;
  clocks = <&cru 287>, <&cru 284>;
  clock-names = "baudclk", "apb_pclk";
  reg-shift = <2>;
  reg-io-width = <4>;
  dmas = <&dmac0 2>, <&dmac0 3>;
  pinctrl-names = "default";
  pinctrl-0 = <&uart1m0_xfer>;
  status = "okay";
 };

波特率配置

UART波特率 = 工作时钟源 / 内部分频系数 / 16
目前,UART驱动会根据配置的波特率大小自动去获取需要的工作时钟频率,可以通过以下命令查询到UART工作时钟频率:

cat /sys/kernel/debug/clk/clk_summary | grep uart

Rockchip UART对常用的波特率,如115200、460800、921600、1500000、3000000、4000000等确保稳定支持。对于一些特殊的波特率,需要修改工作时钟分频策略才能支持。

使用DMA

打开RK3568 UART1,打开dma,配置打开了硬件自动流控的UART1的tx、rx、cts、rts的iomux为group0

&uart1 {
	dma-names = "tx", "rx";
	pinctrl-names = "default";
	pinctrl-0 = <&uart1m0_xfer &uart1m0_ctsn &uart1m0_rtsn>;
	status = "okay";
};

UART使用DMA传输模式只有在数据量很大时才会产生较为明显的减轻CPU负载的效果。一般情况下,和使用中断传输模式相比,UART使用DMA传输模式并不一定能提高数据传输速度。
使用默认中断传输模式,会有以下打印:

failed to request DMA, use interrupt mode

在DMA通道资源紧张的使用场景下,可以考虑关掉TX的DMA传输,会有以下打印

got rx dma channels only

使用串口唤醒系统

串口唤醒系统功能是在系统待机时串口保持打开,并且把串口中断设置为唤醒源。使用时需要在dts中增加以下参数:

&uart1 {
	wakeup-source;
}

在dts中使能UART后,能在系统启动的log中看到以下对应的打印,表示设备正常注册:

fe650000.serial: ttyS1 at MMIO 0xfe650000 (irq = 67, base_baud = 1500000) is a16550A

版权声明:本文为CSDN博主「悲伤的小强」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_29890089/article/details/121289634

生成海报
点赞 0

悲伤的小强

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

RK356X UART 使用

功能特点 Rockchip UART (Universal Asynchronous Receiver/Transmitter) 基于16550A串口标准,完整模块支持以下功能: 支持5、6、7、8 bits数据

定时器触发STM32 ADC的采样转换示例

开发板:STM32F446 Nucleo开发板IDE:  keil MDK初始化配置工具:stm32cubeMx例程内容:通过定时器触发ADC规则通道及注入通道的模数转换工作。下面基于STM32CubeMx进行些必要