[Решено] Установка время через /dev/rtc

Модератор: Модераторы разделов

Аватара пользователя
newsrc
Сообщения: 314
ОС: Slackware

[Решено] Установка время через /dev/rtc

Сообщение newsrc »

Использую функцию ioctl для установки hw-времени через /dev/rtc.

Если использовать макрос RTC_SET_TIME и передавать в функцию ioctl структуру с нужным временем, то всё работает:
Spoiler

Код: Выделить всё

#include <stdio.h>
#include <stdlib.h>
#include <linux/rtc.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <time.h>

int main(int argc, char **argv) {

    int fd;
    struct rtc_time settime_hw;
    struct rtc_time currtime_hw;

    settime_hw.tm_sec = 32;
    settime_hw.tm_min = 16;
    settime_hw.tm_hour = 8;
    settime_hw.tm_mday = 13;
    settime_hw.tm_mon = 6 - 1;
    settime_hw.tm_year = 2013 - 1900;

    fd = open("/dev/rtc", O_RDONLY);
    if (fd < 0) {
        printf("Error: %d\n", errno);
        exit(EXIT_FAILURE);
    }

    if (ioctl(fd, RTC_RD_TIME, &currtime_hw) < 0) {
        printf("Error: %d\n", errno);
        exit(EXIT_FAILURE);
    }

    printf("Time befor set: %d.%02d.%02d %02d:%02d:%02d\n",
            currtime_hw.tm_year + 1900, currtime_hw.tm_mon + 1,
            currtime_hw.tm_mday, currtime_hw.tm_hour,
            currtime_hw.tm_min, currtime_hw.tm_sec);

    if (ioctl(fd, RTC_SET_TIME, &settime_hw) < 0) {
        printf("Error: %d\n", errno);
        exit(EXIT_FAILURE);
    }

    if (ioctl(fd, RTC_RD_TIME, &currtime_hw) < 0) {
        printf("Error: %d\n", errno);
        exit(EXIT_FAILURE);
    }

    printf("Time after set: %d.%02d.%02d %02d:%02d:%02d\n",
            currtime_hw.tm_year + 1900, currtime_hw.tm_mon + 1,
            currtime_hw.tm_mday, currtime_hw.tm_hour,
            currtime_hw.tm_min, currtime_hw.tm_sec);

    close(fd);

    return EXIT_SUCCESS;
}

Но если использовать RTC_EPOCH_SET и в функцию ioctl передавать timestamp в виде unsigned long, то получаю в errno ошибку 25 (Not a typewriter):
Spoiler

Код: Выделить всё

#include <stdio.h>
#include <stdlib.h>
#include <linux/rtc.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <time.h>

int main(int argc, char **argv) {

    int fd;
    struct rtc_time currtime_hw;
    struct tm time_test;
    time_t time_stamp;
    unsigned long time_output;

    fd = open("/dev/rtc", O_RDONLY);
    if (fd < 0) {
        printf("Error: %d\n", errno);
        exit(EXIT_FAILURE);
    }

    if (ioctl(fd, RTC_RD_TIME, &currtime_hw) < 0) {
        printf("Error: %d\n", errno);
        exit(EXIT_FAILURE);
    }

    printf("Time befor set: %d.%02d.%02d %02d:%02d:%02d\n",
            currtime_hw.tm_year + 1900, currtime_hw.tm_mon + 1,
            currtime_hw.tm_mday, currtime_hw.tm_hour,
            currtime_hw.tm_min, currtime_hw.tm_sec);


    time_test.tm_sec = 32;
    time_test.tm_min = 16;
    time_test.tm_hour = 8;
    time_test.tm_mday = 13;
    time_test.tm_mon = 6 - 1;
    time_test.tm_year = 2013 - 1900;

    time_stamp = mktime(&time_test);

    time_output = (unsigned long) time_stamp;

    if (ioctl(fd, RTC_EPOCH_SET, time_output) < 0) {
        printf("Error: %d\n", errno);
        exit(EXIT_FAILURE);
    }

    if (ioctl(fd, RTC_RD_TIME, &currtime_hw) < 0) {
        printf("Error: %d\n", errno);
        exit(EXIT_FAILURE);
    }

    printf("Time after set: %d.%02d.%02d %02d:%02d:%02d\n",
            currtime_hw.tm_year + 1900, currtime_hw.tm_mon + 1,
            currtime_hw.tm_mday, currtime_hw.tm_hour,
            currtime_hw.tm_min, currtime_hw.tm_sec);

    close(fd);

    return EXIT_SUCCESS;
}


Всё под рутом.
Подскажите.
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5468
ОС: Gentoo

Re: [Решено] Установка время через /dev/rtc

Сообщение /dev/random »

newsrc писал(а):
13.06.2013 18:35
Но если использовать RTC_EPOCH_SET и в функцию ioctl передавать timestamp в виде unsigned long, то получаю в errno ошибку 25 (Not a typewriter)

Во-первых, ошибка 25 - это, всё-таки, "Inappropriate ioctl for device".
Во-вторых, согласно ману, RTC_EPOCH_SET работает не для всех RTC. Вы уверены, что для вашего работает?
Спасибо сказали:
Аватара пользователя
newsrc
Сообщения: 314
ОС: Slackware

Re: [Решено] Установка время через /dev/rtc

Сообщение newsrc »

/dev/random писал(а):
13.06.2013 23:36
Во-первых, ошибка 25 - это, всё-таки, "Inappropriate ioctl for device".
Спасибо за уточнение.

/dev/random писал(а):
13.06.2013 23:36
Во-вторых, согласно ману, RTC_EPOCH_SET работает не для всех RTC. Вы уверены, что для вашего работает?
Не работает на x86 и не работает на ARM.
Как убедиться, что должно или не должно работь не знаю.
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5468
ОС: Gentoo

Re: [Решено] Установка время через /dev/rtc

Сообщение /dev/random »

newsrc писал(а):
14.06.2013 10:35
Не работает на x86 и не работает на ARM.
Как убедиться, что должно или не должно работь не знаю.

Ну, grep по исходникам ядра показывает, что этот вызов поддерживается только драйверами NEC VR41XX CPU и Legacy PC RTC Driver.
Спасибо сказали:
Аватара пользователя
newsrc
Сообщения: 314
ОС: Slackware

Re: [Решено] Установка время через /dev/rtc

Сообщение newsrc »

Спасибо вам.
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
Спасибо сказали: