รีเซ็ตตัวควบคุม MMC โดยไม่ต้องถอดการ์ดออกหรือไม่


9

ฉันพยายามช่วยเหลือข้อมูลจากการ์ด SDHC โดยใช้ ddrescue:

while true ; do ddrescue -d /dev/mmcblk0p1 mmc.img mmc.log ; done

ตัวควบคุมฉันไม่แน่ใจว่ามันเป็นการ์ดหรือในแล็ปท็อปของฉันดูเหมือนว่าจะส่งกลับข้อผิดพลาดสำหรับทุกภาค (ซึ่งแสดงใน syslog) หลังจากอ่านเซกเตอร์เสียจำนวนหนึ่ง (ที่ไม่ได้อ่าน) ไม่แสดงใน syslog) ฉันพบว่าการเปิดการ์ดออกและเข้าไปในสล็อตอีกครั้งจะรีเซ็ตสิ่งนี้และรายงานภาคที่ดีเช่นกันอีกครั้งจนกว่าจะอ่านเซกเตอร์เสียมากเกินไปและอื่น ๆ

ขณะนี้ฉันกำลังใช้ลูปนี้เฝ้าดูสถานะของ ddrescue รีเซ็ตการ์ดด้วยตนเอง มีวิธีการรีเซ็ตคอนโทรลเลอร์โดยไม่ต้องถอดการ์ดออกดังนั้นกระบวนการช่วยเหลือสามารถทำงานโดยไม่ต้องใส่ข้อมูลได้หรือไม่

อาจเป็นเรื่องที่เกี่ยวข้องกัน แต่ในแล็ปท็อป Dell นี้เพื่อให้ผู้อ่านสังเกตเห็นว่ามีการใส่การ์ดแล้วจะต้องทำในระหว่างการบู๊ตหรือใช้echo 1 > /sys/bus/pci/rescanงาน แต่เพียงครั้งเดียวหลังจากนั้นอุปกรณ์ PCI ของผู้อ่านจะปรากฏขึ้น

07:00.0 System peripheral: JMicron Technology Corp. SD/MMC Host Controller (rev 30)
        Subsystem: Dell Device 046e
        Flags: bus master, fast devsel, latency 0, IRQ 16
        Memory at f0600000 (32-bit, non-prefetchable) [size=256]
        Capabilities: [a4] Power Management version 3
        Capabilities: [80] Express Endpoint, MSI 00
        Capabilities: [94] MSI: Enable- Count=1/1 Maskable- 64bit-
        Kernel driver in use: sdhci-pci

syslog ที่เกี่ยวข้อง:

# pop in card
mmc0: new SDHC card at address b368
mmcblk0: mmc0:b368 NCard 15.0 GiB (ro)
mmcblk0: p1
# ddrescue begins to read, error count increases, until at some point:
mmcblk0: error -110 transferring data, sector 12854624, nr 1, cmd response 0x900, card status 0x0
end_request: I/O error, dev mmcblk0, sector 12854624
mmcblk0: error -110 transferring data, sector 12854625, nr 1, cmd response 0x900, card status 0x0
end_request: I/O error, dev mmcblk0, sector 12854625
mmcblk0: error -110 transferring data, sector 12854626, nr 1, cmd response 0x900, card status 0x0
end_request: I/O error, dev mmcblk0, sector 12854626
mmcblk0: error -110 transferring data, sector 12854627, nr 1, cmd response 0x900, card status 0x0
end_request: I/O error, dev mmcblk0, sector 12854627
mmcblk0: error -110 transferring data, sector 12854628, nr 1, cmd response 0x900, card status 0x0
end_request: I/O error, dev mmcblk0, sector 12854628
# time since last successful read increases, pop out card
mmc0: Card removed during transfer!
mmc0: Resetting controller.
mmcblk0: error -123 sending status command, retrying
mmcblk0: error -123 sending status command, retrying
mmcblk0: error -123 sending status command, aborting
mmc0: card b368 removed
# GOTO 10

