Skip to main content
UART (Universal Asynchronous Receiver-Transmitter) transmits data asynchronously using start and stop bits instead of a clock signal. The receiving UART reads bits at a specific frequency known as the baud rate.

Key Parameters

  • Baud rate — Communication speed (bits per second)
  • Start/Stop bits — Frame delimiters
  • Parity bit — Optional error checking
  • Data bits — 5–9 bits per frame
  • Flow control — Hardware handshaking via CTS/RTS

Transfer Modes by Subsystem

Interface Components

Device Tree Sources

APIs

Software Configuration

Linux Device Tree Example

4-wire UART (with flow control):
GPIO pinctrl:
QUPAC access control:

Kernel Configuration

Edit kernel_platform/kernel/arch/arm64/configs/qcom_defconfig:
Enable the UART node in the device tree:

Verification

1

Verify UART device registration

2

Configure UART settings

3

Run loopback test

Open two SSH terminals.Terminal 1 (write):
Terminal 2 (read):
Expected output: Hello UART

Debugging

Enable Debug Logs

Troubleshooting

  • Verify device tree status is "ok"
  • Confirm CONFIG_SERIAL_QCOM_GENI=y in kernel config
  • Check GPIO pin configurations and QUPAC access control settings
  • Verify baud rate matches on both ends
  • Check flow control configuration (CTS/RTS)
  • Test with loopback mode first
  • Switch from FIFO to DMA mode for high-speed transfers
  • Check interrupt statistics: cat /proc/interrupts | grep uart
  • Review power management: cat /sys/kernel/debug/pm_genpd/pm_genpd_summary

Debugging Checklist

  • Kernel config includes CONFIG_SERIAL_QCOM_GENI=y
  • Device tree status set to "ok" for UART node
  • GPIO pins properly configured and mapped
  • QUPAC access control properly configured
  • Baud rate matches on both sides
  • Flow control settings are consistent
  • Device file permissions are correct

Resources