bucchiさんが改造されたSDHC対応のドライバーをテストしてみました(1)

 bucchi さんが改造されたSDHC 対応のドライバー(4GB限定)をテストしてみました。
最初に PanasonicLexar の 4GB SDHC メモリーカードでテストを開始、ZBench v2.2ベンチマークテストも取ったりして順調だったんですが、ちょっと欲を出して、手持ちの SD メモリーカードをすべてテストして見ようとということで、左の写真の12種類の SD/SDHC メモリーカードについてテストを始めたところ、ハマッてしまいました。以下で報告するように Panasonic製 の SD メモリーカードでことごとく認識に失敗します

SD メモリーカードが認識しない不具合のまとめ(結論)

 まずは、今回の SD メモリーカードの認識不具合に関するテスト結果から得られた結論から。

■今回の動作テストで正常に認識できなかった SD メモリーカード
正常に認識できない SD メモリーカードたち

上の写真が今回のテストした12種類の SD/SDHC メモリーカードの中で正常に認識できなかった SD メモリーカードです。下表に一覧にしましたが、ほとんどが Panasonic の製品です。

表1 今回の動作テストで正常に認識できなかった SD メモリーカード一覧

No. メーカー 容量 種別 型名 テスト時の初期化(フォーマッティング)状態
1 Panasonic 256MB SD RP-SDH256N1A 3種類の初期化(フォーマッティング)方法でテスト
表3」参照
2 Panasonic 256MB mini SD RP-SS256BJ1K 工場出荷時のまま
3 Panasonic 512MB SD RP-SDH512N1A 工場出荷時のまま
4 Panasonic 1GB SD RP-SDQ01GJ1A 工場出荷時のまま
5 Panasonic 1GB SD RP-SDP01GJ1K 工場出荷時のまま
6 ADATA 1GB SD 不明 たぶん、工場出荷時のまま
■認識しない原因の切り分け

表2 bucchi さんが改造された SDHC 対応のドライバーで認識しない SD メモリーカードの他のドライバー(「SHARP 純正」、「tetsu さん配布版」)での認識状況について
(○:正常に認識、×:認識せず)

SD メモリーカード bucchi さん改造版 SHARP 純正
SL-C1000
tetsu さん配布版
Panasonic 256MB SD RP-SDH256N1A ×
Panasonic 256MB mini SD RP-SS256BJ1K ×
Panasonic 512MB SD RP-SDH512N1A ×
Panasonic 1GB SD RP-SDQ01GJ1A ×
Panasonic 1GB SD RP-SDP01GJ1K ×
ADATA 1GB SD ×
■初期化(フォーマッティング)方法の違いによる影響について
  • SD メモリーカードの初期化(フォーマッティング)方法の問題ではないようです
    SD メモリーカードの初期化(フォーマッティング)方法の影響についても切り分けるため、認識しない Panasonic の 256MB SD メモリーカード RP-SDH256N1A についてつぎの3種類の方法で、また正常に認識する Transcend の 1GB の SD メモリーカード TS1GSDC について、つぎの3種類の方法でテストしたところいずれも、認識状況に変化はありませんでした。このため、初期化(フォーマッティング)方法の問題では無いようです。

表3 bucchi さんが改造された SDHC 対応のドライバーで認識しない SD メモリーカードPanasonic 256MB SD RP-SDH256N1A)を初期化(フォーマッティング)方法を変更して認識状況をテストした結果
(○:正常に認識、×:認識せず)

初期化(フォーマッティング)方法 認識状況
Panasonic SD フォーマッター Ver2.0 (2.0.0.3) ×
SHARP ポータブルAVプレーヤー MT-AV1 ×
Panasonic デジカメ DMC-FX33 ×

表4 bucchi さんが改造された SDHC 対応のドライバーで正常に認識する SD メモリーカードTranscend 1GB SD TS1GSDC)を初期化(フォーマッティング)方法を変更して認識状況をテストした結果
(○:正常に認識、×:認識せず)

初期化(フォーマッティング)方法 認識状況
工場出荷状態
Panasonic SD フォーマッター Ver2.0 (2.0.0.3)
Panasonic デジカメ DMC-FX33
■取得したログから分析した不具合の状況のまとめ
  • bucchi さんの改造されたドライバーでは dmesg の「[SD]-clustsize」が正常に認識する SHRAP 純正ドライバーの値と異なる
ドライバーの種別 dmesg [SD]-clustsize の値 備考
SHRAP 純正ドライバー 4000 "4000" はクラスタサイズ16kByte?
bucchi さん改造のドライバー 2000 "2000" はクラスタサイズ8kByte?
  • dmesg の結果の値("block_count" と "total_size" の値)が明らかにおかしい