ฉันลองใช้เครื่องอ่านการ์ด USB แทนการสร้างข้อผิดพลาดเหล่านี้ใน syslog มันหายไปและต้องเสียบใหม่เพื่อดำเนินการต่อ


ดูเหมือนว่าการโหลดsdhci_pciโมดูลจะทำตามเคล็ดลับ แต่ฉันสงสัยว่ามีตัวเลือกที่โหดร้ายน้อยกว่าในการทำสิ่งนี้หรือไม่:

while sleep 1 ; do
    ddrescue -d -T 1 /dev/mmcblk0p1 mmc.img mmc.log 
    modprobe -r sdhci_pci
    modprobe sdhci_pci
done

คำตอบ:


4

ฉันมีปัญหาเดียวกัน (ข้อผิดพลาด I / O ดังที่แสดงไว้ด้านบน) หลังจากเปลี่ยนการ์ด SD ทันทีในอุปกรณ์ฝังตัว (Kobo eBook Reader) มันจะไม่ตรวจจับการ์ดใหม่ความจุของมันและอื่น ๆ และคาดว่าการ์ดเก่าจะยังคงปรากฏอยู่แทน

ไม่สามารถโหลดโมดูลอีกครั้งได้เนื่องจากมีไดรเวอร์ในตัว device/deleteหรือhost/scanไม่สามารถใช้ได้ การตั้งค่าพารามิเตอร์โมดูล "ถอดออกได้" ไม่สามารถใช้งานได้

การแก้ปัญหาในกรณีของฉันคือการunbindและจากนั้นbindไดรเวอร์สำหรับอุปกรณ์บล็อก MMC

# blockdev --getsize64 /dev/mmcblk0
3965190144
# readlink /sys/block/mmcblk0
../devices/platform/mxsdhci.2/mmc_host/mmc0/mmc0:af9e/block/mmcblk0
# echo mxsdhci.2 > /sys/bus/platform/drivers/mxsdhci/unbind
~~~ change card ~~~
# echo mxsdhci.2 > /sys/bus/platform/drivers/mxsdhci/bind
# blockdev --getsize64 /dev/mmcblk0
8168931328

สิ่งที่ดีคือสิ่งนี้มีผลกับอุปกรณ์ที่คุณสนใจเท่านั้นหากมีการ์ดอื่นในช่องเสียบภายนอก (ไดรเวอร์เดียวกัน/dev/mmcblk1) จะไม่ได้รับผลกระทบ


2

คุณสามารถลองรีเซ็ตอุปกรณ์ SATA โดยใช้ขั้นตอนต่อไปนี้:

/dev/mmcblk0p1สมมติว่าอุปกรณ์ที่มีชื่อ:

  1. ค้นหาตัวควบคุมอุปกรณ์ที่เชื่อมต่อกับ (เราจะต้องใช้สิ่งนี้ในภายหลัง):

    $ readlink /sys/block/mmcblk0p1
     ../devices/pci0000:00/0000:00:1f.2/host1/target1:0:0/1:0:0:0/block/mmcblk0p1
    

    หมายเหตุ:ส่วนที่น่าสนใจถ้าคำตอบคือ host1 ซึ่งระบุตัวควบคุม

  2. ตัดการเชื่อมต่ออุปกรณ์

    $ echo 1 > /sys/block/mmcblk0p1/device/delete
    

    หมายเหตุ:สิ่งนี้จะลบอุปกรณ์ออกจากบัส (ตามหลักเหตุผล) มองหาdmesgการยืนยัน

  3. สแกนคอนโทรลเลอร์อีกครั้ง

    $ echo "- - -" > /sys/class/scsi_host/host1/scan
    

    หมายเหตุ: host1 เป็นตัวระบุจากขั้นตอนที่หนึ่ง อีกครั้งdmesgควรจะแสดงอุปกรณ์ที่ถูกค้นพบ

อ้างอิง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.