SD Card - LOCK_UNLOCK

Sekcia určená pre Arduino nadšencov

Moderátor: Moderátori

Používateľov profilový obrázok
lucky62
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1151
Dátum registrácie: 14 Feb 2012, 20:16
Bydlisko: Liptovský Mikuláš, SK

SD Card - LOCK_UNLOCK

Príspevok od používateľa lucky62 » 30 Aug 2017, 16:47

Ahojte,

snažím sa dorobiť do obsluhy SD karty (knižnica SD, súbor Sd2Card) podporu na zamknutie a odomknutie SD karty heslom (podpora CMD42).
Ale nerozumiem celkom špecifikácii v režime SPI mode.

Zatiaľ to chápem takto:

1) Host pošle do SD CMD42 vrátane prázdneho argumentu - 6 bytov (CMD | 0x40, 4 krát 0x00, CRC)
2) SD odpovie paketom R1 - 1 byte
3) Host odošle do SD dátovú štruktúru - dĺžka závisí od požadovanej operácie. Predpokladajme odomknutie karty/vymazanie hesla. A tu už mi to nie je úplne jasné...
  • Start Block Token? - 1 byte 0xFE - posiela sa? alebo nie?
    CLR_PWD flag 0x02 (=0000 0010) - 1 byte
    Dĺžka hesla v bytoch (max 16) - 1 byte
    Heslo - N bytov - tu mi nie je jasné v akom poradí odoslať heslo či ako "HESLO" alebo ako "OLSEH"...
    CRC 16 bit - 2 byty
4) SD vráti Data Response Token.. (Môže vrátiť aj Data Error Token? Akým spôsobom čakať na odpoveď?)
5) Môžeme prečítať status pomocou CMD13 SEND_STATUS...

Sú nutné nejaké pauzy medzi odosielaním dát?
Vie niekto poradiť?... (Špecifikácia v prílohe.)

Tiež som si všimol, že knižnica pre niektoré príkazy nepočíta skutočné CRC, ale posiela natvrdo 0xFF... Je to ok?
Prílohy
SD_Physical_Layer_Spec.pdf
(1.04 MiB) 84 stiahnutí
0
....môj bazar....

...Nikdy sa nehádaj s blbcom...

Používateľov profilový obrázok
lucky62
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1151
Dátum registrácie: 14 Feb 2012, 20:16
Bydlisko: Liptovský Mikuláš, SK

Re: SD Card - LOCK_UNLOCK

Príspevok od používateľa lucky62 » 30 Aug 2017, 22:23

Čiastočne som pokročil...
Našiel som nejakú inšpiráciu tu: https://www.seanet.com/~karllunt/sdlocker2.html
Je tam pomerne dobre čitateľný zdrojový kód.

Odtiaľ som zistil, že Start Block Token treba poslať. Autor tam ale nenastavuje veľkosť bloku, ale posiela vždy 512 bytov, čo sa mi nepáči.. :-)

Podarilo sa mi odomknúť kartu funkciou ERASE - zmaže všetko na karte vrátane hesla:

Kód: Vybrať všetko

  // set block length to 1
  if (cardCommand(CMD16, 1)) {
    error(SD_CARD_ERROR_CMD16);
    goto fail;
  }

  // send the command 42 - LOCK_UNLOCK
  if (cardCommand(CMD42, 0)) {
    error(SD_CARD_ERROR_CMD42);
    goto fail;
  }
  
  spiSend( 0xFE ); // send Start Token
  spiSend( 0x08 ); // send ERASE flag

  //send fake CRC
  spiSend(0xFF);
  spiSend(0xFF);

  // wait for response
  for (uint8_t i = 0; ((status_ = spiRec()) & 0xF0) && i != 0xFF; i++);

  // wait for not busy
  for (uint16_t i = 0; ( !spiRec() ) && i != 0xFFFF; i++);

  if ( status_ != 0x05 ) {
    error(0x99);
    goto fail;
  }

  chipSelectHigh();
  return true;

fail:
  chipSelectHigh();
  return false;
Odchytenie odozvy nefunguje dobre, lebo funkcia vrátila chybu, no napriek tomu karta sa odomkla.
Stále sa mi nedarí odomknúť kartu heslom, aby sa zachovali dáta...
0
....môj bazar....

...Nikdy sa nehádaj s blbcom...

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: SD Card - LOCK_UNLOCK

Príspevok od používateľa peterple » 31 Aug 2017, 20:50

