В Linux интерфейс к таймеру настенных часов предоставляется через функцию ioctl () драйвера устройства /dev/rtc. Устройство этого драйвера называется Real Time Clock (RTC) . RTC предоставляет функцию для работы со 114-битовым значением в NVRAM. На входе этого устройства установлен осциллятор с частотой 32768 КГц, подсоединенный к резервной батарее. Некоторые дискретные модели RTC имеют встроенные осциллятор и батарею, тогда как другие RTC встраиваются прямо в контроллер периферийной шины (например, южный мост) чипсета процессора. RTC возвращает не только время суток, но, помимо прочего, является и программируемым таймером, имеющим возможность посылать системные прерывания. Частота прерываний варьируется от 2 до 8192 Гц. Также RTC может посылать прерывания ежедневно, наподобие будильника. Далее мы рассмотрим код RTC.
/include/linux/rtc.h /*
* ioctl вызывает приоритетное прерывание обслуживания для /dev/rtc
* interface, если включен любой из RTC-драйверов. */
70 #define• RTC_AIE_ON _IO('p', 0x01) /* Включение прерывания звонка */
71 #define RTC_AIE_OFF _IO('p', 0x02) /* ... отключение */
/* Включение прерывания обновления */
72 #define RTC_UIE_ON _IO('p', 0x03)
73 #define RTC_UIE_OFF _IO('p', 0x04) /* ... отключение */
/* Включение периодического прерывания */
74 #define RTC_PIE_ON _IO('p', 0x05)
75 #define RTC_PIE_OFF _IO('p', 0x06) /* ... отключение */
/* Включение сторожевого прерывания */
'• Часы реального времени. Примеч. пер.
76 #define RTC_WIE_ON _IO('p', OxOf)
77 #define RTC_WIE_OFF _IO('p', 0x10) /* ... отключение */
/* Установка времени звонка */ 78 #define RTC_ALM_SET _IOW('p'
/* Чтение времени звонка*/
79 tdefine RTC_ALM_READ _IOR('p', 0x08, struct rtc_time)
IORt'p', 0x09, struct rtc_time)
IOW('p', 0x0a, struct rtc_time)
0x0b, unsigned long)
0x0c, unsigned long)
OxOd, unsigned long)
_IOW('p', OxOe, unsigned long) :
Функция управления ioctl() находится в include/1 inux/rtc .h. He все из перечисленных там вызовов ioctl () для RTC реализованы для РРС-архитектуры. Эти управляющие вызовы вызывают, в свою очередь, аппаратно-специфические функции более низкого уровня (если они реализованы). Пример в этом подразделе использует функцию RTC_RD_TIME.
Следующий пример вызова ioctl () используется для получения времени суток. Программа просто открывает драйвер, запрашивает у аппаратуры RTC текущую дату ж время и помещает эту информацию в stderr. Обратите внимание, что единовременно только один пользователь может обращаться к драйверу RTC. Проверяющий это код де-шонстрируется при обсуждении драйвера.
Documentation/rtc.txt
/* Укороченная версия кода в /Documentation/rtc.txt */
int main(void) {
int fd, retval = 0; //unsigned long tmp, data; struct rtc__time rtc_tm;
fd = open ("/dev/rtc", 0_RDONLY);
/* Чтение времени/даты RTC */
retval = ioctl(fd, RTC_RD_TIME, &rtc_tm);
/* вывод времени из переменной rtc_tm */ close(fd); return 0;
} /* конец main */
Этот код является отрывком более полного примера в /Documentation/ rtc. txt. Две основные строки кода этой программы - это команда open () и вызов ioctl (); open () сообщает нам, какой драйвер используется (/dev/rtc), a iotcl () указывает конкретный путь сквозь код к физическому интерфейсу RTC и команде RTC_RD_TiME. Код драйвера для команды open () описан в исходных кодах драйвера, однако нам для обсуждения необходимо знать только, какой драйвер устройства открывается.