Navi
aus Metalab Wiki, dem offenen Zentrum für meta-disziplinäre Magier und technisch-kreative Enthusiasten.
Ziele
- Linux-Navigationsgerät fürs Auto bauen mit ausschließlich Free Software.
- Einarbeiten in UART, SPI, I²C, SPI mit Linux >= 4.4
- Spaß haben
Hardware, abstrakt
- Stromversorgung
- GPS
- FM-Radio
- VAN Bus Controller für Display etc
Hardware, konkret
- 12 V -> 5 V Anker PowerDrive 2 Auto Ladegerät 24W / 4.8A 2-Port USB Kfz "Ladegerät"
- MT3329 GPS Receiver
- TSS463-AA VAN Bus Controller
- MCP2551 CAN Line Driver
- RDA5807M FM Radio
- TDA7850 4-Kanal-Audio-Verstärker
- PT7313E Audio Filter
- A20-OLinuXIno-LIME2 Host Computer
Verbindungen
- 12 V -> 5 V "Anker" Netzteil für Auto: ISO-Stecker, USB
- MT3329 GPS Receiver: UART
- TSS463-AA VAN Bus Controller: SPI
- MCP2551 CAN Line Driver: UART
- RDA5807M FM Radio: I²C, Antenne
- TDA7850 4-Kanal-Audio-Verstärker: Cinch, ISO-Stecker
- PT7313E Audio Filter: I²C, Klinke
- A20-OLinuXIno-LIME2 Host Computer: Ethernet
Hardware-Fallstricke
FM-Antenne
- vorhanden am Auto etc
- hat möglicherweise eingebauten Verstärker
- Verstärker schwierig zu finden (ist meist außerhalb des Autos)
- Phantomspeisung zur Stromversorgung nötig?
- Buchse? ISO oder DIN? Wahrscheinlich DIN.
- Impedanz? 100 Ω? 50 Ω?
EMI
- ElectroMagnetic Interference
- unsere Hardware stellt viele Hochfrequenzstörquellen dar
- Störung von außen gibt’s vielleicht auch
- Audioverstärker sollte nicht gestört werden
- Faradayscher Käfig nötig (1 oder mehr)
- Filterplatte mit Masse
- min. 2 Lagen
Ghost in the Machine
- Pull-Up-Widerstände sind auf den Kommunikationsleitungen notwendig, damit kein Blödsinn gesendet/empfangen wird, wenn ein Gerät ohne Strom ist
Software
- Selbstgebastelte (wenn sinnvoll User-Space-) Treiber für die Hardware
- MT3329 geht über gpsd schon
- xgps-Testprogramm
Linux 4.4-rc2
- Hardware und Verbindungen müssen im Device-Tree-File eingetragen sein (d.h. eingetragen werden)
- Device Tree
- offiziell sollten für Peripherie Device-Tree-Overlays verwendet werden (wird zusätzlich zum Board-Device-Tree-File geladen):
- Spezialsyntax __overlay__ { … }
- dtc -@ xxx.dts
- Linux Command Line: dtoverlay=xxx.dtb beim Booten
- geht nicht in Debian, weil "/plugin/" unbekannt
- Hack: Board-File editieren
- bei unserem Host: sun7i-a20-olinuxino-lime2.dts
- folgendes hinten anhängen und dann: make dtbs und die entstehende Datei sun7i-a20-olinuxino-lime2.dtb dem Bootvorgang zur Verfügung stellen
&uart4 { pinctrl-names = “default”; pinctrl-0 = <&uart4_pins_a>; status = “okay”; }; &spi2 { status = “okay”; pinctrl-names = “default”; pinctrl-0 = <&spi2_pins_a>; van0: tss463aa@1 { compatible = “atmel,tss463aa”; reg = <0>; spi-max-frequency = <4000000>; spi-cpol; spi-cpha; }; }; &i2c2 { pinctrl-names = “default”; pinctrl-0 = <&i2c2_pins_a>; status = “okay”; }; &codec { status = “okay”; };
- Für spidev in Linux drivers/spi/spidev.c editieren :
- das Array spidev_dt_ids erweitern um
{ .compatible = “atmel,tss463aa” },
- vor dem (existierenden) Sentinel
{},
- dann ausführen:
make modules make modules_install
User-Space
- Zugriff auf SPI über spidev
- Linux-Source muss editiert werden., damit /dev/-Datei erscheint
- es existieren verschiedene Headerfiles für SPI. Vorsicht! linux-headers-Paket im User Space installieren&verwenden, nicht /usr/src/linux/include
- Zugriff auf I2C funktioniert auch so
- Zugriff auf UART funktioniert auch so
- Interrupts (EINTxx):
- /sys/class/gpioXXX/edge
- /sys/class/gpioXXX/uevent
- poll() oder select() auf errors
http://svn.nomike.com/playground/trunk/Navi/
TODO
- besser: Interrupts im Kernel abarbeiten
- Vorteil: diese werden auch abgearbeitet wenn das User-Space-Programm gerade kaputt ist und wir stellen so sicher, dass das auslösende Gerät weiterarbeiten kann.
- noch besser: SocketCAN-Netzwerkmodul für VAN-Bus schreiben
- einfachste Vorlage: vcan