Forum: PC-Programmierung rtcwake Raspberry


von Frank (Gast)


Lesenswert?

Hallo Forum,

ich habe gerade ein kleines Projekt indem ich einen Raspberry Pi Zero W 
verwende. An ihm ist über i2c1 ein DS3231 Modul angeschlossen als RTC.
Der Raspberry soll später komplett abgeschalten sein und nur an gewissen 
Uhrzeiten durch die RTC geweckt werden. Hierzu möchte ich den Alarm in 
der RTC über den Raspi stellen. Sobald der RTC den Alarm über !INT! 
meldet, wird der Raspi über einen Highside-Switch angeschalten, erledigt 
seine Aufgaben, stellt das nächste Weckdatum und fährt herunter (wodurch 
der Highside-Switch die Spannungsversorgung für den Raspi kappt. Das 
Spiel wiederholt sich dann zur nächsten Weckzeit.

Das RTC-Modul wird beim Startup richtig geladen.
Ein Request bei der hwclock liefert die aktuelle Uhrzeit
1
sudo hwclock
2
Sat 15 Apr 2017 13:19:11 CEST  -0.817910 seconds

Als rtc0 wird gemeldet:
1
cat /sys/class/rtc/rtc0/name
2
ds3231

Soweit so gut.
Nun wollte ich mit rtcwake die Alarmzeit in der RTC stellen:
1
sudo rtcwake -m no -t $(date +%s -d 'today '20:00'')
Allerdings bekomme ich hier schon eine Fehlermeldung:
1
rtcwake: enable rtc alarm failed: Invalid argument

Wenn ich anschließend die Daten der RTC ausgeben lasse, wurde zwar die 
Alarmzeit gestellt, anscheinend wird aber der Alarm (so wie in der 
Fehlermeldung steht) nicht aktiviert:
1
cat /proc/driver/rtc
2
rtc_time        : 11:32:45
3
rtc_date        : 2017-04-15
4
alrm_time       : 18:00:00
5
alrm_date       : 2017-04-15
6
alarm_IRQ       : no
7
alrm_pending    : no
8
update IRQ enabled      : no
9
periodic IRQ enabled    : no
10
periodic IRQ frequency  : 1
11
max user IRQ frequency  : 64
12
24hr            : yes

Ich bin zugegebenermaßen nicht gerade fit was Embedded Linux oder Linux 
allgemein angeht.
Gibt es hier jemand der eine Idee hätte was man an der Stelle machen 
könnte um das Problem zu beheben?
Was mache ich falsch?

Grüße und frohe Ostern
Frank

P.S: Dass die Weckzeit nicht richtig gestellt wurde schiebe ich mal auf 
CEST vs. UTC. Das würde ich als nächstes angehen.

von Frank (Gast)


Lesenswert?

Hm, ich habe mal in rtcwake.c (static int setup_alarm(int fd, time_t 
*wakeup)) etwas geblättert:
[[https://github.com/mmalecki/util-linux/blob/master/sys-utils/rtcwake.c]]

Da gibt es die Codezeile:
1
if (ioctl(fd, RTC_AIE_ON, 0) < 0)
2
{
3
  warn(_("enable rtc alarm failed"));
4
  return -1;
5
}

Wahrscheinlich liegt es also daran, dass der Alarm Interrupt nicht 
enabled ist. Kann mir jemand sagen wo ich den einschalte?

von Sascha W. (sascha-w)


Lesenswert?

Hallo Frank,

kann es evl. sein das sich die IRQ-Angabe nur auf den RPi bezieht? Da 
kannst du niemals einen RTC-IRQ aktivieren weil ja auch Hardwaremäßig 
keiner exsistiert.
Hast du mal probiert ob der Chip zur gesetzten Zeit ein Signal ausgibt? 
Notfalls kannst du den IRQ in der RTC ja auch direkt über einen 
I2C-Befehl aktivieren.

Sascha

von Frank (Gast)


Lesenswert?

Hallo Sascha,

danke für die Antwort.

Sascha W. schrieb:
> kann es evl. sein das sich die IRQ-Angabe nur auf den RPi bezieht? Da
> kannst du niemals einen RTC-IRQ aktivieren weil ja auch Hardwaremäßig
> keiner exsistiert.
Eigentlich interessiert mich der Interrupt ja garnicht. Zum Zeitpunkt wo 
der Interrupt kommt ist der RPi ja sowieso abgeschalten. Ich möchte das 
HW-Signal ja nur verwenden um den RPi wieder einzuschalten.

Sascha W. schrieb:
> Hast du mal probiert ob der Chip zur gesetzten Zeit ein Signal ausgibt?
Ich habe eine LED + Vorwiderstand (< 2mA) gegen Vcc. Ist ja ein 
Open-Kollektor der !INT!. Ich könnte aber mal die LED entfernen und mit 
dem Multi messen. Da hast Du recht.

Sascha W. schrieb:
> Notfalls kannst du den IRQ in der RTC ja auch direkt über einen
> I2C-Befehl aktivieren.
Ja das war auch mein erster Gedanke. Allerdings scheint das nicht zu 
gehen solange der Treiber die Füße drauf hat. Ich hab es zumindest nicht 
über die i2ctools oder ein C-Programm hinbekommen. Beides Mal die 
Fehlermeldung dass das Device bereits belegt ist. Ich müsste also erst 
den Treiber wieder deaktivieren. Das wollte ich im ersten Zug vermeiden 
wenn Linux eigentlich schon die Mittel mitbringt. Klar, ansonsten hänge 
ich den Treiber wieder aus und schreibe mein eigenes Programm wo die 
Sysclock setzt bzw. den Alarm.

Grüße
Frank

von Frank (Gast)


Lesenswert?

Frank schrieb:
> Sascha W. schrieb:
>> Hast du mal probiert ob der Chip zur gesetzten Zeit ein Signal ausgibt?
> Ich habe eine LED + Vorwiderstand (< 2mA) gegen Vcc. Ist ja ein
> Open-Kollektor der !INT!. Ich könnte aber mal die LED entfernen und mit
> dem Multi messen. Da hast Du recht.

Also ich hab es mal ausprobiert. Die Alarmzeit wird richtig in die RTC 
geschrieben über rtcwake. Es fehlen nur die AxIE-Bits und das INTCN-Bit 
wodurch der Ausgang nicht gesetzt wird.

Wenn ich den Treiber aushänge und über i2ctools die Bits setzte, wird 
der Alarm/Output zur richtigen Zeit gesetzt.

von Henrik Haftmann (Gast)


Lesenswert?

Hallo,
bei mir auf einem normalen Raspberry Pi ist es so, dass rtcwake gar 
nicht funktioniert, weil sich Kernel-Overlay ds3107.ko (für ds3231) und 
rtcwake uneins über Systempfade sind.
Das Overlay wird mit entsprechenden Parametern geladen:
/boot/config.txt:
dtoverlay=i2c-rtc,ds3231,wakeup-source
Alles weitere habe ich hier dokumentiert:
http://www.tu-chemnitz.de/~heha/ewa/Logger/#wakeup

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.