Unlocking the card:
• Select a card (CMD7), if not previously selected.
• Define the block length (CMD16), given by the 8-bit card lock/unlock mode, the 8-bit password
size (in bytes), and the number of bytes of the currently used password.
• Send the card lock/unlock command with the appropriate data block size on the data line
including the 16-bit CRC. The data block shall indicate the mode UNLOCK, the length
(PWDS_LEN) and the password itself.
If the PWD content is equal to the sent password, then the card will be unlocked and the card-locked
status bit will be cleared in the status register. If the password is not correct, then the
LOCK_UNLOCK_FAILED error bit will be set in the status register.
Note that unlocking is done only for the current power session. As long as the PWD is not cleared, the
card will be locked automatically on the next power up. The only way to unlock the card is by clearing
the password.
An attempt to unlock an unlocked card will fail and LOCK_UNLOCK_FAILED error bit will be set in the
status register, unless it was done during a password definition or change operation.
Toto je postup na odomknutie ak je nastavené heslo. Robíš to takto?
Neviem ako sa začína CMD42 ale datová štruktúra by mala byť na odomknutie
  1. 0x00 - príkaz unlock ostatné operácie nechceš robiť
  2. 0xnn - dlžka hesla (napriklad 0x05)
  3. "HESLO" poradie samozrejme také isté ako keď si ho tam zapisoval. Takže môžeš aj odzadu alebo ho aj hash-núť
  4. CRC - 7 bitov a posledný bit je jednotka - pozri formát príkazu niekde na začiatku (len neviem čo sa posiela ako prvé či LSB alebo MSB) (strana 54 v pdf)
popis stavov ktoré môžu nastať sú v Table 4-5: Lock Unlock Function (Basic Sequence for CMD42)

Samozrejme pred týmto si musíš do karty to heslo zapísať. Úplne rovnakým spôsobom len bude nastavený príznak SET_PWD, teda prvý byte dát nebude 0x00 ale 0x01.

Edit: tým CRC7 som si už nie tak istý. Možno CRC16.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
lucky62
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1151
Dátum registrácie: 14 Feb 2012, 20:16
Bydlisko: Liptovský Mikuláš, SK

Re: SD Card - LOCK_UNLOCK

Príspevok od používateľa lucky62 » 01 Sep 2017, 08:44

Vďaka za reakciu.
peterple napísal:0x00 - príkaz unlock ostatné operácie nechceš robiť
Vyjadril som sa nesprávne, chcem zmazať heslo, nie len odomknúť kartu na jednu session. Takže posielam flag CLR_PWD teda 0x02.
peterple napísal:"HESLO" poradie samozrejme také isté ako keď si ho tam zapisoval. Takže môžeš aj odzadu alebo ho aj hash-núť
Toto je jasné ale karta bola zamknutá na linuxe utilitou mmc. komkrétne príkazom:
./mmc lock_sd /dev/mmcblk0 <16_Byte_HEX_Code>
Takže neviem, či utilita mmc posiela to heslo odpredu alebo odzadu. Ale to nie je až taký problém. AK mi bude fungovať zamknutie a odomknutie s inou kartou, potom môžem skúsiť poslať heslo normálne odpredu, ak nezaberie skúsim naopak.
peterple napísal:CRC - 7 bitov a posledný bit je jednotka - pozri formát príkazu niekde na začiatku (len neviem čo sa posiela ako prvé či LSB alebo MSB) (strana 54 v pdf)
Namiesto CRC posielam 0xFFFF... Vo všetkých príkladoch na webe, ktoré som videl to tak je. Karty v drvivej väčšine asi CRC ignorujú...
peterple napísal:Edit: tým CRC7 som si už nie tak istý. Možno CRC16.
Keď sa posiela príkaz (napr CMD42) posiela sa CRC7. Keď sa posiela dátový blok, posiela sa CRC16.

Myslím, že to robím, tak ako treba.. Problém mám so správnym vyhodnotením výsledku. Podľa špecifikácie by mala karta na konci bloku poslať odpoveď (7.3.3.1 Data Response Token) v tvare XXX0SSS1, kde XXX sa ignoruje a SSS je status:
  • ‘010’ - Data accepted.
    ‘101’ - Data rejected due to a CRC error.
    ’110’ - Data Rejected due to a Write Error
Nasledovať môže jeden alebo viac BUSY signál (0x00) podľa toho ako dlho potrebuje karta na vykonanie príkazu.

Problém je, že taký status nepríde... A naviac nie je vždy rovnaký....
0
....môj bazar....

...Nikdy sa nehádaj s blbcom...

Používateľov profilový obrázok
lucky62
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1151
Dátum registrácie: 14 Feb 2012, 20:16
Bydlisko: Liptovský Mikuláš, SK

Re: SD Card - LOCK_UNLOCK

Príspevok od používateľa lucky62 » 05 Sep 2017, 07:51

Konečne som to vyriešil...
Zaujímavé bolo to, že krátke príkazy boli vždy OK. Dlhšie príkazy chybovali občas, ten najdlhší - LOCK_UNLOCK, kde posielam 16 bytov dátový blok, vrátil chybu vždy. Pretože vrátený status nebol vždy rovnaký, priviedlo ma to na myšlienku, že chyba bude niekde bližšie k hardvéru - v časovaní signálov.
Nemám momentálne funkčný osciloskop, takže som len pokusne zmenil mód SPI z SPI_MODE0 na SPI_MODE1 a všetko pekne začalo fungovať.
Vysvetlenie SPI módov napr. tu.

Zo špecifikácie SD karty (simplified) som nezistil, v akom móde by mala SD karta pracovať. Možno to v úplnej špecifikácii je uvedené.
Zatiaľ mi stačí, že to funguje...
0
....môj bazar....

