W600 - czyli Cortex M3 z WiFi

Czyli to co mało znane ale mieści się normach ...
ODPOWIEDZ
Awatar użytkownika
squeez
GRafik
Posty: 158
Rejestracja: 16 paź 2017, 23:52

W600 - czyli Cortex M3 z WiFi

Post autor: squeez »

Kilka miesięcy temu pojawiła się informacja o kolejnym esp killer czyli SoC W600 firmy WinnerMicro (http://www.winnermicro.com/en/html/1/156/158/497.html)

W cenie niewiele większej niż 1$.

Jak szybko się pojawiła tak niemal szybko świat zapomniał o tym kilerze :) a to głównie ze względu jak większość mu podobnych ... czyli brak wsparcia, dokumentacji, środowiska.
Z tym, że w tym przypadku w środku siedzi ARM Cortex M3 co stanowi jakąś nadzieję ... i po kilku miesiącach pojawiło się SDK, na chwilę obecną cały czas rozwijane.

Z dokumentacją nadal nie ma szału ale chociaż jest kilka dokumentów po angielsku, wcześniej same chińskie krzaki.

Ale do rzeczy. Najbardziej popularny moduł to "zamiennik" ESP-01 z podobnym układem wyprowadzonych pinów na złączu.
Obrazek

Standardowo zasilanie (3,3V), UART, reset, oraz 3 piny, mogą pełnić funkcję kolejnego interfejsu UART lub jako GPIO.

Owy SoC posiada 1MB FLASH, 288kB RAM i może być taktowany 80MHz.
Obrazek

Pamięć ram podzielona jest na dwie sekcje, jedna dla "systemu" wszystko co związane z obsługą WiFi oraz druga przeznaczona dla użytkownika.

Przejdźmy do ważniejszego jak zamigać LED-em :) i najlepiej w C!
Standardowo modułem można sterować za pomocą komend AT, jako most UART-WiFi to nawet tania alternatywa w porównaniu z innymi modułami. Ale komu by się chciało klepać komendy AT! przecież tam jest M3!

Opis "instalacji" zrobię na swoim przypadku czyli pod systemem Linux, generalnie nie ma większego znaczenia jaka dystrybucja bo potrzebne narzędzia są dostępne w większości dostępnych.

Będziemy potrzebować:
1 - modułu UART pracującego na napięciu 3,3V (piny nie są 5V tolerant, przynajmniej nie znalazłem tego w skromnej dokumentacji)
2 - kompilatora (ale dla ARM to przecież nie problem)
3 - SDK i narzędzi do przygotowania wsadu

Punk 3 najważniejszy znajdziemy na githubie https://github.com/w600/sdk :)

No to zaczynamy:
1 - przygotowanie piaskownicy.
Ja lubię mieć poukładane i to co dotyczy W600 będę trzymał w jednym katalogu, ty zrobisz wedle własnych upodobań.
Zgodnie z powyższym do katalogu w600 pobrałem SDK z githuba:

Kod: Zaznacz cały

mkdir W600
git clone https://github.com/w600/sdk

