RTC(4)

NOM
rtc - Horloge temps réel

SYNOPSIS
#include <linux/rtc.h>

int ioctl(fd, RTC_request, param);

DESCRIPTION
Voici l'interface des pilotes pour les horloges temps réel (RTC) (Ndt : Real Time Clock). La plupart des ordinateurs ont une ou plusieurs horloge(s) matérielle(s) qui enregistre(nt) l'heure courante. On les appelle « horloge(s) temps réel ». L'une d'entre elles possède normalement une pile comme alimentation de secours qui l'alimente de sorte qu'elle conserve le temps lorsque l'ordinateur est éteint. Les horloges temps réel fournissent souvent des alarmes et autres interruptions. Tous les PC x86 et systèmes basés sur ACPI ont une horloge temps réel compatible avec le circuit Motorola MC146818 présent sur les premiers PC/AT. Aujourd'hui, une telle horloge est couramment implémentée dans le jeu de puce de la carte mère (south bridge) et utilise une pile de sauvegarde. Sur les systèmes qui ne sont pas des PC, comme les systèmes embarqués construits autour de processeurs « système sur une puce », utilisent d'autres implémentations. Ils n'offrent généralement pas la même fonctionnalité que l'horloge temps réel d'un PC/AT.

  RTC vs horloge système
L'horloge RTC ne doit pas être confondue avec l'horloge système qui est une horloge logicielle maintenue par le noyau et utilisée pour implémenter les appels système gettimeofday(2) et time(2), aussi bien que pour horodater les fichiers, etc. L'horloge système compte les secondes et microsecondes depuis le début de l'Époque POSIX, c'est-à-dire le 1er janvier 1970 à 00H00 UTC. (Une implémentation classique est de compter les interruptions de temporisation, une par « jiffy », à une fréquence de 100, 250 ou 1000 Hz.) Ainsi, cela est supposé indiquer l'heure, comme le fait également l'horloge RTC. Une différence importante entre une horloge RTC et l'horloge système est que l'horloge RTC continue toujours à fonctionner lorsque l'alimentation du système est défaillante (y compris coupée), ce que ne peut pas faire l'horloge système. Tant qu'elle n'est pas initialisée, l'horloge système ne peut qu'indiquer le temps écoulé depuis le démarrage du système, pas depuis l'Époque POSIX. Aussi, au démarrage ou après une récupération suite à une faiblesse de l'alimentation, l'horloge système est souvent mise à l'heure grâce à l'horloge RTC. Les systèmes qui ne possèdent pas d'horloge RTC doivent mettre à l'heure l'horloge système avec une autre horloge, peut-être au travers du réseau ou bien en entrant les données à la main.

  Fonctionnalité RTC
Les horloges RTC peuvent être lues et configurées avec hwclock(8), ou directement avec les requêtes iotcl indiquées plus loin. En plus de gérer la date et l'heure, la plupart des horloges RTC peut générer des interruptions

*   à chaque mise à jour de l'horloge (c'est-à-dire à chaque seconde) ;

*   à des intervalles périodiques dont la fréquence peut être configurée à tout multiple d'une puissance de deux dans l'intervalle 2 Hz à 8192 Hz ;

*   lorsqu'elle atteint une heure d'alarme précédemment spécifiée.

Chacune de ces interruptions peut être activée ou désactivée séparément. Sur beaucoup de systèmes, l'interruption d'alarme peut être configurée en tant qu'événement de réveil du système, qui peut reprendre le système à partir d'un état de faible consommation comme le mode de veille (Suspend-to-RAM : STR, appelé S3 sur les systèmes ACPI), mode d'hibernation (appelé S4 sur les systèmes ACPI) ou même « éteint » (appelé S5 sur les systèmes ACPI). Sur certains systèmes, l'horloge RTC sauvegardée par pile peut ne pas gérer les interruptions, auquel cas une autre peut le faire. Le périphérique /dev/rtc (ou /dev/rtc0, /dev/rtc1, etc.) ne peut être ouvert qu'une seule fois (jusqu'à ce qu'il soit fermé) et en lecture seule. Dans le cas d'un read(2) ou d'un select(2), le processus appelant est bloqué jusqu'à ce que ne soit reçue la prochaine interruption de cette horloge RTC. À la suite de l'interruption, le processus peut lire un entier long. L'octet de poids faible de celui-ci contient un masque de bit codant les types d'interruption qui sont survenues alors que les trois autres octets contiennent le nombre d'interruptions depuis le dernier read(2).

  Interface ioctl(2)
