Real Time Clock per Orange Pi Zero

Da La cantina di Gvf.
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, un mix fra Armbian e Devuan, la procedura è stata verificata utilizzando Armbian (versione 23.8.3 bookworm)

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: -- -- -- -- -- -- -- -- 
  • per compilare ed aggiungere gli overlay è necessario installare il pacchetto armbian-bsp-cli-orangepizero
Root-prompt.png apt-get install armbian-bsp-cli-orangepizero
  • 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";
                        };
                };
        };

};
download:
Root-prompt.png wget https://cantina.gvf.ve.it/images/4/47/rtc0-i2c0-ds3231.dts
attivazione:
Root-prompt.png armbian-add-overlay rtc0-i2c0-ds3231.dts
Alternativa su I²C0
se invece il RTC è collegato al bus I²C1 va utilizzato (download file rtc0-i2c1-ds3231.dts) analogo al precedente ma col path per la seconda interfaccia
download:
Root-prompt.png wget https://cantina.gvf.ve.it/images/7/77/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";
                        };
                };
        };
};
download:
Root-prompt.png wget https://cantina.gvf.ve.it/images/a/a5/rtc1-soc.dts
attivazione:
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