UART¶
Introduction¶
Firefly-RK3399 development board supports 5 independent UART controller:UART0,UART1,UART2,UART3,and UART4,each with two 64-byte FIFO buffers for data reception and transmission. among them:
UART0 for Bluetooth transmission, UART2 for debugging serial port, only UART0 and UART3 support hardware automatic flow control.
Support bit rate 115.2Kbps, 460.8Kbps, 921.6Kbps, 1.5Mbps, 3Mbps, 4Mbps.
Supports programmable baud rates even,even with non-integer clock divider.
Supports interrupt-based or DMA-based modes.
Support 5-8 bit width transfer.
Our Firefly-RK3399 development board for the convenience of users, leads to a row of general-purpose GPIO, the corresponding schematic is as follows:
GPIO1_A7 and GPIO1_B0 can be reused as uart4_rx
and uart4_tx
,
DTS Config¶
The file kernel/arch/arm64/boot/dts/rockchip/rk3399.dtsi
has the definition of UART nodes:
aliases {
...
serial0 = &uart0;
serial1 = &uart1;
serial2 = &uart2;
serial3 = &uart3;
serial4 = &uart4;
};
serial0 is defined in aliases
node as: serial3 = &uart0;
.
Because our Firefly-RK3399 development board opens the uart4 for the user to use,using uart4 as an example to introduce the use of the serial port. The following are the uart4 node-related definitions:
uart4: serial@ff370000 {
compatible = "rockchip,rk3399-uart", "snps,dw-apb-uart";
reg = <0x0 0xff370000 0x0 0x100>;
clocks = <&pmucru SCLK_UART4_PMU>, <&pmucru PCLK_UART4_PMU>;
clock-names = "baudclk", "apb_pclk";
interrupts = <GIC_SPI 102 IRQ_TYPE_LEVEL_HIGH 0>;
reg-shift = <2>;
reg-io-width = <4>;
pinctrl-names = "default";
pinctrl-0 = <&uart4_xfer>;
status = "disabled";
};
uart4 {
uart4_xfer: uart4-xfer {
rockchip,pins =
<1 7 RK_FUNC_1 &pcfg_pull_up>,
<1 8 RK_FUNC_1 &pcfg_pull_none>;
};
};
You only need to enable the node in the kernel/arch/arm64/boot/dts/rockchip/rk3399-firefly-port.dtsi
file,as follows:
&uart4 {
current-speed = <9600>;
no-loopback-test;
status = "okay";
};
uart_rx
and uart_tx
can be reused as spi1_rxd
and spi1_txd
, so be careful to shut down the use of SPI1, as follows:
&spidev0 {
status = "disabled";
};
Debugging method¶
You can now communicate with the uart4 via a USB-to-serial adapter in your host PC. Follow the steps below:
(1) Connect the uart port.
Connect the TX, RX, GND pins of uart4 to the serial adapter’s TX, RX, GND pins respectively.
(2) Open a serial terminal in host PC.
Run kermit in a shell window, and set baud rate:
$ sudo kermit
C-Kermit> set line /dev/ttyUSB0
C-Kermit> set speed 9600
C-Kermit> set flow-control none
C-Kermit> connect
/dev/ttyUSB0
is the device file of USB-to-serial adapter.baud is the
current-speed
attribute in the DTS node.
(3) Transmit data.
The device file for uart4 is /dev/ttyS4
. Run the following command in device:
echo firefly uart4 test... > /dev/ttyS4
The serial terminal in the host PC will receive string firefly uart4 test...
.
(4) Receive data
First, run the following command in device:
cat /dev/ttyS4
Then input string Firefly uart4 test...
in the serial terminal.You can see the same string received in the device.