Les requêtes ioctl(2) sont définies pour les descripteurs de fichiers connectés aux périphériques RTC :

RTC_RD_TIME
    Renvoyer le temps RTC dans la structure suivante :

    struct rtc_time {
        int tm_sec;
        int tm_min;
        int tm_hour;
        int tm_mday;
        int tm_mon;
        int tm_year;
        int tm_wday;     /* inutilisé */
        int tm_yday;     /* inutilisé */
        int tm_isdst;    /* inutilisé */
    };

    Les champs de cette structure ont la même signification et les mêmes intervalles que la structure tm décrite dans gmtime(3). Un pointeur sur cette structure devrait être passé comme troisième argument de ioctl(2).

RTC_SET_TIME
    Configurer le temps RTC avec la valeur temps spécifiée dans la structure rtc_time pointée par le troisième argument de ioctl(2). Pour pouvoir configurer l'horloge RTC, le processus doit être privilégié (c'est-à-dire avoir la capacité CAP_SYS_TIME).

RTC_ALM_READ, RTC_ALM_SET
    Lire et configurer une alarme pour les horloges RTC qui prennent en charge les alarmes. L'interruption d'alarme doit être activée ou désactivée de manière séparée en utilisant les requêtes RTC_AIE_ON et RTC_AIE_OFF. Le troisième argument de ioctl(2) est un pointeur vers une structure rtc_time. tm_sec, tm_min et tm_hour de cette structure sont utilisés.

RTC_IRQP_READ, RTC_IRQP_SET
    Lire et configurer la fréquence des interruptions périodiques pour les horloges RTC qui prennent en charge les interruptions périodiques. L'interruption périodique doit être activée ou désactivée de manière séparée en utilisant les requêtes RTC_PIE_ON et RTC_PIE_OFF. Le troisième argument de ioctl(2) est un unsigned long * ou un unsigned long, respectivement. La valeur est la fréquence des interruptions par seconde. L'ensemble des fréquences permises est les multiples de deux dans un intervalle de 2 à 8192. Seul un processus privilégié (c'est-à-dire qui a la capacité CAP_SYS_RESOURCE) peut configurer des fréquences supérieures à la valeur spécifiée dans /proc/sys/dev/rtc/max-user-freq. (Ce fichier contient la valeur 64 par défaut.)

RTC_AIE_ON, RTC_AIE_OFF
    Activer ou désactiver l'interruption de l'alarme pour les horloges RTC qui prennent en charge les alarmes. Le troisième argument de ioctl(2) est ignoré.

RTC_UIE_ON, RTC_UIE_OFF
    Activer ou désactiver l'interruption à chaque mise à jour de l'horloge, pour les horloges RTC qui prennent en charge l'interruption « une fois par seconde ». Le troisième argument de ioctl(2) est ignoré.

RTC_PIE_ON, RTC_PIE_OFF
    Activer ou désactiver l'interruption périodique pour les horloges RTC qui prennent en charge ces interruptions périodiques. Le troisième argument de ioctl(2) est ignoré. Seul un processus privilégié (c'est-à-dire qui a la capacité CAP_SYS_RESOURCE) peut activer l'interruption périodique si la fréquence est actuellement supérieure à la valeur spécifiée dans /proc/sys/dev/rtc/max-user-freq.

