Karta SD w La fonerze, czyli jak zrobić sobie więcej miejsca na pakiety
Ostatnia zmiana: 2013-11-26 18:43

La Fonera (w wersji FON2100A/B/C) dysponuje złączem na krawędzi płytki na którym wyprowadzone są sygnały GPIO. Można do nich dołączyć różne rzeczy; jedną z nich jest karta SD (czyli robimy tzw. SD-MOD).

Hardware

Potrzebne są:
- La Fonera (model FON2100A/B/C w tym przypadku)
- złącze kart SD lub czytnik kart SD
- kawałek 6 lub 7 żyłowej taśmy (takiej jak od dysku PATA)

La Fonera

Z urządzenia należy usunąć kilka elementów (R117, R118, R119, R120 na spodzie oraz C142, C143, C144, C145 na górze płytki przy krawędzi złącza SW1). Są one zbędne i wprowadzają zakłócenia na gpio, więc należy je usunąć (wylutować).

SD

Jeżeli nie mamy samego złącza SD można kupić na allegro tanie i popularne czytniki kart SD - rozebrać go i wylutować wszystkie elementy oprócz złącza. Płytka przydatna jest w lutowaniu kabelków do złącza, więc należy ją zostawić. Ew. można użyć adaptera SD / microSD i przewody przylutować bezpośrednio do adaptera.

Połączenie

Karta SD ma 9 styków numerowanych w następujący sposób


..9 1 2 3 4 5 6 7 8
..._________________
../ # # # # # # # # |
./ # # # # # # # # |
.|# |

Natomiast złącze SW1 w La Fonera oznaczone jest następująco:


    |
    |____________
    |
    | port RJ45
    |____________
    |
    | **
    | * 1
    | * 2
    | * 3
    | * 4
    | * 5
    | * 6
    | **
    |
    |

Nie wnikając w szczegóły oznaczeń, kartę SD (złącze) należy podłączyć do fonery w następujący sposób


    Karta SD La Fonera
    
    9
    1 CS 6 (GPIO 7)
    2 DI 5 (GPIO 1)
    3 GND GND
    4 VDD 3 (+3,3v)
    5 CLK 2 (GPIO 4)
    6 GND GND
    7 DO 1 (GPIO 3)
    8

Dodatkowo złącze 3 i 6 karty SD należy połączyć razem i do masy (GND) La Fonery (czyli np. jeden z czterech dużych punków złącza J3 poniżej SW1 - patrz zdjęcia).
Złącza 8 i 9 karty SD (skrajne) należy zostawić niepodłączone.

Oryginalne rozwiązanie podaje jeszcze potrzebę wlutowania rezystora 10KOhm pomiędzy DO i VDD (złącza 7 i 4 karty SD lub 1 i 3 SW1 fonery). W moim rozwiązaniu brakuje tego rezystora, ale jeżeli będą jakiekolwiek problemy z dostępem do karty należy go wlutować.

Software

Trzeba skompilować OpenWrt Kamikaze/trunk z svn (w tym przypadku: r10937), pamiętając o zaznaczeniu pakietu kmod-mmc-over-gpio (w Kernel modules/Other modules - inne potrzebne zaznaczą się samodzielnie). Oczywiście, aby mieć pożytek z tego, należy jeszcze zaznaczyć jeszcze moduły do obsługi systemów plików i stron kodowych, czyli w sumie:


    kmod-mmc-over-gpio
    kmod-fs-vfat
    kmod-fs-ext2
    kmod-fs-ext3
    kmod-nls-base
    kmod-nls-cp437
    kmod-nls-iso8859-1

Dodatkowo oczywiście to co jest nam potrzebne: serwer ftp, http, klient torrenta itd.

Uwaga: domyślnie plik /etc/init.d/mmc_over_gpio zawiera definicje wykorzystywanych gpio. Problem w tym, jedno z nich definiuje gpio5, które w la fonerze powiązane jest z resetem. Zostawiając taki wpis spowodujemy, że fonera będzie się cały czas rebotowała! Należy więc PRZED kompilację zakomentować linię


    add_device "default" 5 4 3 7 0

