Naggischer Freerunner

Geschrieben von MMind am Dienstag, 3. Dezember 2013 in Geräte, Openmoko Freerunner

Der Openmoko Neo Freerunner war ja mein erster Schritt in die embedded-Welt. Leider fristete er die letzten Jahre eher ein Schattendasein — verdrängt durch Oyo und Rockchip-Geräte.

Da viele meiner Samsung-spezifischen Umbauarbeiten alle S3C24xx Prozessoren betreffen hatte ich schon mal den Wunsch diese auch auf dem Freerunner zu testen und dank einer Spende von Christoph Pulster bin ich seit neuestem Eigentümer eines Debug-Boards für den Freerunner. Also hieß es nur noch, dem Freerunner die Hüllen vom Leib zu reißen und den fummeligen Folienleiter anzuschliessen.

Freerunner mit Debug-Board

Das Board stellt einige Features bereit — JTAG, ausgeleitete Pins von I2C- und SPI-Bussen und mehr — aber ich denke mehr als die serielle Ausgabe der Konsole werde ich gar nicht benutzen.

Heute Abend hatte ich dann auch endlich mal Zeit einen Kernel für den Freerunner zu bauen. Der Start gestaltete sich etwas schwierig, da zum einen der Kernel nicht wirklich weit kommt und zum anderen ich nicht wusste welcher UART nun der Debug-UART war. Natürlich war es der letzte probierte UART, der dann doch noch ein paar Kernel-Logs ausgab:

Booting Linux on physical CPU 0x0
Linux version 3.13.0-rc2-next-20131203+ (hstuebner@marty) (gcc version 4.4.5 (Debian 4.4.5-8) ) #229 Tue Dec 3 22:50:48 CET 2013
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177
CPU: VIVT data cache, VIVT instruction cache
Machine: GTA02
bootconsole [earlycon0] enabled
Memory policy: Data cache writeback
CPU S3C2442B (id 0x32440aab)
S3C24XX Clocks, Copyright 2004 Simtec Electronics
S3C244X: core 400.000 MHz, memory 100.000 MHz, peripheral 50.000 MHz
LOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on
Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 32512
Kernel command line: console=ttySAC0,115200 earlyprintk
PID hash table entries: 512 (order: -1, 2048 bytes)
Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
Memory: 126288K/131072K available (2355K kernel code, 163K rwdata, 708K rodata, 121K init, 226K bss, 4784K reserved)
Virtual kernel memory layout:
    vector  : 0xffff0000 - 0xffff1000   (   4 kB)
    fixmap  : 0xfff00000 - 0xfffe0000   ( 896 kB)
    vmalloc : 0xc8800000 - 0xff000000   ( 872 MB)
    lowmem  : 0xc0000000 - 0xc8000000   ( 128 MB)
    modules : 0xbf000000 - 0xc0000000   (  16 MB)
      .text : 0xc0008000 - 0xc0305f34   (3064 kB)
      .init : 0xc0306000 - 0xc03247e4   ( 122 kB)
      .data : 0xc0326000 - 0xc034ef88   ( 164 kB)
       .bss : 0xc034ef88 - 0xc0387a50   ( 227 kB)
NR_IRQS:103
S3C2442: IRQ Support
irq: clearing pending status 000b02f0
irq: clearing pending status 000902d0
irq: clearing pending status 000000c7
irq: clearing pending status 00000082
sched_clock: 16 bits at 1000kHz, resolution 1000ns, wraps every 65535000ns
Console: colour dummy device 80x30
Calibrating delay loop... 199.47 BogoMIPS (lpj=498688)
pid_max: default: 32768 minimum: 301
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
Setting up static identity map for 0x30252760 - 0x302527b8
devtmpfs: initialized
regulator-dummy: no parameters
DMA: preallocated 256 KiB pool for atomic coherent allocations
S3C Power Management, Copyright 2004 Simtec Electronics
S3C2442: Initialising architecture
S3C244X: Clock Support, DVS off
bio: create slab  at 0
Switched to clocksource samsung_clocksource_timer
s3c-adc s3c24xx-adc: operating without regulator "vdd" .
platform s3c24xx-adc: Driver s3c-adc requests probe deferral
msgmni has been set to 246
Block layer SCSI generic (bsg) driver version 0.4 loaded (major 252)
io scheduler noop registered
io scheduler deadline registered (default)
s3c2440-uart.0: Controller clock not found
samsung-uart: probe of s3c2440-uart.0 failed with error -2
s3c2440-uart.1: Controller clock not found
samsung-uart: probe of s3c2440-uart.1 failed with error -2
s3c2440-uart.2: Controller clock not found
samsung-uart: probe of s3c2440-uart.2 failed with error -2
bootconsole [earlycon0] disabled

