跳到主要内容

UART 驱动调试指南

S100(S600)芯片共有4(8)路 uart,即 uart0-uart3(uart0~uart7)。其中 uart0作为调试控制台使用,默认不开启 DMA,且需要通过控制 Bootstrip pin 决定波特率为115200或921600;

其他几路 uart 用作数据传输功能,设备树中默认开启 DMA,支持用户通过软件配置为各种波特率,常用波特率为921600。uart0和1支持硬件流控功能,其他几路 uart 不支持该功能。

UART 使用说明​

代码路径​

drivers/tty/serial/8250/8250_dw.c   #uart驱动文件
drivers/tty/serial/8250/8250_port.c #uart端口操作文件
drivers/tty/serial/8250/8250_core.c #8250 uart驱动核心
hobot-drivers/serial/8250_pdma.c #uart PDMA操作实现文件
kernel/arch/arm64/boot/dts/hobot/drobot-s100-pdma.dtsi   # PDMA 通道 / handshake 映射表
kernel/arch/arm64/boot/dts/hobot/drobot-s100-soc.dtsi # UART 节点
kernel/arch/arm64/boot/dts/hobot/drobot-s600-pdma.dtsi   # PDMA 通道 / handshake 映射表
kernel/arch/arm64/boot/dts/hobot/drobot-s600-soc.dtsi # UART 节点

内核配置​

配置文件路径: hobot-drivers/configs/drobot_s100_defconfig

配置文件路径: hobot-drivers/configs/drobot_s600_defconfig

CONFIG_SERIAL_8250=y   # 8250驱动配置
CONFIG_SERIAL_8250_CONSOLE=y #8250 console驱动配置
CONFIG_SERIAL_8250_DW=y #使能Designware独有的feature
CONFIG_HOBOT_PDMAC=y # UART PDMA 依赖

CONFIG_SERIAL_8250_PDMA 依赖 SERIAL_8250 && HOBOT_PDMAC=y,默认跟随 SERIAL_8250。

DTS 设备节点配置​

/*kernel/arch/arm64/boot/dts/hobot/drobot-s100-soc.dtsi*/
uart1: uart@394A0000 {
power-domains = <&scmi_smc_pd PD_IDX_LSPERI_TOP>;
compatible = "snps,dw-apb-uart";
reg = <0x0 0x394A0000 0x0 0x10000>;
reg-shift = <2>;
reg-io-width = <4>;
interrupts = <GIC_SPI PERISYS_UART0_INTR PERISYS_UART0_INTR_TRIG_TYPE>;
clock-frequency = <200000000>;
pinctrl-names = "default";
pinctrl-0 = <&peri_uart0>;
dmas = <&pdma0 0>, <&pdma0 1>;
dma-names = "rx", "tx";
status = "okay";
};
/*kernel/arch/arm64/boot/dts/hobot/drobot-s600-soc.dtsi*/
uart4: uart@3484E000 {
// power-domains = <&scmi_smc_pd PD_IDX_LSPERI_TOP>;
compatible = "snps,dw-apb-uart";
reg-shift = <2>;
reg-io-width = <4>;
reg = <0x0 0x3484E000 0x0 0x10000>;
interrupts = <GIC_SPI HSISYS_UART4_INTR IRQ_TYPE_LEVEL_HIGH>;
clock-frequency = <500000000>;
pinctrl-names = "default";
pinctrl-0 = <&hsi_uart4_txd_uart4_txd &hsi_uart4_rxd_uart4_rxd>;
dmas = <&pdma0 8>, <&pdma0 9>;
dma-names = "rx", "tx";
};

UART DMA(PDMA) 配置​

S100 A-core 侧 UART 可使用外设 DMA(PDMA)。drobot-s100-pdma.dtsi 预先描述每条 PDMA 通道对应的外设握手号,只供查找 uart 对应的 pdma 通道,不可更改该设备树的配置。

UART 与 handshake 对应关系如下,UART 编号以 drobot-s100-soc.dtsi 中节点为准:

UARTRX handshakeTX handshake
uart0(console)23
uart1@394A000001
uart2@394C000045
uart3@394D000067

在 drobot-s100-soc.dtsi 对应 UART 节点内添加 PDMA 相关属性即可使能,dmas 中的通道号需与上表 handshake 一致:

&uart2 {
status = "okay";
dmas = <&pdma0 4>, <&pdma0 5>; /* rx, tx handshake */
dma-names = "rx", "tx";
};

drobot-s100-soc.dtsi 中 uart1 已配置 dmas 与 dma-names,可作为参考(见上文设备节点)。

UART DMA(PDMA) 配置​

S600 A-core 侧 UART 可使用外设 DMA(PDMA)。drobot-s600-pdma.dtsi 预先描述每条 PDMA 通道对应的外设握手号,只供查找 uart 对应的 pdma 通道,不可更改该设备树的配置。

UART 与 handshake 对应关系如下,UART 编号以 drobot-s600-soc.dtsi 中编号为准:

UARTRX handshakeTX handshake
uart0(console)01
uart1@3484A00023
uart2@3484B00045
uart3@3484D00067
uart4@3484E00089
uart5@3484F0001011
uart6@348500001213
uart7@348510001415

在 drobot-s600-soc.dtsi 对应 UART 节点内添加 PDMA 相关属性即可使能,dmas 中的通道号需与上表 handshake 一致:

&uart6 {
status = "okay";
dmas = <&pdma0 12>, <&pdma0 13>; /* rx, tx handshake */
dma-names = "rx", "tx";
};

drobot-s600-soc.dtsi 中 uart4 已配置 dmas 与 dma-names,可作为参考(见上文设备节点)。

使用示例​

检查 uart 节点​

ls /dev/ttyS*
/dev/ttyS0 /dev/ttyS1 /dev/ttyS2 /dev/ttyS3

串口相关操作​

  • 查看串口波特率等配置:

    stty -F /dev/ttyS1 -a
  • 配置波特率等:

    stty -F /dev/ttyS1 speed 921600 cs8 -cstopb parenb -parodd
  • 读取串口数据:

    cat /dev/ttyS1
  • 向串口输出数据测试:

    echo 123456789 > /dev/ttyS1

RDK S600是将 uart4初始化为/dev/ttyS1,uart4并没有引出物理引脚,且内部不支持软件环回,无法进行串口读写测试。

注意事项​

  • RDK S100硬件设计上40PIN GPIO 使用了 TI 的 TXS 系列的电平转换芯片将1.8V IO 转成3.3V IO,为了信号的质量和可靠性,通信对端尽量不要使用电平转换芯片对其再次进行转换,若使用多级请关注实际硬件信号质量。
  • uart0 作为 console,不能使能 DMA。
  • RDK S600硬件设计上只将 uart6和 uart7通过拓展引脚排引出,且使用了 TI 的 TXB 系列的电平转换芯片将1.8V IO 转成3.3V IO。RDK S600 V0P1 开发板由于硬件限制,uart6和 uart7无法使用。
  • uart0 作为 console,不能使能 DMA。