3.3 MMC/SD/SDIO Host
3.3.1 Introduction
MMC (MultiMediaCard)/SD (Secure Digital)/SDIO (Secure Digital Input Output) 호스트 드라이버는 uSDHC(ultra MMC/SD host controller)에 대해 표준 Linux 드라이버 인터페이스를 구현한다.
호스트 드라이버는 Linux 커널 MMC 프레임워크의 일부이다.
MMC 드라이버에는 아래와 같은 기능이 있다 :
- SD 3.0과 SDIO 2.0 카드에 대해 1비트나 4비트 작동(지금까지 AR6003으로 검즘된 SDIO v2.0을 지원한다).
- 카드 장착 및 제거 감지를 지원한다.
- 표준 MMC 명령을 지원한다.
- PIO와 DMA 데이터 전송.
- 전원 관리를 지원한다.
- MMC 카드에 대해 1/4 8비트 작동을 지원한다.
- i.MX 6에서 USDHC는 eMMC4.4 SDR과 DDR 모드를 지원한다.
- i.MX 7Dual에서 USDHC는 HS400과 HS200을 포함하는 eMMC5.0을 지원한다.
- SD 3.0 SDR50과 SDR104 모드를 지원한다.
3.3.2 Hardware Operation
MMC 통신은 저 전압 범위에서 작동하도록 설계된 진보된 11핀 시리얼 버스를 기반으로 한다. uSDHC 모듈은 SD 메모리와 I/O 기능으로 MMC를 지원한다. uSDHC는 카드에 명령을 보내고 카드에서 데이터 액세스를 수행하여 MMC, SD 메모리, I/O 카드를 컨트롤한다. SD 메모리 카드 시스템은 SD와 SPI의 두 가지 대체 통신 프로토콜을 정의한다. uSDHC는 SD 버스 프로토콜만 지원한다.
uSDHC 명령 전송 유형과 uSDHC 명령 인수 레지스터를 사용하면 카드에 명령을 내릴 수 있다. uSDHC 명령, 시스템 컨트롤, 프로토콜 컨트롤 레지스터를 사용하여 사용자는 데이터와 응답 형식을 지정하고 읽기 대기 주기를 컨트롤할 수 있다.
uSDHC에서 카드의 응답을 저장하는 데 사용되는 4개의 32비트 레지스터가 있다. uSDHC는 직접 명령에 대한 응답을 얻으려고 이 4개의 레지스터를 읽는다. uSDHC는 읽기와 쓰기를 위해 완전히 구성 가능한 128x32 비트 FIFO를 사용한다. 버퍼는 호스트 시스템과 카드 사이 또는 그 반대로 전송되는 데이터의 임시 저장소로 사용된다. uSDHC 데이터 버퍼 액세스 레지스터 비트는 읽기나 쓰기 전송 시 32비트 데이터를 보유한다.
데이터를 수신하는 단계는 아래와 같다 :
- uSDHC 컨트롤러는 RD_WML 레지스터에 설정된 word 양보다 버퍼에 수신된 word 양이 많으면 DMA 요청을 생성한다.
- 이 요청을 받으면, DMA 엔진은 데이터 버퍼 액세스 레지스터를 읽어 uSDHC FIFO에서 시스템 메모리로 데이터를 전송하기 시작한다.
데이터 전송을 위한 단계를 아래와 같다 :
- uSDHC 컨트롤러는 버퍼 공간의 양이 WR_WML 레지스터에 설정된 값을 초과할 때마다 DMA 요청을 생성한다.
- 이 요청을 받으면, DMA 엔진은 미리 정의된 바이트 수만큼 데이터 버퍼 액세스 레지스터에 기록하여 시스템 메모리에서 uSDHC FIFO로 데이터를 이동하기 시작한다.
읽기 전용 uSDHC Present State와 Interrupt Status Registers는 uSDHC 작동 상태, 애플리케이션 FIFO 상태, 오류 조건, 인터럽트 상태를 제공한다.
특정 이벤트가 발생하면, 모듈은 인터럽트를 생성하고 해당 Status Registers 비트를 설정할 수 있다. uSDHC 인터럽트 상태 활성화와 신호 활성화 레지스터를 통해 사용자는 이러한 인터럽트 발생 여부를 컨트롤할 수 있다.
3.3.3 Software Operation
Linux OS에는 MMC 버스 프로토콜을 구현하는 MMC 버스 드라이버가 포함되어 있다. MMC 블록 드라이버는 파일 시스템 읽기/쓰기 호출을 처리하고 uSDHC로 명령을 보내기 위해 로우 레벨의 MMC 호스트 컨트롤러 인터페이스 드라이버를 사용한다.
MMC 드라이버는 init, exit, request, set_ios에 대한 표준 진입점(entry point) 구현을 담당한다. 드라이버는 아래 기능을 구현한다 :
uSDHC의 경우 :
- init 함수 esdhc_pltfm_init()은 플랫폼 하드웨어를 초기화하고 sdhci_host 구조체에 플랫폼 종속 플래그나 값을 설정한다.
- exit 함수 esdhc_pltfm_exit()는 플랫폼 하드웨어를 해제하고 할당된 메모리를 해제한다.
- esdhc_pltfm_get_max_clock() 함수는 플랫폼에서 지원되는 최대 SD 버스 clock 주파수를 가져온다.
- esdhc_pltfm_get_min_clock() 함수는 플랫폼에서 지원되는 최소 SD 버스 clock 주파수를 가져온다.
- esdhc_pltfm_get_ro()는 카드가 읽기 전용 상태인지를 가져온다.
- esdhc_execute_tuning()은 튜닝을 위한 준비를 처리한다. SD 3.0 UHS-I 모드에서만 사용된다.
- esdhc_set_clock()은 clock 변경 요청을 처리한다.
아래 그림은 MMC 관련 드라이버가 계층화되는 방식을 보여준다.
3.3.4 Driver Features
MMC 드라이버는 다음 기능을 지원한다 :
- 여러개의 uSDHC 모듈을 지원한다.
- Linux MMC core 드라이버와 인터페이스하기 위한 모든 진입점(entry point)을 제공한다.
- MMC와 SD 카드
- SDIO 카드
- SD 3.0 카드
- 명령어 timeout과 CRC 오류와 같은 데이터 전송 오류를 인식한다.
- 전원 관리
- 로드 가능(loadable)하거나 내장(builtin) 모듈로 구축을 지원한다.
3.3.5 Source Code Structure
아래 테이블은 drivers/mmc/host에서 사용 가능한 uSDHC 소스 파일을 보여준다.
Table 27. uSDHC Driver Files MMC/SD Driver Files
File | Description |
drivers/mmc/host/sdhci.c | sdhci 표준 스택 코드 |
driers/mmc/host/sdhci-pltfm.c | sdhci 플랫폼 레이어 |
drivers/mmc/host/sdhci-esdhc-imx.c | uSDHC 드라이버 |
drivers/mmc/host/sdhci-esdhc.h | uSDHC 드라이버 헤더 파일 |
3.3.6 Menu Configuration Options
이 모듈에 대해 아래의 Linux 커널 구성 옵션이 제공된다.
- CONFIG_MMC는 MMC 버스 프로토콜에 대한 지원을 빌드한다. menuconfig에서 이 옵션은 아래에서 사용할 수 있다 :
- Device Drivers > MMC/SD/SDIO Card support
- 이 옵션은 기본 값이 Y 이다.
- CONFIG_MMC_BLOCK은 파일 시스템을 마운트하는 데 사용할 수 있는 MMC 블럭 디바이스 드라이버에 대한 지원을 빌드한다. menuconfig에서 이 옵션은 아래에서 사용할 수 있다 :
- Device Drivers > MMC/SD Card Support > MMC block device driver
- 이 옵션은 기본 값이 Y 이다.
- CONFIG_MMC_SDHCI_ESDHC_IMX는 i.MX USDHC 포트에 사용된다. menuconfig에서 이 옵션은 아래에서 찾을 수 있다 :
- Device Drivers > MMC/SD Card Support > Secure Digital Host Controller Interface support > SDHCI support on the platform-specific bus > SDHCI platform support for the eSDHC i.MX controller
- CONFIG_MMC_SDHCI=m, 다음에서 찾을 수 있다.
Device Drivers > MMC/SD Card Support > Secure Digital Host Controller Interface support - CONFIG_MMC_SDHCI_PLTFM=m, 다음에서 찾을 수 있다.
Device Drivers > MMC/SD Card Support > Secure Digital Host Controller Interface support > SDHCI support on the platform-specific bus - CONFIG_MMC_SDHCI_ESDHC_IMX=y, 다음에서 찾을 수 있다.
Device Drivers > MMC/SD Card Support > Secure Digital Host Controller Interface support > SDHCI support on the platform-specific bus > SDHCI platform support for the Freescale eSDHC i.MX controller
- CONFIG_MMC_SDHCI=y, 다음에서 찾을 수 있다.
Device Drivers > MMC/SD Card Support > Secure Digital Host Controller Interface support - CONFIG_MMC_SDHCI_PLTFM=y, 다음에서 찾을 수 있다.
Device Drivers > MMC/SD Card Support > Secure Digital Host Controller Interface support > SDHCI support on the platform-specific bus - CONFIG_MMC_SDHCI_ESDHC_IMX=y, 다음에서 찾을 수 있다.
Device Drivers > MMC/SD Card Support > Secure Digital Host Controller Interface support > SDHCI support on the platform-specific bus > SDHCI platform support for the Freescale eSDHC i.MX controller
- CONFIG_MMC_UNSAFE_RESUME는 rootfs로 MMX/SD/SDIO 카드를 사용하는 임베디드 시스템에 사용된다. menuconfig에서 이 옵션은 아래 위치에 있다 :
- Device drivers > MMC/SD/SDIO Card Support > Assume MMC/SD cards are non-removable
3.3.7 Device Tree Binding
필수 속성 :
- compatible : "fsl,<chip>-esdhc"여야 한다.
- reg : eSDHC 레지스터 위치를 포함해야 한다.
- interrupts : eSDHC 인터럽트를 포함해야 한다.
선택적 속성 :
- non-removable : 카드가 호스트에 영구적으로 연결되어 있음을 나타낸다.
- fsl,cd-internal : 컨트롤러 내부의 카드 감지 기능을 사용하도록 나타낸다.
- fsl,wp-internal : 컨트롤러 내부에 쓰기 방지를 사용하도록 나타낸다.
- cd-gpios : 카드 감지 기능을 위한 GPIO를 지정한다.
- wp-gpios : 쓰기 방지를 위한 GPIO를 지정한다.
- fsl,delay-line : eMMC DDR 모드에 대한 delay line value를 지정한다.
Example:usdhc@02194000 { /* uSDHC2 */
compatible = "fsl,imx6q-usdhc";
reg = <0x02194000 0x4000>;
interrupts = <0 23 0x04>;
clocks = <&clks 164>, <&clks 164>, <&clks 164>;
clock-names = "ipg", "ahb", "per";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc2_1>;
cd-gpios = <&gpio2 2 0>;
wp-gpios = <&gpio2 3 0>;
bus-width = <8>;
no-1-8-v;
keep-power-in-suspend;
enable-sdio-wakeup;
status = "okay";
};
레퍼런스 :
- Documentation/devicetree/bindings/mmc/fsl-imx-esdhc.txt
- arch/arm/boot/dts/imx6*.dtsi
3.3.8 Programming Interface
이 드라이버는 i.MX uSDHC 모듈과 인터페이스하기 위해 MMC 버스 프로토콜에 필요한 기능을 구현한다. "build: make htmldocs"에서 생성된 Linux 문서를 참조한다.
3.3.9 Loadable Module Operations
SDHCI 드라이버는 로드 가능하거나 내장된 모듈로 빌드할 수 있다.
- SDHCI 드라이버를 로드 가능한 모듈로 빌드하는 방법.
- CONFIG_MMC_SDHCI=m, 다음에서 찾을 수 있다.
Device Drivers > MMC/SD Card Support > Secure Digital Host Controller Interface support - CONFIG_MMC_SDHCI_PLTFM=m, 다음에서 찾을 수 있다.
Device Drivers > MMC/SD Card Support > Secure Digital Host Controller Interface support > SDHCI support on the platform-specific bus - CONFIG_MMC_SDHCI_ESDHC_IMX=y, 다음에서 찾을 수 있다.
Device Drivers > MMC/SD Card Support > Secure Digital Host Controller Interface support > SDHCI support on the platform-specific bus > SDHCI platform support for the i.MX eSDHC i.MX controller
- CONFIG_MMC_SDHCI=m, 다음에서 찾을 수 있다.
- SDHCI 모듈을 로드 및 언로드하는 방법.
종속성으로 인하여, 아래 보여지는 모듈 순서에 따라 모듈을 로드하거나 언로드한다.
아래 명령으로 모듈을 로드한다 :
- 현재 디렉토리에 sdhci.ko와 sdhci-platform.ko 파일이 있다고 가정하고, insmod 명령으로 모듈을 로드한다.
$> insmod sdhci.ko $> insmod sdhci-platform.ko
- 해당 커널 모듈 lib 디렉토리에 sdhci.ko와 sdhci-platform.ko 파일이 있는지 확인하고, modprobe 명령으로 모듈을 로드한다.
$> modprobe sdhci.ko $> modprobe sdhci-platform.ko
아래 명령으로 모듈을 언로드한다 :
- insmod 명령으로 모듈을 언로드한다.
$> rmsmod sdhci-platform $> rmsmod sdhci
- modprobe 명령으로 모듈을 언로드한다.
$> modprobe -r sdhci-platform $> modprobe -r sdhci
- 현재 디렉토리에 sdhci.ko와 sdhci-platform.ko 파일이 있다고 가정하고, insmod 명령으로 모듈을 로드한다.
'NXP i.MX SoC Family > i.MX BSP Porting Guide' 카테고리의 다른 글
i.MX BSP Porting Guide - Porting USB (0) | 2022.07.11 |
---|---|
i.MX BSP Porting Guide - Porting Ethernet (0) | 2022.07.08 |
i.MX BSP Porting Guide - Porting HiFi 4 (0) | 2022.07.08 |
i.MX BSP Porting Guide - Porting Audio Codecs (0) | 2022.07.08 |
i.MX BSP Porting Guide - Supporting Cameras with CSI (0) | 2022.07.06 |