Archiv für die Kategorie 'Linux-Kernel'

Hardware-PWM für Foxboard G20

Für bestimmte Anwendung, wie zum Beispiel die Steuerung von Gleichstrommotoren über einen Motortreiber, werden häufig PWM-Signale benötigt. Sollen diese mit Mikroprozessoren erzeugt werden ist die Umsetzung meist relativ einfach, da direkt PWM-Ausgänge genutzt werden können und diese einfach zu programmieren sind. Wenn das erzeugende System (z.B. Foxboard G20 mit ARM9) mit einem Betriebssystem wie Linux versehen ist, dann ist die Umsetzung von PWM-Ausgängen meist aufwendiger. Viele Lösungen nutzen dann das GPIO-Interface und erzeugen das PWM-Signal über ein Programm im Userspace. Diese Technik wird auch als Bit-Banging bezeichnet, da hier jede Veränderung am Pin in Software realisiert werden muss. Damit kann allerdings das Timing nur unzureichend eingehalten werden und es sind auch nur geringe Träger-Frequenzen möglich.

Besser Ergebnisse erzielt man mit einem PWM-Treiber, der die Timer-Einheiten des ARM9-Prozessors, in diesem Fall des Atmel AT91SAM9G20 nutzt. Im vorliegenden Kernel-Modul für das Foxboard G20 wird ein zwei-kanaliger 12-Bit-PWM-Generator mit Trägerfrequenz um die 10 kHz prototypisch umgesetzt. PWM0 ist an J7 Pin 9 verfügbar, PWM1 liegt an J7 Pin 10 an. Für die Signalmasse kann jeder Massepin genutzt werden.

Zum Kompilieren des Moduls muss das richtige Verzeichnis mit den Kernelquellen (vorkonfiguriert und kompiliert) in make_modul.sh eingetragen werden, momentan ist der Quellcode für Kernel 2.6.31 angepasst und es wird ein Cross-Compiler genutzt. Nach dem Kompilieren kann das Kernel-Modul auf das Zielsystem aufgespielt werden, das Laden erfolgt mit insmod.

Das Setzen des Duty-Cycle kann dann mit

echo 2048 > /sys/devices/platform/atmel_pwm/pwm0

beziehungsweise

echo 2048 > /sys/devices/platform/atmel_pwm/pwm1

durchgeführt werden. Für den Duty-Cycle können Werte im Bereich 1-4096 genutzt werden, dies entspricht einem Duty-Cycle zwische 0% und 100%.

Der Quellcode für den Hardware-PWM-Treiber steht unter at91_g20_pwm.tar.gz zur Verfügung.

Netzwerkverkehr aufzeichnen mit Netsniff-ng

Manche Programme sind bei der Analyse von Netzwerkproblemen wirklich nützlich, sind allerdings wenig bekannt und sollten deshalb weiterempfohlen werden. Netsniff-ng ist ein solches freies Werkzeug für Linux, welches dazu dient Netzwerkverkehr aufzuzeichnen, zu analysieren und wieder abzuspielen. Im Gegensatz zu Anwendungen wie tcpdump, ettercap oder wireshark nutzt Netsniff-ng allerdings eine relativ neue Technik um die Pakete von der Netzwerkkarte über den Betriebssystemkern in den Userspace zu befördern. Durch die Nutzung der Linux-eigenen RX_RING-Infrastruktur können Netzwerkpakete unter Vermeidung von unnötigen Kopieroperationen zügig weitergeleitet und weiterverarbeitet werden. Bei diesem Ansatz spricht man deshalb auch vom Zero-Copy-Ansatz, da zur Übergabe von Daten zwischen Betriebsystemkern und Applikation durch Memory-Mapping keine zusätzlichen Speicheroperationen notwendig sind. Die dazu erforderlichen Kernelanpassungen für Senden und Empfangen sind in aktuellen Versionen des Linux-Kernels (2.4.X und 2.6.X) bereits integriert.

Im Vergleich zu bewährten Programmen wie tcpdump erhöht sich die mögliche Aufzeichnungsrate mit Netsniff-ng dadurch deutlich. Wer erste Experimente mit der Software durchführen möchte sollte die stabile Version 0.5.5.0 benutzen. Das nächste Release durch die Entwickler ist im April 2011 geplant und wird unter anderem eine neue Parametersyntax für Kommandozeilenparameter und eine weitergehende Modularisierung der Quellcodebasis bieten um zusätzliche Werkzeuge mit der Technologie zu ermöglichen.

Die Installation von Netsniff-ng 0.5.5.0 erfolgt einfach mit

make
sudo make install

im src/-Verzeichnis des Programms.

Nach erfolgreicher Installation ist es möglich mit:

sudo netsniff-ng --dev eth0 --dump out.pcap --silent

Netzwerkverkehr aufzuzeichnen.