3.3 MMC/SD/SDIO Host
3.3.1 Introduction
The MultiMediaCard (MMC)/ Secure Digital (SD)/ Secure Digital Input Output (SDIO) Host 드라이버는 uSDHC(ultra MMC/SD host controller)에 대한 표준 Linux 드라이버 인터페이스를 구현한다.
호스트 드라이버는 Linux 커널 MMC 프레임워크의 일부이다.
MMC 드라이버에는 아래와 같은 기능이 있다:
- SD3.0와 SDIO 2.0 카드를 위한 1비트나 4비트 작업 (현재까지 SDIO v2.0 지원(AR6003로 검증)).
- 카드 삽입과 제거 감지를 지원.
- 표준 MMC 명령 지원.
- PIO와 DMA 데이터 전송.
- 전원 관리 지원.
- MMC 카드에 대한 1/4 8비트 작업 지원.
- i.MX 6의 경우, USDHC는 eMMC4.4 SDR와 DDR 모드를 지원.
- i.MX 7Dual의 경우, USDHC는 HS400와 HS200을 포함하는 eMMC5.0를 지원.
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 커맨드, 시스템 컨트롤과 프로토콜 컨트롤 레지스터로 사용자는 데이터와 응답의 형식을 지정하고 읽기 대기 주기(read wait cycle)를 컨트롤할 수 있다.
uSDHC에 카드의 응답을 저장하는 데 사용되는 4개의 32비트 레지스터가 있다. uSDHC는 직접 커맨드 응답을 가져오기 위해 이 4개의 레지스터를 읽는다. uSDHC는 읽기와 쓰기를 위해 완전하게 구성가능한 128x32비트 FIFO를 사용한다. 버퍼는 호스트 시스템과 카드 사이에 또는 그 반대로 전송되는 데이터를 위한 임시 저장소로 사용된다. uSDHC 데이터 버퍼 액세스 레지스터 비트는 읽기나 쓰기 전송 시 32비트 데이터를 유지한다.
데이터 수신을 위한 단계는 아래와 같다:
- RD_WML 레지스터에 설정된 양보다 더 많은 word가 버퍼에 수신되면, uSDHC 컨트롤러는 DMA 요청을 생성한다.
- 이 요청을 받으면, DMA 엔진은 데이터 버퍼 액세스 레지스터를 읽어 uSDHC FIFO에서 시스템 메모리로 데이터를 전송을 시작한다.
데이터 전송을 위한 단계는 아래와 같다:
- 버퍼 공간의 양이 WR_WML 레지스터에 설정된 값을 초과할 때마다, uSDHC 컨트롤러는 DMA 요청을 생성한다.
- 이 요청을 받으면, DMA 엔진은 Data Buffer Access Register에 미리 정의된 바이트 수를 기록하여 시스템 메모리에서 uSDHC FIFO로 데이터를 이동을 시작한다.
읽기 전용인 uSDHC Present State와 Interrupt Status Registers는 uSDHC 작업 상태, 애플리케이션 FIFO 상태, 오류 조건과 인터럽트 상태를 제공한다.
특정 이벤트가 발생하면, 모듈은 인터럽트를 생성하고 해당 Status Register 비트를 설정할 수 있다. uSDHC 인터럽트 상태 활성화와 신호 활성 레지스터로 사용자는 이러한 인터럽트 발생 여부를 컨트롤할 수 있다.
3.3.3 Software Operation
Linux OS에는 MMC 버스 프로토콜을 구현한 MMC 버스 드라이버가 포함되어 있다. uSDHC에 커맨드를 보내기 위해 낮은 레벨의 MMC 호스트 컨트롤러 인터페이스 드라이버를 사용하여, 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 버스의 최대 클럭 주파수를 가져온다.
- 함수 esdhc_pltfm_get_min_clock()는 플랫폼에서 지원하는 SD 버스의 최소 클럭 주파수를 가져온다.
- esdhc_pltfm_get_ro()는 카드의 읽기 전용 상태를 가져온다.
- esdhc_execute_tuning()은 튜닝 준비를 처리한다. SD3.0 UHS-I 모드에서만 사용된다.
- esdhc_set_clock()은 클럭 변경 요청을 처리한다.
아래 그림은 MMC와 관련된 드라이버가 어떻게 계층화되어 있는지 보여준다.
3.3.4 Driver Features
MMC 드라이버는 아래 기능을 지원한다:
- 여러 uSDHC 모듈을 지원한다.
- Linux MMC 코어 드라이버와 인터페이스하는 모든 진입점(entry point)을 제공한다.
- MMC와 SD 카드.
- SDIO 카드.
- SD3.0 카드.
- 커맨드 타임아웃과 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에 MMC/SD/SDIO 카드를 사용하는 입베디드 시스템에 사용된다. menuconfig에서 이 옵션은 아래에서 찾을 있다:
3.3.7 Device Tree Binding
필수 속성:
- compatible: "fsl,<chip>-esdhc"여야 한다.
- reg: eSDHC 레지스터 위치를 포함해야 한다.
- interrupts: eSDHC 인터럽트를 포함해야 한다.
선택적 속성:
- non-removable: 영구적으로 카드가 호스트에 연결되어 있다는 것을 나타낸다.
- 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 버스 프로토콜에 필요한 기능을 구현한다. 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에서 찾을 수 있다.
- SDHCI 모듈을 로드, 언로드하는 방법.
종속성으로 인해, 아래에 보여지는 모듈의 순서에 따라 모듈을 로드나 언로드한다.
다음 커맨드를 실행하여 모듈을 로드한다:
- 현재 디렉토리에 sdhci.ko와 sdhci-platform.ko 파일이 존재한다고 가정하고, insmod 커맨드로 모듈을 로드한다.
$> insmod sdhci.ko $> insmod sdhci-platform.ko
- modprobe 커맨드로 모듈을 로드하려면, 해당 커널 모듈의 lib 디렉토리에 sdhci.ko와 sdhci-platform.ko 파일이 있는지 확인한다.
$> 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 커맨드로 모듈을 로드한다.