3.7 Smart Direct Memory Access (SDMA) API
3.7.1 Overview
SDMA(Smart Direct Memory Access) API 드라이버는 SDMA 하드웨어를 컨트롤한다. MCU 메모리 공간과 주변 디바이스 사이에 데이터를 전송하기 위해 다른 드라이버에 API를 제공한다. 아래 기능을 지원한다 :
- MCU 메모리 공간에서 SDMA 내부 RAM으로 채널 스트립트 로드
- 스크립트의 컨텍스트 파라미터 로드
- 스크립트의 버퍼 디스크립터(descriptor) 파라미터 로드
- 스크립트의 실행 컨트롤
- 스크립트 실행 종료 시 callback 메커니즘
3.7.2 Hardware Operation
SDMA 컨트롤러는 MCU 메모리 공간과 주변 디바이스 사이의 데이터 전송을 담당하며 아래 기능을 포함한다 :
- 최대 32개의 시분할(time-division) 멀티플렉스 DMA 채널을 지원하는 멀티 채널 DMA.
- 16비트 Instruction-Set micro-RISC 엔진으로 구동.
- 각 채널은 특정 스크립트로 실행.
- 2단계 우선 순위 기반의 선점형(preemptive) 멀티태스킹으로 매우 빠른 컨텍스트 전환.
- startup 스트립트(즉, 부트 코드) 와 RAM에 위치한 스크립트에서 참조할 수 있는 기타 일반 유틸리티가 포함된 4KB ROM.
- 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
dmaengine.h(SDMA API용 헤더)는 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 8용 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를 지원하지 않는다.
두 가지 제한 사항이 있다 :
- I2C는 프레임 길이가 16바이트보다 큰 경우 DMA 모드를 사용한다. I2C 자체는 프레임을 보내고 받을 때 처음 몇 바이트와 마지막 몇 바이트를 처리하기 위해 여전히 CPU를 사용해야 하기 때문이다. 따라서 전송되는 데이터가 길지 않은 경우, DMA를 사용하여 데이터를 전송해도 효율성이 향상되지 않는다.
- SDMA 스크립트는 rootfs 단계에서 로드되므로, 커널 부트 단계에서 I2C DMA 전송 사용은 실패한다.
소량의 데이터를 전송할 때는 I2C SDMA 모드를 사용하지 않는 것이 좋다. 많은 양의 I2C 데이터를 보내야 하는 특별한 경우, NXP Pro-support에 문의하여 patchset을 받는다.
'NXP i.MX SoC Family > i.MX Linux Reference Manual' 카테고리의 다른 글
i.MX Linux Reference Manual - Connectivity (0) | 2022.07.19 |
---|---|
i.MX Linux Reference Manual - Storage - SPI NOR Flash Memory Technology Device (MTD) (0) | 2022.07.19 |
i.MX Linux Reference Manual - Storage - SATA (0) | 2022.07.18 |
i.MX Linux Reference Manual - Storage - Quad Serial Peripheral Interface (QuadSPI) (0) | 2022.07.18 |
i.MX Linux Reference Manual - Storage - NAND GPMI Flash (0) | 2022.07.15 |