README.md 2.36 KB
Newer Older
Jonathan Klamroth's avatar
Jonathan Klamroth committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65

# Firmware für die IPU im AM57xx

Die Firmware ist allgemein die Schnittstelle zur Hardware und hat dafür folgende
Aufgaben:
* Befehle (vom Linux) umsetzen -> Motor, Servo
* Sensordaten messen und (ans Linux) weiterleiten -> Abstände
  (vorne/hinten/seitlich), Geschwindigkeit
* Steuerung über die RC Fernbedienung

Weitere Infos sind im Wiki zu finden:
https://wwwvs.cs.hs-rm.de/vs-wiki/index.php/(WS20-01)_Autonomes_Modellfahrzeug/Firmware

## Bauen

 # Config laden, siehe ./configs/
 make car2_1_1.5ms_LiPo_defconfig

 # Build
 make

## "Flashen"

 scp carolocupFirmware carolo-car1:/lib/firmware/dra7-ipu1-fw.xem4

Die Firmware wird nicht automatisch neugeladen. Dazu muss die IPU zum Absturz
gebracht werden, was diese neustartet - oder der remoteproc Treiber (lädt den
Code in die IPU und startet diese) neu geladen werden.

## Reset

Der Reset wird durch das Neuladen des remoteproc Treibers ausgelöst, außerdem
ist es während dem Debuggen praktisch, recovery auszuschalten. Damit wird
verhindert, dass die IPU z. B. bei einer mmufault, also wenn man einen
unerlaubten Speicherzugriff macht, neugestartet wird. Damit kann der Fehler mit
gdb untersucht werden.

 ssh carolo-car1 '/sbin/rmmod omap_remoteproc ; /sbin/modprobe omap_remoteproc ; sleep 1 ; echo disabled >/sys/kernel/debug/remoteproc/remoteproc0/recovery'

## Debuggen

Zum Debuggen, muss openocd auf dem Rechner, an dem das Auto angeschlossen ist,
gestartet werden. Dadurch steht in GDB Server bereit:

 ssh -L 3333:localhost:3333 -L 4444:localhost:4444 carolo-debug /opt/carolo/connect-car1-ipu1.sh

Die Optionen `-L` aktivieren Port Forwarding, sodass man GDB lokal starten kann:

 gdb-multiarch carolocupFirmware

Dies muss vom Root-Verzeichnis des Repos ausgeführt werden. Zum einen, damit
carocarolocupFirmware gefunden wird und zum anderen, damit die Datei .gdbinit
gefunden wird. Damit wird automatisch ein Breakpoint bei `main()` gesetzt und
gewartet, bis dies erreicht wurde. Dazu muss vorher in der Config die Option
"Wait for Debugger" (in "Mach Settings") aktiviert sein. Damit wartet der Code
auf den Debugger, der über die .gdbinit bestätigt wird.

Auf Ausgaben mit `printf()` kann über ein entsprechendes File des Treibers
zugegriffen werden:

 cat /sys/kernel/debug/remoteproc/remoteproc0/trace0

Es gibt einen Bug, bei dem manchmal keine Ausgaben zu sehen sind. Dann muss die
IPU wie oben beschrieben resettet werden.