4.3 Enhanced Configurable Serial Peripheral Interface (ECSPI)
4.3.1 Introduction
ECSPI 드라이버는 ECSPI 컨트롤러에 대한 표준 Linux 드라이버 인터페이스를 구현한다.
아래 기능을 지원한다:
- 인터럽트 구동 방식으로 바이트 전송/수신
- 다중 마스터 컨트롤러 인터페이스
- 다중 슬레이브 선택
- 다중 클라이언트 요청
ECSPI는 기존의 시리얼 통신보다 적은 소프트웨어 인터럽트로 빠른 데이터 통신에 사용된다. 각 ECSPI에는 데이터 FIFO가 장착되어 있으며 구성 가능한 마스터/슬레이브 시리얼 주변 디바이스 인터페이스 모듈로, 프로세서가 외부 SPI 마스터나 슬레이브 디바이스와 인터페이스할 수 있다.
ECSPI의 주요 기능은 아래와 같다:
- 구성 가능한 마스터/슬레이브
- 여러 주변 디바이스를 지원하는 4개의 칩 선택 신호
- 최대 32비트 프로그램 가능한 데이터 전송
- 데이터 전송과 수신 모두를 위한 64 x 32비트 FIFO
- Chip Select(SS)와 SPI Clock(SCLK)의 구성 가능한 극성(polarity)과 위상(phase)
ECSPI 모듈은 아래 기능을 지원한다:
- Linux OS와 인터페이스하기 위해 ECSPI 모듈에 필요한 각 기능을 구현한다.
- 다중 SPI 마스터 컨트롤러
- 다중 클라이언트 동기 요청
4.3.2 Software Operation
아래 섹션에서는 ECSPI 소프트웨어 작동에 대해 설명한다.
4.3.3 SPI Sub-System in Linux OS
ECSPI 드라이버 레이어는 클라이언트 레이어(SPI-NOR Flash는 클라이언트의 예이다)와 하드웨어 액세스 레이어 사이에 있다. 아래 그림은 Linux OS의 SPI 서브시스템에 대한 블록 다이어그램을 보여준다.
SPI 요청은 I/O 대기열로 들어간다. 지정된 SPI 디바이스에 대한 요청은 FIFO 순서로 실행되며, 완료 콜백을 통해 비동기적으로 완료된다. 커맨드를 작성한 다음 해당 응답을 읽는 것과 같은 일반적인 트랙잭션 타입에 대한 호출을 포함하여, 이러한 호출에 대한 몇 가지 간단한 동기 래퍼도 있다.
모든 SPI 클라이언트는 연결된 프로토콜 드라이버가 있어야 하고, 모두 동일한 컨트롤러 드라이버를 공유해야 한다. 컨트롤러 드라이버만 기본(underlying) SPI 하드웨어 모듈과 상호 작용할 수 있다. 아래 그림은 SPI 서브시스템에서 다양한 SPI 드라이버가 레이어화 되는 방식을 보여준다.
4.3.4 Software Limitations
ECSPI 드라이버는 아래와 같은 제한 사항이 있다:
- 현재 SPI 슬레이브 로직 구현이 없다.
- 여러 마스터에 연결된 단일 클라이언트를 지원하지 않는다.
- 현재 디바이스 노드 항목의 도움으로 사용자 공간 인터페이스를 구현하지는 않지만, sysfs 인터페이스를 지원한다.
4.3.5 Standard Operations
ECSPI 드라이버는 init, exit, chip select, transfer를 위한 표준 엔트리 포인트(프로그램 진입점) 구현을 담당한다. 드라이버는 아래 기능을 지원한다:
- init 함수 spi_imx_init()는 device_driver 구조체에 등록한다.
- probe 함수 spi_imx_probe()는 SPI 코어 드라이버로 SPI 디바이스별 구조체의 초기화와 등록을 수행한다. 드라이버는 메모리와 IRQ 리소스를 조사(probe)한다. ECSPI I/O 핀을 활성화하고 IRQ를 요청하고 하드웨어를 재설정하도록 IOMUX를 구성한다.
- chip select 함수 spi_imx_chipselect()는 현재 SPI 디바이스에 대한 하드웨어 ECSPI를 구성한다. 워드(word) 크기, 전송 모드, 데이터 속도를 설정한다.
- SPI transfer 함수 spi_imx_transfer()는 데이터 전송 작업을 처리한다.
- SPI setup 함수 spi_imx_setup()은 현재 SPI 디바이스를 초기화한다.
- SPI 드라이버 ISR spi_imx_isr()는 데이터 전송 작업이 완료되고 인터럽트가 발생하면 호출된다.
4.3.6 ECSPI Synchronous Operation
아래 그림은 ECSPI가 동기식 read/write 작업을 제공하는 방식을 보여준다.
4.3.7 Source Code Structure
아래 테이블은 drivers/spi 디렉토리에서 사용할 수 있는 소스 파일을 보여준다:
Table 38. ECSPI Driver Files
File | Description |
---|---|
driveers/spi/spi-imx.c | SPI Master Controller 드라이버 |
4.3.8 Menu Configuration Options
메뉴 구성에서 아래 모듈을 활성화한다:
- CONFIG_SPI는 SPI 코어에 대한 지원을 구축한다. menuconfig에서 이 옵션은 아래에서 사용할 수 있다:
- Device Drivers > SPI Support
- CONFIG_BITBANG은 이것을 필요로 하는 드라이버에 의해 자동으로 선택되는 Library 코드이다. SPI_MAX가 이것을 선택한다. menuconfig에서 이 옵션은 아래에서 사용할 수 있다:
- Device Drivers > SPI Support > Utilities for Bitbanging SPI masters
- CONFIG_SPI_IMX는 ECSPI에 대한 SPI 마스터 모드를 구현한다. menuconfig에서 이 옵션은 아래에서 사용할 수 있다:
- Device Drivers > SPI Support > Freescale i.MX SPI controllers
4.3.9 Programming Interface
이 드라이버는 ECSPI 하드웨어와 인터페이스하기 위해 SPI 코어에 필요한 모든 기능을 구현한다. 자세한 내용은 build: make htmldocs에서 생성된 Linux 문서를 참조한다.
4.3.10 Interrupt Requirements
SPI 인터페이스는 인터럽트를 생성한다.
ECSPI 인터럽트 요구 사항은 아래 테이블에 나열되어 있다.
Table 39. ECSPI Interrupt Requirements
Parameter | Equation | Typical | Worst Case |
---|---|---|---|
BaudRate/ Transfer Length | (BaudRate/(TransferLength)) * (1/Rxtl) | 31250 | 1500000 |
일반적인 값은 수신기 트리커 레벨(Rxtl)이 1이고 32비트 전송 길이의 1Mbps의 전송 속도를 기반으로 한다. 최악의 경우는 8비트 전송 길이의 12Mbps(SPI 인터페이스에서 지원하는 최대 속도) 전송 속도를 기반으로 한다.