Device Tree w VisionSOM

SBC na iMX6 ....
https://somlabs.com/
ODPOWIEDZ
Awatar użytkownika
l3n1n
Moderator
Posty: 322
Rejestracja: 28 paź 2017, 8:46
Lokalizacja: 3M

Device Tree w VisionSOM

Post autor: l3n1n » 19 lip 2018, 7:49

Device tree – zarządzanie zasobami
Co to takiego Device Tree?

Otóż jest to, jak sama nazwa wskazuje, coś co zajmuje się konfiguracją sprzętową naszego urządzenia. Nie będziemy bawić się w wykwintne definicje i dokładne tłumaczenie, ani także nie będę usiłował opowiedzieć o konstrukcji i zasadzie działania Device Tree. Dla programistów amatorów najistotniejsze jest to, że plik, którego edycją będziemy się zajmować zawiera informacje o konfiguracji poszczególnych pinów/padów i interfejsów w naszym urządzeniu. Po dokonaniu wszelkich zmian musimy dokonać kompilacji i uruchomić skompilowany plik na naszym urządzeniu. Istotne jest także to, że możemy uruchomić tylko to, czego będziemy używać i nie będziemy trwonić zasobów i energii na te interfejsy, które nie są nam potrzebne.
Próbowałem dokonać tych zmian na moim VisionSOM ale kompilacja trwała baaardzo długo. Dlatego postawiłem na VirtualBOXie Ubuntu i zgodnie z zaleceniami producenta (SoMLabs) dokonałem właściwej konfiguracji by przeprowadzać zmiany konfiguracji i kompilacji na zewnętrznej maszynie.

Co należy zrobić?

Oto przepis na zupę Ubuntu z VisonSOMem:

1. Instalujemy obraz rootfs Visionsom i uruchamiamy go na systemie hosta.
Otwieramy terminal i piszemy polecenia:

Kod: Zaznacz cały

l3n1n@som:~$sudo apt install qemu-user-static
l3n1n@som:~$wget http://ftp.somlabs.com/somlabs-visionsom-6ull-debian-rootfs-qemu.tar.xz
l3n1n@som:~$sudo tar -xvf somlabs-visionsom-6ull-debian-rootfs-qemu.tar.xz
l3n1n@som:~$sudo cp /etc/hostname ~ /somlabs-debian/etc/hostname
l3n1n@som:~$sudo cp /etc/hosts ~ /somlabs-debian/etc/hosts
l3n1n@som:~$sudo ./somlabs-debian/chtoolchain

2. Zanim zaczniemy konfigurować po swojemu Device Tree za pierwszym razem należy:

a. Przejść do właściwego katalogu:

Kod: Zaznacz cały

root@som:#cd /home/developer/source/kernel/linux-rel_imx_4.1.15_2.1.0_ga		
b. Skopiować właściwą konfigurację do właściwego katalogu:

Kod: Zaznacz cały

root@som:/home/developer/source/kernel/linux-rel_imx_4.1.15_2.1.0_ga# cp /home/developer/source/somlabs-dts-1.0/visionsom-6ull-linux_defconfig /home/developer/source/kernel/linux-rel_imx_4.1.15_2.1.0_ga/.config

c. Uruchamiamy polecenie make:

Kod: Zaznacz cały

root@som:/home/developer/source/kernel/linux-rel_imx_4.1.15_2.1.0_ga#make deb-pkg -j8 CFLAGS_MODULE = -fno-pic
3. Teraz możemy rozpocząć personalizacje naszej konfiguracji.

Uruchamiamy:

Kod: Zaznacz cały

root@som:#nano /home/developer/source/somlabs-dts-1.0/somlabs-visionsom-6ull.dts
No a teraz moi drodzy „hulaj dusza piekła nie ma”, czyli zaczynamy mieszać.
Na początek weźmiemy się za nasze piny. Jeżeli przyjrzycie się uważnie konfiguracji domyślnej urządzenia to okaże się, że nie mamy żadnego pinu do naszej dyspozycji, wszystkie mają jakąś przypisaną funkcję. Na przykład GPIO10, GPIO11, GPIO12, i GPIO13 są przypisane do LEDów użytkownika. Szukamy ich więc we właśnie wyedytowanym pliku konfiguracyjnym.

Obrazek