Ich frage mich ob schon mal jemand einen 3.x-Kernel auf einem Freerunner gestartet hat — der letzte echte Kernel der alle Freerunner-Features unterstützte war ja 2.6.39 oder so.

2 Kommentare Mehr...

Und wieder ein neues Spielzeug - Radxa Rock

Geschrieben von MMind am Freitag, 22. November 2013 in Geräte, Rockchip

Entwicklungsplatinen sind ja momentan groß in Mode. Der RaspberryPi ist ja ein sehr großer Erfolg geworden, mit inzwischen mehr als 2 Millionen verkauften Boards. Während die Development-Boards der Hersteller früher Unsummen kosteten, gibt es inzwischen für so ziemlich jeden ARM-SoC erschwingliche Entwickler-Platinen. Neben dem RaspberryPI sind dies zum Beispiel die Beagle- bzw. Pandaboards für OMAP 3 und 4, die ODROID-Boards für Samsungs Exynos SoCs oder auch die Cubieboards für Allwinner-SoCs.

Vom Hersteller der Cubieboards kommt nun auch ein neuer Boardtyp, diesmal basierend auf dem RK3188 von Rockchip. Das Board nennt sich »Radxa Rock« und soll demnächst allgemein verfügbar sein. Es gab eine Vorserie der Boards von 100 Stück und als Maintainer des Mainline-Kernel-Supports für Rockchip SoCs kam auch ich in den Genuss eines dieser Sample.

Radxa Rock Board

Die Ausstattungseite enthält keine allzugroßen Überraschungen bereit. 2GB Arbeitsspeicher, ein Flash-Chip, USB- und Netzworkports und die obligatorischen Buchsenleisten, an denen eine Menge PINs für eigene Verbindungen genutzt werden können. Ein interessantes Gimmik ist der Infrarotempfänger, auch wenn Infrarot heutzutage warscheinlich nicht mehr so oft verwendet wird.

Mit dem Mainline-Support für das Radxa Rock war ich auch schnell genug. Die Patches für die grundlegende Unterstützung haben es im aktuell laufenden Merge-Window in den Mainline-Kernel geschafft und werden damit Teil von Linux-3.13.

1 Kommentar Mehr...

LinuxCon Europe und ELCE 2013

Geschrieben von MMind am Donnerstag, 7. November 2013 in Auswärts

Wie schon im letzen Jahr wollte ich auch diesmal wieder die LinuxCon und Embedded Linux Conference Europe besuchen — diesmal in Edinburgh. Das heimliche Hauptergeignis aber war der Kernel-Summit, der dieses Jahr ebenfalls dort stattfand. Im Vorfeld des eigentlichen Kernel-Summits fand dann noch der ARM-Mini-Summit statt, der die meisten ARM-Maintainer zusammenbringt und just zu diesem Workshop war auch ich eingeladen :-)

Kernel Summit und ELCE 2013 Badges

Edinburgh

Da es unwarscheinlich ist, dass ich in nächster Zeit nochmal nach Edinburgh komme, habe ich — wie letztes Jahr — wieder ein paar Tage drumherum gelegt um mir die Stadt anzusehen. Ich hatte auch wahnsinniges Glück, dass sich das Wetter nicht an die Vorraussage von Regen, Regen und Regen gehalten hat, sondern über einen großen Teil der Zeit sogar die Sonne schien.

Das bekannste Bauwerk von Edinburgh ist natürlich die Burg, welche auf einem erloschenen Vulkan steht. Von dort führt dann die Royal Mile durch die Altstadt bis hin zum Palace of Holyroodhouse, der offiziellen Residenz der Königin in Schottland.

Ein paar meiner Eindrücke von Edinburgh gibts in meinem Fotoblog und einen deutlich ausführlicheren Reisebericht zu Schottland gibts bei Torsten, der mir immer alles nach- vor-machen muss.

ARM-Mini-Summit

