Vendredi 15 mars 2019

Module I2C RTC DS1307 (Real Time Clock)

i2c-ds1307.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 I2C1 on H3
	 * 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@01c2b000/ds1307@68";
		};
	};

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

Liaisons entre le connecteur UEXT1 de la carte A20-Olinuxino-MICRO et le module RTC DS1307 (5v) ou DS1338 (3.3v)

UEXT1 Module RTC
1 : +3.3v Vcc
2 : GND GND
5 : SCK SCL
6 : SDA SDA

ATTENTION : Utilisation du bus i2c-2

Les i2c sur le système
ls /dev/i2c*
/dev/i2c-0 /dev/i2c-1 /dev/i2c-2

i2c-tools

Installation outil de test et vérification bus i2c
sudo apt install i2c-tools

Les bus détectés sudo i2cdetect -l

i2c-3	i2c       	mv64xxx_i2c adapter             	I2C adapter
i2c-1	i2c       	mv64xxx_i2c adapter             	I2C adapter
i2c-2	i2c       	mv64xxx_i2c adapter             	I2C adapter
i2c-0	i2c       	sun4i_hdmi_i2c adapter          	I2C adapter

Le module est connecté sur le bus 3
sudo i2cdetect -y 3

     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: -- -- -- -- -- -- -- --                         

On voit que le RPi a détecté un composant à l’adresse 0x68 qui d’après la doc constructeur est l’adresse par défaut.Il faut un élément logiciel pour le contrôler (pilote).

Pilote du module DS1307

Le bus i2c et le pilote ds1307 sont actifs dans la configuration du kernel compilé précédemment, sinon

#
# I2C support
#
CONFIG_I2C=y

#
# I2C RTC drivers
#
CONFIG_RTC_DRV_DS1307=y

Chargement du module DS1307

Charger le module
sudo modprobe rtc_ds1307
Préciser l’adresse du composant 0x68
sudo -s
echo "ds1307 0x68" > /sys/class/i2c-adapter/i2c-3/new_device
On vient d’associer l’adresse 0x68 au pilote rtc_ds1307
Vérification
dmesg | tail

[ 1283.720988] rtc-ds1307 3-0068: registered as rtc1
[ 1283.721283] i2c i2c-3: new_device: Instantiated device ds1307 at 0x68

Le circuit est pris en charge et est utilisé par le système pour servir de première horloge temps réel sous la forme du fichier /dev/rtc1

Mise à l’heure

On va mettre à l’heure le module avec celle du système (à jour si connecté sur le réseau via ntp)
hwclock -f /dev/rtc1 -w
Lecture de l’heure sur le module
hwclock -f /dev/rtc1 -r

2018-11-09 09:16:59.240428+0100

Chargement automatique

Debian 9 Stretch - rc.local obsolète, utlisation systemd

  • Au démarrage on associe l’adresse 0x68 au pilote rtc_ds1307 par le biais du fichier /etc/rc.local
  • Puis on ajuste l’heure système à celle de l’horloge matérielle
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

I2CDIR=/sys/class/i2c-adapter/i2c-3
if [ -d "$I2CDIR" ]; then
 echo "ds1307 0x68" > $I2CDIR/new_device
 hwclock -f /dev/rtc1 -s
fi

exit 0

Le chemin est stocké dans une variable I2CDIR et est utilisée pour tester si le répertoire existe :

  • Dans le cas où il n’existe pas ,cela signifie que le pilote pour le support i2c ne s’est pas chargé .
  • Si le répertoire existe ,la commande est exécuter pour déclarer le composant sur le bus et mettre à jour l’heure système