Pierwsze podejście do ODROID-XU3
ODROID-XU3 to obecnie najmocniejszy model oferowany przez koreańską firmę Hardkernel. Uzbrojony jest w 8 rdzeniowy procesor Exynos5422 z czterema rdzeniami Cortex A15 oraz dodatkowymi czterema Cortex A7. W przypadku rdzeni A15 zastosowano taktowanie zegarem 2GHz, natomiast A7 taktowane są zegarem 1.4GHz. Najciekawszą jednak technologią (oprócz big.LITTLE) jest tutaj HMP (Heterogeneous Multi-Processing), która umożliwia wykorzystywanie wszystkich ośmiu rdzeni w dowolnej konfiguracji, zwiększając wydajność systemu nawet o 20%. Nie ma tutaj więc sztywnego przydziału rdzeni na mniej lub bardziej wymagające zadania.
Hardkernel wypuścił również odchudzoną wersję ODRDOID-XU3 Lite, która posiada wolniejsze zegary taktowania 1.8GHz dla rdzeni A15 oraz 1.3GHz dla rdzeni A7. Została również pozbawiona portu DisplayPort i układów mierzączych pobór energii przez kluczowe podsystemy, takie jak procesor, pamięć i GPU.
Ubuntu 14.04.1 bez większych problemów
Na chwilę obecną jest dostępna dystrybucja Ubuntu 14.04.1 z jądrem 3.10.61. Nie zauważyłem żadnych większych problemów w jego działaniu. Bez obaw możemy dokonać aktualizacji systemu, nie martwiąc się o losy kolejnego restartu.
Wraz z Ubuntu 14.04.1, dostajemy dwa specjalne narzędzia: EnergyMonitor, który pozwala nam obserwować i mierzyć zapotrzebowanie na moc poszczególnych układów oraz ODROID Utility, za pomocą którego w łatwy sposób pobierzemy nowszą wersję jądra i ustawimy niektóre opcje.
Kilka testów na początek
W przypadku kompresji i dekompresji pliku BZIP oraz kompresji pliku WAV do MP3, ODROID-XU3 wypada odrobinę gorzej niż NVIDIA Jetson TK1. Różnice są praktycznie niezauważalne.
Sytuacja zmienią się w przypadku pomiaru prędkości nośnika eMMC. Prędkość odczytu ODROID-XU3 oscyluje w granicach 96MB/s, a w przypadku Jetsona wartość ta wynosi 79MB/s. Tak spora różnica wynika z zastosowanego nośnika eMMC, gdzie Hardkernel zastosował kości pamięci w wersji 5.0, natomiast NVIDIA w wersji 4.41.
Sytuacja odwraca się jednak przy Timing cached reads, gdzie Jetson pokazuje przewagę w zastosowanej pamięci DDR3L taktowanej zegarem 933MHz:
Zobaczmy zatem, jak wypadną wyniki testu OpenSSL Speed AES. Najpierw dla jednego rdzenia, a potem wszystkich dostępnych:
Niestety nawet dostępność HMP w ODROID-XU3, nie pozwoliło przegonić wyników jakie osiągnął Jetson TK1. Na koniec zobaczmy wyniki programu sysbench:
OpenGL / OpenGL ES 3.0 ?
Na tym polu ciężko porównać wyniki, ponieważ Jetson TK1 ma problem z programem glmark2-es2, a z kolei ODROID-XU3 nie obsługuje OpenGL. Wyniki zatem będą prawie na pewno nie do porównania. Ale, co tam.
Standardowo nie uda się uzyskać dobrych wyników, ponieważ sterowniki nie pozwalają przekroczyć 70 fps, uzyskując tym samym ogólny wynik 65 punktów.
=======================================================
glmark2 2012.08
=======================================================
OpenGL Information
GL_VENDOR: ARM
GL_RENDERER: Mali-T628
GL_VERSION: OpenGL ES 3.0
=======================================================
[build] use-vbo=false: FPS: 63 FrameTime: 15.873 ms
[build] use-vbo=true: FPS: 72 FrameTime: 13.889 ms
[texture] texture-filter=nearest: FPS: 71 FrameTime: 14.085 ms
[texture] texture-filter=linear: FPS: 71 FrameTime: 14.085 ms
[texture] texture-filter=mipmap: FPS: 71 FrameTime: 14.085 ms
[shading] shading=gouraud: FPS: 71 FrameTime: 14.085 ms
[shading] shading=blinn-phong-inf: FPS: 71 FrameTime: 14.085 ms
[shading] shading=phong: FPS: 71 FrameTime: 14.085 ms
[bump] bump-render=high-poly: FPS: 70 FrameTime: 14.286 ms
[bump] bump-render=normals: FPS: 72 FrameTime: 13.889 ms
[bump] bump-render=height: FPS: 72 FrameTime: 13.889 ms
[effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 71 FrameTime: 14.085 ms
[effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 71 FrameTime: 14.085 ms
[pulsar] light=false:quads=5:texture=false: FPS: 71 FrameTime: 14.085 ms
[desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 62 FrameTime: 16.129 ms
[desktop] effect=shadow:windows=4: FPS: 67 FrameTime: 14.925 ms
[buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 34 FrameTime: 29.412 ms
[buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 34 FrameTime: 29.412 ms
[buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 42 FrameTime: 23.810 ms
[ideas] speed=duration: FPS: 55 FrameTime: 18.182 ms
[jellyfish] <default>: FPS: 71 FrameTime: 14.085 ms
[terrain] <default>: FPS: 30 FrameTime: 33.333 ms
[conditionals] fragment-steps=0:vertex-steps=0: FPS: 71 FrameTime: 14.085 ms
[conditionals] fragment-steps=5:vertex-steps=0: FPS: 70 FrameTime: 14.286 ms
[conditionals] fragment-steps=0:vertex-steps=5: FPS: 71 FrameTime: 14.085 ms
[function] fragment-complexity=low:fragment-steps=5: FPS: 72 FrameTime: 13.889 ms
[function] fragment-complexity=medium:fragment-steps=5: FPS: 72 FrameTime: 13.889 ms
[loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 72 FrameTime: 13.889 ms
[loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 72 FrameTime: 13.889 ms
[loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 70 FrameTime: 14.286 ms
=======================================================
glmark2 Score: 65
=======================================================
Dopiero pomiar w trybie --off-screen daje miarodajne rezultaty:
=======================================================
glmark2 2012.08
=======================================================
OpenGL Information
GL_VENDOR: ARM
GL_RENDERER: Mali-T628
GL_VERSION: OpenGL ES 3.0
=======================================================
[build] use-vbo=false: FPS: 796 FrameTime: 1.256 ms
[build] use-vbo=true: FPS: 926 FrameTime: 1.080 ms
[texture] texture-filter=nearest: FPS: 1009 FrameTime: 0.991 ms
[texture] texture-filter=linear: FPS: 1002 FrameTime: 0.998 ms
[texture] texture-filter=mipmap: FPS: 1018 FrameTime: 0.982 ms
[shading] shading=gouraud: FPS: 720 FrameTime: 1.389 ms
[shading] shading=blinn-phong-inf: FPS: 748 FrameTime: 1.337 ms
[shading] shading=phong: FPS: 675 FrameTime: 1.481 ms
[bump] bump-render=high-poly: FPS: 408 FrameTime: 2.451 ms
[bump] bump-render=normals: FPS: 1077 FrameTime: 0.929 ms
[bump] bump-render=height: FPS: 1001 FrameTime: 0.999 ms
[effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 767 FrameTime: 1.304 ms
[effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 261 FrameTime: 3.831 ms
[pulsar] light=false:quads=5:texture=false: FPS: 965 FrameTime: 1.036 ms
[desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 180 FrameTime: 5.556 ms
[desktop] effect=shadow:windows=4: FPS: 400 FrameTime: 2.500 ms
[buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 132 FrameTime: 7.576 ms
[buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 128 FrameTime: 7.812 ms
[buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 162 FrameTime: 6.173 ms
[ideas] speed=duration: FPS: 229 FrameTime: 4.367 ms
[jellyfish] <default>: FPS: 532 FrameTime: 1.880 ms
[terrain] <default>: FPS: 33 FrameTime: 30.303 ms
[conditionals] fragment-steps=0:vertex-steps=0: FPS: 940 FrameTime: 1.064 ms
[conditionals] fragment-steps=5:vertex-steps=0: FPS: 733 FrameTime: 1.364 ms
[conditionals] fragment-steps=0:vertex-steps=5: FPS: 919 FrameTime: 1.088 ms
[function] fragment-complexity=low:fragment-steps=5: FPS: 882 FrameTime: 1.134 ms
[function] fragment-complexity=medium:fragment-steps=5: FPS: 676 FrameTime: 1.479 ms
[loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 881 FrameTime: 1.135 ms
[loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 882 FrameTime: 1.134 ms
[loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 780 FrameTime: 1.282 ms
=======================================================
glmark2 Score: 662
=======================================================
glmark2 dla OpenGL ES 3.0 zwrócił ogólny wynik 662 punktów. Jak wspomniałem wcześniej, uruchomienie glmark2-es2 na Jetson TK1 kończy się wywrotką programu, ale doskonale za to działa glmark2 dla OpenGL. Zobaczmy jak wyniki będą wyglądać tutaj, po ustawieniu wszystkich rdzeni w tryb performance:
=======================================================
glmark2 2012.08
=======================================================
OpenGL Information
GL_VENDOR: NVIDIA Corporation
GL_RENDERER: GK20A/NullRM/AXI
GL_VERSION: 4.4.0 NVIDIA 21.1
=======================================================
[build] use-vbo=false: FPS: 1739 FrameTime: 0.575 ms
[build] use-vbo=true: FPS: 3660 FrameTime: 0.273 ms
[texture] texture-filter=nearest: FPS: 2436 FrameTime: 0.411 ms
[texture] texture-filter=linear: FPS: 2459 FrameTime: 0.407 ms
[texture] texture-filter=mipmap: FPS: 2538 FrameTime: 0.394 ms
[shading] shading=gouraud: FPS: 1830 FrameTime: 0.546 ms
[shading] shading=blinn-phong-inf: FPS: 1790 FrameTime: 0.559 ms
[shading] shading=phong: FPS: 1764 FrameTime: 0.567 ms
[bump] bump-render=high-poly: FPS: 1595 FrameTime: 0.627 ms
[bump] bump-render=normals: FPS: 3215 FrameTime: 0.311 ms
[bump] bump-render=height: FPS: 3063 FrameTime: 0.326 ms
[effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 520 FrameTime: 1.923 ms
[effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 201 FrameTime: 4.975 ms
[pulsar] light=false:quads=5:texture=false: FPS: 1954 FrameTime: 0.512 ms
[desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 223 FrameTime: 4.484 ms
[desktop] effect=shadow:windows=4: FPS: 409 FrameTime: 2.445 ms
[buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 322 FrameTime: 3.106 ms
[buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 299 FrameTime: 3.344 ms
[buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 449 FrameTime: 2.227 ms
[ideas] speed=duration: FPS: 1106 FrameTime: 0.904 ms
[jellyfish] <default>: FPS: 466 FrameTime: 2.146 ms
[terrain] <default>: FPS: 49 FrameTime: 20.408 ms
[conditionals] fragment-steps=0:vertex-steps=0: FPS: 2166 FrameTime: 0.462 ms
[conditionals] fragment-steps=5:vertex-steps=0: FPS: 1839 FrameTime: 0.544 ms
[conditionals] fragment-steps=0:vertex-steps=5: FPS: 2167 FrameTime: 0.461 ms
[function] fragment-complexity=low:fragment-steps=5: FPS: 2010 FrameTime: 0.498 ms
[function] fragment-complexity=medium:fragment-steps=5: FPS: 1719 FrameTime: 0.582 ms
[loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 2012 FrameTime: 0.497 ms
[loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 2010 FrameTime: 0.498 ms
[loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 1941 FrameTime: 0.515 ms
=======================================================
glmark2 Score: 1598
=======================================================
Wynik 1598 (!!) punktów robi wrażenie. Nie zapominajmy jednak, że układ graficzny zastosowany w Jetson TK1 to zupełnie inna bajka.
Wróćmy jednak do nośnika eMMC
Z reguły nie potrafię się przekonać do pomiarów programem hdparm. Dlatego sprawdziłem to jeszcze raz, bardziej naturalną metodą. Oczywiście wiemy już, że zastosowane pamięci eMMC 5.0 w ODROID XU3 przełożą się na lepsze wyniki.
time sh -c "dd if=/dev/zero of=/home/file bs=4k count=200000 && sync"
200000+0 records in
200000+0 records out
819200000 bytes (819 MB) copied, 12.1435 s, 67.5 MB/s
real 0m13.767s
user 0m0.100s
sys 0m6.300s
sync ; sh -c 'echo 3 > /proc/sys/vm/drop_caches'
time sh -c "dd if=/home/file of=/dev/zero bs=4k count=200000"
200000+0 records in
200000+0 records out
819200000 bytes (819 MB) copied, 6.6226 s, 124 MB/s
real 0m6.635s
user 0m0.055s
sys 0m2.200s
Oraz dla Jetson TK1:
time sh -c "dd if=/dev/zero of=/home/file bs=4k count=200000 && sync"
200000+0 records in
200000+0 records out
819200000 bytes (819 MB) copied, 17.9846 s, 45.5 MB/s
real 0m19.686s
user 0m0.216s
sys 0m6.588s
sync ; sh -c 'echo 3 > /proc/sys/vm/drop_caches'
time sh -c "dd if=/home/file of=/dev/zero bs=4k count=200000"
200000+0 records in
200000+0 records out
819200000 bytes (819 MB) copied, 10.2501 s, 79.9 MB/s
real 0m10.352s
user 0m0.125s
sys 0m2.101s
Prędkości odczytu 124MB/s vs. 79MB/s oraz zapisu 67MB/s vs.45 MB/s. Widać tutaj doskonale różnicę pomiędzy eMMC 5.0 i eMMC 4.41.
W przypadku Jetsona nie jest to jednak kluczowy problem, ponieważ możemy podłączyć dysk twardy bezpośrednio pod kontroler SATA, gdzie dla dysku HDD uzyskujemy wynik 88 MB/s podczas zapisu oraz 107 MB/s podczas odczytu. Oczwiście podłączenie dysku SSD to już inna historia :)
Podsumowanie
ODROID-XU3 nabyłem głównie pod kątem HTPC do pokoju dziennego, aby zastąpił wysłużonego już ODROID-X2. Pomimo tego, że Linux działa tutaj zaskakująco dobrze, to na chwilę obecną nie uraczymy niestety XBMC / Kodi z obsługą akceleracji sprzętowej. Tutaj zdecydowanie lepiej sprawdzi się Jetson TK1 z pełną obsługą OpenGL, który poradzi sobie nawet z bitrate 120Mbps oraz materiałem 4K. Za jakiś czas pewnie się to zmieni, ale póki co ODROID-y zawsze pozostaną dla mnie sprzętem szytym pod Androida - chyba, że myślimy o zastosowaniach serwerowych... no dobra, mini-serwerowych :)
Jak wypadnie Android na ODROID-XU3? O tym dowiecie się z kolejnego odcinka.
Reklama
IMU GY-86. 3-osiowy żyroskop i akcelerometr MPU6050
Zapraszam do kolejnej części artykułu na temat modułu IMU GY-86. Tym razem Będziemy omawiać 3-osiowy akcelerometr i 3-osiowy żyroskop MPU6050. Między innymi. poznamy zasadę działania filtru Kalmana jak i obsługę sprzętowych przerwań przy detekcji ruchu i upadku swobodnego.
Przeczytaj artykuł: 3-osiowy żyroskop i akcelerometr MPU6050
Iteaduino Lite to jeden z wielu dostępnych klonów Arduino, jednak bez wątpienia zasługuje on na kilka dodatkowych słów. Płytka została wyposażona w autorski, 8-bitowy układ LGT8F88A, który śmiało może konkurować z mikrokontrolerem ATmega88. Najważniejszą cechą tego układu jest obsługa 131 instrukcji, których 80% jest wykonywana w jednym cyklu zegara. Wielkim atutem jest również zdolność pracowania z częstotliwością 32MHz, a więc dwukrotnie większą niż tą, którą znamy chociażby z Arduino UNO z ATmega328.
Zobacz cały artykuł: https://www.jarzebski.pl/arduino/arduino-i-klony/iteaduino-lite-lgt8f88a.html
ODROID-VU, mały pomocnik w ekranowej sprawie
Kilka miesięcy temu rozglądałem się za uniwersalnym wyświetlaczem TFT LCD dla całej gromady urządzeń, które przewinęły się przez mojego Bloga. Niektóre z testowanych przeze mnie urządzeń posiadało swoje dedykowane wyświetlacze, jednak podłączenie ich do innych płytek stanowiło nie lada wyzwanie, a często okazywało się wręcz niemożliwe. Przez długi czas, posiłkowałem się wejściem HDMI w monitorze, ale częste przełączanie się pomiędzy obrazem z DVI, a HDMI za pomocą topornego menu OSD doprowadzało mnie do szewskiej pasji. Drugi monitor byłby rozwiązaniem, ale niestety na takowy nie mam za bardzo miejsca.
Hardkernel zaoferował w końcu coś, co przykuło moją uwagę - ODROID-VU będący 9 calowym, pojemnościowym ekranem dotykowym LCD TFT. Dziesięc punktów dotyku obsługiwane jest przez port USB w standardzie HID. Oznacza to, że będzie on działał praktycznie z każdym system operacyjnym, bez konieczności instalowania wymyślnych sterowników. Gniazdo HDMI pozwala na podłączenie go do praktycznie dowolnego urządzenia! Ekran zasilany jest dedykowanym zasilaczem 5V i pobiera maksymalnie prąd 1.2A.
Z tyłu urządzenia znajduje przeźroczyste tworzywo sztuczne chroniące elektronikę, które jest na tyle cienkie, aby pozwalało nam na dostęp do przycisków sterujących, bez konieczności jego odkręcania. Za pomocą przycisków możemy regulować głośność oraz jasność ekranu. Bardziej po prawo znajdziemy przełącznik, który pozwala nam na ustawienie EDID dla rozdzielczości 1280x720 lub 1280x800. Z prawej zaś strony znajdziemy pełnowymiarowe gniazdo HDMI, 3.5mm wyjście audio, micro USB oraz gniazdo zasilania.
ODROID-VU będę mógł również wykorzystać jako drugi "mini-monitor", nie zaśmiecając sobie ekranu głównego. Do wygody pracy na dwóch ekranach nikogo nie trzeba przekonywać, co prawda pełnowymiarowy monitor to nie jest, ale też jest przyjemnie :)
Jasność ekranu wynosi 250 cd/m2, natomiast kąty widzenia wynoszą odpowiednio 120º (60º + 60º) w poziomie i 100º (60º + 40º) w pionie. Wartości te mogłyby być odrobinę lepsze, ale do moich zastosowań są zupełnie wystarczające. Pod tymi względami ekran jest bardzo zbliżony parametrami do wyświetlacza HU070CTP-HD, który miałem okazję poznać podczas recenzji New MarsBoard A20 - miał tylko on niższą rozdzielczość wynoszącą 1024x600 oraz złącze LVDS/RGB.
Jetson TK1 i zegar czasu rzeczywistego DS3231
Jetson TK1 posiada dwa zegary czasu rzeczywistego - pierwszy z nich znajduje się w kompaktowym układzie PMU AS3722, natomiast drugi obecny jest w układzie SoC Tegra TK1. W podstawowej dystrybucji Linux 4 Tegra, domyślnym zegarem jest ten pierwszy. W przypadku Jetsona jest taki problem, że nie posiada on podtrzymania bateryjnego dla zegarów - w praktyce oznacza to utratę ustawionej daty i czasu po zaniku zasilania. Oczywiście, kiedy zostaniemy połączeni z siecią, czas jest synchronizowany z serwerów NTP, ale kłopot pojawia się, gdy nie jesteśmy połączeni z Internetem.
Na pomoc przyjdzie nam opisywany już wcześniej układ DS3231 oraz magistrala I2C oraz moja kompilacja jądra The Grinch w wersji minimum 19.3.4. O samym jądrze i dodatkowych możliwościach jakie przynosi przeczytacie na forum NVIDIA Developer Zone.
Do dyspozycji dostajemy cztery magistrale I2C, dwie w logice 1.8V i dwie w logice 3.3V:
- GEN1_I2C (1.8V) na 50-pinowym złączu J3A1 i 75-pinowym złączu J3A2 (i2c-0)
- GEN2_I2C (3.3V) na 50-pinowym złączu J3A1 (i2c-1)
- PWR_I2C (1.8V) na 75-pinowym złączu J3A2 (i2c-4)
- CAM_I2C (3.3V) na 75-pinowym złączu J3A2 (i2c-2)
Ponieważ DS3231 doskonale radzi sobie również przy napięciu zasilania 3.3V, skorzystamy z GEN2_I2C (i2c-1)
Linie sygnałowe podciągnięte są już do napięć zasilania poprzez rezystory 1kΩ, więc wystarczy praktycznie podłączyć nasz układ:
Jeśli podłączyliśmy wszystko poprawnie, powinniśmy zobaczyć nasz zegar RTC na magistrali i2c-1 pod adresem 0x68.
- # sudo i2cdetect -y -r 1
- 0 1 2 3 4 5 6 7 8 9 a b c d e f
- 00: -- -- -- -- -- -- -- -- -- -- -- -- --
- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
- 60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
- 70: -- -- -- -- -- -- -- --
Następnie możemy dołączyć DS3231 do magistrali:
- # echo ds3231 0x68 | sudo tee /sys/class/i2c-dev/i2c-1/device/new_device
Po tym zabiegu, powinien załadować się nam moduł rtc_ds1307. Możemy to sprawdzić za pomocą polecenia lsmod.
- Module Size Used by
- rtc_ds1307 10881 0
Dodatkowo powinniśmy mieć już dostęp do naszego zegara poprzez nowo utworzone urządzenie /dev/rtc1 i uzyskać możliwość zapisania do niego aktualnego czasu:
- # sudo hwclock -w -f /dev/rtc1
Sprawdźmy, czy czas został zapisany i możemy go odczytać:
- # sudo hwclock -r -f /dev/rtc1
- Thu 21 Aug 2014 11:01:38 PM UTC -0.434869 seconds
Na zakończenie, możemy dodać dwie linie do naszego skryptu rc.local w celu automatyzacji procesu przy starcie systemu:
- echo ds3231 0x68 | sudo tee /sys/class/i2c-dev/i2c-1/device/new_device
- sudo hwclock -s -f /dev/rtc1
Gdybyśmy chcieli, aby nasz DS3231 był domyślnym zegarem rtc0, musimy zablokować moduł rtc_as3722 w pliku /etc/modprobe.d/blacklist.conf dodając linię:
- blacklist rtc_as3722
Należy przy tym pamiętać, aby zmienić w pliku rc.local poprzedni wpis, aby odczyt odbywał się z rtc0 zamiast rtc1, ponieważ po tym zabiegu nasz układ będzie urządzeniem rtc0.