Temat: Aktualizacja modemu Quectela przez OpenWrt
Niektóre z wykorzystywanych przez nas urządzeń pod OpenWrt mają wbudowany modem komórkowy. O ile systematycznie aktualizujemy OpenWrt do nowszych wersji w celu zwiększenia funkcjonalności lub poprawy bezpieczeństwa o tyle modem jest często zapomnianym elementem systemu. Niektórzy zakładają że skoro działa to nie ma co ruszać, ale skoro producent daje nowsze wersje to ma do tego powód, więc powinno się je dla porządku zainstalować.
Niestety nie wszyscy producenci udostępniają aktualizacje oprogramowania swoich modemów a jeszcze mniejsza liczba udostępnia odpowiednie oprogramowanie pod linuksa; na całe szczęście wyjątkiem jest m.in. Sierra Wireless oraz Quectel. Jeżeli masz w urządzeniu z OpenWrt modem tego ostatniego producenta to ten poradnik jest dla Ciebie, jeżeli nie - czytaj to jako ciekawostkę.
Najpierw musimy dowiedzieć się jaką wersje firmware mamy w modemie. Możemy wykorzystać do tego polecenia AT, a żeby je wydać modemowi musimy posłużyć się jednym z programów do tego celu przeznaczonego, np. odpowiednimi dodatkami do LuCI, Gargoyle, czy mifi, programami konsolowymi typu screen, chat, minicom, picocom czy mój sms-tool. Będzie autoreklama, wykorzystamy sms-toola. Jeżeli nie ma go jeszcze w systemie to można go zainstalować odpowiednim poleceniem (jest w aktualnym repo OpenWrt, oczywiście musimy mieć zestawione połączenie z internetem):
# opkg update
# opkg install sms-tool
Jak już się zainstaluje to wykonujemy np. polecenie ATI:
# sms_tool -d /dev/ttyUSB2 at "ATI"
Quectel
EC25
Revision: EC25EFAR02A08M4G
W moim przykładzie mam modem Quectel EC25 ze starym firmware R02A08, fizycznie jest on w routerze Teltonika RUT950 (co będzie istotne za chwilę). Teraz wystarczy poszukać np. na forum producenta jaka jest aktualna wersja firmware. Niestety z niewiadomych powodów Quectel nie posiada strony z aktualizacjami i nie udostępnia firmware ot tak do pobrania. Należy założyć sobie konto na ich forum, napisać w odpowiednim istniejącym temacie lub założyć nowy wątek z prośbą o aktualne firmware podając dokładnie wersję jaką mamy aktualnie. Jeżeli mamy szczęście to w ciągu kilku godzin dostaniemy email w linkiem do pobrania, przy braku szczęścia - można czekać i dwa tygodnie aż się odezwą. W moim przypadku zajęło to 9 dni i otrzymałem link do wersji EC25EFAR06A17M4G, czyli sporo nowszej. Oczywiście firmware jest różne dla różnych modeli, nawet jest różne dla tego samego modelu ale innej rewizji (w przypadku Quecteli oznaczenie po nazwie modelu, to "EFA" w moim przypadku, ma znaczenie). Jeżeli wgracie inną wersję to modem zostanie programowo uszkodzony (zgadnijcie skąd wiem). Różne wersje firmware do różnych modemów można także znaleźć w internecie, ale opisałem pozyskanie go z "oficjalnego" źródła.
Jeżeli modem można wyjąć z urządzenia to przekładamy go do adaptera USB lub laptopa wyposażonego w odpowiedni slot i pod Windowsem czy Linuksem aktualizujemy firmware i nie ma tematu. Producent może dostarczyć (oczywiście trzeba o to poprosić) także odpowiednie oprogramowanie do aktualizacji pod te systemy.
Natomiast jeżeli modem jest wlutowany w płytkę jako moduł (tak właśnie ma wspomniana Teltonika) lub nie można wyjąć modemu z urządzenia bo jest to trudne logistycznie to można modem zaktualizować bezpośrednio w urządzeniu.
Od pewnego czasu w repozytorium OpenWrt można znaleźć pakiet qfirehose* - to jest właśnie program służący do aktualizacji firmware modemów Quectela. Jest w trochę starszej wersji (w chwili pisania tego opisu w repozytorium jest v1.4.9, producent udostępnia już v1.4.17), ale nadal działa i nie trzeba specjalnie kompilować go dla OpenWrt.
*) ze względów licencyjnych pakiet qfirehose może być niedostępny z repozytorium OpenWrt.
Instalujemy go poleceniem:
# opkg update
# opkg install qfirehose
Ten pakiet potrzebny będzie tylko do aktualizacji modemu, później można go znów odinstalować.
Drugą trudnością jest wielkość firmware wynosząca ok 100MB (mniej lub więcej, zależy od wersji i modemu). Jeżeli mamy tyle dostępnej pamięci flash to po prostu kopiujemy pliki firmware do flash. Jeżeli urządzenie ma port USB to kopiujemy firmware na jakiś nośnik, podłączamy do routera, montujemy nośnik. Jeżeli zaś router nie ma ani wystarczającej pamięci flash ani złącza USB (jak wspomniana Teltonika RUT950) to musimy udostępnić firmware w inny sposób, np. podłączając przez wifi czy kabel jakiś zasób sieciowy.
Możemy wykorzystać NAS, udostępnić pliki przez sambę, nfs, ssh, ftp czy dowolny inny sposób. Ja wykorzystałem ssh: na laptopie zrobiłem katalog /tmp/quectel/ec25, skopiowałem tam pliki z firmware (wystarczy rozpakować zipa bezpośrednio do tego katalogu). Zaś na routerze wykonałem:
# opkg update
# opkg install sshfs
# mkdir /tmp/firmware
# sshfs -v cezary@192.168.11.229:/tmp/quectel/ec25 /tmp/firmware/
Jeżeli wszystko się udało to przez ls /tmp/firmware upewniamy się że router widzi pliki dla modemu.
Jeżeli zaś chcemy użyć USB to po prostu
# mkdir /tmp/firmware
# mount /dev/sda1 /tmp/firmware
Oczywiście nazwy nośników itd należy dostosować do tego czym dysponujemy.
Pamiętamy o wyłączeniu wszystkiego co może korzystać z wanu i modemu, jakieś monitory restartujące połączenie, modemmanagera, demony odczytujące parametry sygnału czy SMS i podobne rzeczy. U mnie wystarczyło wyłączyć crona oraz samo połączenie z internetem:
# /etc/init.d/cron stop
# ifdown wan
Można zaczynać aktualizację:
# qfirehose -f /tmp/firmware/
[000.000]: Version: QFirehose_Linux_Android_V1.4.9
[000.001]: Builded: Dec 19 2023 02:55:03
[000.002]: Find md5 check file </tmp/firmware/md5.txt>
[000.013]: md5 checking: /tmp/firmware/contents.xml pass
[000.158]: md5 checking: /tmp/firmware/update/appsboot.mbn pass
[000.199]: md5 checking: /tmp/firmware/update/ENPRG9x07.mbn pass
[000.213]: md5 checking: /tmp/firmware/update/firehose/partition_complete_p4K_b256K.mbn pass
[000.220]: md5 checking: /tmp/firmware/update/firehose/patch_p4K_b256K.xml pass
[000.272]: md5 checking: /tmp/firmware/update/firehose/prog_nand_firehose_9x07.mbn pass
[000.280]: md5 checking: /tmp/firmware/update/firehose/rawprogram_nand_p4K_b256K_update.xml pass
[002.132]: md5 checking: /tmp/firmware/update/mdm9607-perf-boot.img pass
[017.336]: md5 checking: /tmp/firmware/update/mdm9607-perf-sysfs.ubi pass
[020.567]: md5 checking: /tmp/firmware/update/mdm-perf-recovery-image-mdm9607-perf.ubi pass
[033.713]: md5 checking: /tmp/firmware/update/NON-HLOS.ubi pass
[033.754]: md5 checking: /tmp/firmware/update/NPRG9x07.mbn pass
[033.888]: md5 checking: /tmp/firmware/update/oemapp.ubi pass
[033.896]: md5 checking: /tmp/firmware/update/partition.mbn pass
[033.907]: md5 checking: /tmp/firmware/update/partition_nand.xml pass
[033.965]: md5 checking: /tmp/firmware/update/rpm.mbn pass
[034.044]: md5 checking: /tmp/firmware/update/sbl1.mbn pass
[034.222]: md5 checking: /tmp/firmware/update/tz.mbn pass
[034.224]: Totals checking 18 files md5 value, 0 file fail!
[034.228]: [1] /sys/bus/usb/devices/1-1 2c7c/125/318
... tu dużo komunikatów ...
[115.244]: <response value="ACK" />
[116.251]: THE TOTAL DOWNLOAD TIME IS 79.919 s
[116.251]: Upgrade module successfully.
Proces zakończony sukcesem. Warto odczekać jeszcze chwilę na restart modemu i później ew również zrestartować całe urządzenie.
Po wszystkim sprawdziłem jaką mam wersję
# sms_tool -d /dev/ttyUSB2 at "ATI"
Quectel
EC25
Revision: EC25EFAR06A17M4G
Modem przedstawił się jako "R06A17" czyli operacja została całkowicie zakończona sukcesem.
I na końcu małe ostrzeżenie: jeżeli coś pójdzie nie tak to o ile modem mamy w postaci karty miniPCIe to zawsze można ją zdemontować i spróbować reanimować przez wprowadzenie modemu w odpowiedni tryb pracy. Gorzej jeżeli moduł jest wlutowany w płytkę - czasami producenci nie wyprowadzają na zewnątrz dodatkowych pinów żeby można było modem reanimować oraz może nie być dostępnego odpowiedniego oprogramowania pod OpenWrt. Należy więc robić aktualizację naprawdę w "bezpiecznych warunkach" i z głową - w miarę możliwości nie montować zasobów przez wifi a jeżeli już to zapewnić stabilne połączenie lub najlepiej po kablu, nie robić tego zdalnie w lokalizacji którą mamy 500 km dalej itp. Miejcie trochę instynktu samozachowawczego. No i nie w pierwszy dzień roku po słabo przespanej nocy...