rtc - Horloge temps réel
#include <linux/rtc.h>
int ioctl(fd, RTC_request, param);
Il s'agit d'une interface aux pilotes pour les horloges temps réel (RTC).
La plupart des ordinateurs disposent d'une ou plusieurs horloges
matérielles intégrées, enregistrant l'heure locale. Elles
sont appelées « horloges temps
réel » (RTC). L'une d'entre elles est
généralement alimentée par une pile afin de rester
à l'heure une fois l'ordinateur éteint. Les RTC permettent
souvent d'utiliser des alarmes et d'autres interruptions.
Tous les PC i386 et les systèmes basés sur ACPI ont une RTC
compatible avec la puce Motorola MC146818 du PC/AT d'origine.
Aujourd'hui l'horloge est généralement intégrée au
jeu de composants de la carte mère (« south
bridge ») et utilise une pile de secours remplaçable de
la taille d'une pièce de monnaie.
Les systèmes autres que les PC, comme les systèmes
embarqués construits autour de processeurs embarquant tout le
système, utilisent d'autres mises en œuvre.
Généralement, ils n'offrent pas les mêmes
fonctionnalités qu'une RTC de PC/AT.
Les RTC ne doivent pas être confondues avec l'horloge système, qui
est une horloge logicielle gérée par le noyau et utilisée
dans
gettimeofday(2) et
time(2), ainsi que pour le marquage
temporel des fichiers, etc. L'horloge système indique le nombre de
secondes et microsecondes écoulées depuis un instant de
départ, défini comme depuis l'époque POSIX :
1er janvier 1970 à 00:00:00 (UTC). (Une mise en œuvre
usuelle compte le nombre d'interruptions, une par pulsation à une
fréquence de 100, 250 ou 1000 Hz.) C'est-à-dire qu'elle
est supposée renvoyer l'heure locale, comme le font les RTC.
Une différence clé entre une RTC et l'horloge système est
qu'une RTC fonctionne même lorsque le système est dans un
état de veille d'alimentation (incluant
« éteint ») et que l'horloge système
ne peut fonctionner. Jusqu'à son initialisation, l'horloge
système ne peut indiquer que le temps écoulé depuis le
démarrage du système mais pas celui depuis l'époque
POSIX. Ainsi, au démarrage et après la sortie de veille,
l'horloge système sera souvent réglée à l'heure
locale actuelle en utilisant une RTC. Les systèmes sans RTC ont besoin
de régler leur horloge système par un autre moyen,
peut-être à travers le réseau ou en entrant les valeurs
à la main.
RTCs can be read and written with
hwclock(8), or directly with the
ioctl(2) requests listed below.
En plus du compte de la date et de l'heure, de nombreuses RTC peuvent aussi
générer des interruptions :
- •
- à chaque mise à jour de l'horloge
(c.-à-d.. une fois par seconde) ;
- •
- à des intervalles réguliers, de
fréquence réglable à une puissance de 2 entre
2 Hz et 8192 Hz ;
- •
- lorsque la date d'une alarme réglée
auparavant est atteinte.
Chacune de ces sources d'interruptions peut être activée ou
désactivée séparément. Sur de nombreux
systèmes, l'interruption venant de l'alarme peut être
configurée comme un événement déclenchant le
réveil du système, et ainsi sortir le système d'un
état de veille d'alimentation comme la veille en RAM (STR,
appelée S3 dans les systèmes ACPI), l'hibernation
(appelée S4 dans les systèmes ACPI) ou même l'extinction
(appelée S5 dans les systèmes ACPI). Sur certains
systèmes, la pile de secours de la RTC ne peut générer
d'interruptions, alors qu'une autre le peut.
Le périphérique
/dev/rtc (ou
/dev/rtc0,
/dev/rtc1, etc.) est en lecture seule et un seul accès
simultané est possible. Un processus appelant
read(2) ou
select(2) est bloqué jusqu'à la réception de
l'interruption RTC suivante. Suite à l'interruption, le processus peut
lire un entier long, dont l'octet de poids faible contient le type
d'interruption qui vient de se produire et les 3 octets restants
contiennent le nombre d'interruptions depuis le dernier appel à
read(2).
Les appels
ioctl(2) suivants sont définis sur les descripteurs des
fichiers associés aux périphériques RTC :
- RTC_RD_TIME
- Renvoie l'heure de cette 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; /* non utilisé */
int tm_yday; /* non utilisé */
int tm_isdst; /* non utilisé */
};
- Les membres de cette structure ont les mêmes sens et
les mêmes portées que la ceux de la structure tm
décrite dans gmtime(3). Un pointeur vers cette structure est
attendu en troisième paramètre pour ioctl(2).
- RTC_SET_TIME
- Règle cette horloge RTC à l'heure
spécifiée par la structure rtc_time vers laquelle
pointe le troisième paramètre passé à
ioctl(2). Pour pouvoir modifier l'heure RTC, le processus doit
être privilégié (i.e. disposer du droit
CAP_SYS_TIME).
-
RTC_ALM_READ, RTC_ALM_SET
- Lit et règle l'heure d'alarme, pour les horloges RTC
qui gèrent les alarmes. L'interruption venant de l'alarme doit
être activée ou désactivée
séparément en utilisant respectivement les requêtes
RTC_AIE_ON ou RTC_AIE_OFF. Le troisième
paramètre d' ioctl(2) est un pointeur vers une structure
rtc_time. Seuls les champs tm_sec, tm_min, et
tm_hour de cette structure sont utilisés.
-
RTC_IRQP_READ, RTC_IRQP_SET
- Lit et règle la fréquence des interruptions,
pour les horloges RTC gérant les interruptions périodiques.
L'interruption périodique doit être activée ou
désactivée séparément en utilisant
respectivement les requêtes RTC_PIE_ON ou
RTC_PIE_OFF. Le troisième paramètre d'
ioctl(2) est un unsigned long * ou un unsigned
long respectivement. La valeur représente la fréquence
en interruptions par seconde. Le jeu des fréquences permises est
l'ensemble des multiples de deux entre 2 et 8192. Seul un processus
privilégié (i.e. disposant du droit CAP_SYS_RESOURCE)
peut régler une fréquence supérieure à celle
spécifiée dans /proc/sys/dev/rtc/max-user-freq, par
défaut 64.
-
RTC_AIE_ON, RTC_AIE_OFF
- Active ou désactive l'interruption venant de
l'alarme, pour les RTC qui gèrent les alarmes. Le troisième
paramètre d' ioctl(2) est ignoré.
-
RTC_UIE_ON, RTC_UIE_OFF
- Active ou désactive l'interruption à chaque
mise à jour, pour les horloges gérant cette interruption
envoyée chaque seconde. Le troisième paramètre d'
ioctl(2) est ignoré.
-
RTC_PIE_ON, RTC_PIE_OFF
- Active ou désactive l'interruption
périodique, pour les RTC gérant ces interruptions
périodiques. Le troisième paramètre d'
ioctl(2) est ignoré. Seul un processus
privilégié (i.e. disposant du droit CAP_SYS_RESOURCE)
peut régler une fréquence supérieure à celle
spécifiée dans /proc/sys/dev/rtc/max-user-freq.
-
RTC_EPOCH_READ, RTC_EPOCH_SET
- Many RTCs encode the year in an 8-bit register which is
either interpreted as an 8-bit binary number or as a BCD number. In both
cases, the number is interpreted relative to this RTC's Epoch. The RTC's
Epoch is initialized to 1900 on most systems but on Alpha and MIPS it
might also be initialized to 1952, 1980, or 2000, depending on the value
of an RTC register for the year. With some RTCs, these operations can be
used to read or to set the RTC's Epoch, respectively. The third
ioctl(2) argument is an unsigned long * or an
unsigned long, respectively, and the value returned (or assigned)
is the Epoch. To set the RTC's Epoch the process must be privileged (i.e.,
have the CAP_SYS_TIME capability).
-
RTC_WKALM_RD, RTC_WKALM_SET
- Certaines RTC disposent d'une interface pour les alarmes
plus puissante, utilisant ces ioctl pour lire ou écrire l'heure de
l'alarme de la RTC 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 venant de l'alarme, ou pour lire son
état actuel ; lorsque ces appels sont utilisés,
RTC_AIE_ON et RTC_AIE_OFF ne sont pas utilisés.
L'attribut pending est utilisé par RTC_WKALM_RD pour
signaler une interruption en attente (c'est en général
inutile sous Linux, excepté lors du dialogue avec la RTC
gérée par un microcode EFI). Le champ time est autant
utilisé par RTC_ALM_READ et RTC_ALM_SET,
excepté que les champs tm_mday, tm_mon et
tm_year sont également valides. Un pointeur vers cette
structure doit être passé en troisième
paramètre ioctl(2).
-
/dev/rtc, /dev/rtc0, /dev/rtc1,
etc.
- RTC special character device files.
- /proc/driver/rtc
- status of the (first) RTC.
Lorsque l'horloge du noyau est synchronisée avec une
référence externe en utilisant
adjtimex(2), le noyau met
à jour une RTC désignée toutes les 11 minutes.
Pour y parvenir, le noyau doit arrêter brièvement les
interruptions périodiques, ce qui peut affecter les programmes
utilisant cette RTC.
L'époque d'une RTC n'a rien à voir avec l'époque POSIX,
utilisé uniquement pour l'horloge système.
Si l'année relative à l'époque de la RTC et au registre de
l'année est inférieure à 1970, on considère que
l'année est de 100 ans supérieure, c.-à-d. entre
2000 et 2069.
Some RTCs support "wildcard" values in alarm fields, to support
scenarios like periodic alarms at fifteen minutes after every hour, or on the
first day of each month. Such usage is nonportable; portable user-space code
expects only a single alarm interrupt, and will either disable or reinitialize
the alarm after receiving it.
Certaines RTC gèrent des interruptions de périodes multiples d'une
seconde plutôt qu'en fractions de secondes, des alarmes multiples, la
programmation de signaux de sortie d'horloge, la mémoire non volatile,
et d'autres possibilités matérielles qui ne sont pas accessibles
par cette API.
date(1),
adjtimex(2),
gettimeofday(2),
settimeofday(2),
stime(2),
time(2),
gmtime(3),
time(7),
hwclock(8)
Documentation/rtc.txt dans les sources du noyau Linux
La traduction française de cette page de manuel a été
créée par Christophe Blaess
<
https://www.blaess.fr/christophe/>, Stéphan Rafin
<
[email protected]>, Thierry Vignaud
<
[email protected]>, François Micaux, Alain Portal
<
[email protected]>, Jean-Philippe Guérard
<
[email protected]>, Jean-Luc Coulon (f5ibh)
<
[email protected]>, Julien Cristau
<
[email protected]>, Thomas Huriaux <
[email protected]>,
Nicolas François <
[email protected]>, Florentin
Duneau <
[email protected]>, Simon Paillard
<
[email protected]>, Denis Barbier
<
[email protected]> et David Prévot <
[email protected]>
Cette traduction est une documentation libre ; veuillez vous reporter
à la
GNU
General Public License version 3 concernant les conditions de copie
et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel,
veuillez envoyer un message à
[email protected]