2

Друг дал мне сломанную SD-карту, надеясь, что я смогу что-нибудь восстановить с нее. У меня нет проблем с установкой любых других карт. Я не получаю никаких блочных устройств в /dev, но подсистема mmc распознает вставленную карту как mmc0 и выводит ее. edit3: спецификации карт из подсистемы mmc выглядят хорошо для меня (добавлено в разделе кода).

edit2: речь идет не о восстановлении данных как таковой. Мой вопрос заключается в том, если и как я могу получить какие-либо данные от признанного mmc0.

Есть ли способ уговорить распознанное устройство mmc, чтобы он дал мне хоть какие-то данные, или все потеряно?

Я не мог понять, что такое "обязательный статус SD", но я думаю, что это стандартный статус для карт памяти SD.

По крайней мере, двоичный дамп содержимого может быть полезен для восстановления чего-либо. Я знаю, что это своего рода безнадежное дело, но я все равно хотел бы попробовать. С этого момента, мне должно быть хорошо идти. Я надеюсь, что блоки не слишком случайно распределены по памяти. Я бы даже дошел до того, чтобы взломать его, но, думаю, я ничего не смогу сделать.

Извините, если это дубликат, я должен был быть очень конкретным в своем поиске, так как большинство моих хитов не были связаны с конкретной проблемой. Спасибо:3

$ dmesg | tail -n3:
[10674.146692] mmc0: cannot verify signal voltage switch
[10674.244739] mmc0: card lacks mandatory SD Status function
[10674.244774] mmc0: new SD card at address 59b4

$ find /sys -name '*mmc*' (abbrev.)
/sys/bus/mmc/devices/mmc0:59b4
/sys/bus/mmc/drivers/mmcblk
/sys/bus/platform/devices/rtsx_pci_sdmmc.0
/sys/bus/platform/drivers/rtsx_pci_sdmmc/rtsx_pci_sdmmc.0
/sys/devices/pci0000:00/0000:00:1c.2/0000:04:00.0/rtsx_pci_sdmmc.0/mmc_host/mmc0/mmc0:59b4
/sys/class/mmc_host/mmc0
/sys/module/mmc_core/holders/mmc_block
/sys/module/mmc_core/holders/rtsx_pci_sdmmc
/sys/module/mmc_block
/sys/module/rtsx_pci/holders/rtsx_pci_sdmmc
/sys/module/rtsx_pci_sdmmc/drivers/platform:rtsx_pci_sdmmc

$ lspci -vvvs 04:00.0
04:00.0 Unassigned class [ff00]: Realtek Semiconductor Co., Ltd. RTS5209 PCI Express Card Reader (rev 01)
    Subsystem: Lenovo Device 21dd
    Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx+
    Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
    Latency: 0, Cache Line Size: 64 bytes
    Interrupt: pin A routed to IRQ 24
    Region 0: Memory at f0600000 (32-bit, non-prefetchable) [size=4K]
    Capabilities: <access denied>
    Kernel driver in use: rtsx_pci
    Kernel modules: rtsx_pci

$ uname -a
Linux 4.4.1-2-ARCH #1 SMP PREEMPT Wed Feb 3 13:12:33 UTC 2016 x86_64 GNU/Linux