2 - kompilator.
Z kompilatorem (gcc) dla ARM nie ma problemu. Ale jest mały chiński haczyk :) SDK działa ze starszą wersja kompilatora 4.19 z 2014 roku. Więc trzeba go pobrać. Dla dystrybucji debiano podobnych możemy skorzystać z launchpad-a (https://launchpad.net/gcc-arm-embedded/ ... 4-q4-major) i żeby nie instalować tej wersji (zainstalowaną mam zdecydowanie nowszą) to pobieramy archiwum z kompilatorem:

Kod: Zaznacz cały

wget https://launchpad.net/gcc-arm-embedded/4.9/4.9-2014-q4-major/+download/gcc-arm-none-eabi-4_9-2014q4-20141203-linux.tar.bz2
oczywiście w tym samym katalogu co SDK czyli "W600"
Pobranie archiwum wypakować, żeby ułatwić sobie życie zmieniłem nazwę wypakowanego katalog na gcc-arm-4_9. Tak więc kompilator nie jest instalowany nie będzie się gryźć z inną wersją itp.

3 - ożenić SDK i kompilator.
Jako że nie instalowałem tej wersji kompilatora to system nie wie że go mam i standardowo będzie chciał użyć wersji zainstalowanej w systemie w moim przypadku 7, a tak niestety się nie da, próbowałem ale przy budowie binarek wychodzą błędy.
Aby nie kombinować za wiele nieco zmieniłem plik odpowiedzialny za kompilację w katalogu sdk/tools/tool_chain.def
Dodałem tam linię:

Kod: Zaznacz cały

GCC_DIR = /home/nazwa_usera/W600/gcc-arm-4_9/bin/
czyli pełną ścieżkę gdzie znajdują się binarki kompilatora.
Oraz w sekcji tego pliku:

Kod: Zaznacz cały

# select which tools to use as compiler, librarian and linker
ifeq ($(COMPILE), gcc)
    AR = $(GCC_DIR)arm-none-eabi-ar
    ASM = $(GCC_DIR)arm-none-eabi-gcc
    CC = $(GCC_DIR)arm-none-eabi-gcc
    CPP = $(GCC_DIR)arm-none-eabi-c++
    LINK = $(GCC_DIR)arm-none-eabi-ld
    OBJCOPY = $(GCC_DIR)arm-none-eabi-objcopy
    OBJDUMP = $(GCC_DIR)arm-none-eabi-objdump
dodałem $(GCC_DIR) przed nazwami narzędzi do kompilacji. Dzięki tej modyfikacji w trakcie procesu kompilacji będziemy korzystać z pobranej wcześniej wersji a nie tych dostępnych w systemie.
Jeszcze chwilę pozostańmy w tym katalogu i nadamy prawa do wykonywania dla programów do tworzenia obrazów, czyli:

Kod: Zaznacz cały

chmod +x tools/makeimg
chmod +x tools/makeimg_all
chmod +x tools/makeimg_dbg

Zanim przejdziemy do kompilacji "helloworld" z przykładów z SDK musimy nadać też prawa do wykonania skryptu ułatwiającego proces kompilacji

Kod: Zaznacz cały

chmod +x example/build.sh

No to kompilujemy :)
W katalogu example znajdującego się w SDK jest helloworld od niego zaczniemy, zawiera podkatalog user a tam plik main.c zbudujemy go bez modyfikacji w kodzie, to zostawiam już każdemu we własnym zakresie.

Przechodzimy do katalogu example i wydajmy polecenie:

Kod: Zaznacz cały

./build.sh helloworld
parametrem dla tego skryptu jest nazwa katalogu z przykładem jaki chcemy zbudować, a pliki z wsadem znajdą się w:

Kod: Zaznacz cały

 sdk/bin/nazwa_projektu

... no to do dzieła :)

Kod: Zaznacz cały

.......
Generate  ..//bin/helloworld/helloworld.bin successully
linux platform
..//bin/helloworld/helloworld.bin:   28.9% -- replaced with ..//bin/helloworld/helloworld.bin.gz
secboot_len:4948, app_imglen:47788, total:55788
use 1M flash
Build finish !!!

Tadammm no i co teraz z tym zrobić! :)

No właśnie i tu przyda się przeczytać dokumentację, jest kilka sposobów na wymianę wsadu. Generalnie w układzie jest bootloader i są dwie możliwości wgrania.
1 - całość, czyli nowy bootloader (generowany przy kompilacji) oraz program.
2 - wgranie skompresowanego obrazu samej sekcji programu.

Wszystkie potrzebne pliki są już przygotowane:

Kod: Zaznacz cały

ls ../bin/helloworld/
helloworld.bin  helloworld.fls  helloworld_gz.img  helloworld.map

Dla opcji 1 jest przygotowany plik: helloworld.fls a dla 2: helloworld_gz.img

No dobra ale co dalej czym wgrać ... zgodnie z dokumentacja wsad należy wgrać przy użyciu protokołu Xmodem. Jeśli w systemie nie ma paczki lrzsz to musimy ją zainstalować.

Kod: Zaznacz cały

#apt-get install lrzsz

Podpiąć się do UART0 układu, domyślnie 8N1 i prędkość 115200

Opcja 1.
Żeby skorzystać z tej drogi, należy podać stan niski na pin 13 (PA_0 - bootmode) stan niski i zresetować układ (podać stan niski na pin 2).
w terminalu pojawi si coś w tym stylu:
Zrzut ekranu z 2019-04-22 04-07-02.png

