[메모리]

SDIO(Secure Digital I/O)란 무엇인가?

Neo Park 2013. 6. 3. 13:30

    

1. SDIO?

  • 우리가 흔히 쓰는 SD card 들을 위한 IO 이다.
  • Secure Digital I/O
  • SD Card 뿐만 아니라 기타 Embedded SDIO 장치들에도 사용된다.
  • Embedded SDIO 에서 SD busSD Commands 로 이루어 진다.

2. SDIO Features

  • Common SDIO Features
    • Targeted for portable and stationary applications
    • 최소 혹은 수정이 없는 물리적 SD 버스가 요구됨
    • 최대 7 I/O 기능 + 1 memory 기능 제공
    • event 로 interrupt 제공
    • Card 정보는 Tuples 로 제공됨
  • SDIO Card Features
    • 2.7-3.6V
    • Removable and PnP
    • Multiple Form factors
    • Standard-Size SDIO
    • miniSDIO
    • microSDIO
  • Embedded SDIO Device Features
    • 2.7-3.6V or 1.7-1.96V
    • Non removable device
    • Any Form factor and any pin layout
    • Shared Bus connection 가능

3. Signal Pins

 

 

위 그림에서 SDIO 구조를 잘 설명하고 있는 것 같다. 최대 8개의 버스 중에서 CMD 라인과 DATA 라인 CLK 라인이 존재한다. I/O 들의 구조는 대부분 비슷한것 같다. i2c 혹은 spi 처럼 clk 을 기준으로 cmd 를 보내고 data 를 read/write 하는 구조.

그렇다면 I/O 구조들 간의 차이는 무엇일까? lwn 의 기사 중 댓글을 보니 io 별 보장하는 속도의 차이가 있다.링크
SPI (20 Mbit/s), UART (8 Mbit/s), I2C (400kbit/s), SDIO (100 bit/s)!!! 따라서 100Mbit/s 까지 동작하게 되는 Wifi 모듈에는 적합한 인터페이스라고 생각이 된다.

4. Initialization Sequence

참고 자료들을 보면 SD Card 와 함께 동작하게 되는 Initialization 과정에 대한 자세한 설명이 나와있다. 하지만 대부분의 동작들은 커널에서 제공하리라 생각된다. 또 내가 원하는 것은 SDIO 를 이용한 Wifi 모듈의 정상적인 제어 이므로 cmd 와 함께 동작한다는 점, Reset cmd / Re-init Memory 가 존재한다는 점, Initialize SDIO 의 여부를 확인 한 뒤에 동작한다는 점 만 유념하고 정리를 하면 될 것 같다.
만약 모듈을 제어하는대 문제가 발생한다면 자세한 과정까지 디버깅을 해야겠지만..

5. SDIO for Kernel

다행이도 이미 코드가 존재하는것으로 보인다.
코드를 빠르게 리뷰 해 보니 /drivers/mmc/core/sdio.c 파일의 함수를 아래와 같이 구조체로 선언하여 사용하고 있다. 개발 시 참고하면 되겠다.


/*
 * linux/driver/mmc/core/core.h
 * http://lxr.free-electrons.com/source/drivers/mmc/core/core.h?v=2.6.37;a=mips#L18
 */
struct mmc_bus_ops {
        int (*awake)(struct mmc_host *);
        int (*sleep)(struct mmc_host *);
        void (*remove)(struct mmc_host *);
        void (*detect)(struct mmc_host *);
        int (*suspend)(struct mmc_host *);
        int (*resume)(struct mmc_host *);
        int (*power_save)(struct mmc_host *);
        int (*power_restore)(struct mmc_host *);
};
/*
 * linux/driver/mmc/core/sd.c
 * http://lxr.free-electrons.com/source/drivers/mmc/core/sd.c?v=2.6.37;a=mips#L737
 */
static const struct mmc_bus_ops mmc_sd_ops = {
        .remove = mmc_sd_remove,
        .detect = mmc_sd_detect,
        .suspend = NULL,
        .resume = NULL,
        .power_restore = mmc_sd_power_restore,
};
static const struct mmc_bus_ops mmc_sd_ops_unsafe = {
        .remove = mmc_sd_remove,
        .detect = mmc_sd_detect,
        .suspend = mmc_sd_suspend,
        .resume = mmc_sd_resume,
        .power_restore = mmc_sd_power_restore,
};

#. 참고자료

http://www.sandisk.com/Assets/File/OEM/Manuals/SDSDIOspecsv1.pdf
http://www.smart-dv.com/vip/sdio.html
https://www.sdcard.org/developers/overview/sdio/
http://labs.isee.biz/index.php/HowtosetupMarvell88w8686SDIOwifi
http://lwn.net/Articles/242744/
http://www.windowsfordevices.com/c/a/Windows-For-Devices-Articles/Understanding-secure-digital-IO-performance-in-systems-and-cards/
http://lxr.free-electrons.com/source/drivers/mmc/core/sdio.c

 

 

 

참조 : http://libmarco.tistory.com/66