Real Time Clock per Orange Pi Zero

Da La cantina di Gvf.
Versione del 14 feb 2023 alle 18:58 di Gvf (discussione | contributi) (+ overlay per i2c1)
Jump to navigation Jump to search

Il modulo Orange Pi Zero (OPI zero) non dispone di un Real Time Clock o RTC o, per essere più precisi, il SoC utilizzato lo fornirebbe solo che non è stato previsto il montaggio del relativo quarzo e della batteria tampone quindi la precisione è nulla e in caso di mancanza di alimentazione si azzera. Quindi direi la sua utilità è nulla. Fortunatamente esistono in commercio numerosi integrati che forniscono questa funzionalità con una connessione I²C. Sono anche facilmente reperibili dei moduli che possono venir collegati direttamente sul connettore di espansione dell'OPI Zero (o del Raspberry o di altri moduli simili).

Requisiti

  • un SBC Orange Pi o Raspeberry Pi
  • sistema operativo Armbian
  • un modulo RTC compatibile

SBC

Al momento ho collaudato questa soluzione solo utilizzando un Orange Pi Zero. Teoricamente dovrebbe funzionare su tutti i moduli similari facendo attenzione a quale bus I²C rendono disponibile e utilizzando l'overlay adatto.

Armbian

Per i miei progetti utilizzo un Sistema operativo derivato da Armbian, la procedura è stata verificata utilizzando Armbian (versione ?)

RTC

DS3231 based RTC module.jpg

Occorre fare attenzione a quale modulo si intende usare, alcuni richiedono alimentazione e segnali a 5V e potrebbero essere incompatibili con la scheda da voi utilizzata. Nel caso di Orange Pi Zero io utilizzo l'integrato DS3231 direttamente sul circuito o utilizzando uno dei moduli facilmente reperibili in rete.

Il DS1307 va alimentato a 5V e per essere utilizzato con L'IO a 3.3V richiede un adattatore di livello (puah)

Configurazione con Orange Pi Zero e DS3231

Dopo aver collegato il modulo prescelto è necessario:

  • attivare l'interfaccia I²C (I2C0) usando armbian-config o editando il file /boot/armbianEnv.txt
  • installare i tools I2C
Root-prompt.png apt-get install i2c-tools
  • verificare che il modulo venga visto correttamente all'indirizzo 68 (hex) del bus 0
Root-prompt.png i2cdetect -y 0
il risultato dovrebbe essere simile a questo:
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- 4a -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- -- 
  • compilare ed aggiungere alla configurazione i seguenti overlay:
per rendere disponibile il modulo collegato a I²C0 (download file rtc0-i2c0-ds3231.dts)
/dts-v1/;
/plugin/;

/ {
        compatible = "allwinner,sun4i-a10", "allwinner,sun7i-a20", "allwinner,sun8i-h3", "allwinner,sun50i-a64", "allwinner,sun50i-h5";

        /* 
         * Aliases can be used to set the external RTC as rtc0.
         * Needs supplying the correct path to the I2C controller RTC is connected to,
         * this example is for I2C0 on H2+ (TWI0 on PA11/PA12).
         * NOTE: setting time at boot by the kernel
         * may not work in some cases if the external RTC module is loaded too late
         */
        fragment@0 {
                target-path = "/aliases";
                __overlay__ {
                        rtc0 = "/soc/i2c@1c2ac00/ds3231@68";
                };
        };

        fragment@1 {
                target = <&i2c0>;
                __overlay__ {
                        #address-cells = <1>;
                        #size-cells = <0>;
                        ds3231@68 {
                                compatible = "dallas,ds3232";
                                reg = <0x68>;
                                status = "okay";
                        };
                };
        };

};
con il comando:
Root-prompt.png armbian-add-overlay rtc0-i2c0-ds3231.dts
se invece il RTC è collegato al bus I²C1 va utilizzato (download file rtc0-i2c1-ds3231.dts)
da attivare col comando:
Root-prompt.png armbian-add-overlay rtc0-i2c1-ds3231.dts
per spostare l'RTC del SoC da /dev/rtc0 a /dev/rtc1 (download file rtc1-soc.dts)
/dts-v1/;
/plugin/;

/ {
        compatible = "allwinner,sun4i-a10", "allwinner,sun7i-a20", "allwinner,sun8i-h3", "allwinner,sun50i-a64", "allwinner,sun50i-h5";

        /* 
         * Aliases can be used to set the internal RTC as rtc1.
         */
        fragment@0 {
                target-path = "/aliases";
                __overlay__ {
                        rtc1 = "/soc/rtc@1f00000";
                };
        };

        fragment@1 {
                target = <&rtc>;
                __overlay__ {
                        rtc@1f00000 {
                                status = "disabled";
                        };
                };
        };
};
con il comando:
Root-prompt.png armbian-add-overlay rtc1-soc.dts
  • riavviare il sistema
Root-prompt.png reboot
  • verificare che siano disponibili entrambi gli RTC
Root-prompt.png ls /dev/rtc*
  • il risultato dovrebbe essere qualcosa del genere:
lrwxrwxrwx 1 root root      4 18-12-2022 11:26:08 /dev/rtc -> rtc0
crw------- 1 root root 253, 0 18-12-2022 11:26:08 /dev/rtc0
crw------- 1 root root 253, 0 18-12-2022 11:26:08 /dev/rtc1
  • facoltativamente sui può eliminare il programma fake-hwclock
Root-prompt.png apt-get purge fake-hwclock


Fonti