Главная » 2017 » Ноябрь » 19 » man 4 rtc
21:52
man 4 rtc

SEO sprint - Всё для максимальной раскрутки!





ИМЯ


rtc - часы реального времени



ОБЗОР


#include <linux/rtc.h>

int ioctl(fd, RTC_request, param);



ОПИСАНИЕ


Данное устройство представляет собой интерфейс к драйверам часов реального времени
(RTC).

В большинстве компьютеров есть одни и более аппаратных часов, ведущих отчёт
"обычного" времени. Они называются "часами реального времени" (Real Time Clock,
RTC). Некоторые из них имеют батарею резервного питания для продолжения работы в
периоды, когда компьютер выключен. В RTC часто встроены будильники и другие
прерывания.

Все ПК i386 и системы с ACPI содержат RTC, которые совместимы с микросхемой
Motorola MC146818 из первоначальной модели PC/AT. Сегодня такие RTC обычно
встраивают в чипсет материнской платы (в южный мост), и они используют заменяемую
резервную батарею (типа «таблетки»).

В системах, несовместимых с PC (например, встраиваемые системы, собираемые на
процессоре "всё в одном"), используются другие варианты. Обычно, они не
предоставляют таких возможностей, как RTC в PC/AT.

RTC и системные часы
Не нужно путать RTC с системными часами, которые представляют собой часы,
реализованные в ядре программно и используемые для работы gettimeofday(2) и
time(2), а также при указании временных меток файлов и т. п. Системные часы выдают
секунды и микросекунды, начиная отсчёт от эпохи POSIX: 1970-01-01 00:00:00 +0000
(UTC) (в основном, реализуется на основе таймера прерываний ведя подсчёт «мигов»
(jiffy) c частотой 100, 250 или 1000 Гц). То есть, предполагается, что они
показывают обычное время как и RTC.

Ключевым отличием RTC от системных часов, является то, что RTC работают даже когда
система находится в состоянии пониженного энергопотребления (даже в выключенном),
а для системных часов такое недоступно. До своей инициализации системные часы
показывают время, прошедшее с момента запуска системы, а не с начала эпохи POSIX.
Поэтому при загрузке и после восстановления из состояния пониженного
энергопотребления в системных часах часто подстраивают текущее время с помощью
RTC. Системам без RTC требуется установить свои системные часы с помощью других
часов, возможно через сеть или ручного ввода данных.

Назначение RTC
Из RTC можно читать или писать с помощью hwclock(8) или через вызовы ioctl,
перечисленные ниже.

Помимо контроля даты и времени многие RTC также позволяют генерировать прерывания

* при каждом обновлении часов (т.е. раз в секунду);

* через периодические интервалы с частотой, значение которой может быть любой
степенью 2 в диапазоне от 2 Гц до 8192 Гц;

* по достижению указанного времени будильника.
Устройство /dev/rtc (или /dev/rtc0, /dev/rtc1 и т.д.) можно открыть только один
раз (до тех пор, пока не будет закрыто) и только для чтения. При вызове read(2) и
select(2) вызывающий процесс блокируется до следующего приёма прерывания от RTC.
После прерывания процесс может прочитать длинное целое, в котором наименее
значимый байт содержит битовую маску типа произошедшего прерывания, а остальные 3
байта содержат количество прерываний, произошедших с последнего вызова read(2).

Интерфейс ioctl(2)
Для файловых дескрипторов, указывающих на открытые устройства RTC, доступны
следующие запросы ioctl(2):

RTC_RD_TIME
Получить время RTC в виде следующей структуры:

struct rtc_time {
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday; /* не используется */
int tm_yday; /* не используется */
int tm_isdst; /* не используется */
};

Поля структуры имеют те же значения и диапазоны что и у структуры tm,
описанной в gmtime(3). Указатель на эту структуру должен передаваться в
третьем аргументе ioctl(2).

RTC_SET_TIME
Установить время RTC в значение, заданное в структуре rtc_time, на которую
указывает третий аргумент ioctl(2). Для установки времени RTC процесс
должен иметь права (т.е., мандат CAP_SYS_TIME).

RTC_ALM_READ, RTC_ALM_SET
Получить и установить время будильника, если он поддерживается RTC.
Прерывание будильника должно быть включено или выключено отдельно с помощью
запросов RTC_AIE_ON, RTC_AIE_OFF. Третий аргумент ioctl(2) является
указателем на структуру rtc_time. В структуре используются только поля
tm_sec, tm_min и tm_hour.

