Forum: Mikrocontroller und Digitale Elektronik "Pingu920" - ARM9 Linux Embedded zum selbst Löten


von O. D. (odbs)


Lesenswert?

Anbei ein kleines Projekt, an dem ich gerade arbeite.

Es handelt sich um einen Einplatinencomputer auf Basis des Atmel 
AT91RM9200, der darauf ausgelegt wird, möglichst preisgünstig und vor 
allem mit "Hausmitteln" herstellbar zu sein.

Auf der Platine:

* AT91RM9200 (ARM920T @ 180 MHz)
* 64 MByte SD-RAM
* 4 MByte serielles Dataflash für Bootloader
* USB-Host mit Buchse Typ A
* USB-Device mit Buchse Typ B
* Ethernet 10/100-Base-T mit Buchse RJ45
* SD-Karten-Slot
* Schaltnetzteil 3,3V und 1,8V mit genügend Reserven für weitere 
Peripherie

Ein einfacher 64-poliger Wannenstecker stellt folgende externe 
Schnittstellen zur Verfügung:

* 4 x serielle Schnittstelle RXD/TXD, 3 x zusätzlich RTS/CTS
* 1 x SPI mit Chip-Select
* 1 x TWI bzw. I2C
* External Bus Interface (EBI) mit 16bit Datenbus und 4 Adressleitungen 
für MMIO
* zahlreiche GPIO
* alle für ein IDE-Interface erforderlichen Signale stehen extern zur 
Verfügung

Programmieren lässt sich das Board ganz einfach ohne JTAG, da das 
interne Bootprogramm im ROM des AT91RM9200 den Download per XMODEM über 
eine serielle Schnittstelle, die sog. "Debug Unit", zulässt. Diese Debug 
Unit ist über einen FT232R als USB nach draußen geführt. Über das 
Einlöten von Widerständen wird festgelegt, ob die USB-B-Buchse auf der 
Platine mit der Debug Unit oder dem USB Device Port des AT91RM9200 
verbunden ist.

Die Platine wird etwa eine halbe Eurokarte groß sein und in ein 
handelsübliches Aluprofil-Gehäuse passen. SD-Karten-Slot und alle 
Buchsen sind an einer Seite angeordnet, so daß sie über die Frontplatte 
zugänglich sind.

Es kommen keinerlei BGA- oder QFN-Bauteile zum Einsatz. Der "schlimmste" 
Pitch ist 0,5mm; solche Bauteile lassen sich auch mit einfachem Werkzeug 
und etwas Efahrung per Hand löten. Die Platine ist zwar vierlagig, die 
Anforderungen bleiben mit 0,3mm als kleinster Bohrung und 150µm als 
feinster Struktur im Kupfer jedoch im Rahmen. Die Platine ist nur 
einseitig bestückt.

Aktueller Stand: Schaltplan und Platinenlayout "so gut wie fertig".

von O. D. (odbs)


Angehängte Dateien:

Lesenswert?

Vorläufiger Schaltplan.

von O. D. (odbs)


Lesenswert?

Jetzt hoffe ich natürlich, daß zahlreiche Tipps und 
Verbesserungsvorschläge eintrudeln, bevor die Platine in die 
Prototypen-Fertigung geht! Allerdings wird sich am grundlegenden Konzept 
nichts mehr ändern, denn ich benötige genau eine solche Platine als 
Bestandteil für ein größeres Projekt.

Wer gravierende Fehler findet, wird im nächsten Iterationsschritt mit 
einer Gratis-Platine bedacht - "so lange der Vorrat reicht" ;)

von Tüddel (Gast)


Lesenswert?

Ein paar Ferite / Filter täten in den Stromversorgungszweigen und in den 
Steckkontackten ganz gut..

Zusätzlicher Spannungsversorgungsstecker falls man man "Stand Alone" 
sein will

Naja halt allerlei rund um EMV-Schutz und Störausstrahlung fehlt halt... 
Aber es kommt auch sehr stark auf das Layout an!

Hab auch schon diverse mehrlagige (10+) EMV-Gerechte (mit bestandenen 
Test) zig MHz DSP-Layouts mit EAGLE ;) geroutet... ist halt alles ein 
sache des Könnens und des Wissens um Proble prahl ;)

by the way
Was für ein CAD-System benutzt du? Integra?

von O. D. (odbs)


Lesenswert?

Nein, das ist nur das schnöde Eagle.

ESD/EMV-Schutz wollte ich für den "User-Port" nicht vorsehen, das wäre 
zu viel Aufwand. Je nachdem, was da angeflanscht wird, muß man das halt 
extern machen. Für USB sollten die Kondensatoren reichen, der verwendete 
Magjack für Ethernet hat das nötige drin.

Stromversorgung generell - ja, da hast du Recht, da werde ich mich 
nochmal dransetzen.

Leider kann ich bei nur vier Lagen und so wenig Platz für Vias die 
"bösen" Signale nicht nach innen legen.

von Jörn K. (joern)


Lesenswert?

Ich gebe auch noch meinen Senf dazu:

- Ethernet: Pullup für MDIO (Eventuell kann man auch den internen vom 
Atmel nehmen, wenn vorhanden)

- DBGU: R8/R9 sind überflüssig, da die R-Versionen von FTDI die 
Widerstände schon drin haben. Pullup R2 u.U. auch überflüssig, da der 
FTDI interne Pullups an den Eingängen hat.

- JTAG: Wenigstens auf Testpunkte legen. Vielleicht will mal einer doch 
debuggen ;)

- Erweiterungsstecker: Etwas mehr Masseverbindungen wären nicht 
schlecht.

Wie Tüddel schon geschrieben hat ein paar Ferrite würden sich gut 
machen.

Noch eine andere Frage: Warum kein 9260?

von O. D. (odbs)


Lesenswert?

> - Ethernet: Pullup für MDIO (Eventuell kann man auch den internen vom
> Atmel nehmen, wenn vorhanden)

Korrekter Hinweis, danke.

> - DBGU: R8/R9 sind überflüssig, da die R-Versionen von FTDI die
> Widerstände schon drin haben.

Die Widerstände sollen nicht 27 Ohm haben, sondern 0 Ohm. Durch 
Ein-/Auslöten von R8/R9 oder R36/R37 wird die Umschaltung vom USB Device 
Port auf die Debug Unit gemacht.

> Pullup R2 u.U. auch überflüssig, da der
> FTDI interne Pullups an den Eingängen hat.

Der Pin dient beim Starten als BMS - "Boot Mode Select", und auf die 200 
kOhm vom FT232 wollte ich mich nicht verlassen.

> - JTAG: Wenigstens auf Testpunkte legen. Vielleicht will mal einer doch
> debuggen ;)

Pah ;)

> - Erweiterungsstecker: Etwas mehr Masseverbindungen wären nicht
> schlecht.

Ich kaufe... mehr Platz. Na gut, vielleicht kann man ein paar GPIOs 
opfern.

> Noch eine andere Frage: Warum kein 9260?

Erfüllt meine Anforderungen, ist leicht zu bekommen, und außerdem hatte 
ich schon ein Symbol in Eagle dafür gebaut. Keine weiteren guten 
Argumente.

von O. D. (odbs)


Lesenswert?

Gerade noch selbst gesehen:

Ein Oszillator funktioniert auch besser mit Stromversorgung ;)

von tom (Gast)


Lesenswert?

Die Lösung mit dem Ein-/Auslöten von Widerständen um zwischen 
Programmieren und USB-Device-Port umzuschalten finde ich alles andere 
als praktisch. Ich wäre für Steckbrücken.

Oder bist du der perfekte Programmierer der keine Fehler macht und 
deswegen nur ein mal das Board flashen muss?

von tom (Gast)


Lesenswert?

Wie wird eigentlich das Board mit Spannung versorgt? Erfolgt die 
Spannungsversorgung über USB oder wird das Board über K1 mit Spannung 
versorgt oder fehlt da noch ein Stecker für den Niederspannungsanschluss 
inklusiver Verpolungsschutz?

Bei X1 ist Pin 1 mit 5V bezeichnet, bei X2 ist ist Pin 1 mit USBD-C mit 
dem Prozessor verbunden, kann der Prozessor max. 500mA laut 
USB-Spezifikation liefern??? Erscheint mir etwas gewagt.

von O. D. (odbs)


Lesenswert?

> Die Lösung mit dem Ein-/Auslöten von Widerständen um zwischen
> Programmieren und USB-Device-Port umzuschalten finde ich alles andere
> als praktisch. Ich wäre für Steckbrücken.
>
> Oder bist du der perfekte Programmierer der keine Fehler macht und
> deswegen nur ein mal das Board flashen muss?