RTC_EPOCH_READ, RTC_EPOCH_SET
    Beaucoup d'horloges RTC encodent l'année dans un registre 8 bits qui est interprété soit comme un nombre binaire 8 bits, soit comme un nombre DCB. Dans les deux cas, le nombre est interprété relativement à l'Époque de cette horloge RTC. L'Époque de l'horloge RTC est initialisée à l'année 1900 sur la plupart des systèmes mais sur Alpha et Mips, elle peut être initialisée à 1952, 1980 ou 2000, suivant la valeur d'un registre RTC pour l'année. Avec certaines horloges RTC, ces opérations peuvent être utilisées pour lire ou configurer l'Époque de l'horloge RTC, respectivement. Le troisième argument de ioctl(2) est un unsigned long * ou un unsigned long, respectivement, et la valeur renvoyée (ou affectée) est l'Époque. Pour configurer l'Époque de l'horloge RTC, le processus doit être privilégié (c'est-à-dire avoir la capacité CAP_SYS_TIME).

RTC_WKALM_RD, RTC_WKALM_SET
    Certaines horloges RTC prennent en charge une interface d'alarme plus puissante, en utilisant ces requêtes iotcl pour lire ou écrire la date de l'alarme de l'horloge RTC (respectivement) avec cette structure :

    struct rtc_wkalrm {
        unsigned char enabled;
        unsigned char pending;
        struct rtc_time time;
    };

    L'attribut enabled est utilisé pour activer ou désactiver l'interruption d'alarme ou pour lire son état actuel ; lorsqu'on utilise ces appels, RTC_AIE_ON et RTC_AIE_OFF ne sont pas utilisés. L'attribut pending est utilisé par RTC_WKALM_RD pour indiquer une interruption pendante (dans la plupart des cas, inutile sous Linux, sauf lorsqu'on demande la gestion de l'horloge RTC par micrologiciel EFI). Le champ time est utilisé avec RTC_ALM_READ et RTC_ALM_SET à condition que les champs tm_mday, tm_mon, et tm_year soient également valides. Un pointeur sur cette structure doit être passé en tant que troisième argument à ioctl(2).

FICHIERS
/dev/rtc, /dev/rtc0, /dev/rtc1, etc : fichiers périphériques de caractère spécial RTC. /proc/driver/rtc : état de la (première) horloge RTC.

NOTES
Lorsque l'horloge système du noyau est synchronisée avec une référence externe en utilisant adjtimex(2), il mettra à jour une horloge RTC désignée périodiquement toutes les 11 minutes. Pour ce faire, le noyau doit désactiver brièvement les interruptions périodiques ; cela peut affecter les programmes qui utilisent cette horloge RTC. L'Époque de l'horloge RTC n'a rien à voir avec l'Époque POSIX qui est seulement utilisée pour l'horloge système. Si l'année de l'Époque de l'horloge RTC et le registre année est moins que 1970, on suppose alors que l'on est 100 ans plus tard, c'est-à-dire entre 2000 et 2069. Certaines horloges RTC prennent en charge des valeurs avec « jokers » dans les champs de l'alarme afin de prendre en charge des scenarii comme des alarmes périodes à la quinzième minute après chaque heure, ou le premier jour de chaque mois. Une telle utilisation n'est pas portable ; du code portable en espace utilisateur attend une seule interruption d'alarme et soit désactivera l'alarme, soit il la réinitalisera après avoir reçu l'interruption. Certaines horloges RTC prennent en charge des interruptions périodiques dont les périodes sont des multiples de la seconde au lieu de fractions de seconde ; des alarmes multiples ; des signaux d'horloge de sortie programmables ; de la mémoire non volatile ; et d'autres possibilités matérielles qui ne sont actuellement pas décrites par cette API.

VOIR AUSSI
hwclock(8), date(1), time(2), stime(2), gettimeofday(2), settimeofday(2), adjtimex(2), gmtime(3), time(7), /usr/src/linux/Documentation/rtc.txt

TRADUCTION

Ce document est une traduction réalisée par Alain Portal <aportal AT univ-montp2 DOT fr> le 21 juillet 2006 et révisée le 22 décembre 2007.

L'équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : « LANG=C man 4 rtc ». N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.