UART
Update time:2018-04-17 Views:3659
Introduction
There are 3 uarts on Firefly-RK3128 development board, which are uart0, uart1, uart2.
uart0 is used by bluetooth for data transmission. To use uart0, the bluetooth must be disabled.
uart1 is also multiplexed:
BT_HOST_WAKE/SPI_TXD/UART1_TX
BT_WAKE/SPI_RXD/UART1_RX
WIFI_REG_ON/SPI_CSN0/UART1_RTS
To use uart1, bluetooth and SPI must be disabled.
uart2 is generally used as debug port. It is also multiplexed with the TF card, hence uart2 and TF card can not be used at the same time:
SDMMC_D0/UART2_TX
SDMMC_D1/UART2_RX
Both uart1 and uart2 have 32 bytes FIFO. Uart0 has double 64 byte FIFOs for optimised for bluetooth use. All the uarts support 5/6/7/8 bit serial data communication in DMA-based or interrupt-based operation mode.
Create DTS Node
The DTS node have already been created in file kernel/arch/arm/boot/dts/rk312x.dtsi, shown as following:
uart0: serial@20060000 { compatible = "rockchip,serial"; reg = <0x20060000 0x100>; interrupts = <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>; clock-frequency = <24000000>; clocks = <&clk_uart0>, <&clk_gates8 0>; clock-names = "sclk_uart", "pclk_uart"; reg-shift = <2>; reg-io-width = <4>; dmas = <&pdma 2>, <&pdma 3>;#dma-cells = <2>; pinctrl-names = "default"; pinctrl-0 = <&uart0_xfer &uart0_cts &uart0_rts>; status = "disabled";}; uart1: serial@20064000 { compatible = "rockchip,serial"; reg = <0x20064000 0x100>; interrupts = <GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>; clock-frequency = <24000000>; clocks = <&clk_uart1>, <&clk_gates8 1>; clock-names = "sclk_uart", "pclk_uart"; reg-shift = <2>; reg-io-width = <4>; dmas = <&pdma 4>, <&pdma 5>;#dma-cells = <2>; pinctrl-names = "default"; pinctrl-0 = <&uart1_xfer &uart1_cts &uart1_rts>; status = "disabled";};
Configure uart0
You need to enable uart0 and disable bluetooth in kernel/arch/arm/boot/dts/rk3128-fireprime.dts:
&uart0 { status = "okay"; dma-names = "!tx", "!rx"; pinctrl-0 = <&uart0_xfer &uart0_cts>;}; wireless-bluetooth { compatible = "bluetooth-platdata";...status = "disabled";};
Configure uart1
You need to enable uart1 and disable both bluetooth and SPI in kernel/arch/arm/boot/dts/rk3128-fireprime.dts:
//... wireless-bluetooth { compatible = "bluetooth-platdata";...status = "disabled";};//...&spi0 { status = "disabled";};&uart1 { status = "okay"; dma-names = "!tx", "!rx"; pinctrl-0 = <&uart1_xfer &uart1_cts>;};
Compile and Flash Kernel
Compile the kernel as followed:
make rk3128-fireprime.img
After successful compilation, flash kernel.img and resource.img under kernel directory to the development board.
Data Commuincation
You can now communicate with the uart (uart0 as an example here) 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 uart0 to the serial adapter's RX, TX, GND pins respectively.
Note: if you are using the Firefly serial adapter, connect TX to TX, RX to RX.
(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 the PC's serial adapter
uart0 baud defaults to 9600
(3) Transmit data.
The device file for uart0 is /dev/ttyS0. Run the following command in device:
echo firefly uart test... > /dev/ttyS0
The serial terminal in the host PC will receive string "firefly uart test...".
(4) Receive data.
First, run the following command in device:
cat /dev/ttyS0
Then input string "Firefly uart3 test..." in the serial terminal. You can see the same string received in the device.
To change baud of uart0, for example, to 115200, run the following command:
stty -F /dev/ttyS0 115200