i dodać nową zgodnie z naszą definicją wykorzystywanych gpio czyli


    add_device "default" 1 3 4 7 0

w pliku package/mmc_over_gpio/files/mmc_over_gpio.init. Tak przygotowane środowisko należy skompilować i zainstalować firmware na fonerze.

Dla Kamikaze 8.09 wystarczy zainstalować w/w pakiety wraz z zależnościami.
Aktualizacja: powyższy opis dotyczy starszej wersji trunka lub 8.09. W obecnym trunku konfigurację wykonuje się w pliku /etc/config/mmc_over_gpio

Testowanie

Uruchomienie


    /etc/init.d/mmc_over_gpio enable
    /etc/init.d/mmc_over_gpio start

Po uruchomieniu w logu (dmesg) powinny pojawić się m.in. następujące informacje:


    mmc_spi spi32766.0: ASSUMING 3.2-3.4 V slot power
    mmc_spi spi32766.0: SD/MMC host mmc0, no DMA, no WP, no poweroff
    spi-gpio-mmc: MMC-Card "default" attached to GPIO pins 1,3,4,7
    mmc_spi spi32766.0: can't change chip-select polarity
    mmc0: problem reading switch capabilities, performance might suffer.
    mmc0: new SD card on SPI
    mmcblk0: mmc0:0000 SD 1960448KiB
        mmcblk0: p1

(w tym przypadku w złączu była 2GB karta SD GOODRAM). Jak widać została znaleziona jedna partycja, więc można ją podmontować (wcześniej należy upewnić się, że załadowane są odpowiednie strony kodowe)


    mkdir -p /hdd
    insmod nls_base
    insmod nls_cp437
    insmod nls_iso8859-1

i samo montowanie


    mount -t vfat /dev/mmcblk0p1 /hdd

Sukces! Teraz można już normalnie korzystać z karty i postawić serwerek FTP, małe WWW czy ctorrenta (lub zbierać logi z aircracka, ale to już inny temat).

W przypadku błędów należy najpierw upewnić się, że właściwie zostały zlutowane kabelki i nie ma zwarcia pomiędzy poszczególnymi sygnałami.

Wydajność

Niestety, wydajność nie jest najlepszą stroną rozwiązania ponieważ wykorzystywane są porty GPIO do sterowania kartą, a sam sterownik jest dość uniwersalny, żeby można było samodzielnie ustalić piny.

Testy wykonałem w następujący sposób: La Fonera z zamontowaną kartą SD, postawiony serwer FTP (vsftpd, pełny dostęp do anonymousa, jako root wskazany punkt montowania karty). Testy polegały na przesłaniu ok 25MB pliku zawierające binarne dane losowe na kartę a później odczyt tego pliku. Oto wyniki:


    ftp> mput test.bin
    mput test.bin? y
    200 PORT command successful. Consider using PASV.
    150 Ok to send data.
    226 File receive OK.
    25721919 bytes sent in 404.54 secs (62.1 kB/s)
    ftp> lcd /tmp/
    Local directory now /tmp
    ftp> mget test.bin
    mget test.bin? y
    200 PORT command successful. Consider using PASV.
    150 Opening BINARY mode data connection for test.bin (25721919 bytes).
    226 File send OK.
    25721919 bytes received in 414.85 secs (60.6 kB/s)
    ftp>

Czyli jak widać ok 60 kilobajtów /s. Szybko to nie jest, ale pewnie znajdą się zastosowania SD gdzie szybkość nie ma aż takiego znaczenia. Obciążenie procesora na La Fonerze podczas transmisji sięgało 92%.

Zakończenie

Rozwiązanie nie jest hot-plug, czyli nie można karty wyjmować i wkładać podczas pracy systemu.
Jeden obrazek za tysiąc słów, czyli:


(kliknij, aby powiększyć)

(kliknij, aby powiększyć)

(kliknij, aby powiększyć)

(kliknij, aby powiększyć)