Panasonic 1GB SD RP-SDQ01GJ1A
× 認識に不具合有り
Transcend 1GB SD TS1GSDC
○ 正常に認識
block_size: 512 block_size: 512
write_block_size: 512 write_block_size: 512
block_count: 33554432 block_count: 1995776
total_size: 0 total_size: 1021837312

テスト結果(SDメモリーカードテスト専用のシェルスクリプト sd_info.sh で取得したログ)

■bucchi さん改造のドライバーで認識できなかった SD メモリーカードPanasonic 256MB SD RP-SDH256N1A)でドライバーを変更して正常に認識したログ
使用したドライバー 取得したログへのリンク
bucchi さん改造版 sd_info_result_Panasonic_256MB_SD_memory_card_RP-SDH256N1A_01.txt
SHARP 純正(SL-C1000 sd_info_result_Panasonic_256MB_SD_memory_card_RP-SDH256N1A_02.txt
tetsu さん配布版 sd_info_result_Panasonic_256MB_SD_memory_card_RP-SDH256N1A_03.txt
■bucchi さん改造のドライバーで正常に認識される SD メモリーカードTranscend 1GB SD TS1GSDC)のログ
SD メモリーカード 取得したログへのリンク
Transcend 1GB SD TS1GSDC sd_info_result_Transcend_1GB_SD_memory_card_TS1GSDC.txt

テスト環境とテスト方法について

 今回のテストに利用したテスト環境とテスト方法は以下の通りです。

■テスト環境
機種名 SL-C1000
ROM Version 1.02
Kernel Version Special Kernel v18i
CCCR値 0x02000210(デフォルト値)
VCORE値 0x1A(デフォルト値)
bash-2.05$ cat /proc/deviceinfo/product
SL-C1000
bash-2.05$ cat /proc/deviceinfo/revision
1.02
bash-2.05$ cat /proc/version
Linux version 2.4.20 (v18i@tetsu.homelinux.org) (gcc version 2.95.2 19991024 (release)) #4 Sun, 12 Aug 2007 23:47:25 +0900
bash-2.05$ cat /proc/zaurus/CCCR
0x02000210
bash-2.05$ cat /proc/zaurus/VCORE
0x1A
■不具合の原因をつきとめるためのテスト方法について
  • 不具合の原因をつきとめるために必要と思われる、私が考えつく以下の情報を取得しました。なお、テスト作業を簡単にするために、下記の専用のシェルスクリプトsd_info.sh)を作成しました。
  • なお、テストに当たっては他の影響を排除するため、テスト条件を変更するたびに『再起動』を実施しました。また、SD メモリーカードテスト専用のシェルスクリプトsd_info.sh)によるログの取得も『再起動直後』に実施しました。