...Nikdy sa nehádaj s blbcom...

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: SD Card - LOCK_UNLOCK

Príspevok od používateľa peterple » 05 Sep 2017, 23:27

Časovanie nájdeš pre konkrétnu kartu od konkrétneho výrobcu, nie vo všeobecnom dokumente. Ale to či data sú platné pri nábežnej alebo dobežnej hrane to je základ pri SPI. To som veru nepredpokladal že by si to mohol mať navolené chybne. Nabudúce to bude moja prvá otázka v podobných prípadoch.

To je taký programátorský prístup. Neriešiť hw detaily. Lenže v tom to práve je. V tých detailoch. Inak tie karty idú s hodinami od 0 teda si môžeš urobiť SPI s hodinami 1Hz (alebo 0,1Hz) a pozerať to môžeš aj na ledkách. Netreba osciloskop. Alebo to môžeš clockovať bezzákmitovým tlačidlom. Tak som to robil v dobe keď logický analyzátor stál milióny a dostať sa k dvojkanálovému osciloskopu s dvojitou časovkou kde sa to dalo slušne roztiahnuť a presnoriť bolo tiež obťiažné.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
lucky62
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1151
Dátum registrácie: 14 Feb 2012, 20:16
Bydlisko: Liptovský Mikuláš, SK

Re: SD Card - LOCK_UNLOCK

Príspevok od používateľa lucky62 » 06 Sep 2017, 10:15

No musím povedať, že nastavenie SPI režimu som "zdedil" z pôvodnej Arduino knižnice Sd2Card (súčasť SD knižnice).
V nej sa používa všade SPI_MODE0. Predpokladal som, že to je správne.

Inak v tomto ohľade je dokumentácia nedostatočná.
V dokumentácii k Samsung kartám (v prílohe), som sa dočítal len toto:
Data must always be sampled on the rising edge of the clock.
Chýba informácia, v akom stave má byť CLK, keď je v kľude.. (aj keď to asi nie je dôležité).
Naviac, nie je jasné, či to platí aj pre SPI režim SD karty.
Prílohy
Samsung_MMCPlus_Specification.pdf
(2.18 MiB) 82 stiahnutí
0
....môj bazar....

...Nikdy sa nehádaj s blbcom...

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: SD Card - LOCK_UNLOCK

Príspevok od používateľa peterple » 07 Sep 2017, 20:25

tak to je potom divné. SPI 1 je podľa toho linku dobežná a nie nábežná. Takže ten arduino projekt to mal OK.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
lucky62
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1151
Dátum registrácie: 14 Feb 2012, 20:16
Bydlisko: Liptovský Mikuláš, SK

Re: SD Card - LOCK_UNLOCK

Príspevok od používateľa lucky62 » 09 Dec 2018, 17:47

@pablox ma kontaktoval, s otázkou, ako som v tejto veci pokročil..

Tak prikladám, čo som vytvoril.
Priznám sa, že detaily si už nepamätám, ale fungovalo to...
Prílohy
SDCARD_TOOLS.zip
(15.28 KiB) 121 stiahnutí
0
....môj bazar....

...Nikdy sa nehádaj s blbcom...

maskrtnik01
Ultimate člen
Ultimate člen
Príspevky: 2563
Dátum registrácie: 20 Júl 2010, 00:00
Bydlisko: okolie KE
Vek: 27

Re: SD Card - LOCK_UNLOCK

Príspevok od používateľa maskrtnik01 » 09 Dec 2018, 17:53

lucky62 napísal:Chýba informácia, v akom stave má byť CLK, keď je v kľude.. (aj keď to asi nie je dôležité).
Nedávno som sa pokúšal rozbehať jeden IO, ktorý tiež nemal najlepšie časové diagramy. Vyšlo mi buď CPOL1/CPHA0 alebo opačne. Pokusne som zistil, že iba jedna možnosť funguje.
0

Používateľov profilový obrázok
pablox
Ultimate člen
Ultimate člen
Príspevky: 1736
Dátum registrácie: 19 Júl 2006, 00:00
Bydlisko: Ruzomberok
Vek: 32
Kontaktovať používateľa:

Re: SD Card - LOCK_UNLOCK

Príspevok od používateľa pablox » 12 Dec 2018, 18:18

Vďaka luckymu62 sa mi podarilo odomknúť zamknutú SD kartu, ktorá nebola viditeľná v ničom. Použitý HW Arduino NANO a SD modul. Trvalo mi ale deň, kým som to rozbehol, pomohlo zmeniť #define SD_SPI_MODE SPI_MODE1 na #define SD_SPI_MODE SPI_MODE0.
0

Používateľov profilový obrázok
lucky62
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1151
Dátum registrácie: 14 Feb 2012, 20:16
Bydlisko: Liptovský Mikuláš, SK

Re: SD Card - LOCK_UNLOCK

Príspevok od používateľa lucky62 » 12 Dec 2018, 22:39

Tak gratulujem. :-)
Je zaujímavé, že mne to fungovalo len v MODE1. V staršom príspevku som to spomínal...
0
....môj bazar....

...Nikdy sa nehádaj s blbcom...

Napísať odpoveď