Natürlich nicht. Allerdings würde es reichen, den Bootloader "u-boot" 
einmal auf dem Dataflash zu installieren. Das Board würde anschließend 
entweder über NFS vom PC booten, oder Betriebssystem und Kernel sind auf 
der SD-Karte installiert. Die Programmentwicklung oder das Anpassen des 
Kernels würde also nicht ein ständiges Umlöten erfordern. Trotzdem sind 
normale Jumper natürlich schöner. Ich ändere das, wenn noch Platz ist.

von O. D. (odbs)


Lesenswert?

> Wie wird eigentlich das Board mit Spannung versorgt? Erfolgt die
> Spannungsversorgung über USB oder wird das Board über K1 mit Spannung
> versorgt oder fehlt da noch ein Stecker für den Niederspannungsanschluss
> inklusiver Verpolungsschutz?

Das Board soll über K1 mit stabilisierten +5V versorgt werden. Grund 
ist, daß in meinem Projekt eine Basisplatine zur Verfügung steht, auf 
der weitere Peripherie und das "Hauptnetzteil" vorhanden sind.

Ein Niederspannungsanschluß wäre natürlich schön, solange man das Board 
als Entwicklungsplattform auf dem Schreibtisch einsetzt, auf der Platine 
ist aber definitiv kein Platz mehr für ein solch sperriges Teil.

> Bei X1 ist Pin 1 mit 5V bezeichnet, bei X2 ist ist Pin 1 mit USBD-C mit
> dem Prozessor verbunden, kann der Prozessor max. 500mA laut
> USB-Spezifikation liefern??? Erscheint mir etwas gewagt.

USBD-C soll als Eingang programmiert werden und dient nur der Erkennung, 
ob an X2 - dem USB-Device - ein Host angeschlossen ist. Deshalb auch der 
Spannungsteiler von 5V auf 3,3V. Das USB-Device versorgt nichts mit 
Spannung, und das Board selbst wird anders herum auch nicht über USB 
versorgt.

Bei dem USB-Host - also X1 - habe ich einfach die 5V-Versorgung 
durchgeschleift. Theoretisch könnte man natürlich so einen Chip nehmen, 
wie er z.B. in USB-Hubs eingebaut ist, der den Strombedarf überwacht und 
den Port ggf. wegschaltet. Das halte ich aber für Overkill bei so einer 
Anwendung - die meisten ARM9-Boards machen das auch nicht anders.

von tom (Gast)


Lesenswert?

Alternativ noch folgender Vorschlag:

Wenn du den FT232RL wirklich nur ein mal benötigst, dann wäre es sogar 
sinnvoller, diesen komplett vom Board zu nehmen und nur die nötigen 
Leitungen zum Programmieren heraus zu führen und extern dann den RS232RL 
auf eine eigene Platine zusetzen!?

von O. D. (odbs)


Lesenswert?

Eher nicht, weil diese USB-Verbindung die Linux-Konsole darstellt. Den 
Bootvorgang kann man anders schlecht überwachen. So lange es noch kein 
Telnet, SSH etc. gibt, wäre das Board "stumm" und Kernelprobleme würden 
sich schlecht rausdebuggen lassen.

Hat man irgendwann einmal eine fertige Anwendung, die keine Konsole, 
aber dafür ein USB-Device-Port benötigt, steht es einem natürlich frei, 
den FT232R einfach nicht zu bestücken.

Ich brauche das USB-Device in meiner Anwendung sogar überhaupt nicht, 
und würde im Zweifelsfall eher die serielle Schnittstelle über den 
FT232R behalten als ein "echtes" USB-Device.

von O. D. (odbs)


Angehängte Dateien:

Lesenswert?

Hier die überarbeitete Version

von O. D. (odbs)


Lesenswert?