取得項目 取得コマンド
ドライバーの情報 シェルスクリプトで判定して表示
SD メモリーカードの情報
/proc/driver/mmcsd/00/*
cat /proc/driver/mmcsd/00/detect
cat /proc/driver/mmcsd/00/manufacture
cat /proc/driver/mmcsd/00/product
cat /proc/driver/mmcsd/00/type
システムログ dmesg dmesg
パーティション情報 fdisk -l または fdisk -l -u
マウント状況 mount|grep /dev/mmcda1
容量の情報 df /dev/mmcda1
■SD メモリーカードテスト専用のシェルスクリプト - sd_info.sh

シェルスクリプトのソース(ダウンロード

#!/bin/sh
#
# get SD/SDHC memory card information.
#
# file name : sd_info.sh
# version   : 0.0.2
# create    : Jan. 29th, 2010
# update    : Jan. 30th, 2010
# author    : Fumiyoshi Sasaki
#
SD_DRIVER_FILE_NEME="/lib/modules/2.4.20/kernel/drivers/block/sharp_mmcsd_m.o"
echo "SD/SDHC driver and memory card information"
echo "========================================================"
echo -n "PRODUCT : "
cat /proc/deviceinfo/product
echo
SD_DRIVER_FILE_SIZE=`ls -l "$SD_DRIVER_FILE_NEME" | tr -s ' ' | cut -d ' ' -f 5`
if [ -L "$SD_DRIVER_FILE_NEME" ]
then
  echo "SD memory card driver           : use SHARP pure driver"
elif [ "$SD_DRIVER_FILE_SIZE" -eq 67530 ]
then
  echo "SD memory card driver           : use tetsu SD memory card driver (same as SHARP SL-C3200 driver)" 
elif [ "$SD_DRIVER_FILE_SIZE" -eq 75296 ]
then
  echo "SD memory card driver           : use bucchi SD/SDHC memory card driver" 
fi
echo "SD memory card driver file size : $SD_DRIVER_FILE_SIZE"
echo
echo "ls -l /lib/modules/2.4.20/kernel/drivers/block/sharp_mmcsd_m.o result"
echo "---------------------------------------------------------"
ls -l /lib/modules/2.4.20/kernel/drivers/block/sharp_mmcsd_m.o
echo
echo "cat /proc/driver/mmcsd/00/* result"
echo "---------------------------------------------------------"
echo -n "  detect      : "
cat /proc/driver/mmcsd/00/detect
echo -n "  manufacture : "
cat /proc/driver/mmcsd/00/manufacture
echo -n "  product     : "
cat /proc/driver/mmcsd/00/product
echo -n "  type        : "
cat /proc/driver/mmcsd/00/type
echo
echo "mount | grep /dev/mmcda1 result"
echo "---------------------------------------------------------"
mount | grep /dev/mmcda1
echo
echo "df /dev/mmcda1 result"
echo "---------------------------------------------------------"
df /dev/mmcda1
echo
echo "fdisk -l result"
echo "---------------------------------------------------------"
fdisk -l
echo
echo "dmesg result"
echo "---------------------------------------------------------"
dmesg
exit 0
SDメモリーカードテスト専用のシェルスクリプトの実行例

bucchi さんの改造されたドライバーで正常に認識されない SD メモリーカードPanasonic 256MB SD RP-SDH256N1A)の例

SD/SDHC driver and memory card information
========================================================
PRODUCT : SL-C1000

SD memory card driver           : use bucchi SD/SDHC memory card driver
SD memory card driver file size : 75296

ls -l /lib/modules/2.4.20/kernel/drivers/block/sharp_mmcsd_m.o result
---------------------------------------------------------
-rw-r--r--    1 root     qpe         75296 Jan 24 18:22 /lib/modules/2.4.20/kernel/drivers/block/sharp_mmcsd_m.o

cat /proc/driver/mmcsd/00/* result
---------------------------------------------------------
  detect      : 1
  manufacture : 1
  product     : S256B
  type        : SD

mount | grep /dev/mmcda1 result
---------------------------------------------------------

df /dev/mmcda1 result
---------------------------------------------------------
Filesystem           1k-blocks      Used Available Use% Mounted on

fdisk -l result
---------------------------------------------------------

dmesg result
---------------------------------------------------------
 options enabled
SharpSL serial driver version 5.05c (2001-07-08) with no serial options enabled
ttyS00 at 0xf8100000x (irq = 22) is a 16550A
ttyS01 at 0xf8700000x (irq = 20) is a 16550A, using IRDA
ttyS02 at 0xf8200000x (irq = 21) is a 16550A
rs_init: IRDA H/W initializaion
sharpled_init: done.
akita remote controller
  :
途中省略
  :
SD Driver Initialized.
sharp_mmcsd 0.30 13 Oct 2004
pxa_sd_wait_response: card removed (cmd=00)
pxa_sd_wait_response: card removed (cmd=00)
pxa_sd_wait_response: card removed (cmd=00)
pxa_sd_wait_id_response: card removed (cmd=00)
  :
途中省略
  :
monitor_modinit: finished
pxa_sd_wait_response: responce time out (cmd=52 MMC_STAT=0x2142)
pxa_sd_wait_response: responce time out (cmd=05 MMC_STAT=0x2142)
block_size: 512
write_block_size: 512
block_count: 16777216
total_size: 0
SDHC=0
[SD]-clustsize = 2000
EXT3-fs: Unrecognized mount option quiet
EXT2-fs: Unrecognized mount option quiet
cramfs: wrong magic
MINIX-fs: unable to read superblock
MSDOS FS: IO charset utf8
FAT: unable to read boot sector
FAT: freeing iocharset=utf8
isofs_read_super: bread failed, dev=3c:01, iso_blknum=16, block=32
NTFS-fs error (device 3c:01): parse_options(): Unrecognized mount option quiet.
NTFS-fs warning (device 3c:01): parse_options(): Option iocharset is deprecated. Please use option nls=<charsetname> in the future.
jffs2: attempt to mount non-MTD device 3c:01
EXT3-fs: unable to read superblock
EXT2-fs: unable to read superblock
cramfs: wrong magic
MINIX-fs: unable to read superblock
FAT: unable to read boot sector
isofs_read_super: bread failed, dev=3c:01, iso_blknum=16, block=32
NTFS-fs error (device 3c:01): read_ntfs_boot_sector(): Unable to read primary boot sector.
NTFS-fs error (device 3c:01): read_ntfs_boot_sector(): Mount option errors=recover not used. Aborting without trying to recover.
NTFS-fs error (device 3c:01): ntfs_read_super(): Not an NTFS volume.
jffs2: attempt to mount non-MTD device 3c:01
pxa_sd_wait_response: responce time out (cmd=52 MMC_STAT=0x2142)
pxa_sd_wait_response: responce time out (cmd=05 MMC_STAT=0x2142)
block_size: 512
write_block_size: 512
<span style="font-weight:bold;color:#FF0000;">block_count: 16777216</span>
total_size: 0
SDHC=0
[SD]-clustsize = 2000
EXT3-fs: Unrecognized mount option quiet
EXT2-fs: Unrecognized mount option quiet
cramfs: wrong magic
MINIX-fs: unable to read superblock
MSDOS FS: IO charset utf8
FAT: unable to read boot sector
FAT: freeing iocharset=utf8
isofs_read_super: bread failed, dev=3c:01, iso_blknum=16, block=32
NTFS-fs error (device 3c:01): parse_options(): Unrecognized mount option quiet.
NTFS-fs warning (device 3c:01): parse_options(): Option iocharset is deprecated. Please use option nls=<charsetname> in the future.
jffs2: attempt to mount non-MTD device 3c:01
EXT3-fs: unable to read superblock
EXT2-fs: unable to read superblock
cramfs: wrong magic
MINIX-fs: unable to read superblock
FAT: unable to read boot sector
isofs_read_super: bread failed, dev=3c:01, iso_blknum=16, block=32
NTFS-fs error (device 3c:01): read_ntfs_boot_sector(): Unable to read primary boot sector.
NTFS-fs error (device 3c:01): read_ntfs_boot_sector(): Mount option errors=recover not used. Aborting without trying to recover.
NTFS-fs error (device 3c:01): ntfs_read_super(): Not an NTFS volume.
jffs2: attempt to mount non-MTD device 3c:01

bucchi さんの改造されたドライバーで正常に認識される SD メモリーカードTranscend 1GB SD TS1GSDC)の例

SD/SDHC driver and memory card information
========================================================
PRODUCT : SL-C1000

SD memory card driver           : use bucchi SD/SDHC memory card driver
SD memory card driver file size : 75296

ls -l /lib/modules/2.4.20/kernel/drivers/block/sharp_mmcsd_m.o result
---------------------------------------------------------
-rw-r--r--    1 root     qpe         75296 Jan 24 18:22 /lib/modules/2.4.20/kernel/drivers/block/sharp_mmcsd_m.o

cat /proc/driver/mmcsd/00/* result
---------------------------------------------------------
  detect      : 1
  manufacture : 27
  product     : 00000
  type        : SD

mount | grep /dev/mmcda1 result
---------------------------------------------------------
/dev/mmcda1 on /usr/mnt.rom/card type vfat (rw,noatime)

df /dev/mmcda1 result
---------------------------------------------------------
Filesystem           1k-blocks      Used Available Use% Mounted on
/dev/mmcda1             997504    185376    812128  19% /usr/mnt.rom/card

fdisk -l result
---------------------------------------------------------

Disk /dev/mmcda: 1021 MB, 1021837312 bytes
31 heads, 62 sectors/track, 1038 cylinders
Units = cylinders of 1922 * 512 = 984064 bytes

     Device Boot    Start       End    Blocks   Id  System
/dev/mmcda1             1      1039    997764+   6  FAT16

dmesg result
---------------------------------------------------------
Linux version 2.4.20 (v18i@tetsu.homelinux.org) (gcc version 2.95.2 19991024 (release)) #4 Sun, 12 Aug 2007 23:47:25 +0900
CPU: XScale-PXA270 revision 7
Machine: SHARP Akita
  :
途中省略
  :
SD Driver Initialized.
sharp_mmcsd 0.30 13 Oct 2004
pxa_sd_wait_response: card removed (cmd=00)
pxa_sd_wait_response: card removed (cmd=00)
pxa_sd_wait_response: card removed (cmd=00)
pxa_sd_wait_id_response: card removed (cmd=00)
  :
途中省略
  :
monitor_modinit: finished
pxa_sd_wait_response: responce time out (cmd=52 MMC_STAT=0x2142)
pxa_sd_wait_response: responce time out (cmd=05 MMC_STAT=0x2142)
block_size: 512
write_block_size: 512
block_count: 1995776
total_size: 1021837312
SDHC=0
[SD]-clustsize = 4000
Partition check:
 mmcda: mmcda1
 mmcda: mmcda1
EXT3-fs: Unrecognized mount option quiet
 mmcda: mmcda1
 mmcda: mmcda1
EXT2-fs: Unrecognized mount option quiet
 mmcda: mmcda1
 mmcda: mmcda1
cramfs: wrong magic
 mmcda: mmcda1
 mmcda: mmcda1
VFS: Can't find a Minix or Minix V2 filesystem on device 3c:01.
 mmcda: mmcda1
 mmcda: mmcda1
MSDOS FS: IO charset utf8