1. SDIO?
- 우리가 흔히 쓰는 SD card 들을 위한 IO 이다.
- Secure Digital I/O
- SD Card 뿐만 아니라 기타 Embedded SDIO 장치들에도 사용된다.
- Embedded SDIO 에서 SD bus 와 SD 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
'[메모리]' 카테고리의 다른 글
Mobile DDR(LPDDR), 모바일 DDR이란? (0) | 2013.06.07 |
---|---|
JEDEC의 차세대 모바일 메모리 LPDDR4와 Wide I/O 2 (0) | 2013.06.07 |
SD와 SHDC, 그리고 SDIO (SD vs SDHC, and SDIO) (0) | 2013.06.03 |
DIMM(dual in-line memory module)이란 무엇인가? (0) | 2013.04.24 |
SDRAM 파라메터 (CL, tRCD, tRP,tRAS, tRC,WL,tWR..) (0) | 2013.04.08 |