In der ARM-Welt ist DeviceTree ja momentan das Thema mit der meisten Aufmerksamkeit und dies spiegelte sich natürlich auch in den Themen des Mini-Summit wieder. Ein Großteil der Diskussionen befasste sich also mit DeviceTree-Bindings, DeviceTree-Verifikation, ACPI vs. DeviceTree und einigen Device-*-Themen mehr.

Drumherum gab es dann noch Diskussionen um die Verwaltung des ARM-Trees, den Fortschritt der Konsolidierung der »Legacy«-Architekturen — zum Beispiel der S3C24XX-SoCs, die neue ARM64-Architektur und auch dem Common-Clock-Framework.

Kernel-Summit-Gruppenfoto
KS-Gruppenfoto mit mir in der obersten Reihe, aufgenommen von Thorsten Leemhuis

LinuxCon Europe

Die eigentliche LinuxCon überlagerte sich großflächig mit dem ARM-mini-summit und ist zudem momentan sehr Cloud-lastig, sodass mich die dort behandelten Themen nicht wirklich interessiert und ich sie mir deswegen gespart habe. Dadurch habe ich zwar zwei relativ interessante Podiumsdiskussionen verpasst, aber gerade beim Torvalds-Interview waren die Fragen dann, wie zu erwarten, sehr ähnlich zu vorherigen Interviews — also nicht der große Verlust.

Embedded Linux Conference Europe

Da der Kernel-Summit auch am Freitag Interessantes bot, hab ich von der ELCE auch nur den ersten Tag mitbekommen. An diesem Tag gab es aber auch einige sehr interessante Vorträge. Ein Beispiel war der Zustandsbericht zum Common-Display-Framework — das aber leider noch etwas in der Luft zu hängen scheint. Sehr low-levelig, aber nicht minder interessant war der Vortrag von Will Deacon über die ARM-Memory-Barrieren und wie sich diese auf Code-Ausführung im Prozessor auswirken.

Nächstes Jahr

2014 finden die LinuxCon und ELCE in Düsseldorf statt. Während dies die Anreise erleichtert, hätten sie sich aber doch einen touristisch etwas attraktiveren Ort aussuchen können.

0 Kommentare Mehr...

SMP - Erste Schritte

Geschrieben von MMind am Sonntag, 9. Juni 2013 in Rockchip

Meinen Basteleien an dem Rockchip-Soc bringen mich abermals mit neuen Bereichen in Kontakt. Ein sehr wichtiger Bereich ist dabei SMP. SMP steht für »symmetric multi-processing« und erlaubt es dem z.B dem Linux-Kernel, laufende Prozesse dynamisch auf alle verfügbaren Prozessoren zu verteilen. Bisher hatte ich ja immer nur mit Ein-Kern-Prozessoren zu tun, sodass ich hier mal eben wieder Neuland betreten habe.

Theorie

Beim Systemstart ist dabei immer nur eine CPU aktiv, d.h. wenn der Linux-Kernel startet arbeitet dieser immer nur auf einem Prozessor. Um alle Kerne zu nutzen, müssen diese separat vom Kernel gebootet werden. Dies geschieht durch verschiedene Funktionen die in einem struct smp_operations zusammengefasst werden.

Die erste Funktion ist »smp_init_cpus«, die eigentlich die Anzahl der vorhandenen Prozessoren bzw. Kerne ermitteln soll. Auf neueren Devicetree-basierenden Plattformen ist dies jedoch nicht mehr nötig, da die Informationen über die verfügbaren CPUs aus dem Devicetree selbst bezogen werden können, weswegen die Funktion auf der Rockchip-Platform nicht nötig ist.

Danach folgt »smp_prepare_cpus«, dessen wichtigste Aufgabe es ist die Cache-Kohärenz zu aktivieren, da jeder Core seinen eigenen Cache besitzt, Inhalte für den gleichen Wert zwischen Caches aber nicht differieren dürfen. In Cortex-A9 Prozessoren, wie dem RK3066, ist dafür die sogenannte Snoop-Control-Unit zuständig, die sogenanntes Bus-Snooping nutzt um Cache-Änderungen zu verfolgen.

Die letzte Funktion ist dann »smp_boot_secondary«, deren Aufgabe es nun ist, die jeweilige CPU in ihrem Argument zu starten. Die Prozedur zum starten eines Kerns ist für jede Plattform unterschiedlich. Bei den Rockchip-SoCs können die Kerne über die PMU aktiviert und deaktiviert werden. Wenn ein Kern startet versucht er ein Programm im prozessoreigenen SRAM zu starten, dass die Initialisierung übernimmt. Deswegen muss dieses (Assembler-)Programm vor Aktivierung des Kerns in das SRAM kopiert werden.

