Управление временем включения компьютера(запись в порты)

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

pas
Сообщения: 597
Статус: маньяк
ОС: Gentoo

Управление временем включения компьютера(запись в порты)

Сообщение pas »

Провел поиск в инете, но проги для того, что бы из Linux-а установить время включения компьютера найти не смог.
На форуме нашел высказывания в смысле, что найти соответствующую прогу найти не удалось.
Соответственно решил попробовать сам написать простейшую прогу которая будет записывать время включения компьютера.
Найден файл /dev/rtc, и /usr/include/linux/rtc.h. Соответственноместо куда писать есть (первый файл) и описание, что писать вроде то же. Однако отсутствует самая малость - опыт написания прог на С/С++.Если совсем точно некоторый имеется, но под виндой и органичивается написанием простенького каталогизатора, который впоследствии переписал на асм.
Хотелось бы простенький пример проги, которая пишет в символьное устройство.
И поясните: есть строки в rtc.h типа
#define RTC_AIE_ON _IO('p', 0x01) /* Alarm int. enable on */
Я правильно понимаю, что нужно будет использовать примерно RTC_AIE_ON(var1,var2) вместо ioctr(var1,var2)?

PS: если я всеже изобретаю велосипед, ткните носом, какая прога уже может это сделать, а то время несколько ограничено, а имеющийся вариант (оставлять комп включенным до завершения последнего задания (запись с телика)) несколько не очень красиво.
Спасибо сказали:
Аватара пользователя
Red User
Сообщения: 229
ОС: Debian

Re: Управление временем включения компьютера(запись в порты)

Сообщение Red User »

pas писал(а):
16.08.2008 13:18
Хотелось бы простенький пример проги, которая пишет в символьное устройство.


Насколько я понял, писать в символьное устройство ничего не надо. Надо его открыть и вызывать ioctl. Вот примерчик:

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

#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/rtc.h>

int main()
{
    int fd, ret;
    struct rtc_time rtctime;

    fd = open("/dev/rtc", O_RDWR);
    if (fd < 0)
        return 1;

    ret = ioctl(fd, RTC_ALM_READ, &rtctime);
    if (-1 == ret)
        perror("ioctl");
    else
    {
        printf("tm_sec: %d\n", rtctime.tm_sec);
        printf("tm_min: %d\n", rtctime.tm_min);
        printf("tm_hour: %d\n", rtctime.tm_hour);
        printf("tm_mday: %d\n", rtctime.tm_mday);
        printf("tm_mon: %d\n", rtctime.tm_mon);
        printf("tm_year: %d\n", rtctime.tm_year);
        printf("tm_wday: %d\n", rtctime.tm_wday);
        printf("tm_yday: %d\n", rtctime.tm_yday);
        printf("tm_isdst: %d\n", rtctime.tm_isdst);
    }

    close(fd);

    return 0;
}


pas писал(а):
16.08.2008 13:18
И поясните: есть строки в rtc.h типа
#define RTC_AIE_ON _IO('p', 0x01) /* Alarm int. enable on */
Я правильно понимаю, что нужно будет использовать примерно RTC_AIE_ON(var1,var2) вместо ioctr(var1,var2)?


RTC_AIE_ON - это второй аргумент для ioctl.
А ведь когда-то не боялись мы программы любой,
И с одним лишь debug'ом выходили на бой,
И искусно написанный вирус встречали как брата
Спасибо сказали:
pas
Сообщения: 597
Статус: маньяк
ОС: Gentoo

Re: Управление временем включения компьютера(запись в порты)

Сообщение pas »

Большое спасибо за исчерпывающий ответ.
Спасибо сказали:
pas
Сообщения: 597
Статус: маньяк
ОС: Gentoo

Re: Управление временем включения компьютера(запись в порты)

Сообщение pas »

К сожалению возникла небольшая проблема: время при помощи RTC_ALM_SET устанавливается (RTC_ALM_READ читает новое значение и cat /proc/driver/rtc показывает, что значение изменилось, но в БИОС это значение не записывается, почему-то.

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

[root@pas pas]# cat /proc/driver/rtc
rtc_time        : 22:33:16
rtc_date        : 2008-08-16
rtc_epoch       : 1900
alarm           : 21:03:00
DST_enable      : no
BCD             : yes
24hr            : yes
square_wave     : no
alarm_IRQ       : no
update_IRQ      : no
periodic_IRQ    : no
periodic_freq   : 1024
batt_status     : okay

прога (без инклюдов)

Код:

int main() { int fd, ret; struct rtc_time rtctime,rtctime2; struct rtc_wkalrm rw; fd = open("/dev/rtc", O_RDWR); if (fd < 0) { printf("Ошибка"); return 1; } rtctime.tm_sec=0; rtctime.tm_min=3; rtctime.tm_hour=21; ret = ioctl(fd, RTC_ALM_SET, &rtctime); if (-1 == ret) perror("ioctl"); else { printf("Время установлено\n"); } ret = ioctl(fd, RTC_UIE_ON); if (-1 == ret) perror("ioctl"); else { printf("Включен аларм\n"); } ret = ioctl(fd, RTC_ALM_READ, &rtctime2); if (-1 == ret) perror("ioctl"); else { printf("tm_sec: %d\n", rtctime2.tm_sec); printf("tm_min: %d\n", rtctime2.tm_min); printf("tm_hour: %d\n", rtctime2.tm_hour); } close(fd); return 0; }

Может нужно еще какую команду давать, что бы это значение записалось в БИОС?
Спасибо сказали:
pas
Сообщения: 597
Статус: маньяк
ОС: Gentoo

Re: Управление временем включения компьютера(запись в порты)

Сообщение pas »

Поробовал запись и чтение через порт 70h/71h, но ситуация аналогичная. Писал и через /dev/port и напрямую (inb/outb).

Код:

#include <stdio.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <sys/ioctl.h> #include <linux/rtc.h> //#include <asm-x86_64/unistd.h> #include <sys/io.h> //#include <asm/io.h> extern int ioperm(unsigned long , unsigned long , int ); extern void outb(unsigned char, short unsigned int); extern unsigned char inb(short unsigned int); int main() { int fd, ret; long fs; char buf[4]; struct rtc_time rtctime,rtctime2; struct rtc_wkalrm rw; ioperm(0x70, 2, 1); outb(3, 0x70); printf("Записано значение\n"); buf[0]=inb(0x71); printf("Полученное значение=%d\n",buf[0]);

В результате читается не то значение, которое реально вижу в BIOS и которое показывается в /proc/driver/rtc сразу после загрузки, а то которое я туда записал перед этим через /dev/port.
Я в полном тупике и незнаю больше куда смотреть. Может кто выведет на путь истинный?
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Управление временем включения компьютера(запись в порты)

Сообщение watashiwa_daredeska »

Могу порекомендовать покрутить nvram-wakeup. Оно, похоже, сдохло давно, но можно попытаться подкрутить под модель своей материнки.
Спасибо сказали: