Jeśli chcemy podłączyć kartę SD do WRT54GL wystarczy do tego celu gniazdo kart SD i 7 10 cm przewodów (najlepiej taśma), lutownica i trochę manualnych zdolności. Podłączenie wykonujemy według poniższego schematu.
Karta SD, numeracja złącza
9 1 2 3 4 5 6 7 8 ____________________________ / || || || || || || || || | | || | | |
| Pin karty | Opis pinu | Podłączenie do | Opis podłączenia |
|---|---|---|---|
| 1. | CS | GPIO7 | DMZ LED |
| 2. | DI | GPIO2 | White LED |
| 3. | VSS | GND | Serial port pin 9 (JP2) |
| 4. | VDD | 3.3V | Serial port pin 1 (JP2) |
| 5. | CLK | GPIO3 | Orange LED |
| 6. | VSS | GND | Serial port pin 10 (JP2) |
| 7. | DO | GPIO4 | Cisco Tester |
3.3V oraz GND
GPIO2 oraz GPIO3
GPIO 4 oraz GPIO 7
Do poprawnej pracy pamięci SD wymagany jest moduł mmc.o . Moduł kompilujemy samodzielnie lub pobieramy odpowiednią wersje binarną.
1. Pobieramy aktualna wersję modułu mmc ze strony forum OpenWrt.org
2. Moduł „mmc.o” kopiujemy do naszego rutera do katalogu /lib/modules/2.4.30/ lub 2.4.34.
3. Ładujemy moduł
#> insmod mmc
4. Sprawdzamy prawidłowe załadowanie
#> dmesg | grep mmc [INFO] mmc_hardware_init: initializing GPIOs [INFO] mmc_card_init: powering card on. sending 80 CLK [INFO] mmc_card_init: resetting card (CMD0) [INFO] mmc_card_init: doing initialization loop [INFO] mmc_card_init: card inited successfully in 3 tries (0 seconds 196000 usec). [INFO] mmc_init: MMC/SD Card ID: [INFO] mmc_card_config: size = 60928, hardsectsize = 512, sectors = 121856 [WARN] mmc_init: hd_sizes=60928, hd[0].nr_sects=121856 [INFO] mmc_card_init: set_blocklen (CMD16) succeeded ! mmca: p1
mmc Hardware init mmc Card init mmc Card init *1* mmc Card init *2* Size = 60928, hardsectsize = 512, sectors = 121856 Partition check: mmca: p1
5. Dodajemy automatyczne ładowanie modułu
#> echo "mmc" > /etc/modules.d/20-mmc
6. Instalujemy potrzebne pakiety.
#> ipkg install e2fsprogs #> ipkg install kmod-ext2
7. Ustawiamy maskę GPIO.
#> echo "0x9c" > /proc/diag/gpiomask
8. Formatujemy partycję.
#> mkfs.ext2 -j /dev/mmc/disc0/part1
To w przypadku dużych kart może trochę potrwać - kilka ładnych minut.
9. Ładujemy moduł z obsługą i dodajemy ładowanie automatyczne.
#> insmod ext2 #> echo 'ext2' > /etc/modules.d/30-ext2
10. Montujemy partycję i dodajemy montowanie automatyczne w przyszłości.
#> mkdir -p /mnt/sd #> echo "/dev/mmc/disc0/part1 /mnt/sd ext2 defaults 0 0" > /etc/fstab #> mount /dev/mmc/disc0/part1 /mnt/sd #> echo "echo "0x9c" > /proc/diag/gpiomask" > /etc/init.d/S20externalmount #> echo "mount /dev/mmc/disc0/part1 /mnt/sd" >> /etc/init.d/S20externalmount #> chmod +x /etc/init.d/S20externalmount
(plik /etc/init.d/S20externalmount wymaga dodania #!/bin/sh na początku pliku)
11. Konfigurujemy ipkg, dodajemy wpis do /etc/ipkg.conf
#> echo "dest sd /mnt/sd" >> /etc/ipkg.conf
12. Modyfikujemy zmienne systemowe. Zastępujemy w /etc/profile
export PATH=/bin:/sbin:/usr/bin:/usr/sbin
na
export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/mnt/sd/bin:/mnt/sd/sbin:/mnt/sd/usr/bin:/mnt/sd/usr/sbin
dodajemy
export LD_LIBRARY_PATH=/lib:/usr/lib:/mnt/sd/lib:/mnt/sd/usr/lib
13. Teraz możemy cieszyć się nowym dyskiem. Jak chcemy jakiś pakiet zainstalować we wskazanej lokalizacji to:
#> ipkg -d sd install pciutils
O tym jak instalować poprawnie pakiety na pamięci SD/MMC można przeczytać w dziale usbhdd. Należy przy tym pamiętać aby pozamieniać ścieżki prowadzące do naszej pamięci z /hdd na /mnt/sd.
W Kamikaze (dla brcm-2.4) dostępny jest gotowy pakiet z przygotowanym modułem: kmod-broadcom-mmc. Dla routerów innych niż WRT54GL należy przygotować okablowane według poniższych danych:
| Pin karty | Opis pinu | Podłączenie do |
|---|---|---|
| 1. | CS | GPIO7 |
| 2. | DI | GPIO5 |
| 3. | VSS | GND |
| 4. | VDD | 3.3V |
| 5. | CLK | GPIO3 |
| 6. | VSS | GND |
| 7. | DO | GPIO4 |
WRT54GL nie posiada GPIO5, zamiast niego, używany jest GPIO2, powyższy opis GPIO stosuje się więc dla modeli np w WRT54G v3.1. http://wiki.openwrt.org/OpenWrtDocs/Customizing/Hardware/MMC?highlight=%28mmc%29.
W punkcie 6 moduł obsługi filesystemu nazywa się kmod-fs-ext2 i taki pakiet należy zainstalowac.
Ponadto załadowanie modułu z repozytorium kamikaze powoduje błąd i karty nie można ani zamontować ani zformatować, występuje to tylko w WRT54GL przy WRT54G moduł działa prawidłowo. Dlatego też, dla „Kamikaze 7.09 + xwrt” instalacja karty SD przebiega identycznie jak dla Whiterussian, z wprowadzeniem tylko drobnej zmiany w podpunkcie 10 wyżej opisanego tutoriala.
W punkcie 10 dokonujemy więc drobnej korekty.
#> mkdir -p /mnt/sd #> echo "/dev/mmc/disc0/part1 /mnt/sd ext2 defaults 0 0" > /etc/fstab #> mount /dev/mmc/disc0/part1 /mnt/sd #> echo "echo "0x9c" > /proc/diag/gpiomask" > /etc/init.d/custom-user-startup #> echo "mount /dev/mmc/disc0/part1 /mnt/sd" >> /etc/init.d/custom-user-startup #> chmod +x /etc/init.d/custom-user-startup
Dane mogą być nieprawidłowe, gdyż odnoszą sie do starej wersji modułu MMC.
Nie wiem jakie testy przeprowadzić, ale:
root@OpenWrt:/mmc/tmp# time `wget http://downloads.openwrt.org/whiterussian/rc6/bin/openwrt-wrt54g-squashfs.bin` openwrt-wrt54g-squas 100% |*********************************************| 1385 KB 00:00 ETA time: cannot run Connecting Command exited with non-zero status 127 real 0m 0.01s user 0m 0.00s sys 0m 0.01s root@OpenWrt:/mmc/tmp#
W tym czasie vmstat pokazuje:
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---- r b swpd free buff cache si so bi bo in cs us sy id wa 0 0 0 1868 508 5448 0 0 0 0 105 9 0 1 99 0 0 0 0 1868 508 5448 0 0 0 0 105 8 0 1 99 0 3 0 0 436 508 6836 0 0 0 16 922 317 5 81 14 0 0 0 0 480 508 6836 0 0 0 0 117 18 1 2 97 0 0 0 0 480 508 6836 0 0 0 0 104 5 0 1 99 0
Wydaje mi się, że wszystkie operacje zapisu są buforowane. Przy pobieraniu/zapisie plików do 2M, zapis nasŧepuje z opóźnieniem. Powyżej tej wartości system „staje” i dokonuje zapisu. Przejrzę jeszcze kod.
Odczyt:
#> wget http://192.168.1.1/OpenWrt-SDK-Linux-i686-1.tar.bz2
--19:05:19-- http://192.168.1.1/OpenWrt-SDK-Linux-i686-1.tar.bz2
=> `OpenWrt-SDK-Linux-i686-1.tar.bz2.1'
Connecting to 192.168.1.1:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 45,506,979 [application/octet-stream]
100%[==========================================>] 45,506,979 223.65K/s ETA 00:00
19:08:56 (205.17 KB/s) - `OpenWrt-SDK-Linux-i686-1.tar.bz2.1' saved [45,506,979/45,506,979]
W tym czasie vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---- r b swpd free buff cache si so bi bo in cs us sy id wa 3 0 0 492 580 6696 0 0 12 22 142 21 1 22 77 0 3 0 0 436 588 6700 0 0 257 0 374 11 0 99 0 0 3 0 0 424 588 6724 0 0 257 0 384 11 0 99 1 0 3 0 0 396 584 6736 0 0 257 0 392 11 1 99 0 0 3 0 0 388 584 6772 0 0 257 0 389 14 1 99 0 0 4 0 0 352 592 6784 0 0 257 3 479 14 0 99 0 0 3 0 0 328 596 6792 0 0 257 0 393 12 0 100 0 0 3 0 0 316 604 6824 0 0 257 0 405 20 1 99 0 0
Testowałem na SD SanDisk 1G Nie wiem czy to wynika z osiągnięcia przez procesor granicy obsługi GPIO, czy też można ew. coś poprawić w sterowniku. Jak będę miał chwilę to przetestuję z wersją z svn dd-wrt.
Kompletny opis modyfikacji sd-mod dla access-pointa WAP54G z wykorzystaniem GPIO(3,4,6 oraz 7) Linksys wap54g - sd-mod, openwrt
Kompletny opis modyfikacji sd-mod dla La Fonera GPIO La fonera - SDMOD