Wenn das alles funktioniert, kann das gestartete System dann über 2 Kerne verfügen.

Ich will Ergebnisse sehen

Da der heutige Tag sehr erfolgreich war, gibt es in der /proc/cpuinfo meines Tablets nun folgendes zu sehen:

processor	: 0
model name	: ARMv7 Processor rev 0 (v7l)
BogoMIPS	: 1196.85
Features	: swp half thumb fastmult vfp edsp neon vfpv3 tls 
CPU implementer	: 0x41
CPU architecture: 7
CPU variant	: 0x3
CPU part	: 0xc09
CPU revision	: 0

processor	: 1
model name	: ARMv7 Processor rev 0 (v7l)
BogoMIPS	: 1196.85
Features	: swp half thumb fastmult vfp edsp neon vfpv3 tls 
CPU implementer	: 0x41
CPU architecture: 7
CPU variant	: 0x3
CPU part	: 0xc09
CPU revision	: 0

Hardware	: Rockchip Cortex-A9 (Device Tree)
Revision	: 0000
Serial		: 0000000000000000
2 Kommentare Mehr...

Und noch ein neuer Spielplatz

Geschrieben von MMind am Mittwoch, 29. Mai 2013 in Rockchip

Die letzten Wochen war ich mit einem ganz besonderen neuen Spielzeug beschäftigt — einem Tablet basierend auf dem RK3066-SoC von Rockchip. Grundlage des RK3066 ist eine Dual-Core Cortex-A9 ARM-CPU die mit bis zu 1,6 GHz läuft und durch die üblichen Komponenten (I2C, SPI, etc) ergänzt wird.

Ist-Zustand

Rockchip-Geräte sind anscheinend recht weit verbreitet, da die SoCs recht günstig zu haben sind. Die Kernel-Quellen zu einigen dieser Geräte sind verfügbar, entsprechen aber leider dem Erwartungsbild für Hersteller-Kernel-Quellen — d.h. in keiner Weise mainline-Kernel-tauglich.

Um Rockchip-basierende Geräte hat sich auch eine kleine »Community« gebildet, die aber auch nur an diesen verfügbaren Kernelquellen herumbastelt. Im mainline-Kernel sind Rockchip-SoCs darum ein unbeschriebenes Blatt — genauso wie ich es mag.

Deshalb konnte ich während der letzten Wochen mal versuchen auch im Low-Level-Bereich der SoC-Unterstützung Erfahrungen zu sammeln.

Erste Patchserie

Wie es scheint hatten die Rockchip-Designer keine Lust alle Komponenten neu zu entwickeln, sondern waren für viele von diesen bei Anbietern von standardisierten Komponenten einkaufen. So kommen z.B. mindestens die seriellen Ports, Timer, USB-OTG, MMC- und SPI-Controller aus der Designware-Reihe von Synopsys.

Montag war es dann soweit und ich konnte die erste Patchserie and die entsprechenden Mailinglisten senden. Der größte Posten dabei war der Pinctrl-Treiber, der für die Verwaltung der Pins und GPIOs des Chips verantwortlich ist. Unerwarteterweise gab es keine sehr großen Kritiken, sondern eigentlich nur kleinere Verbesserungsvorschläge.

Es gab aber auch erweiterte Hausaufgaben. Im mainline-Kernel ist es nicht erlaubt, nur an seinen eigenen Sandkasten zu denken, und der Pinctrl-Treiber kam anscheinend genau zu dem Zeitpunkt, an dem eine Verallgemeinerung von oftmals genutzten Funktionen an der Zeit war. D.h. ich habe diese Aufgabe geerbt, um dann meinen Treiber mit diesen Neuerungen platzieren zu können.

Trotz dessen sollte 3.11 mit einem Quentchen Glück noch zu schaffen sein — sonst dann erst 3.12.

0 Kommentare Mehr...

Seite 1 von 23, insgesamt 114 Einträge

Suche

Nach Einträgen suchen in Outside the Walled Garden:

Das Gesuchte nicht gefunden? Gib einen Kommentar in einem Eintrag ab oder nimm per E-Mail Kontakt auf!