Đặt lại bộ điều khiển MMC mà không cần tháo thẻ?


9

Tôi đang cố gắng cứu dữ liệu từ thẻ SDHC bằng ddresTHER:

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

Bộ điều khiển, tôi không chắc là nó trên thẻ hay là trong máy tính xách tay của tôi, dường như trả lại lỗi cho tất cả các lĩnh vực (xuất hiện trong syslog) sau khi một số thành phần xấu nhất định đã được đọc (mà không ' T hiển thị trong syslog), tôi thấy rằng việc bật thẻ ra và vào khe lại đặt lại điều này và báo cáo các lĩnh vực tốt là tốt trở lại cho đến khi có quá nhiều thành phần xấu được đọc, v.v.

Hiện tại tôi đang sử dụng vòng lặp này, theo dõi đầu ra trạng thái của ddresTHER, đặt lại thẻ theo cách thủ công. Có cách nào để thiết lập lại bộ điều khiển mà không cần tháo thẻ, vì vậy quá trình cứu hộ có thể chạy không cần giám sát?

Có thể điều này có liên quan, nhưng trong máy tính xách tay Dell này, để người đọc thậm chí nhận thấy một thẻ đã được cắm, nó phải được thực hiện trong khi khởi động hoặc sử dụng echo 1 > /sys/bus/pci/rescan, nhưng chỉ một lần, sau đó thiết bị PCI đọc xuất hiện và mọi thứ hoạt động như mong đợi:

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 có liên quan:

# 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

Tôi cũng đã thử sử dụng đầu đọc thẻ USB, thay vì tạo ra các lỗi này trong syslog, nó chỉ biến mất và cần phải cắm lại để tiếp tục.


Có vẻ như tải lại sdhci_pcimô-đun thực hiện thủ thuật, nhưng tôi tự hỏi liệu có một tùy chọn ít vũ phu hơn để làm điều này không:

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

Câu trả lời:


4

Tôi gặp vấn đề tương tự (lỗi I / O như được hiển thị ở trên) sau khi thay đổi thẻ SD một cách nhanh chóng trong một thiết bị nhúng (Trình đọc sách điện tử Kobo). Nó sẽ không phát hiện ra thẻ mới, dung lượng của nó, v.v. và thay vào đó mong đợi thẻ cũ vẫn còn hiện diện.

Không thể tải lại một mô-đun vì trình điều khiển đã được tích hợp sẵn. device/deletehoặc host/scankhông có sẵn. Đặt tham số mô-đun "có thể tháo rời" không làm cho nó hoạt động.

Giải pháp trong trường hợp của tôi là unbind, và sau đó bind, trình điều khiển cho thiết bị khối 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

Điều tuyệt vời là điều này chỉ ảnh hưởng đến thiết bị mà bạn quan tâm. Nếu có một thẻ khác trong khe cắm bên ngoài (cùng trình điều khiển /dev/mmcblk1) , nó không bị ảnh hưởng.


2

Bạn có thể thử đặt lại thiết bị SATA bằng các bước sau:

Giả sử thiết bị được đặt tên : /dev/mmcblk0p1.

  1. Tìm hiểu xem bộ điều khiển nào được gắn vào thiết bị (chúng ta sẽ cần cái này sau):

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

    LƯU Ý: Phần thú vị nếu câu trả lời là host1, xác định bộ điều khiển.

  2. Ngắt kết nối thiết bị

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

    LƯU Ý: Điều này sẽ xóa thiết bị khỏi xe buýt (một cách hợp lý). Nhìn vào dmesgđể xác nhận.

  3. Quét lại bộ điều khiển

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

    LƯU Ý: host1 là mã định danh từ bước một. Một lần nữa, dmesgsẽ hiển thị các thiết bị được khám phá lại.

Người giới thiệu

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.