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.
Wpisy na podobny temat
- 25 Jul 2014 » Jetson TK1 i drobne testy wydajnościowe Hardware
- 13 Jul 2014 » NVIDIA Jetson TK1 - pierwsze wrażenia Hardware
- 02 Aug 2014 » 8MP kamera See3CAM_80 z autofocusem i USB 3.0 Hardware
Komentarze
Czy magistrala i2c na Jetsonie wymaga jakis dodatkowych operacji aktywacyjnych? Pytam poniewaz nie moge uzyskac komunikacji z modulem fm http://www.seeedstudio.com/depot/Grove-I2C-FM-Receiver-p-1953.html Dodam, ze modul dziala bez problemu podlaczony do BeagleBone Black.
Czy przypadkieb BBC nie ma na i2c poziomów 5v? W jetsonie masz 3.3 lub 1.8.
Sprawdzalem multimetrem poziomy i na BBB mam 3,3v na liniach scl i sda
Sprawdź na schematach TK1 jakie są rezystory podciągające o ile są
Na schemacie są rezystory 1K podciagnięte do 3,3V o oznaczeniach R2B6 i R2B8. Dla pewnosci sprawdzilem poziom na liniach SCL i SDA na Jetsonie i mam 3,3V w stanie nieaktywnym. Dodam jeszcze, że odbiornik fm z którym próbuję się skomunikowac jest widoczny na magistrali BBB pod adresami 0x10 0x11 i 0x60 po skanowaniu programem i2cdetect. Do sterowania sluży adres 0x10. Na Jetsonie nie widac zadnego z tych adresow po skanowaniu. Ale zeby bylo ciekawiej sprobowalem z programu w C czytac bezposrednio z tych adresow na Jetsonie. I o ile na 0x10 i 0x11 nic nie uzyskalem to z 0x60 dostaje jakies wartosci i odbiornik fm odpowiada bitem ACK na wywolania. Wiem to bo podlaczylem do linii analiazator sygnalow do I2C i na odczytach widac ze komunikacja wyglada na wlasciwa. Jednak tak jak wczesniej pisalem do sterowania sluzy adres 0x10 wiec w dalszym ciagu nie jestem w stanie sterowac odbiornikiem fm.
Na schemacie są rezystory 1K podciagnięte do 3,3V o oznaczeniach R2B6 i R2B8. Dla pewnosci sprawdzilem poziom na liniach SCL i SDA na Jetsonie i mam 3,3V w stanie nieaktywnym. Dodam jeszcze, że odbiornik fm z którym próbuję się skomunikowac jest widoczny na magistrali BBB pod adresami 0x10 0x11 i 0x60 po skanowaniu programem i2cdetect. Do sterowania sluży adres 0x10. Na Jetsonie nie widac zadnego z tych adresow po skanowaniu. Ale zeby bylo ciekawiej sprobowalem z programu w C czytac bezposrednio z tych adresow na Jetsonie. I o ile na 0x10 i 0x11 nic nie uzyskalem to z 0x60 dostaje jakies wartosci i odbiornik fm odpowiada bitem ACK na wywolania. Wiem to bo podlaczylem do linii analiazator sygnalow do I2C i na odczytach widac ze komunikacja wyglada na wlasciwa. Jednak tak jak wczesniej pisalem do sterowania sluzy adres 0x10 wiec w dalszym ciagu nie jestem w stanie sterowac odbiornikiem fm.