$ for i in /sys/bus/mmc/devices/mmc0:59b4/*; do echo -n "$i: "; cat $i; done
/sys/bus/mmc/devices/mmc0:59b4/cid: 041641534d495344000000000000b901
/sys/bus/mmc/devices/mmc0:59b4/csd: 00000000000000000000000000000001
/sys/bus/mmc/devices/mmc0:59b4/date: 09/2011
/sys/bus/mmc/devices/mmc0:59b4/erase_size: 0
/sys/bus/mmc/devices/mmc0:59b4/fwrev: 0x0
/sys/bus/mmc/devices/mmc0:59b4/hwrev: 0x0
/sys/bus/mmc/devices/mmc0:59b4/manfid: 0x000004
/sys/bus/mmc/devices/mmc0:59b4/name: SMISD
/sys/bus/mmc/devices/mmc0:59b4/oemid: 0x1641
/sys/bus/mmc/devices/mmc0:59b4/preferred_erase_size: 0
/sys/bus/mmc/devices/mmc0:59b4/scr: 0000000000000000
/sys/bus/mmc/devices/mmc0:59b4/serial: 0x00000000
/sys/bus/mmc/devices/mmc0:59b4/type: SD
/sys/bus/mmc/devices/mmc0:59b4/uevent: MMC_TYPE=SD
MMC_NAME=SMISD
MODALIAS=mmc:block

обратите внимание: я обнаружил ошибку подсистемы ядра, связанную с моим устройством чтения карт; это не относится к моему ядру, правда.

edit: для справки, вот так выглядит новая рабочая карта в dmesg:

[18936.957097] mmc0: cannot verify signal voltage switch
[18937.064604] mmc0: new ultra high speed SDR104 SDHC card at address e624
[18937.064787] mmcblk0: mmc0:e624 SE16G 14.8 GiB 
[18937.074743]  mmcblk0: p1

Я пытаюсь выяснить, что на самом деле не так с картой, сейчас я собираю ядро с помощью mmc-debug. При чтении спецификаций SD

edit4: после компиляции модифицированного ядра я получил новый вывод. После сравнения упрощенных спецификаций хост-контроллера (с полученным результатом) я понял, что упрощенные спецификации недостаточно охватывают процесс, чтобы я мог понять проблему. Может быть, если кто-то с некоторым пониманием может поделиться своими мыслями?

Я задокументировал вывод отладочной информации dmesg, чтобы помочь с ситуацией:

it starts with this, maybe resets some things o_0, it gets better, soon.
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: sdmmc_get_cd: RTSX_BIPR = 0x00010000
 mmc0: mmc_rescan_try_freq: trying to init card at 400000 Hz
 mmc0: clock 0Hz busmode 2 powermode 1 cs 0 Vdd 21 width 0 timing 0
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: sdmmc_switch_voltage: signal_voltage = 0
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: Initial signal voltage of 3.3v
 mmc0: clock 400000Hz busmode 2 powermode 2 cs 0 Vdd 21 width 0 timing 0

 mmc0: starting CMD52 arg 00000c00 flags 00000195
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: sd_send_cmd_get_rsp: SD/MMC CMD 52, arg = 0x00000c00
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: 0xFDA0(8): 80 01 00 00 00 1f 00 00
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: 0xFDA8(8): 00 ff ff ff ff ff 91 08
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: 0xFDB0(4): 00 00 00 08 00 00 00 00
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: 0xFD52(8): 04 55 00 14 0d 03 03 15
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: 0xFD5A(8): 55 01 02 01 01 00 aa aa
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: 0xFD62(8): e9 55 55 15 04 00 64 04
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: rtsx_pci_send_cmd error (err = -110)
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: CMD 52 0x00000c00 error(-110)
 mmc0: req done (CMD52): -110: 00000000 00000000 00000000 00000000
repeated once with:
 mmc0: starting CMD52 arg 80000c08 flags 00000195
 [...]
 mmc0: req done (CMD52): -110: 00000000 00000000 00000000 00000000

reset card (1) CMD0
 mmc0: clock 400000Hz busmode 2 powermode 2 cs 1 Vdd 21 width 0 timing 0
 mmc0: starting CMD0 arg 00000000 flags 000000c0
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: sd_send_cmd_get_rsp: SD/MMC CMD 0, arg = 0x00000000
 mmc0: req done (CMD0): 0: 00000000 00000000 00000000 00000000
 mmc0: clock 400000Hz busmode 2 powermode 2 cs 0 Vdd 21 width 0 timing 0

voltage check (2) CMD8
 mmc0: starting CMD8 arg 000001aa flags 000002f5
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: sd_send_cmd_get_rsp: SD/MMC CMD 8, arg = 0x000001aa
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: cmd->resp[0] = 0x000001aa
 mmc0: req done (CMD8): 0: 000001aa 00000000 00000000 00000000

get SDIO OCR (5) CMD5 (shortened)
 mmc0: starting CMD5 arg 00000000 flags 000002e1
 mmc0: req failed (CMD5): -110, retrying...
 mmc0: req failed (CMD5): -110, retrying...
 mmc0: req failed (CMD5): -110, retrying...
 mmc0: req done (CMD5): -110: 00000000 00000000 00000000 00000000
this is according to spec, since the card is type=capacity not type=sdio, so flag SDIO=0

I don't know what happens here, I guess it checks for (MP memory present): so step (11)?
 mmc0: starting CMD55 arg 00000000 flags 000000f5
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: sd_send_cmd_get_rsp: SD/MMC CMD 55, arg = 0x00000000
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: cmd->resp[0] = 0x00400120
 mmc0: req done (CMD55): 0: 00400120 00000000 00000000 00000000

since step (2) did not "succeed" this should be (12), spec says to reset the card with CMD0 in this case
 mmc0: starting CMD41 arg 00000000 flags 000000e1
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: sd_send_cmd_get_rsp: SD/MMC CMD 41, arg = 0x00000000
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: cmd->resp[0] = 0x00ff8000
 mmc0: req done (CMD41): 0: 00ff8000 00000000 00000000 00000000

 mmc0: clock 0Hz busmode 2 powermode 0 cs 0 Vdd 0 width 0 timing 0
 mmc0: clock 0Hz busmode 2 powermode 1 cs 0 Vdd 21 width 0 timing 0
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: sdmmc_switch_voltage: signal_voltage = 0
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: Initial signal voltage of 3.3v
 mmc0: clock 400000Hz busmode 2 powermode 2 cs 0 Vdd 21 width 0 timing 0
 mmc0: clock 400000Hz busmode 2 powermode 2 cs 1 Vdd 21 width 0 timing 0

so, powermode 2 it is, then? CMD0 and CMD8 to start back on square one.
 mmc0: starting CMD0 arg 00000000 flags 000000c0
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: sd_send_cmd_get_rsp: SD/MMC CMD 0, arg = 0x00000000
 mmc0: req done (CMD0): 0: 00000000 00000000 00000000 00000000
 mmc0: clock 400000Hz busmode 2 powermode 2 cs 0 Vdd 21 width 0 timing 0
 mmc0: starting CMD8 arg 000001aa flags 000002f5
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: sd_send_cmd_get_rsp: SD/MMC CMD 8, arg = 0x000001aa
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: cmd->resp[0] = 0x000001aa
 mmc0: req done (CMD8): 0: 000001aa 00000000 00000000 00000000

 mmc0: starting CMD55 arg 00000000 flags 000000f5
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: sd_send_cmd_get_rsp: SD/MMC CMD 55, arg = 0x00000000
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: cmd->resp[0] = 0x00000120
 mmc0: req done (CMD55): 0: 00000120 00000000 00000000 00000000
 mmc0: starting CMD41 arg 51300000 flags 000000e1
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: sd_send_cmd_get_rsp: SD/MMC CMD 41, arg = 0x51300000
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: cmd->resp[0] = 0x00ff8000
 mmc0: req done (CMD41): 0: 00ff8000 00000000 00000000 00000000
repeats 34x times until:
 mmc0: cannot verify signal voltage switch
since the working card produces the same output, I guess this is okay.

I don't know what CMD11 is. simple spec does not cover that.
 mmc0: starting CMD11 arg 00000000 flags 00000015
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: sd_send_cmd_get_rsp: SD/MMC CMD 11, arg = 0x00000000
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: cmd->resp[0] = 0x00000320
 mmc0: req done (CMD11): 0: 00000320 00000000 00000000 00000000
 mmc0: clock 0Hz busmode 2 powermode 2 cs 0 Vdd 21 width 0 timing 0
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: sdmmc_switch_voltage: signal_voltage = 1
 mmc0: clock 400000Hz busmode 2 powermode 2 cs 0 Vdd 21 width 0 timing 0

WOW. Were magically back in the spec at step (30) CMD2 is issued to get CID
 mmc0: starting CMD2 arg 00000000 flags 00000067
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: sd_send_cmd_get_rsp: SD/MMC CMD 2, arg = 0x00000000
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: cmd->resp[0] = 0x04164153
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: cmd->resp[1] = 0x4d495344
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: cmd->resp[2] = 0x00000000
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: cmd->resp[3] = 0x0000b901
 mmc0: req done (CMD2): 0: 04164153 4d495344 00000000 0000b901

step (31) get RCA
 mmc0: starting CMD3 arg 00000000 flags 00000075
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: sd_send_cmd_get_rsp: SD/MMC CMD 3, arg = 0x00000000
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: cmd->resp[0] = 0x59b40500
 mmc0: req done (CMD3): 0: 59b40500 00000000 00000000 00000000
RCA != 0 so CMD3 is not issued again. spec ends here.

so uuuuh... no clue. CMD9 is not covered in spec
 mmc0: starting CMD9 arg 59b40000 flags 00000007
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: sd_send_cmd_get_rsp: SD/MMC CMD 9, arg = 0x59b40000
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: cmd->resp[0] = 0x00000000
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: cmd->resp[1] = 0x00000000
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: cmd->resp[2] = 0x00000000
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: cmd->resp[3] = 0x00000001
 mmc0: req done (CMD9): 0: 00000000 00000000 00000000 00000001

nor is CMD7
 mmc0: starting CMD7 arg 59b40000 flags 00000015
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: sd_send_cmd_get_rsp: SD/MMC CMD 7, arg = 0x59b40000
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: cmd->resp[0] = 0x00000700
 mmc0: req done (CMD7): 0: 00000700 00000000 00000000 00000000

 mmc0: starting CMD55 arg 59b40000 flags 00000095
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: sd_send_cmd_get_rsp: SD/MMC CMD 55, arg = 0x59b40000
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: cmd->resp[0] = 0x00000920
 mmc0: req done (CMD55): 0: 00000920 00000000 00000000 00000000

 mmc0: starting CMD51 arg 00000000 flags 000000b5
 mmc0:     blksz 8 blocks 1 flags 00000200 tsac 100 ms nsac 0
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: sd_read_data: SD/MMC CMD 51, arg = 0x00000000
 mmc0: req done (CMD51): 0: 00000000 00000000 00000000 00000000

 mmc0:     8 bytes transferred: 0
comclusion:
 mmc0: card lacks mandatory SD Status function
  rtsx_pci_sdmmc rtsx_pci_sdmmc.0: sdmmc_get_ro: RTSX_BIPR = 0x00010000
 mmc0: new SD card at address 59b4
welp.

0