Menü Bezárás

SD kártya olvasás Raspberry Pi-vel

Sok esetben jól jöhet, ha Raspberry Pi kártyánk a rendszer számára fenntartott SD kártya mellett képes egy másik kártyát is olvasni. Ennek egyik egyszerű kivitelezési módját mutatja be alábbi cikkünk.

Hardver

Mivel a Raspberry Pi processzora, perifériái illetve az SD kártya is 3.3V-ról üzemel, ezért jelszint illesztéssel nem kell foglalkozni. Az SD kártyát közvetlen rákötöttem az RPI-re, erre számos módszer létezik.

Első megoldásként egy microSD-SD átalakítóra forrasztottam tüskesort. Én ezt használom, mert a többi közül ez a legszebb, illetve nem lehet rosszul belerakni az SD kártyát. Hozzátenném, hogy a régi élcsatlakozós floppykábelekbe is bele lehet erőltetés nélkül dugni az SD kártyákat.
WP_20160706_003
WP_20160706_002

Másik megoldásokat alkalmazhatunk, ha közvetlen egy microSD-t akarunk bekötni. Ekkor közvetlen forraszthatunk kábeleket a memóriakártyára, illetve használhatjuk egy szétbontott hüvelysor késeit. Ezeket zsugorcsövezve egyesével is rádughatjuk a kártyára, vagy egy NYÁK-ra is forraszthatjuk őket, utóbbi esetben nem kell félni zárlattól, azonban a félretolva és fordítva behelyezés problémás lehet.
WP_20160629_001

Természetesen vásárolni is lehet megfelelő foglalatot, ezeknek általában van kártya detektálásra szolgáló érintkezője, amit később a Device Tree-be beírva használhatunk, így hotplug szolgáltatást is elérhetünk.

Szoftver

Az alábbi leírást a legújabb (2016-05-27) Raspbiannal mutatom be. A módszer megegyező a legtöbb verziónál, azonban 4.2-es kerneltől visszamenőleg nagyon eltér.

A Raspbian összerakói úgy döntöttek, hogy 4.2-es kerneltől Device Tree-t használnak a kernelben. A Device Tree rövid leírása, hogy a board specifikus dolgokat nem kell (és nem is illik már) Kernelbe fordítani, a szükséges memóriacímeket stb. egy leírófájlba pakoljuk, ezt lefordítjuk, majd végül a Bootloader minden betöltéskor továbbadja a kernelnek.
A Device Tree-t nem szükséges minden esetben újrafordítani, lehet ún. fregmenteket betölteni, melyekkel módosíthatjuk/kiegészíthetjük a már betöltött Device Tree-t.
Az aktuális Device Tree-t fájlszerűen a /proc/device_tree mappában találjuk, ebből egy hasznos program kódot is képes generálni: dtc -I fs /proc/device-tree Ez tartalmazza az aktuális Device Tree-t, benne az összes akár futásidejű módosítással.

Dolgozzunk azzal a DeviceTree-vel, amit a bootloader közvetlen átad a raspberrynek. A raspberry bootloadere egyébként szeretettel tölt be ún. overlay-t, ezzel pl engedélyezve az SPI buszt (a config.txt-ben lehet látni a sort)
Dumpoljuk le az indításkor betöltött DeviceTree-t: dtc -I dtb /boot/bcm2708-rpi-b.dtb > bcm2708-rpi-b.dts majd nyissuk meg a kapott forrásfájlt szerkesztésre. A (nálam) 206. sor környékén található az SPI rész, itt 1-2 módosítást végezzünk el.

  • Kapcsoljuk be permanensen az SPI-t, az SPI vezérlőnél írjuk át a „status”-t „okay”-ra.
  • Az első SPI-ra kötött perifériát módosítsuk, nem általános SPI soros portként akarjuk használni (spidev), cseréljük le a blokkot erre:
    mmc-slot@0 {
    compatible = "mmc-spi-slot";
    reg = <0>;
    voltage-ranges = <3200 3400>;
    spi-max-frequency = <0x7a120>;
    };

Ezt követően fordítsuk le a Device Tree-t: dtc -I dts -O dtb -o bcm2708-rpi-b.dtb bcm2708-rpi-b.dts, majd cseréljük le a bootláskor betöltött dtb-t (előtte érdemes biztonsági mentést csinálni): cp bcm2708-rpi-b.dtb /boot/bcm2708-rpi-b.dtb. Újraindítás után modprobe mmc-spi paranccsal betölthetjük a szükséges drivert. Jövőbeli verzióknál talán elég idáig csinálni ezt a tutorialt, azonban jelenleg van egy bug a driverben, aminek kijavításához újra kell fordítani a kernelt. A szükséges patch elérhető a forrásokban, illetve a linkek között megtalálható a kernel lefordításához egy tutorial is. Mindezek után működőképes SD interfészt kapunk körülbelül 1 MB/s sebességgel.

Források

WP_20160706_001

Related Posts