3.7 Smart Direct Memory Access (SDMA) API
3.7.1 Overview
Smart Direct Memory Access (SDMA) API 드라이버는 SDMA 하드웨어를 컨트롤한다. MCU 메모리 공간과 주변 디바이스 사이에 데이터를 전송하기 위해 다른 드라이버에 API를 제공한다. 아래 기능을 지원한다:
- MCU 메모리 공간에서 SDMA 내부 RAM으로 채널 스크립트 로드
- 스크립트의 컨텍스트 파라미터 로드
- 스크립트의 버퍼 디스크립터 파라미터 로드
- 스크립트의 실행 컨트롤
- 스크립트 실행 종료 시 콜백 메커니즘
3.7.2 Hardware Operation
SDMA 컨트롤러는 MCU 메모리 공간과 주변 디바이스 사이에 데이터 전송을 담당하며, 다음 기능을 포함한다:
- 최대 32개의 다중화된 시분할 DMA 채널을 지원하는 다중 채널 DMA.
- 16비트 Instruction-Set micro-RISC 엔진으로 구동.
- 각 채널은 특정 스크립트를 실행.
- 2 레벨의 우선 순위 기반 선점형 멀티태스킹으로 매우 빠른 컨텍스트 전환.
- 4KB ROM에는 스타트업 스크립트(즉, 부트 코드)와 RAM에 위치한 스크립트에서 참조할 수 있는 다른 일반적인 유틸리티를 포함한다.
- 8KB RAM 영역은 프로세서 컨텍스트 영역과 시스템 메모리에서 다운로드한 채널 스크립트를 저장하는 코드 공간 영역으로 나뉜다.
3.7.3 Software Operation
다른 드라이버에서 SDMA 채널을 컨트롤할 수 있도록 드라이버는 API를 제공한다. SDMA 채널은 주변 디바이스와 전송 타입에 따라 전용 스크립트를 실행한다. SDMA API 드라이버는 SDMA 메모리에 스크립트를 로드하고, 채널 디스크립터를 초기화하고, 버퍼 디스크립터와 SDMA 레지스터를 컨트롤한다.
아래 테이블은 SDMA를 사용하는 드라이버 목록과 각 드라이버에서 사용하는 물리적인 SDMA 채널 수를 제공한다. 드라이버는 사용하려는 SDMA 채널 번호(정적 채널 할당)를 지정하거나, SDMA 드라이버에서 드라이버가 사용할 비어 있는 SDMA 채널(동적 채널 할당)을 제공하도록 할 수 있다. 동적 채널 할당을 위해, SDMA 채널 목록은 채널 32에서 채널 1로 스캔된다. 비어 있는 채널이 발견되면, 해당 채널이 요청된 DMA 전송에 할당된다.
Table 31. SDMA Channel Usage
Driver Name | Number of SDMA Channels |
SDMA Channel Used |
---|---|---|
SDMA CMD | 1 | 정적 채널 할당 - SDMA 채널 0 사용 |
SSI | 디바이스당 2개 | 동적 채널 할당 |
UART | 디바이스당 2개 | 동적 채널 할당 |
SPDIF | 디바이스당 2개 | 동적 채널 할당 |
ESAI | 디바이스당 2개 | 동적 채널 할당 |
ASRC | 디바이스당 6개 | 동적 채널 할당 |
AUD2HTX | 디바이스당 1개 | 동적 채널 할당 |
EASRC | 디바이스당 8개 | 동적 채널 할당 |
ECSPI | 디바이스당 2개 | 동적 채널 할당 |
MICFIL | 디바이스당 1개 | 동적 채널 할당 |
XCVR | 디바이스당 2개 | 동적 채널 할당 |
참고 :
이 테이블에는 현재 SDMA 스크립트에서 지원하는 기능이 포함되어 있지만, 특정 구현은 플랫폼마다 다를 수 있다. SDMA에서 지원하는 주변 디바이스는 각 플랫폼의 DTS 구성에 따라 달라진다.
3.7.4 Source Code Structure
SDMA API 헤더 파일인 dmaengine.h는 linux/include/linux 디렉토리에서 사용할 수 있다.
아래 테이블은 drivers/dma 디렉토리에서 사용할 있는 소스 파일을 보여준다.
Table 32. SDMA API Source Files
File | Description |
---|---|
drivers/dma/dmaengine.c | SDMA 관리 루틴 |
drivers/dma/imx-sdma.c | SDMA 구현 드라이버 |
drivers/dma/imx-dma.c | i.MX DMA 드라이버 |
아래 테이블은 4.1과 4.9 커널에 대해 firmware/imx/sdma 디렉토리에서 사용할 수 있는 이미지 파일을 보여준다. 4.14 커널의 경우, sdma 펌웨어는 커널 소스 트리가 아닌 firmware-imx 패키지와 함께 제공된다.
Table 33. SDMA Script Files
File | Description |
---|---|
sdma-imx6q.bin | i.MX 6을 위한 SDMA RAM 스크립트 |
sdma-imx7d.bin | i.MX 7과 i.MX 8M을 위한 SDMA RAM 스크립트 |
3.7.5 Special peripheral with SDMA cases
3.7.5.1 I2C in i.MX 6/7Dual/8M
현재 릴리스에서 i.MX 6/7Dual/8M의 I2C 컨트롤러와 SDMA 스크립트는 SDMA를 지원하지 않는다.
두 가지 제한 사항이 있다:
- 프레임 길이가 16바이트보다 클 때, I2C는 DMA 모드를 사용한다. 왜냐하면 I2C 자체는 프레임을 보내고 받을 때 처음 몇 바이트와 마지막 몇 바이트를 처리하기 위해 여전히 CPU를 사용해야 하기 때문이다. 따라서, 전송되는 데이터가 길지 않은 경우, DMA를 사용하여 데이터를 전송해도 효율성이 향상되지 않는다.
- SDMA 스크립트는 rootfs 단계에서 로드되므로, 커널 부팅 단계에서 I2C DMA 전송을 사용할 수 없다(전송이 실패한다).
작은 용량의 데이터를 보낼 때는 I2C SDMA 모드를 사용하지 않는 것이 좋다. 대용량의 I2C 데이터 전송이 필요한 특별한 경우, NXP Pro-support에 문의하여 패치 세트를 받는다.