RTC_IRQP_READ, RTC_IRQP_SET
Получить и установить частоту периодических прерываний, если они
поддерживаются RTC. Периодическое прерывание должно быть включено или
выключено отдельно с помощью запросов RTC_PIE_ON, RTC_PIE_OFF. Третий
аргумент ioctl(2) имеет тип unsigned long * или unsigned long,
соответственно. Значение задаёт частоту прерываний в секунду. Можно
указывать частоты кратны степени 2 в диапазоне от 2 до 8192. Только
привилегированный процесс (т.е., имеющий мандат CAP_SYS_RESOURCE) может
устанавливать частоты выше значения, указанного в
/proc/sys/dev/rtc/max-user-freq. (По умолчанию в этом файле содержится
значение 64.)

RTC_AIE_ON, RTC_AIE_OFF
Включить или выключить прерывание от будильника, если RTC поддерживает
будильники. Третий аргумент ioctl(2) игнорируется.
привилегированный процесс (т.е., имеющий мандат CAP_SYS_RESOURCE) может
устанавливать частоты выше значения, указанного в
/proc/sys/dev/rtc/max-user-freq.

RTC_EPOCH_READ, RTC_EPOCH_SET
В многих RTC год кодируется в 8-битном регистре, значение которого может
учитываться как 8-битное двоичное число или как число в двоично-десятичном
коде (BCD). В обоих случаях, число учитывается относительно начала эпохи
RTC. Эпоха RTC на большинстве систем начинается с 1900 года, но на Alpha и
MIPS также она может начинаться с 1952, 1980 или 2000 года, в зависимости
от значения годового регистра RTC. С некоторыми RTC эти операции можно
использовать для чтения или установки эпохи RTC, соответственно. Третий
аргумент ioctl(2) имеет тип unsigned long * или unsigned long,
соответственно, а возвращаемое значение (или назначаемое) является эпохой.
Чтобы установить эпоху RTC процесс должен быть привилегированным (т.е.,
иметь мандат CAP_SYS_TIME).

RTC_WKALM_RD, RTC_WKALM_SET
Некоторые RTC поддерживают более универсальный интерфейс будильника, в
котором эти ioctl используются для чтения и записи времени будильника RTC
(соответственно) с помощью структуры:

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

Флаг enabled используется для включения или отключения прерывания
будильника, или для чтения его текущего состояния; когда совершаются данные
вызовы RTC_AIE_ON и RTC_AIE_OFF не используются. Флаг pending используется
RTC_WKALM_RD для сообщения об ожидающем прерывании (хотя это практически
бесполезно в Linux, за исключением RTC, управляемого микропрограммой EFI).
Поле time используется RTC_ALM_READ и RTC_ALM_SET, но поля tm_mday, tm_mon
и tm_year также учитываются. Указатель на эту структуру должен передаваться
в третьем аргументе ioctl(2).



ФАЙЛЫ


/dev/rtc, /dev/rtc0, /dev/rtc1 и т.д.: специальные файлы символьных устройств RTC.

/proc/driver/rtc: состояние (первого) RTC.



ЗАМЕЧАНИЯ


Когда системное время ядра синхронизируется с внешним источником с помощью
adjtimex(2), оно будет обновляться назначенным RTC с периодичностью каждые 11
минут. Для этого ядро на время отключает периодические прерывания; это может
повлиять на программы, использующие RTC.

Эпоха RTC не имеет ничего общего с эпохой POSIX, которая используется только в
системных часах.

Если год, согласно эпохи RTC и регистр года меньше чем 1970, то предполагается,
что время на 100 лет позже, то есть, между 2000 и 2069 годами.

Некоторые RTC поддерживают значения «шаблона» в полях будильника, чтобы обеспечить
поддержку сценариев, например периодические будильники, через первые 15 минут в
начале каждого часа, или первый день каждого месяца. Но это непереносимо;



СМОТРИТЕ ТАКЖЕ


date(1), adjtimex(2), gettimeofday(2), settimeofday(2), stime(2), time(2),
gmtime(3), time(7), hwclock(8)

Файл Documentation/rtc.txt в дереве исходного кода ядра Linux



Категория: (4) Специальные файлы (находящиеся обычно в каталоге /dev) | Просмотров: 535 | Добавил: Администратор | Рейтинг: 0.0/0
Всего комментариев: 0
avatar