본문 바로가기

모바일지식/SD

SD카드에 대한 기본 지식

http://blog.naver.com/PostView.nhn?blogId=agnazz&logNo=100086004464&viewDate=&currentPage=1&listtype=0&userTopListOpen=false&userTopListCount=5&userTopListManageOpen=false&userTopListCurrentPage=undefined

<강좌 계획>

#1. SD카드에 대한 기본 지식(Backround)
  - SD카드의 종류 (Background)
  - SD카드의 간략적인 Block diagram
  - SD카드 시스템 Bus Topology
#2. SD카드 표준 Registers
  - OCR, CID, RCA, DSR, CSD, SCR
#3. SD카드 Command와 Response
#4. SD카드 CCC(Card Command Class)
#5. SD카드 Power-on sequence

1. SD카드의 역사(History)
 - SD카드는 2000년 1월 Panasonic과 SanDisk와 Toshiba가 설립한 SD Association (http://www.sdcard.org) 에서 표준을 관리하며, 400개 이상의 brand에서 적용되고 있으며, 1,100여개의 회사가 설계, 개발, 제조에 관여하며, 8,000여개 이상의 모델에 적용된, 모바일 전자장치에서 사용하는 이동식 메모리카드로서의 사실상의 업계 표준이라 할 수 있다.
  - SD카드는 MMC카드에서 유래되었다.
    최초의 MMC카드는 Data bus가 1bit mode만 지원되었고, Data 전송 최대 지원 클럭이 20Mhz에 불과하였으며, 공급 전원이 3.3V 만 허용되었다.
  - 이론상으로 계산했을 때, 20Mhz에서 실제 데이터가 1bit 시리얼 통신이므로 최대 한계 속도는 20Mbps(2.5MB/s)에 불과하였으며, 이는 데이터 전달에 소요되는 시간만을 가정한 것이므로 실제 성능은 Write/Read연산에 대하여 카드 내부 컨트롤러에서 소요되는 시간까지 감안한다면 이보다 훨씬 낮다고 볼 수 있다.
   - 초기 MMC카드(버전 3.x)에서 Data 선을 4개로 늘이고, 최대 지원 클럭을 25Mhz로 한 것이 SD카드의 시작(SD카드 버전 1.x)이다. (이론상 4 x 25Mhz = 100Mbps = 12.5MB/s) 
   - 물론 MMC 카드 역시 이후 표준을 revision하여, 4bit data bus와 저전압환경에서 동작할 수 있도록 수정하고, 데이터 전송 클럭을 높이고, Security 관련 동작들까지 추가되면서 SD카드의 기능상의 우열을 논하기는 어려워졌다.



=> MMC카드는 겉모습이 SD카드와 매우 유사하다
    좌측에 있는 것이 SD카드 우측에 있는 것이 MMC카드이다.




=>  MMC Spec 4.x 에 들어서서는 SD카드와 기능 상의 차이를 찾기 힘들다.
     참고로 MMC 표준은 지멘스社와 SanDisk社가 1997년에 만든 MMCA(MMC Association  : http://www.mmca.org) 에서 표준을 관리하며, MMC Spec 4.x에서는 삼성의 표준화 노력이 많이 보이는 편이다.
     이 강좌에서의 범위를 벗어나기는 하지만 Managed NAND (Controller 내장형 NAND 칩)에 채택되는 interface는 삼성의 Movi-NAND와 Hynix의 Managed NAND계열은 MMC Spec. 4.x 스펙을 채택하고, SanDisk의 i-NAND와 같은 계열은 SD카드 interface를 사용한다.
    이 부분도 각자 회사가 추진하는 표준에 대한 표준화 경쟁이 치열한 부분이다.



=> SD카드는 9개의 Pin이 노출되어 있고, MMC카드는 7개의 Pin만 노출되어 있다.
   실제 MMC카드를 구할 수 없어서, 인터넷에서 비교 사진을 구했다.
   사진을 제공해주신 블로거님께 다시 한번 감사의 말씀을 드린다.



=> 7개의 Pin은 CMD 1개, 전원 1개, 그라운드 2개, 클럭 1개, 데이터 라인 1개, 예약 1개로 구성된다.

이 강좌의 목표는 MMC가 아닌 SD카드가 목적이므로 MMC카드는 SD카드의 비교하는 수준에서 그치고 앞으로는 SD카드 이야기만 하도록 하겠다.

2. SD카드 formats

<SD카드 Standard Formats>

 SD(SC)는 2GB 이하(2GB포함) 용량에 해당되는 SD카드이다.
 Mechanical feature는 그림과 같이 3가지 Type이 있다.
일반적인 SD와, miniSD와 우리가 흔히 t-flash라고 부르는 mircoSD가 있다.
물리적인 크기는 다르지만, 모두 동일하다.

<SD카드 High-Capacity Formats>

 4GB 이상 ~ 32GB까지의 SD카드를 SDHC라고 부른다.
SDHC는 SD카드 2.x  스펙에서 시작된다.
Standard formats과의 차이점은 크게 용량 차이만 있다고 해도 무방하다.

<Speed Class>
다만 SDHC부터는 speed class를 명시하도록 되어 있다.(SDHC는 optional, SDXC는 mandatory)
아래와 같이 Class 2, 4, 6 셋 중 하나를 명시하도록 되어 있다.
예를 들어 내가 산 SanDisk 8GB 에 class 4라고 명시된 카드를 구입했다면
그 카드는 사용자가 사용하는 체감하는 속도(File System 보다 상위 관점)에서 
Write 시간 기준으로 worst case에도 4MB/s 를 보장한다는 뜻이다.
즉, 대부분의 경우에는 그 보다 훨씬 좋은 성능을 보이는 것이며, 가장 최악의 시간 소요시에도 4MB/s가 가능하다는 뜻이다. (speed class 숫자가 큰 값이 더 좋은 성능이다.)
고용량 메모리카드가 적용되면서, 디지컬 카메라, 캠코더에서 고용량의 Data의 Read/Write 량이 매우 많아졌기 때문에, 실시간 동작 성능에 대해서도 매우 까다로워졌다.

Speed class는 일반적인 I/O 성능에 대해서 말하는 것이 아니다.
일반적인 I/O 커맨드 이외에 Speed class와 관련된 커맨드가 미리 정의되어 있으며
Speed Class Control Command (CMD20) 로 Speed class 구간의 시작과 끝을 정해줄 수 있으며
이 구간 내에서만 Speed class의 성능이 보장된다.
이 값 역시, AU(Allocation unit)중 used RU(Record unit)의 비율이 0에 가까울 때 성능이 보장된다.
AV와 같이 writing 량이 실시간으로 많은 량이 필요할 경우에만 사용한다고 보면 된다.

SD 스펙 3.0 (2009년 4월)에서는 Clasa 2,4,6 이외에 Class 0과 Class 10이 추가되었다.
Class 0는 Speed class 적용이 되지 않은 legacy card를 말하고
Class 10은 10MB/s 이며, 내용은 동일하다.


<SD카드 차세대 방식 SDXC - SD eXtened-Capacity Formats>

 32GB부터 2TB까지 지원되는 SDXC 카드이다.
 2009년 4월에 소개되었으며, 현재 bus 전송 speed 는 104MB/s이며 로드맵 상으로 300MB/s까지 확장될 예정이다. 향상되는 속도는 SD카드 방식에서만 적용되는 것이 아니라, Embedded SD, SDIO에도 적용될 예정이라고 하니, Managed NAND 계열에서도 희소식이다.


3. SD카드 Block diagram


  위의 SD카드 Block Diagram은 KingMax 512MB SD카드 data sheet에서 발췌한 그림이다.

 - Interface pin
  위에서도 잠깐 언급한 적이 있지만, 초기 MMC카드는 7개 pin이며 초기 SD카드는 9pin이다.
  9개 pin은 전원 1개, 그라운드 2개, CMD 1개, 클럭 1개, DATA 4개 이다.
  microSD Type은 그라운드 핀을 1개로 줄여서 8개이다.
  
 - 내부 Controller, Register
   SD카드는 내부적으로 Controller와 Register를 가진다. 
   Controller에 들어가는 firmware는 SD vendor마다 다르지만, 
   Register에 구조는 스펙에서 명시된 내용에 따라야 한다.
   Controller에서는 Bare NAND에 대하여 Bad Block handling, Wear Leveling을 위해서 
   FTL이 구현되어 있어야 한다.

 - Memory Core
   당연한 이야기이지만, SD카드 내부에 실제로 Memory 가 들어있다.
   SD카드 스펙에서는 Memory를 어떤 것으로 구현해야한다는 법은 명시되어 있지 않다.
   이 Memory를 반드시 NAND Flash로 구현해야한다는 것은 아니다는 것이다.
   NOR Flash로 구현해도 되고, EEPROM으로 구현해도 된다.
   하지만, Write에 대한 timing을 준수하려면 아마도 NOR나 EEPROM으로는 만들기가 힘들 것이다.
   따라서, 동일한 SD카드 스펙을 사용하더라도, Memroy Core가 NAND Flash 중에서 SLC 인지 MLC인지, Small block인지 Large block인지에 따라서 성능은 매우 달라질 수 있다.
   SD카드 제조사는 단가 절감을 위하여 MLC, Large block을 채택하는 경향이 있다. 
   MLC 조차도 2bit/cell 에서 3bit/cell 로 변경을 검토하고 있는 단계이며,
   이 때문에 최근에 시중에 나오는 SD카드가 반드시 예전에 나온 것 보다 좋은 성능을 가진다는 것은 보장할 수 없다.


4. SD Bus Topology
  일반적인 환경에서는 Host가 1개의 SD카드만을 가질 수 있지만, 스펙에서는 1개의 Host가 여러개의 카드를 구성할 수 있도록 되어 있다. 이때 구성하는 방법에 대한 그림은 아래와 같다.
Host와 Card와의 연결 Pin은 8개이다.
이중 동일한 Line을 공유할 수 있는 Pin은 Clock과 Vdd(전원)과 Vss(그라운드)뿐이다.
CMD 1개, DATA 4개(1bit mode로 한다면 1개만 연결해도 무방)는 Card별로 dedicated line이 필요하다.


  대부분의 환경에서는 Host에서는 1개의 Card만 연결하기 때문에, 아래의 그림은 Host와 Card가 어떻게 연결되는 지, 그 Pin만 이해하면 되겠다.

<각 Pin은 역할>
  1. 전원(Vdd) : SD카드는 자체 전원이 없이, Host가 공급해주는 전원으로 동작한다.
                       SD카드의 동작 전원은 Host의 환경에 따라 유연하게 동작할 수 있도록
                       고정된 전원으로 설계되어 있지 않다.
                       다음 강좌 SD카드 Reigster 중 OCR에서 좀더 상세하게 논의하겠지만,
                       SD카드는 각자 자신이 동작 가능한 전압 범위를 가지고, 
                       그 범위 이내의 전원 공급에서 동작한다.
                       일반적으로 3.3V은 2.7V ~ 3.6V 정도의 범위를 가진다.
  2. 그라운드(Vss) : 정압 전원이 있으면 그 기준을 위해 항상 따라다니는 게 그라운드 ^^;
  3. 클럭(CLK) : 커맨드와 데이터의 bit 해석의 동기화를 위한 클럭
                       최대 클럭 값만이 정해져있다.
                       SD스펙 1.x에서는 25Mhz 이며, 
                       SD스펙 2.x에서는 High-speed mode에서 50Mhz까지 지원해야 한다.
                       SD스펙 3.x에서는 SDR104 모드에서 208Mhz까지 지원해야 한다.
                       최대 클럭이 25Mhz 라고 해서 꼭 25Mhz로 클럭을 줄 필요는 없다.
                       10Mhz, 20Mhz에서도 정상적으로 잘 동작한다.
                       하지만, 클럭 개수를 기준으로 Protocol이 정의된 부분이 있으니, 
                       시간 기준으로 S/W로 Coding된 내용이 있다면 조심해야 한다.
  4. 커맨드 라인(CMD) : Host가 Card에 내려주는 Command packet과 
                                  Card가 Host에게 주는 Response packet이 돌아다니는 길이다. 
                                  자세한 Command 와 Response에 대해서는 차후 강좌에서 소개하겠다.
                                  커맨드 라인은 회로 상으로 Pull-up 처리해주어야 한다.
  5. 데이터 라인(D0-3) : 실제 데이터가 돌아 다니는 길이다. (Read/Write 관련 명령에서만 사용)
                                  SD카드는 default로 1bit 통신 모드로 동작한다.
                                  커맨드를 통해서 Bus width를 4bit 모드로 설정할 수 있으며, 
                                  설정된 후에서야 실제로 4개 line을 모두 사용한다.
                                  데이터 라인도 회로 상으로 Pull-up 처리해주어야 한다.


 다음 강좌에서는 SD카드 내부 Register의 field가 가지는 값에 대해서 같이 살펴보도록 하자



오늘 강좌에서 볼 내용은 SD카드가 가지는 표준 레지스터들이다.
지난 번 강좌에서도 언급한 적이 있지만, SD카드 내부에도 실제 메모리를 제외하고서도 컨트롤러와 레지스터들을 가진다.
아래 그림에 나온것과 같이 32bit 짜리 OCR 레지스터, 128bit 짜리 CID 레지스터, 16bit 짜리 RCA 레지스터, 16bit 짜리 DSR 레지스터, 128bit 짜리 CSD 레지스터, 64bit짜리 SCR 레지스터들이 표준 레지스터들이다.
레지스터의 값들 중에는, Read only 값으로 CARD가 가지는 특성에 대해서 알려주는 field들도 있고, 현재 설정 변경이 가능한 상태에 대한 레지스터들도 있다.

표준 레지스터 중에서 중요한 레지스터는 CID, CSD, SCR 레지스터이며, 나머지 레지스터를 한번 읽어 넘어가주는 정도면 충분할 것으로 생각된다.




1. OCR (Operating Condition Register)
   SD카드 자신이 동작할 수 있는 동작 전원에 대한 레지스터이다.
   일반적으로 SD카드는 3.3V 동작 전원에서 동작한다.
   모든 장치들이 마찬가지지만, 동작 전원은 10% 정도의 마진을 가지게 된다.
   이 구체적인 동작전원 범위를 알려주는 Register이며, 이것은 Read only이다.
   32bit 로 구성되어 있으며 해독하는 방법은 아래와 같다

  32bit 중 실제로 사용하는 구간은 4번 bit~23번 bit 까지이다.
  내가 가지고 있는 SD카드에서 OCR 레지스터 값을 읽어보아도 스펙에서 예시로 보여준
  0x00FF8000 값이 확인되었다.
  즉, 이 값을 가지는 SD카드는 2.7V~3.6V 범위 내에서의 전원 공급에서 정상 동작이 가능하다는 의미이다.




2. CID (Card Identification Register)
   SD카드 자신의 식별자에 대한 내용이다.
   CID는 128bit(=16Byte) 크기를 가지며 가지는 내용은 제조사 ID, 제품명, 제조일자, 시리얼 번호가 포함된다.


  내가 가지고 있는 KingStone 1GB 짜리 micro SD카드의 CID 값을 읽어본 결과
  Manufacturer ID는 내가 가진 KingStone 제품은 0x02였고,
  Application은 0x544D 이며, 
  제품명은 "SD01G",
  Revision은 0x32 (3.2)이며, 
  4Byte 고유 시리얼번호를 가지고 있었고,
  제조일자는 0x007A (2007년 10월)이었다.
  참고로 소개한 CID 레지스터 구조는 SD카드에만 적용된다.
  MMC카드에는 좀더 다른 구조로 구성되어 있다.

3. RCA (Relative Card Address register)
   SD카드 상대 주소값이다.
   이전 강좌에서도 언급했던 것과 같이, SD카드는 1개의 Host에 여러개의 SD카드가 연결될 수 있다.
   SD카드를 초기화(card identification)하는 과정에서 Host는 SD카드에게 특정 번호를 부여한다.
   이것은 Host에 연결된 여러개의 SD카드 중에서 SD카드들을 구별하기 위한 식별자이다.
   Host가 SD카드에게 부여하는 임시적인 이름이라고 생각하면 이해가 쉬울 것이다.
   Host가 SD카드에게 주소를 지정해주면 SD카드는 RCA 레지스터에 저장해둔다.
   이후 Host가 특정 SD카드를 selection/deselection할 때에는 이 RCA값이 식별자가 된다.

4. DSR (Driver Stage Register)
   SD카드의 추가 기능을 위한 레지스터
   대부분의 카드에서는 DSR 레지스터가 존재하지 않는다.
   DSR 레지스터는 필수요건이 아니라, optional 한 사항이다.
   이후 살펴볼 CSD 레지스터에서 DSR Implemented filed의 값이 1인 경우에만 DSR 레지스터가 존재한다고 한다. 하지만 본인이 본 SD카드 중에 DSR 레지스터가 존재하는 SD카드는 본 적이 없으니 별로 중요하게 살펴볼 레지스터는 아니다.

5. CSD (Card Specific Data register)
   SD카드 레지스터 중에서 가장 중요한 레지스터이다.
   SD카드 설정과 관련된 레지스터들이다.
   CSD의 구조는 1.0 버전과 2.0 버전이 있다.
   일반적으로 SDHC부터 CSD 2.0 구조를 사용한다.
   CSD 1.0과 2.0의 차이점은 1.0 중 불필요한 field를 제거한 것과 용량 계산 방법의 변경이다.




 1) CSD Structure
    CSD 구조에 대한 field이다. 2bit로 할당되어 있으며 가능한 값은 0과 1이다. (2~3은 예약)
    0은 CSD 1.0 구조를 사용한다는 의미이며,
    1은 CSD 2.0 구조를 사용한다는 의미이다.
  
 2) TAAC 
     Read operation를 위해서 Controller 내부에서 소요되는 시간이다.
     SDSC에서는 의미를 부여했으나, SDHC의 CSD 2.0에서는 그냥 0x0E으로 고정값을 준다.
     0x0E은 1ms의 의미.

 3) NSAC
     Worst case에서의 Read operation에서의 Clock 소모 갯수 최대치의 1/1000를 명시
     8bit이므로, 0xFF인 경우 255k 개의 Clock 을 read operation 중에 소모할 수 있다는 뜻
     SDSC에서는 의미를 부여했으나, SDHC에서는 0으로 고정값을 준다.
     ※ TAAC와 NSAC와 앞으로 이야기할 R2W_FACTOR는 카드 자체의 타이밍과 관련된 값들이다.
         이 값들은 SDSC에서는 의미가 있었으나, SDHC부터는 의미가 없어진다.
         스펙에서도 카드가 가지는 타이밍 특성 변수값을 이용하여 
         Host Controller를 설계하지 말하고 권하고 있다.
         Read 와 Write의 timeout 값은 CSD 레지스터의 값에 근거하지 말고, 
         고정값를 사용할 것을 권장하고 있다.
         더 웃긴 것은 SD카드 제조사에게는 최대 250ms 이내 write timeout를 권장하지만, 
         Host 구현에서는 500ms까지 응답을 waiting하라고 권장하고 있다.

 4) TRAN_SPEED
     1개의 데이터 라인을 사용하여 낼 수 있는 최대의 속도를 말한다
     대부분의 SDSC 카드는 25Mhz까지를 지원하므로, 25Mbps 값을 가진다.
     SDHC SDR50, DDR50, 또는 UHS50을 지원하는 카드는 100Mhz까지 지원하므로 100Mbps
     UHS104카드는 208Mhz까지 지원하지만 편의상 200Mbps로 표기한다.
     이는 현재 switch function으로 설정된 속도 모드에 따라서 동적으로 다른 값을 가진다.
     Default speed mode로 사용중일 때에는 25Mbps라고 표기되지만,
     High speed mode로 전환할 경우에는 50Mbps가 된다.

     Mbps 환산 시 Mhz에서의 1000값은 1024값으로 편의상 간주한다.
     ※ Bus speed mode (4bit 병렬 통신을 사용 가정)
         (1) Default Speed Mode : 3.3V signaling, Frequency up to 25Mhz, up to 12.5MB/s
         (2) High Speed Mode : 3.3V signaling, Frequency up to 50Mhz, up to 25MB/s
         (3) SDR12 : 1.8V signaling, Frequency up to 25Mhz, up to 12.5MB/s
         (4) SDR25 : 1.8V signaling, Frequency up to 50Mhz, up to 25MB/s
         (5) SDR50 : 1.8V signaling, Frequency up to 100Mhz, up to 50MB/s
         (6) SDR104 : 1.8V signaling, Frequency up to 208Mhz, up to 104MB/s
         (7) DDR50 : 1.8V signaling, Frequency up to 50Mhz, sampled on both clock edges, up to 50MB/s
        => SD 스펙 3.0 에서는 UHS (Ultra High Speed Phase I : UHS-I) 카드를 소개하고 있다.
            UHS-I 은 위와 같이 7가지의 Speeed mode를 Switch function으로 설정할 수 있으며
            SDHC부터 optional 하게 지원한다.
            UHS-I은 UHS50와 UHS104로 구분되며, 
            1~7번 속도 모드를 모두 지원하는 카드를 UHS104라고 하며,
            6번 208Hz를 지원하지 않고 나머지 6가지 속도 모드만 지원하는 카드를 UHS50이라고 한다.   

 5) CCC
    카드가 지원하는 Card Command Class를 표기한다.
    SD카드는 사용하는 command를 묶어서 command class를 구성한다.
    예를 들면, CCC0는 Basic 커맨드 셋으로 초기화 및 기본적인 설정을 위한 command 이며
    CCC2는 Read와 관련된 커맨드들의 모임이고, CCC4는 Write와 관련된 커맨드들,
    CCC6은 Card Write Protection과 관련된 커맨드, CCC7은 Lock/Unlock과 관련된 커맨드들이다.
    CCC는 0~11번까지 12가지 셋으로 구성된다.
    일반적인 시중에 유통되는 카드는 Basic/Read/Write 는 지원하더라도 Write Protect나 Lock/Unlock은 지원하지 않을 수도 있다.
   이럴 경우, 지원하는 커맨드에 대한 셋을 CCC field에서 기록해두어, 이러한 커맨드들을 카드가 이해할 수 있는지 Host가 검사한 후 동작을 수행하도록 해야한다.
     CCC field는 12개 Bit로 구성되며, 각각의 CCC 커맨드 클래스에 대하여 지원하면 bit를 1로 아니면 0으로 표기한다.

 6) READ_BL_LEN
    Read 를 수행할 때, 1개 Block의 크기로 설정할 수 있는 
    카드가 지원하는 최대 크기이다.
    값은 2^n 승에의 n값이 field 값이 된다.
    512byte의 Read Block 사이즈를 가질 경우, 2^9=512 이므로 9라고 표기한다.
    대부분 512byte를 지원하지만, 필자가 본 SD카드 중에는 1024byte를 지원하는 카드도 있었다.
    2GB SDSC카드의 경우 대부분 1024byte이다.
    SDHC 에서는 무조건 512byte로 고정값을 가지도록 하고 있다.

 7) READ_BL_PARTIAL
    6번의 READ_BL_LEN에서 명시한 Block의 크기보다 작은 값으로 Read가 가능하지를 표기한다.
    가능하다면 1, 아니면 0으로 표기한다.
    SDHC 에서는 무조건 0로 고정값을 가지도록 하고 있다.
    즉, SDHC에서는 무조건 512byte 단위의 Read만 허용한다는 의미이다.

 8) WRITE_BLK_MSALIGN

     1개의 커맨드에 의해 물리적 Block을 초과하여 Write가 가능한지에 대한 값이다.
     허용할 경우 1, 불가능할 경우 0
     대부분 0이다. SDHC에서는 무조건 0이다. 

 9) READ_BLK_MSALIGN
     1개의 커맨드에 의해 물리적 Block을 초과하여 Read가 가능한지에 대한 값이다.
     허용할 경우 1, 불가능할 경우 0
     대부분 0이다. SDHC에서는 무조건 0이다.
  
 10) DSR_IMP
     DSR Register가 존재하는지에 대한 내용이다.
     대부분 미구현(0)이다.

 11) C_SIZE
     C_SIZE와 아래 소개할 13)C_SIZE_MULT 값은 카드의 용량 계산에 필요한 field이다.
     C_SIZE는 12개 bit로 구성되고, C_SIZE_MULT는 3개 bit로 구성된다.
     C_SIZE는 0~4095, C_SIZE_MULT는 0~7의 값을 가진다.
     
     카드 용량 = 블럭 개수 x 블럭 크기
     블럭 개수 = (C_SIZE +1) x (2^C_SIZE_MULT)
     블럭 크기 = 6)에서 표기한 READ_BL_LEN 값이다.

     C_SIZE가 4095, C_SIZE_MULT 가 7일 때 최대 값을 가지며,
     이 때 READ_BL_LEN이 1024일 때, 2GB이다.

     카드 용량은 User data의 용량(Secured data의 용량은 포함되지 않은 순수 User 용량)을 말한다.

     이러한 카드 용량 계산 법은 SDSC카드에서만 유효하다.
     SDHC부터는 새로운 용량 계산 방법을 사용한다.
     SDHC 카드 용량  =  (C_SIZE + 1 ) x 512KB
     SDHC에서는 C_SIZE bit가 22개 bit로 확장되었다.
     이로써 C_SIZE로 표기할 수 있는 카드 용량은 2TB까지 확장될 수 있게 되었다.
   


 12) VDD_R_CURR_MIN, VDD_W_CURR_MIN, VDD_R_CURR_MAX, VDD_W_CURR_MAX
    SDSC에서만 존재하는 field이다.
    Read 또는 Write 할 때 소모되는 최대/최소 전류량을 의미하는데, SDHC에서는 폐기되었다.

 13) C_SIZE_MULT 
    SDSC에서만 존재하는 field이다.
    SDSC에서 카드 용량 계산시 C_SIZE값과 같이 사용되던, 값이다.
    SDHC에서는 폐기되었다.

 14) ERASE_BLK_EN
    SDSC : 0인 경우, 아래 SECTOR_SIZE에서 정의된 섹터 크기에 의해 지워진다.
              예를 들어 Host가 Erase하라고 명령한 주소 공간이 두개의 Sector에 부분적으로 걸쳐있다면
               Host가 명령한 주소를 포함하는 Sector들이 모두 삭제된다.
              1인 경우에는, Host가 Erase를 명령한 주소 만큼만 삭제된다.
    SDHC : 1 고정값.
    ※ SDSC에서는 Erase/Read/Write 커맨드의 argument로 전송되는 주소값이 Byte 단위 주소값이었지만, SDHC에서는 512Byte의 고정크기 Block의 Block index값이다.
     따라서 사실상 SDHC에서는 Erase를 명령한 주소 공간이 두개의 Sector에 부분적으로 걸쳐있을 수가 없다.

 15) SECTOR_SIZE
     SDSC : 한번에 Erase할 수 있는 최대 Sector의 개수, Sector의 크기는 WRITE_BL_LEN을 따른다.
                0이면 1개 sector, 127이면 128개 sector
     SDHC : 0x7F 고정값. 이 값은 Erase와 관련을 가지지 않는다.

 16) WP_GRP_SIZE
     SDSC : 한번에 Write Protect할 수 있는 최대 Sector의 개수, Sector의 크기는 WRITE_BL_LEN을 따른다.
                0이면 1개 sector, 127이면 128개 sector
     SDHC : 0x00 고정값.  SDHC에서는 Write Protect Group을 지원하지 않는다.

 17) WP_GRP_ENABLE
     SDSC : Write Protect가 가능한 Group이 있다면 1
     SDHC : 0x00 고정값.  SDHC에서는 Write Protect Group을 지원하지 않는다.

 18) R2W_FACTOR
     1개 Block을 기록하는 데 소요되는 시간을 1개 Block의 read 시간의 배수로 표기
      0 : Write 시간은 Read와 동일한 시간 소요
      1 : Write 시간은 Read의 2배 시간 소요
      2 : Write 시간은 Read의 4배 시간 소요
      3 : Write 시간은 Read의 8배 시간 소요
      4 : Write 시간은 Read의 16배 시간 소요
      5 : Write 시간은 Read의 32배 시간 소요
     SDSC : 0~5까지의 값을 가질 수 있다. (실제 카드마다 다른 값을 가진다)
     SDHC : 2(Read의 4배) 고정값, 
    ※ R2W_FACTOR는 Host controller 구현시 Write timeout 구현에 사용하면 안된다.
        Write timeout은 250ms의 고정값을 사용하여야 한다.

 19) WRITE_BL_LEN
     Write  Block의 크기, READ_BL_LEN과 동일
     SDSC : 512, 1024, 2048 중에 하나의 값을 가진다
     SDHC : 512 고정값

 20) WRITE_BL_PARTIAL
     Write  Block의 크기보다 적은 Write에 대한 허용 여부
     SDSC : 1(허용), 0(불허) 중에 하나의 값을 가진다
     SDHC : 0 고정값
    ※ SDSC에서는 Erase/Read/Write 커맨드의 argument로 전송되는 주소값이 Byte 단위 주소값이었지만, SDHC에서는 512Byte의 고정크기 Block의 Block index값이다.
     따라서 사실상 SDHC에서는 Write Block 시 Paritail로 발생될 수가 없다.

 21) FILE_FORMAT_GRP
     0만 허용, 0일 때만, FILE_FORMAT 이 의미를 가진다.
     FILE_FORMAT = 0 :  HDD처럼 partition table을 가진 형태의 File System 사용
     FILE_FORMAT = 1 :  DOS FAT (FDD)처럼 partition table은 없으며, boot sector를 가진 형태
     FILE_FORMAT = 2 :  Universal File Format
     FILE_FORMAT = 3 :  Others/Unknown
     SDHC에서는 FILE_FORMAT_GRP와 FILE_FORMAT은 모두 0으로 고정값을 가지게 하며
     Host에서는 절대 이 값을 참조하여 File System를 결정할 수 없도록 하고 있다.
      
 22) COPY
     카드가 가진 내용이 원본이 아닌 사본이라는 뜻이다.
     COPY field는 한번 밖에 기록할 수 없다.
     원본과 사본의 의미가 애매하긴 하지만, 일반적으로 모두 COPY field는 1이다.

