Navi: Unterschied zwischen den Versionen
| Dannym (Diskussion | Beiträge) | Dannym (Diskussion | Beiträge) | ||
| Zeile 99: | Zeile 99: | ||
| <pre> | <pre> | ||
| #include <dt-bindings/pwm/pwm.h> | |||
| / { | / { | ||
| 	tss463aa { | 	tss463aa { | ||
Version vom 20. Mai 2018, 10:19 Uhr
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, Tasten etc
Hardware, konkret
- 12 V -> 5 V Anker PowerDrive 2 Auto "Ladegerät" 24W / 4.8A 2-Port USB
- U-Blox 7 GPS Receiver
- TSS463-AA VAN Bus Controller
- MCP2551 CAN Line Driver
- RDA5807M FM Radio
- TDA7850 4-Kanal-Audio-Verstärker
- PT7313E Audio Filter
- MAX3002 Level Shifter
- A20-OLinuXIno-LIME2 Host Computer
Verbindungen
- 12 V -> 5 V Anker Netzteil für Auto: ISO-Stecker, USB
- MT3329 GPS Receiver: UART4
- TSS463-AA VAN Bus Controller: SPI2
- MCP2551 CAN Line Driver: UART, aber zwischen TSS463-AA und MCP2551
- RDA5807M FM Radio: I²C2, Antenne
- TDA7850 4-Kanal-Audio-Verstärker: Cinch, ISO-Stecker
- PT7313E Audio Filter: I²C, Klinke
- A20-OLinuXIno-LIME2 Host Computer: Ethernet
A20 Pinout
- UART4: PG10,PG11 (on GPIO-1)
- SPI2: PC19,20,21,22 (on GPIO-1)
- I2C2: PB20, PB21 (on GPIO-1)
- maybeEINT: PI17 (pin# 38) (possible: PI10..PI13, PI16..PI19 incl.; prefer: PI16, PI17 [muxed UART2 RTS, CTS]) [muxed SPI0, SPI1, UART5, UART6] (on GPIO-2)
- CAN: PH20 [pin# 33], PH21 [pin# 35] (on GPIO-3)
- PS2: PH12, PH13, PI14, PI15 [muxed with SPI0 CS, SPI1 CS, EINT] (on GPIO-3)
- EINT: PH0, PH9..PH11, PH14..PH21 incl. [muxed UART3, CSI] (on GPIO-3) ^^^ best: PH8,9 [pin#11],10,11
- FM In: FMINR, FMINL (on GPIO-4)
- Line In: LINEINR, LINEINL (on GPIO-4)
- [TV In: TVIN0, TVIN1, TVIN2, TVIN3 (on GPIO-4)]
- maybe TODO: IR (both CIR and IRDA)
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? 150 Ω (wahrscheinlich)? 50 Ω (wahrscheinlich nicht)? Antennenanpassung nötig?
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.17.0-rc5
- 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
 
 
- offiziell sollten für Peripherie Device-Tree-Overlays verwendet werden (wird zusätzlich zum Board-Device-Tree-File geladen):
#include <dt-bindings/pwm/pwm.h>
/ {
	tss463aa {
		compatible = “atmel,tss463aa”;
		clocks = <&clk_out_a>;
		clock-frequency = <8000000>;
		pinctrl-0 = <&clk_out_a_pins_a>;
		pinctrl-names = "default";
	};
        pwm_bl: backlight {
                compatible = "pwm-backlight";
                pwms = <&pwm0 0 50000>; /* FIXME settings; FIXME use pwm0_pins_a. */
                brightness-levels = <0 2 5 7 10 12 15 17 255>; /* FIXME more */
                default-brightness-level = <0>;
                pinctrl-names = "default";
                pinctrl-0 = <&bl_enable_pin>;
                enable-gpios = <&pio 7 8 GPIO_ACTIVE_HIGH>; /* FIXME: LCD power: PH8. */
        };
        panel: panel {
                compatible = "innolux,at070tn92", "panel-dpi";
                backlight = <&pwm_bl>;
                /* TODO power-supply = <&vdd_pnl_reg> */
                /* TODO port@0 { ... ...endpoint { tcon0_out_panel } } */
        };
};
&pio {
   ...
        bl_enable_pin: bl_enable_pin@0 {
                pins = "PH8";
                function = "gpio_out";
        };
};
&uart4 {
	pinctrl-names = “default”;
	pinctrl-0 = <&uart4_pins_a>;
	status = “okay”;
};
&spi2 {
	status = “okay”;
	pinctrl-names = “default”;
	pinctrl-0 = <&spi2_pins_a>, <&spi2_cs0_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”;
};
/* touchscreen */
&rtp {
        allwinner,ts-attached;
        #thermal-sensor-cells = <0>;
        /* sensitive/noisy touch panel */
        allwinner,tp-sensitive-adjust = <0>;
        allwinner,filter-type = <3>;
};
&pwm {
        pinctrl-names = "default";
        pinctrl-0 = <&pwm0_pins_a>, <&pwm1_pins_a>;
        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/
Softwarekonfiguration
http://www.catb.org/gpsd/gpsd-time-service-howto.html
Linux Kernel:
CONFIG_PPS=y CONFIG_PPS_CLIENT_LDISC=y
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