Провел поиск в инете, но проги для того, что бы из 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: если я всеже изобретаю велосипед, ткните носом, какая прога уже может это сделать, а то время несколько ограничено, а имеющийся вариант (оставлять комп включенным до завершения последнего задания (запись с телика)) несколько не очень красиво.
Управление временем включения компьютера(запись в порты)
Модератор: Модераторы разделов
-
pas
- Сообщения: 597
- Статус: маньяк
- ОС: Gentoo
-
Red User
- Сообщения: 229
- ОС: Debian
Re: Управление временем включения компьютера(запись в порты)
Насколько я понял, писать в символьное устройство ничего не надо. Надо его открыть и вызывать 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;
}RTC_AIE_ON - это второй аргумент для ioctl.
А ведь когда-то не боялись мы программы любой,
И с одним лишь debug'ом выходили на бой,
И искусно написанный вирус встречали как брата
И с одним лишь debug'ом выходили на бой,
И искусно написанный вирус встречали как брата
-
pas
- Сообщения: 597
- Статус: маньяк
- ОС: Gentoo
Re: Управление временем включения компьютера(запись в порты)
Большое спасибо за исчерпывающий ответ.
-
pas
- Сообщения: 597
- Статус: маньяк
- ОС: Gentoo
Re: Управление временем включения компьютера(запись в порты)
К сожалению возникла небольшая проблема: время при помощи 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: Управление временем включения компьютера(запись в порты)
Поробовал запись и чтение через порт 70h/71h, но ситуация аналогичная. Писал и через /dev/port и напрямую (inb/outb).
В результате читается не то значение, которое реально вижу в BIOS и которое показывается в /proc/driver/rtc сразу после загрузки, а то которое я туда записал перед этим через /dev/port.
Я в полном тупике и незнаю больше куда смотреть. Может кто выведет на путь истинный?
Код:
#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: Управление временем включения компьютера(запись в порты)
Могу порекомендовать покрутить nvram-wakeup. Оно, похоже, сдохло давно, но можно попытаться подкрутить под модель своей материнки.
Мои розовые очки