====== Contiki 3.0 auf dem @ANY2400 & @ANY900 USB Stick mit RPL-Border-Router und SLIP ======
Der @ANY USB Stick ist eigentlich nicht für den Einsatz als IPv6 Router konzipiert, er besitzt nicht wie der Raven RZUSB-Stick ein vollständiges USB Interface mit RNDIS Support, sondern nur einen CP2103 Chip, welcher als virtuelle serielle Schnittstelle genutzt werden kann. Um jedoch einzelne Contiki Knoten über IPv6 erreichen zu können und diese bei Bedarf über IPv6 mit einer globalen Adresse erreichbar zu machen, kann dieser USB Stick als Router bzw. Gateway eingesetzt werden.
{{:contiki:a-n-solutions-module:atanyusbstick.jpg?600|}}
Der @ANY2400 USB Stick besitzt das AT-ANY-2400-1 Modul, der @ANY900 USB Stick das AT-ANY-900-1 Modul (siehe [[contiki:a-n-solutions-module:atany24001-module|Contiki Portierung auf die AT-ANY-1 Module]]), sie enthalten also einen ATmega1281V sowie den AT86RF231 Funkchip + integrierte Antenne (2,4Ghz) bzw. AT86RF212 Funkchip + integrierte Antenne (900MHz). Es ist also möglich als Kompilierungsziel ''TARGET=avr-zigbit'' zu verwenden. Auch hier ist vor der Kompilierung zu beachten, dass innerhalb der Fuses ''EESAVE'' deaktiviert werden muss (siehe [[contiki:a-n-solutions-module:atany24001-module|Contiki Portierung auf die AT-ANY-1 Module)]]).
Um eine Kommunikation zwischen uIP auf dem Mikrocontroller und dem PC über die serielle Schnittstelle zu ermöglichen, bietet Contiki den Einsatz des SLIP Protokolls an. Leider wurde dies bisher kaum für das Zigbit Modul genutzt, weshalb kein vorkonfiguriertes Projekt innerhalb des Contiki Quellcodes vorhanden ist. Für andere Plattformen wie z.B, SKY oder auch den AVR-Zigduino sind bereits Implementierungen vorhanden. Auch für den AVR Raven gibt es Anfänge einer SLIP Implementierung, welche jedoch nicht ausgereift ist.\\
Da es sinnvoll ist nicht nur eine einzelne Kommunikation der Knoten mit dem Gateway zu ermöglichen, sondern durch den Einsatz von RPL vermaschtes Routing zu verwenden, soll nicht wie auf dem RZ Raven USB Stick ein einfaches Forwarding Interface genutzt werden, sondern ein RPL Router mit globaler IPv6 Anbindung über SLIP implementiert werden.\\
Hierzu gibt es unter Contiki bereits eine Implementierung, welche sich in ''/examples/ipv6/rpl-border-router/'' befindet. Leider ist auch hier keine Portierung für das Zigbit Modul vorhanden, es muss also auch hier eine Anpassung vorgenommen werden.
Der komplett angepasste Quellcode basierend auf Contiki 3.0 steht bei Github zur Verfügung:
[[https://github.com/tscheffl/contiki/tree/ANSolution_3-0/examples/ipv6/rpl-border-router]]
Zum Nachnutzen einfach das komplette Repo clonen, in den Branch ''ANSolution_3-0''
wechseln und den Quellcode compilieren:
git clone https://github.com/tscheffl/contiki.git
git checkout -b ANSolution_3-0
cd /examples/ipv6/rpl-border-router
make
Die vorgenommen Änderungen werden [[contiki:a-n-solutions-module:contiki3#änderungen_innerhalb_des_plattform_ordners_für_das_zigbit_modulplatformavr-zigbit|hier]] genauer erläutert.
==== Todo: ====
FIXME
* die Anleitung für [[contiki:a-n-solutions-module:atany24001-usb-gateway#kompilierung_und_verbindungsherstellung_über_tunslip6|tunslip]] muss noch aktualisiert werden
* Fotos vom Programmieradapter für die Bricks und AVR JTAGICE3
* SLIP Datenrate erhöhen?: #define UART1_CONF_RX_WITH_DMA 1 https://sourceforge.net/p/contiki/mailman/contiki-developers/thread/50588ED9.2010409@yahoo.de/
==== HowTo: ====
**Baudrate für SLIP anpassen** in:
* ''/examples/ipv6/rpl-border-router/slip-bridge.c'' und
* ''/platform/avr-zigbit/contiki-avr-zigbit-main.c''
**IP-Adresse (MAC) anpassen** in:
* entweder in ''/platform/avr-zigbit/contiki-avr-zigbit-main.c'' statisch eintragen \\ oder besser durch die Verwendung der ''MY_NODE_ID'' Variable im Makefile:CFLAGS += -DMY_NODE_ID=10
:!: Die Variable ändert das letzte Oktett der Adresse. Der Wert der Variable ist dezimal, IPv6 Adressen sind hexadezimal, ''10'' wird also zu ''0a''
**Größe der Binaries ermitteln**:\\
avr-size border-router.avr-zigbit -C --mcu=atmega1281
**Herstellen von .hex und .eeprom Files mit avr-objcopy** (:!: nicht getestet, wird bei ''avrdude'' 6.2 und ''libelf'' Support nicht benötigt, da direkt aus der elf-Datei gelesen werden kann):
avr-objcopy -O ihex border-router.avr-zigbit border-router.avr-zigbit.hex
avr-objcopy -O ihex -I elf32-avr -j .eeprom border-router.avr-zigbit border-router.avr-zigbit.eeprom
**Flashen der Sticks mit ''avrdude'' 6.2 direkt aus Instant-Contiki:**\\
Eine allgemeine Anleitung für avrdude findet sich hier: [[contiki:upload_with_avrdude_to_avr|Flashen des AVRs direkt aus Instant Contiki mit avrdude]]
sudo avrdude -c jtag3 -p m1281 -P usb -B2 -U flash:w:border-router.avr-zigbit
sudo avrdude -c jtag3 -p m1281 -P usb -B2 -U eeprom:w:border-router.avr-zigbit
Die Bitclock wurde reduziert (''-B2''), da teilweise Fehler beim Flashen aufgetreten sind.\\
Weiterhin muss scheinbar immer zuerst der Flash und dann der EEPROM neu programmiert werden. Beim Versuch nur den EEPROM zu flashen (neue MAC-Adresse) erhalte ich einen Verifikationsfehler:
avrdude: verification error, first mismatch at byte 0x0007
0x54 != 0x56
avrdude: verification error; content mismatch
**SLIP Tunnel aufbauen**
sudo ./tunslip6 -L -v5 -d20 -s /dev/ttyUSB0 -B 38400 aaaa::1/64
===== Änderungen innerhalb des Plattform Ordners für das Zigbit Modul (/platform/avr-zigbit/) =====
Da der CP2103 Chip an die serielle Schnittstelle 1 des ATmega1281 angeschlossen ist, kann nur diese für die Kommunikation über SLIP verwendet werden, USART1 ist standardmäßig für Printf Debugging Nachrichten vorgesehen.
==== Datei contiki-avr-zigbit-main.c ====
In Contiki 3.0 wurden Änderungen an der Datei ''/platform/avr-zigbit/contiki-avr-zigbit-main.c''
vorgenommen. Diese Datei muss nicht mehr angepasst werden.
Bei erfolgreichem Verbindungsaufbau über SLIP werden die Printf Kommandos ebenfalls über SLIP übermittelt.
Durch Versuche konnte festgestellt werden, dass bei Überschreitung von 38400 als Baudrate SLIP nicht mehr korrekt arbeitet. Dies kann aber unter Umständen variieren.\\
Auf mindestens einem Modul war bei der Datenrate auf >38400 Baud keine Adresskonfiguration über SLIP möglich:
0006.363 *** Address:aaaa::1 => aaaa:0000:0000:0000
Got configuration message of type %
0006.373 Got configuration message of type %
-> Hier kann die komplette Datei betrachtet werden [[https://github.com/tscheffl/contiki/blob/ANSolution_3-0/platform/avr-zigbit/contiki-avr-zigbit-main.c]].
==== Datei slip_uart1.c ====
Da die AVR Mikrocontroller spezielle Befehle zur Ansteuerung der seriellen Schnittstelle verwenden, werden für das SLIP Interface plattformabhängige Funktionen benötigt, diese wurden von University of Colombo School of Computing bereits für den AVR Raven geschrieben. Im Verzeichnis ''/platform/avr-raven/'' befindet sich die Datei ''slip_uart0.c'', welche den maschinenabhängigen Quellcode für den AVR Raven enthält. Da die AVR Mikrocontrollerfamilie grundsätzlich gleich aufgebaut ist, kann dieser Quellcode auch für das Zigbit Modul verwendet werden. Hierzu muss lediglich die Datei in das Zigbit Plattform Verzeichnis ''/platform/avr-zigbit/'' kopiert werden.\\
Da innerhalb des @ANY2400 USB Sticks jedoch nicht USART0 sondern USART1 an das virtuelle serielle Interface angeschlossen ist, muss dies innerhalb der Funktion ''slip_arch_init(unsigned long ubr)'' noch angepasst werden.
void
slip_arch_init(unsigned long ubr)
{
//rs232_set_input(RS232_PORT_0, slip_input_byte);
rs232_set_input(RS232_PORT_1, slip_input_byte);
stdout = &slip_stdout;
}
Im Anschluss wird die Datei dann in ''slip_uart1.c'' umbenannt.
-> Hier kann die komplette Datei mit den Änderungen betrachtet werden [[https://github.com/tscheffl/contiki/blob/ANSolution_3-0/platform/avr-zigbit/slip_uart1.c]].\\
==== Datei contiki-conf.h ====
Da innerhalb der Datei ''contiki-conf.h'' die Schnittstelle für SLIP festgelegt wird, welche wie zuvor erwähnt standardmäßig auf 0 steht, muss diese hier auf USART1 geändert werden.
/* COM port to be used for SLIP connection */
//#define SLIP_PORT RS232_PORT_0
#define SLIP_PORT RS232_PORT_1
Außerdem verwendet der Quellcode des //rpl-border-router//s ein ''project-conf.h'' File, worin unter anderem das für SLIP benötigte //Fallback Interface// festgelegt wird. Damit das ''project-conf.h'' File während der Kompilierung beachtet wird, muss innerhalb von ''contiki-conf.h'' die unten stehende Erweiterung eingetragen werden.
/*---------------------------------------------------------------------------*/
/* Include project specific config */
/* PROJECT_CONF_H might be defined in the project Makefile */
#ifdef PROJECT_CONF_H
#include PROJECT_CONF_H
#endif /* PROJECT_CONF_H */
/*---------------------------------------------------------------------------*/
-> Hier kann die komplette Datei mit den Änderungen betrachtet werden [[https://github.com/tscheffl/contiki/blob/ANSolution_3-0/platform/avr-zigbit/contiki-conf.h|]].\\
==== Datei Makefile.avr-zigbit ====
Um die zuvor erstellte Datei ''slip_uart1.c'' sowie die des Weiteren benötigte Datei ''slip.c'' während des Kompiliervorgangs miteinzubeziehen, ist innerhalb der Datei ''Makefile.avr-zigbit'' die untenstehende Erweiterung notwendig.
CONTIKI_TARGET_SOURCEFILES += rs232.c cfs-eeprom.c eeprom.c random.c mmem.c \
contiki-avr-zigbit-main.c \
sicslowmac.c linkaddr.c queuebuf.c nullmac.c packetbuf.c \
frame802154.c framer-802154.c framer.c nullsec.c nbr-table.c slip_uart1.c slip.c
:!: In Contiki 3.x muss hier ggf. noch die Datei ''framer.c'' entfernt werden, da sonst das Übersetzen fehlschlägt (noch nicht getestet).
-> Hier kann die komplette Datei mit den Änderungen betrachtet werden [[https://github.com/tscheffl/contiki/blob/ANSolution_3-0/platform/avr-zigbit/Makefile.avr-zigbit|]].\\
----
===== Änderungen innerhalb des rpl-border-router Quellcodes (/examples/ipv6/rpl-border-router/) =====
Auch innerhalb des Quellcodes für den RPL Border Router sind einige kleine Anpassungen nötig, da wie zuvor erwähnt, der Quellcode nicht für das spezielle Modul angepasst ist.
==== Datei border-router.c ====
Der RPL Border Router ist eigentlich für eine Plattform mit Tastern und Sensoren vorgesehen und enthält entsprechenden Code. Da innerhalb des @ANY2400 USB Sticks keine Taster und Sensoren vorhanden sind, müssen diese Codeteile entfernt werden.
Weiterhin wird ''rs232.h'' eingebunden.
#include "net/netstack.h"
//#include "dev/button-sensor.h"
#include "dev/slip.h"
#include "dev/rs232.h"
----
NETSTACK_MAC.off(0);
PROCESS_PAUSE();
/*sz*/
//SENSORS_ACTIVATE(button_sensor);
/*sz*/
PRINTF("RPL-Border router started\n");
----
while(1) {
PROCESS_YIELD();
/*sz*/
//if (ev == sensors_event && data == &button_sensor) {
// PRINTF("Initiating global repair\n");
// rpl_repair_root(RPL_DEFAULT_INSTANCE);
//}
/*sz*/
}
PROCESS_END();
}
-> Hier kann die komplette Datei mit den Änderungen betrachtet werden [[https://github.com/tscheffl/contiki/blob/ANSolution_3-0/examples/ipv6/rpl-border-router/border-router.c]].
==== Datei slip-bridge.c ====
Anpassung der Baud-Rate in slip-bridge.c
/*---------------------------------------------------------------------------*/
static void
init(void)
{
slip_arch_init(BAUD2UBR(38400));
process_start(&slip_process, NULL);
slip_set_input_callback(slip_input_callback);
}
-> Hier kann die komplette Datei mit den Änderungen betrachtet werden [[https://github.com/tscheffl/contiki/blob/ANSolution_3-0/examples/ipv6/rpl-border-router/slip-bridge.c]].
==== Datei project-conf.h ====
Da die Makros ''QUEUEBUF_CONF_NUM'' und ''UIP_CONF_BUFFER_SIZE'' bereits in ''/platform/avr-zigbit/contiki-conf.h'' definiert wurden, bekommt man beim Kompilieren jedesmal Warnungen diesbezüglich. Durch die folgenden Änderungen kann dies vermieden werden.
//#ifndef QUEUEBUF_CONF_NUM
//#define QUEUEBUF_CONF_NUM 4
//#endif
//#ifndef UIP_CONF_BUFFER_SIZE
//#define UIP_CONF_BUFFER_SIZE 140
//#endif
Um außerdem die Standardeinstellungen von RPL nicht alle selbst konfigurieren zu müssen, wurden diese aus dem ''contiki-conf.h''-File des AVR Ravens übernommen und am Dateiende eingefügt.
/* ************************************************************************** */
//#pragma mark RPL Settings
/* ************************************************************************** */
#if UIP_CONF_IPV6_RPL
#define UIP_CONF_ROUTER 1
#define UIP_CONF_ND6_SEND_RA 0
#define UIP_CONF_ND6_REACHABLE_TIME 600000
#define UIP_CONF_ND6_RETRANS_TIMER 10000
/* For slow slip connections, to prevent buffer overruns */
//#define UIP_CONF_RECEIVE_WINDOW 300
#undef UIP_CONF_FWCACHE_SIZE
#define UIP_CONF_FWCACHE_SIZE 30
#define UIP_CONF_BROADCAST 1
#define UIP_ARCH_IPCHKSUM 1
#define UIP_CONF_PINGADDRCONF 0
#define UIP_CONF_LOGGING 0
//#define UIP_CONF_DS6_ROUTE_INFORMATION 0
#endif /* RPL */
-> Hier kann die komplette Datei mit den Änderungen betrachtet werden [[https://github.com/tscheffl/contiki/blob/ANSolution_3-0/examples/ipv6/rpl-border-router/project-conf.h]].\\
==== Datei rf230bb.c ====
FIXME (noch nicht getestet)
Die @ANY-2400 Module besitzen den AT86RF231 Funkchip, dieser bietet die Möglichkeit einen externen Verstärker nachzuschalten. Dies wurde innerhalb den @ANY-2400 Modulen realisiert. Damit dieser Verstärker nicht immer aktiv ist, bietet der AT86RF231 einen Ausgangspin, welcher beim Senden aktiv wird und somit den Verstärker steuert. Diese Funktion muss jedoch aktiviert werden. Dazu muss innerhalb des Registers 0x04 (TRX_CTRL_1) das 7. Bit (PA_EXT_EN) auf High gesetzt werden. Dies kann innerhalb der Datei ''rf230bb.c'' in der Funktion ''rf230_warm_reset()'' mit den folgenden Codezeilen realisiert werden.
innerhalb ''rf230bb.c''
/*sz*/
/*set external PA in on state, used for @ANY modules*/
uint8_t reg_trx_ctrl_state;
reg_trx_ctrl_state = hal_register_read(0x04);
reg_trx_ctrl_state = (reg_trx_ctrl_state) | (0x80);
hal_register_write(0x04, reg_trx_ctrl_state);
/*sz*/
-> gesamte Datei (Änderungen markiert mit /*sz*/)
[[contiki:a-n-solutions-module:rf230bb.c|rf230bb.c]]