Hallo Leute, bin auf der Suche,nach der einfachsten Lösung, um mit einer SD Karte im internen Kartenleser, via terminal zu kommunizieren. Ich möchte gerne CMD befehle via Terminal an die SD senden und zum Beispiel die CID oder Serien-Nummer auslesen. Benutze zurzeit Ubuntu 16.04 LTS, es sollte auch die Antwort der Karte in der Konsole ersichtlich sein. Danke im voraus.
über Spi mit SD Karte kommunizieren
Anmeldungsdatum: Beiträge: Zähle... |
|
Projektleitung
Anmeldungsdatum: Beiträge: 12527 |
Bin mir nicht ganz sicher, was Du versuchst. Eine SD-Karte ist ein Speichermedium. Wenn die gemountet ist, kannst Du etwas darauf schreiben und davon lesen. Aber was meinst Du mit "via terminal [...] kommunizieren"? Und was sollen "CMD befehle" sein? CMD ist die Windows-Shell. Ach ja, und 16.04 ist asbach. |
(Themenstarter)
Anmeldungsdatum: Beiträge: 5 |
Es gibt verschiederne befehle die Über SPIan die SD Karte gesendet werden das die SD Karte z.B intialisiert . So sieht das aus (CMD1 None(0) R1 No SEND_OP_COND Initiate initialization process) Initialization In idle state, the card accepts only CMD0, CMD1, CMD8, ACMD41, CMD58 and CMD59 |
Anmeldungsdatum: Beiträge: 10978 |
Wie ist der Kartenleser angebunden? Wenn der intern über USB dran hängt, kommt man normalerweise nicht so einfach an diese Informationen, weil der Controller diese Informationen nicht in einem standardisierten Format zugänglich macht. Wenn der Kartenleser hingegen direkt an einem (PCIe-)Bus hängt, exponiert der Kernel diese Felder - vgl. z.B.: https://www.cameramemoryspeed.com/sd-memory-card-faq/reading-sd-card-cid-serial-psn-internal-numbers/ Im Zweifelsfall nimm Hardware mit ausreichend flotten GPIO-Ports (z.B. an einem Einplatinencomputer) oder einen µC und schreib dir den Code zur Kommunikation mit dem Ding selber. |
(Themenstarter)
Anmeldungsdatum: Beiträge: 5 |
Guten Morgen, danke für die rasche und kompetente Antwort. Der interne Kartenleser ist über PCIe angebunden. Da ich aber leider nicht Programmieren kann, könntest du mir bitte sagen, wie ich anfange mit so einem Programm unter Ubuntu in C oder in Python? Sollte möglichst einfach und verständlich gegliedert sein, zu einfachen kommunikation via SPI mit der SD Karte. Besten Dank im Voraus. |
Anmeldungsdatum: Beiträge: 10978 |
Dann müsstest du u.a. die cid und scr sowie die Seriennummer über sysfs auslesen können (https://www.kernel.org/doc/html/v5.14/driver-api/mmc/mmc-dev-attrs.html hat eine Übersicht, was da verfügbar sein sollte), wenn du den Namen des Blockdevice für die SD-Karte kennst - z.B. wären das auf meinem alten CubieTruck diese Pfade für den internen micro-SD-Slot: $ cat /sys/class/block/mmcblk1/device/cid $ cat /sys/class/block/mmcblk1/device/srt $ cat /sys/class/block/mmcblk1/device/serial
Das ist oft schwer so hardwarenah zu arbeiten, wenn die Grundlagen fehlen - brauchst du da irgendetwas an Funktionalität, das über die vom Kernel bzw. sysfs angebotene Funktionalität hinaus geht?
Da ich mit PCIe Treibern noch keine Erfahrung habe, würde das mit einem Microcontroller oder Raspberry Pi angehen (da kann man das spidev-Modul recht einfach nutzen - für die Python-Bibliothek gibt es hier eine Einführung: https://www.sigmdel.ca/michel/ha/rpi/dnld/draft_spidev_doc.pdf - oder mit cpb-/spi-tools von der Shell aus Befehle absetzen) - das erspart einem den Umweg über die Abstraktionen des Linux-Kernels. |
(Themenstarter)
Anmeldungsdatum: Beiträge: 5 |
Ja das habe ich schon geschafft, aber mehr leider noch nicht.
Ich würde gerne einfache Befehle senden, wie z.B. cmd62 0xEFAC62EC (enter vendor mode), CMD9, CMD10 oder die Seriennummer (nicht die CID) der SD Karte ändern per SPI und mit dem Logic Analyser die Signale auswerten. spi-tools habe ich schon getestet konnte aber leider keine brauchbaren Ergebnisse erreichen, da mir die Kenntnis zum Benutzen fehlt. Kann ich mit SPI-tools auch ohne Microkontroller mit der SD Karte interagieren via SPI unter Ubuntu 16.04 LTS? Ich habe leider keinen RaspberryPi, hätte aber einen Arduino Mega 2560 und einen Nano, geht das mit denen auch samt SD-Karten Modul? |
Anmeldungsdatum: Beiträge: 10978 |
Das ist die Frage, ob das geht (laut https://www.cameramemoryspeed.com/sd-memory-card-faq/reading-sd-card-cid-serial-psn-internal-numbers/ ist die Seriennummer ein Feld der CID) - das mit cmd62 war doch ein Exploit aus https://bunniefoo.com/bunnie/sdcard-30c3-pub.pdf - das galt nur für Samsung-Speicher und die interessante Frage ist, ob man außerhalb der SD-Spezifikation die CID bei den Karten, die du hast noch ändern kann - laut beaups/SamsungCID/issues/2 scheint das bei ab 2017 produzierten Samsung SD-Karten nicht mehr so einfach zu gehen.
Dazu brauchst du erst ein über das spidev-Kernelmodul ansprechbares SPI-Interface. Ich weiß nicht, ob dein Kartenleser das einfach so exponiert, dass man das reguläre Treibermodul entladen und spidev dafür konfigurieren kann.
Ja, das sollte gehen - in dilshan/sdfatlib/tree/main/sddriver gibt es wie es aussieht Code, mit dem man SD-Karten über SPI ansprechen und Befehle senden kann (dilshan/sdfatlib/blob/main/sddriver/sddriver.c) - darauf sollte man aufbauen können. Der Zugriff auf SPI mit dem Arduino ist hier dokumentiert: https://docs.arduino.cc/learn/communication/spi |
(Themenstarter)
Anmeldungsdatum: Beiträge: 5 |
Danke für die Hilfe,ich werde es mal versuchen ob ich was zusammen bringe |