Teraz trzeba w konsoli wydać polecenie:

Kod: Zaznacz cały

sx -vv bin/nazwa_pliku.fls < /dev/ttyUSB0 > /dev/ttyUSB0
gdzie /dev/ttyUSB0 port konwertera USB-UART
wsad zostanie wgrany, należy go jeszcze ręcznie zresetować by nowy wsad został załadowany przy bootowaniu.

Opcja 2.
Tryb ten pozwala na podmianę samej sekcji użytkownika, i do tego potrzebny jest plik z skompresowanym obrazem: .img
Tu jest łatwiej bo nie musimy się dolutować do pinu PA_0, a wystarczy w trakcie normalnej pracy układu trzymać wciśnięty klawisz ESC i zresetować układ. W trakcie bootowania (po resecie) wysłanie znaku klawisza ESC powoduje wejście w tryb upgade.
Zrzut ekranu z 2019-04-22 04-07-36.png

I analogicznie jak wcześniej przesłać odpowiedni plik protokołem Xmodem:

Kod: Zaznacz cały

sx -vv bin/nazwa_pliku.img < /dev/ttyUSB0 > /dev/ttyUSB0
W tym przypadku układ po wgraniu wsadu, rozpakuje go umieści we flash i zresetuje automatycznie uC.

Nie napisałem jeszcze że SDK jest oparte o FreeRTOS, jest sporo przykładów (dema) z softem do chyba każdego peryferiału jaki jest w układzie.
Pomimo skromnej dokumentacji są komentarze w plikach nagłówkowych dzięki czemu można jakoś iść do przodu :)

Mi przypadł póki co ten układ, w obudowie QFP-32 (5x5mm) mam naprawdę fajny materiał do IoT.

Zachęcam do zapoznania z W600 :)

Ja czekam na płytkę (devboard)
Obrazek

Będzie trochę łatwiej bo wszystkie GPIO są wyprowadzone.

Czy jest to ESP killer ... nie wiem ale zasługuje na uwagę i mi przypadł, szkoda tylko że nigdzie nie znanazłem dostępnych samych kostek a jedynie jako moduły, choć w cenie ~4,5 PLN mamy po wylutowaniu oscylator 40MHz i W600 które można używać w swoich projektach :)

A to z aktualnego placu boju ...
Obrazek
Awatar użytkownika
l3n1n
Administrator
Posty: 362
Rejestracja: 28 paź 2017, 8:46
Lokalizacja: 3M

Re: W600 - czyli Cortex M3 z WiFi

Post autor: l3n1n »

Super opis, naprawdę znakomity materiał. Jedno małe ale a właściwie alusie :): coś ci się materiał źle przekleił. Nie będę poprawiał bo może stracić na wartości ;). A W600 już do mnie wędruje :p. Wygląda na to że masz materiał wklejony w środek swojego materiału po raz wtóry.
Awatar użytkownika
squeez
GRafik
Posty: 158
Rejestracja: 16 paź 2017, 23:52

Re: W600 - czyli Cortex M3 z WiFi

Post autor: squeez »

późno było i robiłem kopie do schowka jak bym coś niechcący zrypał :)
i jak widać coś zrypałem :)

Jak możesz to popraw bo ja już nie mogę edytować tego wpisu (nie mam ikonki) :P
Awatar użytkownika
SunRiver
Użytkownik
Posty: 1338
Rejestracja: 08 paź 2017, 11:27
Lokalizacja: Festung Oppeln
Kontakt:

Re: W600 - czyli Cortex M3 z WiFi

Post autor: SunRiver »

No bajerancko panie kolego i tego co nam trzeba wiec czekamy na ciąg dalszy :P
Awatar użytkownika
squeez
GRafik
Posty: 158
Rejestracja: 16 paź 2017, 23:52

Re: W600 - czyli Cortex M3 z WiFi

Post autor: squeez »

Proces wgrywania pokazany jest na obrazku poniżej:
Obrazek

Wgrywanie skompresowanego obrazu (czyli przy resecie układu wysyłane kodu znaku ESC) na screenie widać że po wgraniu wsadu jest on dekompresowany i podmieniany po czym następuje reset i uruchomienie nowego umieszczonego wsadu.

Teraz trochę o zautomatyzowaniu.