23) PERM_WRITE_PROTECT
     카드 전체 영역에 대하여 영구적인 Write Protect를 걸었는지에 대한 field이다.
     PERM_WRITE_PROTECT field는 한번 밖에 기록할 수 없다.
     Write Protect가 걸려있으면 모든 Erase/Write 명령은 동작하지 않는다.

 24) TMP_WRITE_PROTECT
     카드 전체 영역에 대하여 임구적인 Write Protect를 걸었는지에 대한 field이다.
     Write Protect가 걸려있으면 모든 Erase/Write 명령은 동작하지 않는다.

 25) FILE_FORMAT
     FILE_FORMAT = 0 :  HDD처럼 partition table을 가진 형태의 File System 사용
     FILE_FORMAT = 1 :  DOS FAT (FDD)처럼 partition table은 없으며, boot sector를 가진 형태
     FILE_FORMAT = 2 :  Universal File Format
     FILE_FORMAT = 3 :  Others/Unknown
     SDHC에서는 FILE_FORMAT_GRP와 FILE_FORMAT은 모두 0으로 고정값을 가지게 하며
     Host에서는 절대 이 값을 참조하여 File System를 결정할 수 없도록 하고 있다.   


6. SCR (SD Card Configuration register)
   SD카드 설정과 관련하여 CSD이외에 추가적인 레지스터로 CSD 다음으로 중요한 레지스터이다.
   SCR의 구조는 1.0 버전한가지 뿐이다


  1) SCR Structure 
     0이 SCR 구조 1.0 을 나타내며, 아직 SCR의 구조는 1.0 한가지 뿐이다.

  2) SD Spec. Version
     이 SD카드가 지원하는 SD Spec 버전을 지칭한다.
     0 : SD Spec. 1.0 또는 1.01을 의미
     1 : SD Spec. 1.10 을 의미
     2 : SD Spec. 2.00 또는 3.00 을 의미 (3.00 이라면 6번 SD_SPEC3 field 참조)
    ※ 각 SD 스펙별 지원 가능한 내용에 대해서는 아래에서 다루겠다.

  3) Data status after erase 
     Erase 된 후, Data가 가지는 값이 어떤 값인지를 나타낸다.
     0이면 0, 1이면 1
     일반적으로 NAND는 Erase 후 1이 되는 것이 정상적이나, 
     SD카드 vendor에 따라서 Erase 이후 0으로 되는 제품도 있다.
     1이면, Erase한 직후, 그 주소를 Read할 경우 모든 값이 0xFF로 읽힐 것이다.

  4) SD Security Support

     지원하는 Securty 버전을 나타낸다.
     0 : no security
     1 : Not Used
     2 : Version 1.01
     3 : Version 2.00
     4 : Version 3.00
     일반적으로 SDSC는 2, SDHC는 3이다.
   
  5) DAT Bus widths supported
     SD카드가 지원하는 Data 버스 라인을 나타낸다.
     Bit 0 : 1 bit (DAT0)
     Bit 2 : 4 bit (DAT0-3)
     일반적으로 1bit 통신 모드와 4bit 통신 모드를 모두 가능한 카드는 0b0101이 된다.   

  6) Spec. Version 3.00 or higher (표에서 47번 bit 1개 : SD_SPEC3)
     SD_SPEC 값이 2인 경우, 2.00 또는 3.00 이상을 의미한다.
     이때는 SD_SPEC3 field에서 추가 확인하여 2.00인지 3.00인지 구별해야 한다.
     0이면 SD SPEC 2.0 지원
     1이면 SD SPEC 3.0 지원
     
  7) Command Support bits (표에서 33~32번 bit 2개)
     33번 Bit : CMD23 (SET_BLOCK_COUNT) 지원 여부 (UHS104 카드는 반드시 지원해야함)
     32번 Bit : CMD20 (SPEED_CLASS_CONTROL) 지원 여부 (SDXC는 반드시 지원해야함)
     ※ CMD23과 CMD20은 뒤늦게 추가(SD 2.0)되었기 때문에 CCC에 포함되지 않는다.
         따라서 SCR Register의 33번, 32번 bit를 통하여 이 커맨드의 지원여부를 알려준다.
         CMD20이 가능해야  Speed Class 상 구현된 실시간 Recording이 가능하다.

    ※ 각 SD 스펙별 지원 가능한 내용
    [1] SD Spec ver 1.01 (SD_SPEC of SCR = 0)
         CMD6을 지원하지 않음
         CMD8을 지원하지 않음
         User 영역 카드 용량은 최대 2GB 이내여야 함.
    [2] SD Spec ver 1.10 (SD_SPEC of SCR = 1)
         CMD6을 지원해야 함
         CMD8을 지원하지 않음
         User 영역 카드 용량은 최대 2GB 이내여야 함.
    [3] SD Spec ver 2.00 (SD_SPEC of SCR = 2 && SD_SPEC3 = 0)
         CMD6을 지원해야 함
         CMD8을 지원해야 함
         CMD42를 지원해야 함
         SDHC 카드인 경우에는 Speed Class를 지원해야 함.
         User 영역 카드 용량은 최대 32GB 이내여야 함.
    [4] SD Spec ver 3.00 (SD_SPEC of SCR = 2 && SD_SPEC3 = 1)
         CMD6을 지원해야 함
         CMD8을 지원해야 함
         CMD42를 지원해야 함
         SDHC, SDXC 카드인 경우에는 Speed Class를 지원해야 함.
         User 영역 카드 용량은 최대 2TB 이내여야 함.
      ※ CMD6 : Driver Strength 설정 커맨드
      ※ CMD8 : Send Interface Condition 커맨드(동작 전원 범위 조회)
      ※ CMD42 : Lock/Unlock 커맨드(Lock/Unlock/Password 설정)


다음 강좌에서는 SD카드의 커맨드와 응답에 대한 형식에 대해서 계속하겠다.
강좌 하나씩 쓸 때마다 소요되는 시간이 생각보다 많이 걸려서 다음 강좌까지는 시간이 좀 걸릴 것 같다.

'모바일지식 > SD' 카테고리의 다른 글

SD/MMC에 대한 자료  (0) 2011.08.15
SD(Secure Digital) 카드  (0) 2011.08.15
SD 카드 개요  (0) 2011.08.15
갤럭시S II 분해  (0) 2011.08.15
SD카드 분해한 사진  (1) 2011.08.15