1
Uncompressing Linux.......................... done, booting the kernel.
2
3
Linux version 2.6.32.3 (x@y) (gcc version 4.3.4 (GCC) ) #12 Sat Jan 9 07:38:14 CET 2010
4
5
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177
6
7
CPU: VIVT data cache, VIVT instruction cache
8
9
Machine: Pingu920
10
11
Warning: bad configuration page, trying to continue
12
13
Memory policy: ECC disabled, Data cache writeback
14
15
Clocks: CPU 179 MHz, master 59 MHz, main 18.432 MHz
16
17
Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 16256
18
19
Kernel command line: mtdparts=spi0.0-AT45DB321x:16896(dfboot),16896(env),236544(uboot),2162688(linux),1892352(root) root=/dev/mtdblock4 rootfstype=cramfs mem=64M
20
21
PID hash table entries: 256 (order: -2, 1024 bytes)
22
23
Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)
24
25
Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)
26
27
Memory: 64MB = 64MB total
28
29
Memory: 62688KB available (1860K code, 173K data, 80K init, 0K highmem)
30
31
SLUB: Genslabs=11, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
32
33
Hierarchical RCU implementation.
34
35
NR_IRQS:192
36
37
AT91: 96 gpio irqs in 3 banks
38
39
console [ttyS0] enabled
40
41
Calibrating delay loop... 89.79 BogoMIPS (lpj=350208)
42
43
Mount-cache hash table entries: 512
44
45
CPU: Testing write buffer coherency: ok
46
47
NET: Registered protocol family 16
48
49
bio: create slab <bio-0> at 0
50
51
SCSI subsystem initialized
52
53
usbcore: registered new interface driver usbfs
54
55
usbcore: registered new interface driver hub
56
57
usbcore: registered new device driver usb
58
59
LinuxPPS API ver. 1 registered
60
61
Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
62
63
Switching to clocksource 32k_counter
64
65
NET: Registered protocol family 2
66
67
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
68
69
TCP established hash table entries: 2048 (order: 2, 16384 bytes)
70
71
TCP bind hash table entries: 2048 (order: 1, 8192 bytes)
72
73
TCP: Hash tables configured (established 2048 bind 2048)
74
75
TCP reno registered
76
77
NET: Registered protocol family 1
78
79
io scheduler noop registered
80
81
io scheduler anticipatory registered (default)
82
83
atmel_usart.0: ttyS0 at MMIO 0xfefff200 (irq = 1) is a ATMEL_SERIAL
84
85
atmel_usart.1: ttyS1 at MMIO 0xfffc0000 (irq = 6) is a ATMEL_SERIAL
86
87
atmel_usart.2: ttyS2 at MMIO 0xfffc4000 (irq = 7) is a ATMEL_SERIAL
88
89
atmel_usart.3: ttyS3 at MMIO 0xfffc8000 (irq = 8) is a ATMEL_SERIAL
90
91
atmel_spi atmel_spi.0: Atmel SPI Controller at 0xfffe0000 (irq 13)
92
93
mtd_dataflash spi0.0: AT45DB321x (4224 KBytes) pagesize 528 bytes (OTP)
94
95
5 cmdlinepart partitions found on MTD device spi0.0-AT45DB321x
96
97
Creating 5 MTD partitions on "spi0.0-AT45DB321x":
98
99
0x000000000000-0x000000004200 : "dfboot"
100
101
0x000000004200-0x000000008400 : "env"
102
103
0x000000008400-0x000000042000 : "uboot"
104
105
0x000000042000-0x000000252000 : "linux"
106
107
0x000000252000-0x000000420000 : "root"
108
109
at91_ether: probe of at91_ether failed with error -1
110
111
ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
112
113
at91_ohci at91_ohci: AT91 OHCI
114
115
at91_ohci at91_ohci: new USB bus registered, assigned bus number 1
116
117
at91_ohci at91_ohci: irq 23, io mem 0x00300000
118
119
usb usb1: configuration #1 chosen from 1 choice
120
121
hub 1-0:1.0: USB hub found
122
123
hub 1-0:1.0: 1 port detected
124
125
Initializing USB Mass Storage driver...
126
127
usbcore: registered new interface driver usb-storage
128
129
USB Mass Storage support registered.
130
131
udc: at91_udc version 3 May 2006
132
133
TCP cubic registered
134
135
VFS: Mounted root (cramfs filesystem) readonly on device 31:4.
136
137
Freeing init memory: 80K

Ein paar Fehler sind gefunden und behoben, ein paar andere sind noch 
offen (siehe oben). Der Ethernet PHY macht noch Probleme 
(25MHz-Oszillator läuft nicht an) und das JFFS2 als RootFS funktioniert 
nicht auf dem Dataflash. Letzteres ist anscheinend aber ein bekanntes 
Problem.

Aber immerhin habe ich schon eine Partie GNUchess gegen das kleine Board 
gespielt.

von Gerrit G. (liggi)


Lesenswert?

Gibt es was neues oder ist das Projekt tot?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.