W katalogu W600 w którym już jest katalog z sdk i kompilatorem zakładam nowy katalog projekty w nim będę trzymał swoje projekty żeby nie zaśmiecać tego z SDK.

Ja trochę zmodyfikowałem plik build.sh z katalogu z przykładmi i umieściłem go w utworzonym katalogu projekty.
Zawartość tego pliku:

Kod: Zaznacz cały

#!/bin/sh

COMPILE=gcc
FLASH_SIZE=1M

#./build_app_new.sh test_prj debug

if [ -z "$1" ];then
        echo "please input the project folder name !!!"
        exit 1
else
        APP_BIN_NAME=$1
fi

echo ""
echo "start..."
echo ""
if [ -z "$2" ];then
		rm -r $APP_BIN_NAME/bin
		set -e
		make -f Makefile.mk clean APP_BIN_NAME=$APP_BIN_NAME;
		make -f Makefile.mk COMPILE=$COMPILE APP_BIN_NAME=$APP_BIN_NAME TARGET=$APP_BIN_NAME FLASH_SIZE=$FLASH_SIZE
		mkdir -p $APP_BIN_NAME/bin
		mv ../sdk/bin/$APP_BIN_NAME/* $APP_BIN_NAME/bin
        exit 1
fi

if [ $2 = "clean" ];then
	echo "Czyszczenie projektu ..."
	set -e
	make  -f Makefile.mk  clean APP_BIN_NAME=$APP_BIN_NAME;
fi
Należy również skopiować plik Makefile.mk z katalogu z przykładami i umieścić go w katalogu projekty oraz dokonać w niem małej modyfikacji.
W linii w której podana jest ścieżka względna do katalogu z sdk musimy dokonać zmiany:

Kod: Zaznacz cały

TOP_DIR:=../sdk
Teraz jeszcze utworzyłęm jeden skrypt do wgrania wsadu. Plik flash.sh

Kod: Zaznacz cały

#!/bin/sh
COM=/dev/ttyUSB0
BAUDRATE=115200

if [ -z "$1" ];then
        echo "Please input the project folder name !!!"
        exit 1
else
        APP_BIN_NAME=$1
	stty -F $COM $BAUDRATE
fi

echo "Flash SoC..."
if [ $2 = "secboot" ];then
                echo "Wgrywam secboot ..."
		sx -vv $APP_BIN_NAME/bin/$APP_BIN_NAME.fls < $COM > $COM
        exit 1

elif [ $2 = "img" ];then
		echo "Wgrywam image ..."
		sx -vv $APP_BIN_NAME/bin/"$APP_BIN_NAME"_gz.img < $COM > $COM
	exit 1
else
	echo "Brak wymaganych parametrow."
fi
Zmienne COM można zmienić według tego jak pod jakim urządzeniem jest wasz konwerter UART u mnie jest to /dev/ttyUSB0

No to teraz można skopiować cały katalog helloworld z katalogu examples do katalogu projekty

Otworzyć terminal (jeśli jeszcze nie był :) ) i będąc w katalogu z projektami wykonać komendę:

Kod: Zaznacz cały

./build.sh helloworld
co powinno skutkować skompilowaniem projektu, jak wszystko będzie ok to w katalogu z projektem zostanie utworzony katalog bin gdzie będą pliki .fls .img .map potrzebne do wgrania wsadu.

Wgrywanie robimy w analogiczny sposób przy pomocy flash.sh

Kod: Zaznacz cały

./flash.sh helloworld img
Skrypt potrzebuje dwóch parametrów: pierwszy to nazwa projektu do wgrania a drugi to rodzaj wsadu i tu dla obrazu skopresowanego podajemy img a dla całej paczki (plik .fls) wpisujemy secboot

Oczywiście wcześniej wprowadzając W600 w stan "wgrywania" :)

Skrypt build.sh ma jeszcze jedną opcję clean służąca do czyszczenia po kompilacji:

Kod: Zaznacz cały

./build.sh helloworld clean
Wcześniej nie pisałem ale istnieje jeszcze możliwość zmiany wsadu przez OTA czyli bezprzewodowo przez WiFi, szczerze powiedziawszy jeszcze tego nie testowałem ale jak uczynię to opiszę :)
ODPOWIEDZ

Wróć do „Inne moduły WIFI dla IoT”