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.
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.
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
- https://github.com/raspberrypi/linux/wiki/Device-Tree-on-ARCH_BCM2708 – device tree alapfeladatok
- http://lxr.free-electrons.com/source/Documentation/devicetree/bindings/mmc/mmc-spi-slot.txt?v=3.2 – mmc-spi device tree bejegyzés
- https://github.com/msperl/linux-rpi/commit/aef50a19f335ae3d2eb43ac5496c7f03930b394f – kernel pach mmc-spi modulhoz
- https://www.raspberrypi.org/documentation/linux/kernel/building.md – kernel fordítás
- http://pinouts.ru/Memory/sdcard_pinout.shtml – sd pinout
- http://elm-chan.org/docs/mmc/gfx1/micro_contact.jpeg – microsd pinout
- http://www.instructables.com/files/orig/FN1/YEKZ/HN824U1E/FN1YEKZHN824U1E.jpg – rpi pinout