Picctl
Aus open7x0.org
Das Programm picctl soll das Programm pic_control ablösen. Beide stellen eine Schnittstelle zum Modul 'pic16f73.o', welches mit dem PIC kommuniziert. Der PIC steuert die Stromversorgung (ein/aus), hat einen Echtzeitruhr und einen Timer, der die Box zu einer fest programmierten Zeit aufweckt.
Inhaltsverzeichnis |
Vorgaben für die Entwicklung
Bei der Entwicklung des Programmes 'picctl' gab es die folgenden selbstgesteckten Vorgaben:
- Das Programm soll möglichst kompatibel zu 'pic_control' sein, damit es dieses problemlos ersetzen kann.
- Das Programm soll alle ioctl()-Kodes des Modules unterstützen, und nicht nur ein paar wenige, wie es 'pic_control' tut.
- Die Ausgabe soll Script-lesbar sein.
- Um weitere ioctl()-Kodes austesten zu können, soll es numerische Kodes mit beliebig vielen Parametern annehmen können.
- Es sollen mehrere Befehle sequenziell (ähnlich wie im einem Script) abgearbeitet werden können. Dieses Feature ist wichtig für eine dynamische LED-Steuerung.
- Es können alternative und lesbarere Namen angegeben werden.
Hieraus ergab sich das folgende Syntax-Modell:
- Nichtnumerische Befehle und deren Parameter werden einfach nacheinander durch Leerzeichen getrennt angegeben. Da die Anzahl der notwendigen Parameter bekannt ist, kann das Ende eines Kommandos genau erkannt werden.
- Numerische Befehle werden durch das Pluszeichen ('+') eingeleitet. Dieses macht sie eindeutig und von numerischen Parametern unterscheidbar. Da die Anzahl der Parameter nicht vorgegeben ist, werden diese nach einem Gleichheitszeichen ('=') angegeben, wobei die einzelnen Parameter durch Kommata (',') voneinander getrennt sind. Leerzeichen werden nicht benutzt.
Die aktuelle Quelltext befindet sich in SVN:
Ausgabe der Inline-Hilfe
picctl V0.08 - Dirk Clemens - 2006-09-18 usage: picctl [options]... [mode [value]]... [+mode[=p1[,p2]...]]... Options: -h --help print this help. -l --list list all modes. -v --version print version and exit. -q --quiet suppress output of modes with parameters. -r --repeat repeat all commands endless. -x --hex print result in hex without prefix. -d --debug print debug infos to stderr. -t --test test mode, don't ioctl anything. Modes: (1-14,16-19,256,391) get-time 4 get pic time in utc (PICGetTime) set-time utc_time 1 set pic time in utc (PICSetTime) get-alarm 5 get alarm time in utc (PICGetAlarm) set-alarm utc_time 2 set alarm time in utc (PICSetAlarm) clear-alarm 3 clear alarm (PICClearAlarm) set-shutdown delay_sec 6 power-off in N seconds (PICSetShutdown) set-reboot n_sec m_sec 7 power-off in N + reboot in M sec (PICSetReboot) get-startup-mode 16 get startup mode (PICGetStartUp) set-mid-led 8 set middle led (PICSetRedLed) clear-mid-led 10 clear middle led (PICClearRedLed) set-outer-led 9 set outer leds (PICSetGreenLed) clear-outer-led 11 clear outer leds (PICClearGreenLed) dimm-led off on dur md 12 dimm led (PICDimmLed) get-led-status 13 get led status (dimm values) (PICGetLedStatus) link-led 17 set middle led (PICLinkLed) unlink-led 18 stop blinking of middle led (PICUnlinkLed) blink-led 19 start blinking of middle led (PICBlinkLed) get-chip-nr 256 get chip number (FTGetChipNr) get-voltages 14 get voltages (PICGetVoltages) get-mac 391 extract the network mac from pic data (FTGetData) sleep sec flush output and sleep N seconds msleep milli_sec flush output and sleep N milli seconds wait wait until 'dimm-led' has finished +mode[=p1[,p2]...] any numeric mode (c like numbers)
Einige Kommandos im Detail
set-shutdown
Syntax: picctl set-shutdown <delay_in_sec>
Dieses Kommando schaltet die Box nach einer Verzögerung von <delay_in_sec> Sekunden aus. Hierzu trennt der PIC das restliche System von der Stromversorgung.
set-reboot
Syntax: picctl set-shutdown <power_off_delay> <reboot_delay>
Dieses Kommando schaltet die Box nach einer Verzögerung von <power_off_delay> Sekunden aus. Hierzu trennt der PIC das restliche System von der Stromversorgung.
Nach weiteren <reboot_delay> Sekunden wird der Strom wieder eingeschaltet und damit ein Neustart ausgeführt
get-startup-mode
Syntax: picctl get-startup-mode
Dieses Kommando liefert zwei Werte:
Beim ersten Wert handeltet es sich gemäß Kernel-Log um dem Shutdown-Modus. Bisher sind mir 2 Werte aufgefallen:
- Wert 1: Nach einem Stromausfall.
- Wert 32: sonst.
Der zweite Wert gibt den Start-Modus an:
- Wert 1: Die Box wurde nach einem Stromausfall gestartet.
- Wert 2: Die Box wurde über einen Timer (Befehl 'set-alarm') gestartet.
- Wert 4: Die Box wurde manuell über die POWER-Taste der Fernbedienung gestartet.
- Wert 8: Die Box wurde aufgrund des Befehles 'set-reboot' gestartet.
dimm-led
Syntax: picctl dimm-led <dunkel> <hell> <dauer> <flags>
- <dunkel> & <hell>
Die ersten beiden Parameter geben die Lichtstärke für 'dunkel' und 'hell' der beiden äußeren LED s an. Die Werte sind aus dem Bereich 0 (aus) bis 40 (maximale Leuchtkraft).
Außerdem sollte gelten: dunkel < hell
Werte >40 bewirken keine weitere Aufhellung der LED. Diese Werte sind jedoch relevant für die Dimming Dauer. Dieses wird z.B. am Kommando 'picctl dimm-led 0 200 1 0x11' gut sichtbar.
- <dauer>
Der PIC verändert die Helligkeit der LEDs in Einzelschritten. Dieser Wert legt nun fest, wieviel Zeit zwischen zwei dieser Modifikationen vergehen. Die Angabe erfolgt in 10 Millisekunden Einheiten.
Die Gesamtdauer einer Phase errechnet sich daher aus:
T_sec = abs(dunkel-hell) * dauer/100
Sind Helligkeiten und Zeitdauer vorgegeben, dann ergibt sich für den Wert 'dauer' durch Umformung der obigen Formel die folgende Formel:
dauer = 100 * T_sec / abs(dunkel-hell)
- <flags>
Die Flags entscheiden die eigentliche Operation. Das Dimmen bezieht sich aussschlißlich auf die äußeren beiden LEDs.
- Bit-0 (Wert 1)
Ist das Bit gesetzt, dann wird das Auf- und Abdimmen zyklisch wiederholt. Bit-1 ist dann unerheblich und Bit-2 legt die anfängliche Richtung fest. - Bit-1 (Wert 2)
Ist das Bit gesetzt, dann wird einmal auf und einmal abgedimmt. Bit-2 legt hierbei die anfängliche Richtung fest. - Bit-2 (Wert 4)
Ist das Bit gesetzt, dann wird von Hell nach Dunkel gedimmt. Ist es nicht gesetzt, dann wird von Dunkel nach Hell gedimmt. - Bit-3 (Wert 8)
-ungenutzt- - Bit-4 (Wert 16)
Nur, wenn dieses Bit gesetzt wird, wird überhaupt gedimmt. Falls nicht gesetzt, dann ist der Zustand der Bits 0-2 unerheblich. - Bit-5 (Wert 32)
Ist dieses Bit gesetzt, dann wird einmalig die mittlere LED ausgeschaltet und wieder mit voller Intensität aktiviert. Dieses Bit arbeitet unabhängig von allen anderen Bits. - Bit-6 (Wert 64)
-ungenutzt- - Bit-7 (Wert 128)
-ungenutzt-
</li>
get-led-status
Syntax: picctl get-led-status
Die Abfrage liefert 4 Werte, deren Bedeutung paarweise identisch mit denen von 'dimm-led' ist.
Die ersten 3 Werte sind identisch mit denen des letzten 'dimm-led' Befehles.
Der 4. Wert <flags> enthält dynamische Informationen über den aktuellen Zustand des Dimmens:
- Bit-0 (Wert 1)
Ist das Bit gesetzt, dann ist das zyklische Auf- und Abdimmen aktiviert. Bit-1 ist dann unerheblich. - Bit-1 (Wert 2)
Ist das Bit gesetzt, dann ist das einmalige auf auf- und abdimmen aktiviert. Sobald der Dimm-Vorgang beendet ist, wird dieses Bit gelöscht. - Bit-2 (Wert 4)
Ist das Bit gesetzt, dann wird gerade von Dunkel nach Hell gedimmt. Ist es nicht gesetzt, dann wird gerade von Hell nach Dunkel gedimmt. Am Ende des Dimmens wird der Zustand angezeigt, der als nächsten aktive wäre. - Bit-3 (Wert 8)
-unverändert- - Bit-4 (Wert 16)
Dieses Bit bleibt solange gesetzt, bis das Dimmen beendet ist. - Bit-5 (Wert 32)
Dieses Bit ist immer 0. - Bit-6 (Wert 64)
-unverändert- - Bit-7 (Wert 128)
-unverändert-
Das Modul-Protokoll
Das Modul wird über /dev/pic mit der Funktion ioctl() angesprochen. Für die Parameterübergaben wird ein Feld mit 32-Bit-Werten (z.B. int buf[100]) benötigt. Dieses Feld muss hinreichend groß sein, um alle Parameter aufzunhemen. Der erster Wert (buf[0]) gibt jeweils die Anzahl der folgenden Werte an.
Bei der Analyse der Kommandos und derer Parameter hat die Überwachung der Ausgabe von /proc/kmsg mit Hinweisen auf Kommandoname und Parameteranzahl sehr geholfen.
Parameterübergabe an das Modul
Ins erste Element (buf[0]) wird die Anzahl der folgenden Parameter angegeben. Die folgenden Elemente werden mit den zu übergebenen Daten befüllt.
Ergebnisse des Modules
Im ersten Element (buf[0]) steht die Anzahl der Rückgabewerte, die ab buf[1] folgen.
Sonderfall FTGetData
Das Kommando FTGetData (391==0x187) stellt einen Sonderfall da. Hier muss ein Zeiger auf die folgende Struktur übergeben werden:
struct mac_t { int unknown1; int unknown2; int unknown3; int length; // length of buf in bytes unsigned char * buf; // pointer to a buffer };Bei der Rückgabe hat 'length' immer den Wert 128. In den ersten 6 Bytes von 'buf' steht dann die MAC-Adresse. Die anderen Bytes haben immer den Wert 0xff.
Links zum Thema »VDR Firmware«
- VDR Firmware, Opener-Firmware, VDR Firmware FAQ, Download
- Menu-System
- Wichtige Verzeichnisse
- Parameter
- Wichtige Kommandos
- dump-info, picctl
Kommandos in »Lemmis Firmware«
- Bit-0 (Wert 1)

