Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru
Партнеры:
otladka.com.ua - г.Киев

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:2
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:6
Форум » starterkit.ru » Embedded Linux
Установка времени в RTC
Alex
Добавлено 09.11.2009 09:31
0
Сообщение: 1
Alex
0

Регистрация: 08.07.2009
Обращаюсь за помощью к сенсеям данной темы. Имеется - устройство на основе AT91SAM9260, в нём живёт линукс с ядром 2.6.27 и есть микросхема часов DS1307. Часы нормально работают, устанавливаются при помощи утилиты hwclock.
Необходимо устанавливать часы из приложения. Но я столкнулся с засадой...
1. Функция system("/sbin/hwclock -w"); сообщает что "applet not found", причём такое сообщение возникает при любом вызове system, например system("mkdir temp");
2. Если пойти другим путём:

struct rtc_time rt;
fd = open("/dev/rtc", O_RDONLY); (или fd = open("/dev/rtc", O_RDWR); или fd = open("/dev/rtc0", O_RDONLY);)
ioctl(fd, RTC_SET_TIME, &rt);
close(fd);

"устройство открывается" и дескриптору fd присваивается нормальное значение... но функция ioctl возвращает -1

Подскажите....
Спуститься к концу Подняться к началу
Персональная информация
Pavel Ivanchenko
Добавлено 09.11.2009 09:40 Сообщение: 2
Pavel Ivanchenko
Admin
4.39

Пункты: 91348
Регистрация: 24.03.2009
Пол: Мужчина
Попробуйте не саму функцию вызывать, а бузибокс с аргументом запуска требуемой функции ...
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 09.11.2009 11:54 Редактировалось 09.11.2009 11:56 Сообщение: 3
sasamy
4.70

Пункты: 76880
Регистрация: 14.08.2009
Цитата
"устройство открывается" и дескриптору fd присваивается нормальное значение... но функция ioctl возвращает -1


А что она должна возвратить если ей передается некорректное значение ? Смотрите исходники busybox - там все очень понятно и кратко, каждой команде соответствует отдельный файл команда.c так что для поиска нужны минимальные усилия.
Спуститься к концу Подняться к началу
Персональная информация
Alex
Добавлено 09.11.2009 14:32 Сообщение: 4
Alex
0

Регистрация: 08.07.2009
И что некоректоного я передаю в ioctl? Может я просто это не вижу, бывает такое... но можно было и точнее сказать. В исходниках busybox именно так и пишется в rtc в функции write_rtc
Спуститься к концу Подняться к началу
Персональная информация
Alex
Добавлено 09.11.2009 14:42 Сообщение: 5
Alex
0

Регистрация: 08.07.2009
А как вызвать busybox с параметром? system("/bin/busybox hwclock"); ? На это ругается так же - applet not found
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 09.11.2009 15:02 Сообщение: 6
sasamy
4.70

Пункты: 76880
Регистрация: 14.08.2009
Цитата
В исходниках busybox именно так и пишется в rtc в функции write_rtc


Там тоже структура rtc_time неинициалированная передается ?
Спуститься к концу Подняться к началу
Персональная информация
Alex
Добавлено 09.11.2009 15:03 Сообщение: 7
Alex
0

Регистрация: 08.07.2009
Я же просто опустил эти скучные строчки. Конечно же там передаются значения времени.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 09.11.2009 20:21 Редактировалось 09.11.2009 20:56 Сообщение: 8
sasamy
4.70

Пункты: 76880
Регистрация: 14.08.2009
У меня вроде работает. Код практически один в один с бб:

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

int main(void)
{
struct tm tm;
struct timeval tv;
int rtc = open("/dev/rtc0", O_WRONLY);

gettimeofday(&tv, NULL);

tm = *localtime(&tv.tv_sec);
tm.tm_isdst = 0;

printf("return %d\n", ioctl(rtc, RTC_SET_TIME, &tm));

close(rtc);

return 0;
}

ЗЫ: struct tm или rtc_time - роли не играет, это фактически одно и тоже
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 10.11.2009 01:06 Сообщение: 9
sasamy
4.70

Пункты: 76880
Регистрация: 14.08.2009
Интересно - есть известный глюк на наших камнях sam9260 ревизии А - в rtt некорректное значение после ресета и hwclock например у меня отказывается рабтать сразу после ресета, но после установки корректного значения этим
Код

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

int main(void)
{
struct rtc_time rt;
time_t secs = 0;
int rtc = open("/dev/rtc0", O_WRONLY);

rt = *((struct rtc_time *)gmtime(&secs));
rt.tm_isdst = 0;

printf("return %d\n", ioctl(rtc, RTC_SET_TIME, &rt));

close(rtc);

return 0;
}



все начинает работать, хотя казалось бы в ББ практически все тоже самое...
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 29.11.2010 11:55 Сообщение: 10
Jury093
4.5

Пункты: 54233
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
все начинает работать, хотя казалось бы в ББ практически все тоже самое...

наступил на аналогичные грабли на 9G45: вставил батарейку, в логе:
Код
Setting the system clock.
RTC_RD_TIME: Invalid or incomplete multibyte or wide character
ioctl() to /dev/rtc0 to read the time failed.
Unable to set System Clock to: Thu Jan 1 00:00:13 UTC 1970 (warning).

hwclock ругался на ширину данный и еще какую-то хрень
взял твой сорец, скомпилил на плате
Код
armets:~# cd /home/jury/my-prog/rtc-start/
armets:/home/jury/my-prog/rtc-start# make
gcc rtc-start.c -o rtc-start
armets:/home/jury/my-prog/rtc-start# ls
Makefile rtc-start rtc-start.c
armets:/home/jury/my-prog/rtc-start# ./rtc-start
return 0
armets:/home/jury/my-prog/rtc-start# hwclock
Thu Jan 1 00:00:07 1970 -0.113026 seconds
armets:/home/jury/my-prog/rtc-start# date 112911372010
Mon Nov 29 11:37:00 UTC 2010
armets:/home/jury/my-prog/rtc-start# hwclock --systohc
armets:/home/jury/my-prog/rtc-start# hwclock
Mon Nov 29 11:37:20 2010 -0.356176 seconds
armets:/home/jury/my-prog/rtc-start# date
Mon Nov 29 11:37:31 UTC 2010
armets:/home/jury/my-prog/rtc-start# reboot
...
bla-bla-bla
...
rtc-at91sam9 at91_rtt.0: setting system clock to 2010-11-29 11:38:33 UTC (1291030713)

для контроля выключил питание платы, включаю
Код
rtc-at91sam9 at91_rtt.0: setting system clock to 2010-11-29 11:40:31 UTC (1291030831)


Спасибо Саша.

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux