4.11 Low Power Universal Asynchronous Receiver/Transmitter (LPUART)
4.11.1 Introduction
저수준 UART 드라이버는 Linux 시리얼 드라이버 API를 모든 UART 포트에 인터페이스한다.
아래와 같은 기능이 있다:
- 인터럽트 기반 및 eDMA 기반의 문자 송수신
- 최대 4Mbps의 표준 Linux 전송 속도
- 7비트, 8비트, 9비트 또는 10비트 문자 길이로 문자 송수신
- 하나 또는 두 개의 정지 비트 전송
- 모뎀 컨트롤 라인을 읽기 위해 TIOCMGET IOCTL을 지원한다. 상수 TIOCM_CTS와 TIOCM_CAR만 지원하고 DTE 모드에서만 TIOCM_RI를 지원한다.
- 모뎀 컨트롤 라인을 설정하기 위해 TIOCMSET IOCTL을 지원한다. 상수 TIOCM_RTS와 TIOCM_DTR만 지원한다.
- ODD와 EVEN 패리티
- XON/XOFF 소프트웨어 흐름 제어. 소프트웨어 흐름 제어를 사용하는 시리얼 통신은 통신 속도가 너무 높지 않고 버퍼 오버런 가능성이 최소일 때 안정적이다.
- CTS/RTS 하드웨어 흐름 제어 - 인터럽트 기반의 소프트웨어로 제어되는 하드웨어 흐름과 하드웨어 기반의 하드웨어로 제어되는 흐름 모두
- 표준 Linux 시리얼 API를 통해 브레이크 문자 송수신
- 프레임과 패리티 오류 인식
- 브레이크, 패리티 그리고 프레임 오류가 있는 문자를 무시하는 기능
- TIOCGSSERIAL와 TIOCSSERIAL TTY IOCTL로 UART 포트 정보를 가져오고 설정한다. setserial과 dip 같은 일부 프로그램은 이 기능을 사용하여 전송 속도가 올바르게 설정되었는지 확인하고 디바이스에 대한 일반 정보를 얻는다. UART 타입은 serial_core.h 헤더 파일에 정의된 대로 52로 설정되어야 한다.
- UART 포트를 일시 중지와 다시 시작에 의한 전원 관리 기능
- 표준 TTY 레이어의 IOCTL 호출
모든 UART 포트는 디바이스 파일 /dev/ttyLP0 ~ /dev/ttyLP1에서 액세스할 수 있다.
4.11.2 Hardware Operation
디바이스에서 사용 가능한 UART 모듈 수를 확인하려면, SoC와 관련된 Applications Processor Reference Manual를 참조한다.
각 UART 하드웨어 포트는 표준 RS-232 시리얼 통신이 가능하다.
각 UART에는 64바이트 트랜스미터 FIFO와 32-half-word 깊이의 리시버 FIFO가 포함되어 있다. 또한 각 UART는 각 FIFO의 데이터 레벨이 프로그램된 임계값 레벨에 도달하고 모뎀 신호의 상태가 변경될 때 마스크 가능한 다양한 인터럽트를 지원한다.
4.11.3 Software Operation
Linux OS에는 다양한 플랫폼의 UART 드라이버에서 공통적인 시리얼 작업의 많은 부분을 관리하는 코어 UART 드라이버가 포함되어 있다.
저수준의 UART 드라이버는 UART 포트 정보와 일련의 컨트롤 기능과 같은 정보를 코어 UART 드라이버에 제공하는 역할을 한다. 이러한 기능은 Linux OS와 UART 하드웨어 사이의 저수준 인터페이스로 구현된다. 다른 드라이버나 사용자 애플리케이션에서 호출할 수 없다. 하드웨어 컨트롤에 사용되는 컨트롤 함수는 uart_ops라는 구조체로 코어 드라이버에 전달되고 포트 정보는 uart_port라는 구조체로 전달된다. 또한 저수준의 드라이버는 UART 포트에 대한 다양한 인터럽트를 처리하고, 필요한 경우 콘솔 지원을 제공한다.
각 UART는 DTS 파일에서 DMA 채널을 활성화하여 데이터 전송에 DMA를 사용하도록 구성할 수 있다.
드라이버는 DMA 전송이 필요한 UART에 대해 두 개의 DMA 채널을 요청한다. 수신 트랜잭션에서, 드라이버는 DMA 수신 버퍼에서 TTY Flip Buffer로 데이터를 복사한다.
DMA를 사용하여 전송하는 동안, 드라이버는 UART 전송 버퍼에서 DMA 전송 버퍼로 데이터를 복사하고 이 버퍼를 DMA 시스템으로 보낸다. 자세한 내용은 커널 소스 트리의 시리얼 드라이버에 대한 Linux 설명서를 참조한다.
4.11.4 Driver Features
UART 드라이버는 아래 기능을 지원한다:
- 최대 4Mbps 전송 속도
- 인터럽트 기반 모드에서만 프레임과 패리티 오류를 인식한다. DMA 기반 모드에서는 이러한 오류를 인식하지 못한다.
- 브레이크 문자를 보내고, 받고 적절하게 처리한다.
- 모뎀 컨트롤 신호를 인식한다.
- 요청할 경우, 프레임, 패리티 그리고 브레이크 오류가 있는 문자를 무시한다.
- 하드웨어 흐름 제어에 대한 지원을 구현한다.
- UART 포트 정보를 가져오고 설정한다. 특정 흐름 제어의 카운트 정보는 하드웨어 기반의 하드웨어 흐름 제어 모드에서 사용할 수 없다.
- 전원 관리
- 인터럽트 기반과 DMA 기반의 데이터 전송
4.11.5 Source Code Structure
아래 테이블은 UART 드라이버 소스 파일을 보여준다.
Table 48. UART Driver Files
File | Description |
---|---|
drivers/tty/serial/fsl_lpuart.c | LP UART 드라이버 |
i.MX 8의 경우, i.MX 8X와 i.MX 8M 구성 옵션은 arch/arm64/boot/dts 디렉토리에 있는 디바이스 트리에 지정된다.
4.11.6 Menu Configuration Options
UART 드라이버는 기본적으로 활성화되어 있다.
메뉴 구성 옵션은 다음 위치에 있다:
- Device Drivers > Character devices > Serial drivers > Freescale LPUART serial port support [*] Console on Freescale LPUART serial port
4.11.7 Programming Interface
UART 드라이버는 UART 포트와 인터페이스하기 위해 Linux 시리얼 API에 필요한 모든 메소드를 구현하고, Linux 코어 UART 드라이버에 일련의 컨트롤 메소드를 제공한다. 드라이버에 구현된 메서드에 대한 자세한 내용은 API 문서를 참조한다.
4.11.8 Interrupt Requirements
UART 드라이버 인터페이스는 하나의 인터럽트만 생성한다.
상태는 RX나 TX 같이 어떤 종류의 인터럽트가 발생하는지 결정하는 데 사용된다.