linux(3.0.8)의 mmc드라이버에서 mmc정보를 표시하는 debugfs의 사용례를 알아보기로 한다.

  •    debugfs_create_file(name, mode, parent...)
        debugfs파일시스템에 'name'이름을 가지는 파일을 만든다.
        mode에 이 노드를 read-only(S_IRUSR )로 만들지 write가능(S_IRUSR|S_IWUSR)하게 할지 지정할 수 있다.
        parent는 'name'이 속하는 디렉토리를 나타낸다.
        이렇게 만들어진 read-only의 file은 cat과 같은 툴로 내용을 볼 수 있다.
        write가능하게할 경우에는 커맨드를 kernel내부에 전달할 수 있다.
  •   debugfs_create_dir
         debugfs의 파일을 담을 디렉토리리를 생성한다.
  •   debugfs_remove
         debugfs_create_file, debugfs_create_dir에 의해 만들어지 entry를 삭제한다.
  •   debugfs_remove_recursive
         debugfs_create_file, debugfs_create_dir에 의해 만들어진 file과 subdir를 모두 삭제한다.

그러면, mmc모듈(drivers/mmc/core)에서 위에서 설명된 debugfs API가 어떻게 사용되는지 알아보기로 하자.

우선 User Level에서 mmc관련 debugfs의 노드를 보려면 다음과 같이 mount명령을 사용하여 노드가 보이도록 한다.
 

        mount -t debugfs none /sys/kernel/debug


/sys/kernel/debug밑 호스트이름(mmc_hostname())에 따라 mmc0, mmc1 ...와 같은 디렉토리가 생긴다.
그리고 ios, clock, clk_delay노드가 만들어진다. '#'과 그뒤의 문장은 주석문이다.

  •  ios: 'cat'명령을 이용하여 mmc0/ios의 내용을 보면 다음과 같이 나타난다.
          clock:          48000000 Hz
          vdd:            20 (3.2 ~ 3.3 V)
          bus mode:       2 (push-pull)           # { "open drain", "push-pull", "invalid" }
          chip select:    0 (don't care)          # { "don't care", "active high", "active low" }
          power mode:     2 (on)                  # { "off", "up", "on", "invalid" }
          bus width:      2 (4 bits)
          timing spec:    2 (sd high-speed)       # { "legacy", "mmc high-speed", "sd high-speed", "invalid" }
  •   clock: 'cat'명령을 이용하여 mmc0/clock의 내용을 보면 다음과 같이 나타난다.
         00000900
  •   clk_delay:
       clk_delay는 kernel의 config파라메터를 켜고 build하였을 경우 볼수 있는 정보이다.
       drivers/mmc/core/Kconfig:
             config MMC_CLKGATE
             bool "MMC host clock gating"
            help
            This will attempt to aggressively gate the clock to the MMC card.
           This is done to save power due to gating off the logic and bus
           noise when the MMC card is not in use. Your host driver has to
           support handling this in order for it to be of any use.

또한 카드번호(mmc_card_id())에 해당하는 디렉토리(예를들면 mmc0:b368)도 만들어 지고,
  그 밑에는 다음과 같은 정보를 제공하는 노드가 생성된다.

  • status: 'cat'명령을 이용하여 mmc0/mmc0:b368/status의 내용을 보면 다음과 같이 나타난다.
         00000900
  • ext_csd:
        mmc카드인 경우 csd레지스터 뿐만 아니라 ext_csd(크기512byte)에 카드사용에 대한 다양한(?) 정보를 얻을 수 있다.
        특히, MMC카드의 수명에 관련된 사용량에 대한 정보를 얻을 수 있다. 하지만 이 레지스터는 MMC에 국한되고 SD에는 해당되지 않는다.