Hallo miteinander.
Beim gestrigen Besuch meines Lieblings Schrottis habe ich ein Nest
Thermostat mitgenommen.
Eigentlich wollte ich es zerlegen und schauen was so drin ist und vor
allem wie der Encoder gebaut ist weil mir die Haptik gefällt. Das gerät
hat ein rundes Display und man kann den Metallring welcher das Gehäuse
ist zur Bedienung drehen.
Zuhause an den Usb angeschlossen ging es sogar noch an. Es scheint wohl
nicht mal defekt zu sein, allerdings wartet es auf ein fehlendes
"Heatlink"
Google erzählte mir das im inneren ein Linux werkelt und auch gleich wie
man das Ding Rootet.
https://www.exploitee.rs/index.php/Exploiting_Nest_Thermostats
Ich bin allerdings bis auf einige stunden Basteln mit der Vip1710 damals
recht Unerfahren mit Embedded Linux
Ich habe einige Quellen gefunden
https://www.exploitee.rs/index.php/Nest_Hacking#Displayhttps://nest.com/legal/compliance/
Nun stellt sich mir die Frage. Wie bekomme ich eigene Programme drauf
bzw woher bekommt man Compiler und co ?
Es wäre ja schon super dem Ding eine neue Aufgabe zu geben. Zb Digitaler
Bilderrahmen oder zur Bedingung einiger Smarthome Elemente.
;) Fast.
Mir fehlt der Schritt um auf so einer Hardware ein Programm zu
schreiben.
Google liefert mir da mangels Fragewort keine antworten.
Angenommen ich möchte ein einfaches hallo Welt in C Schreiben und auf
dem Gerät Starten.
Wie stellt man das an?
Hi, aller wahrscheinlichkeit nach wird auf dem ding direkt kein gcc oder
anderer compiler. drauf sein. Einfach mal gcc auf der konsole eingeben
und gucken. Oder alle verzeichnisse des suchpfades durchgucken, was da
so rumsteht.
Falls kein compiler dabei ist, braucst du zunächst mal einen
Crosscompiler+BuildTools, die -auf einer abweichenden hardware- Code für
deine Zielplattform generieren. Ganz oben im bootlog steht der Name der
Target-CPU, die linux-kernel version und die für den build des kernel
verwendete gcc-Version.
Am die meisten Cross-Toolchains gibts für Linux. Dh einfach mal dein
preferred linux in einer VM installieren(geht am schnellsten), cross
toolchain oben drauf, suchpfade anpassen, fertig.
Dann musst du dein hello world programm noch irgendwie aufs target
bekommen. Am einfachsten wäre hier ein nfs-mount auf deine linux-vm,
netzwerk ist ja lt bootlog gestartet. Ggf noch die ssid und
wpa2-passphrase in /etc/network auf dem target anpassen.
Ob das geht, hängt davon ab, ob auf dem target überhaupt ein nfs client
installiert ist. Wenn nicht, guck mal ob ein ftp(d) oder ssh(d) oder
ähnliches drauf ist. Irgendwie musst du das hello world aufs target
kriegen. Ein beschreibbares filesystem auf dem target wird es in jedem
fall geben, /var oder /tmp geht immer. Evtl ist auch eines der
flash-filesysteme beschreibbar, dann überlebt dein hello world sogar
einen reboot.
Also auf dem Gerät habe ich erst mal nix gefunden aber einen Gcc für Pc
war sogar einfach :) Da ich schon auf Linux bin brauchte ich auch keine
Vm :)
Ich bekomme über einen Umweg über Curl die Datei von meinem Nas
Webserver auf den Nest. Und siehe da es klappt :)
Jetzt werde ich mich mal versuchen das Netzwerk zu Mounten damit das
ganze etwas einfacher wird.
Bleiben noch zwei Essentielle Probleme. Wie bekomme ich ein Bild auf das
Display und wie frage ich den Ringencoder ab.
Grafik ist unter Fb0 erreichbar mit cat /dev/urandom > /dev/fb0 bekomme
ich bunte Pixel.
Aber wie setze ich aus C einen Pixel
und wie komme ich an die Eingänge
input: pwm-beeper as /devices/platform/pwm-beeper/input/input0
Avago ADBS driver
input: avago-adbs-a330 as
/devices/platform/omap/omap_i2c.2/i2c-2/2-0057/input/input1
input: twl4030_pwrbutton as
/devices/platform/omap/omap_i2c.1/i2c-1/1-0049/twl4030_pwrbutton/input/i
nput2
Keks schrieb:> schmeisst deine> suchmaschine viele brauchbare treffer...
Absolut :) nur leider zu viele. Und ich habe zu wenig Ahnung.
Okay ich habe da ein Programm gefunden leider ohne Beschreibung.
Es lässt das Display in Grau / Schwarz erstrahlen
Über memset(FrameBuffer, 128, FixedInfo.smem_len); werden daten in den
Buffer geschoben. nur finde ich nicht woher diese kommen?
Ich hätte eine schleife erwartet in welcher erstmals die 0 Pixel erzeugt
werden oder so.
Es gibt einige andere Beispiele bei denen das so ist aber diese erzeugen
auf dem Nest nur eine Fehlermeldung dort wird auch anstelle von memset
nur mit munmap gearbeitet.
Das beispiel schreibt mit memset ganz dumpf 0x80 an jede fb-adresse,
ohne sich um zeilen, spalten, bytes per pixel zu kümmern. Im endeffekt
gibt das dann grau. Du kannst dieses beispiel aber erweitern, indem du
die werte (und andere) aus fix_ und var_screeninfo rausklaubst und mit
diesen infos dann strukturiert in FrameBuffer reinschreibst. Du brauchst
dazu lediglich die organisation eines pixels im FB, die zeilenlänge und
die Anzahl der Zeilen. Darauf kannst du dann deine eigenen
Zeichenfunktionen aufsetzen.
Ungefähr. es sind bits_per_pixel/8 bytes. Meistens drei oder vier. RGB
oder RGBA, kann aber auch was exotisches sein. ZB 565 bits für RGB und
zwei bytes per pixel. Einfach mal ausprobieren. Und du kannst dann auch
bei 32 bpp direkt einen uint32 per memset schreiben. Muss nicht
unbedingt byteweise sein.
Es sind 1 Byte Pro Pixel RGB und ein Byte ohne ersichtliche Funktion.
Somit sollte ich jetzt Schonmal Bilder auf das Display bekommen.
Ist das denn eigentlich der Richtige weg Bilder auf ein Display zu
bekommen oder gibt es da einfachere Wege als im Speicher Pixel zu
setzen?
Ich erinnere mich an qbasic zurück dort gab es so Draw und Circle
functionen.
Keks schrieb:> Draw und Circle setzen im endeffekt auch auf diese primitiven> setze-pixel-funktionen auf...
Ich weiß :) ich hatte nur gehofft das es fertige befehle gibt damit ich
nicht alles selber machen muss :)
Es gibt in den weiten des Internetz viele graphic libraries in C, die
auf dem Framebuffer aufsetzen, von klein bis fett. Einfach mal suchen.
Hier eine von den einfacheren, vermittelt dir eine Idee, wie's gehen
könnte:
https://github.com/boppreh/framebuffer
Wenn du Textdarstellung brauchst, findest du bestimmt auch eine fertige
FontEngine.