Jak widać, domyślnie na piny zostały domyślnie przypisane do LED w celu sygnalizowania aktywności w trakcie różnego rodzaju transmisji. Na przykład UART, WiFi, BT itd.
Jesżeli chcemy je „zwolnić”, by były do naszej dyspozycji wystarczy zakomentować, całość (od początkowego nawiasu klamrowego do końcowego) lub jeśli nasze potrzeby są mniejsze możemy zakomentować te piny, których będziemy potrzebować. W pliku odwołania do tych pinów występują także w innym miejscu. Ja jednak spróbuje zakomentować tylko ten kawałek. Będę potrzebował jeszcze coś z interfejsu i2c. Szukam więc tekstu i2c.
Wybieramy skrót ctrl+W i wpisujemy i2c po czym naciskamy Enter.
Zostajemy przeniesieni do linii zawierającej:

Obrazek

Widząc jak wygląda wpis dla i2c1 spróbujemy stworzyć sobie dostęp do kolejnego interfejsu I2C. Wprowadzamy pod spodem następujący wpis:

Kod: Zaznacz cały

&i2c2 {
        clock_frequency = <100000>;
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_i2c2>;
        status = "okay";
};
Konsekwentnie szukamy kolejnego wystąpienia i2c1.

Obrazek

I wprowadzamy odpowiedni wpis zmieniając tylko piny odpowiedzialne za SCL i SDA.

Kod: Zaznacz cały

pinctrl_i2c2: i2c2grp {
                        fsl, pins = <
                                MX6UL_PAD_UART5_TX_DATA__I2C2_SCL 0x4001b8b0
                                MX6UL_PAD_UART5_RX_DATA__I2C2_SDA 0x4001b8b0
                        >;
                }
O co chodzi z definicją padów? Otóż są one z budowane z trzech części. Pierwsza część MX6UL_PAD_UART5_TX_DATA – to nazwa pada występująca w systemie. I2C2_SCL to wybrana, alternatywna funkcja pin a 0x4001b8b0 to dodatkowa konfiguracja pina.
W katalogu /home/developer/source/kernel/linux-rel_imx_4.1.15_2.1.0_ga/arch/arm/boot/dts/ wpisujemy:

Kod: Zaznacz cały

more imx6ul-pinfunc.h
Tu możemy dowiedzieć się więcej o tym, jakie funkcje mogą przybierać poszczególne piny.
Teraz możemy zapisać nasz edytowany plik konfiguracyjny przejść do właściwego katalogu i utworzyć pakiet Debiana:

Kod: Zaznacz cały

root@som:#cd /home/developer/source/somlabs-dts-1.0/
root@som:/home/developer/source/somlabs-dts-1.0# dpkg-buildpackage -us -uc
Kompilacja trwała u mnie kilkanaście sekund. Teraz przegrywamy przy pomocy komendy scp utworzony plik do urządzenia docelowego.

Kod: Zaznacz cały

root@som:#scp /home/developer/source/somlabs-dts_1.0.0_armhf.deb root@10.0.0.5:/root/
10.0.0.5 to przykładowy adres, wy mósicie w tym miejscu wpisać ip własnej maszyny docelowej.
Po wpisaniu tej komendy pojawi się monit o wpisanie hasła root’a z maszyny docelowej. Po jego wpisaniu następuje wgranie pliku do miejsca docelowego. Przechodzimy do konsoli VisionSOM i wpisujemy komendę:

Kod: Zaznacz cały

root@somlabs:#dpkg -i /root/somlabs-dts_1.0.0_armhf.deb
Po wykonaniu tej komendy restartujemy system przy pomocy komendy reboot.
System zacznie się zamykać a następnie uruchamiać ponownie z uwzględnionymi przez nas zmianami.
Pierwszy zauważalnym sygnałem, że nasze zamiary zostały uwzględnione będzie zmiana w zachowaniu się LEDów. Okazuje się, że dotychczas migały one w zależności od wykonywanych poleceń a obecnie wszystkie palą się jednostajnym światłem.
Sprawdzamy też interfejs i2c:

Kod: Zaznacz cały

root@somlabs:#ls /sys/class/i2c-adapter
Widzimy, że w odpowiedzi otrzymaliśmy to co ustawiliśmy w pliku konfiguracyjnym. Są obydwa wejścia i2c. Czyli operacja zmiany w Device Tree zakończyła się sukcesem.

ODPOWIEDZ