Horst: Mischung von OpenWrt und DLINK-System
Also OpenWrt (bleeding edge Kamikaze) läuft jetzt zwar grundsätzlich bei mir. Was ich aber noch haben will und was bei OpenWrt nicht dabei ist:
- Treiber für ISDN und die FXO/FXS-Anschlüsse (Analogtelefonie).
- Asterisk-Zaptelmodul (Bristuff) für ISDN-Aschlüsse.
Aus Zeitgründen habe ich mir jetzt ein gemischtes OpenWrt/DLINK-System hingebastelt:
Das rootfs von OpenWrt, aber:
- Kernel (zImage) von D-Link
- /lib/modules/2.6.16.9/...-Module von D-Link
- /lib/firmware/... von D-Link
- asterisk von D-Link
Die D-Link-Sachen sind dabei aber nicht aus dem Original-Dateisystem im Flash. Stattdessen habe ich mir die Horstbox-Entwicklungsumgebung installiert, und das Zeug neu kompiliert. Damit bekommt man noch weitere Asterisk-Module für /usr/lib/asterisk/modules
Interessant noch: Der Flashspeicher von Horst ist ja angeblich 32MB groß. Er wird von RedBoot jedoch nur halb erkannt und angezeigt. Linux findet dort noch zwei weitere Partitionen. Der Kernel 2.6.16.9 von D-Link findet beim Booten noch eine Partition "spare1" (8MB) in mtd7 an und eine "spare2" in mtd8. Einen Openwrt-Kernel 2.6.26 hatte ich auch mal gebootet, der hatte, glaub ich, die beiden Teile zusammengefasst angezeigt.
Die "spare2" wird jedoch eigenartigerweise als 12MB gemeldet. Hat die Horstbox vielleicht sogar 36MB Flash?
Ich hab bei mir das "spare1" als JFFS2-System eingerichtet und dort die Asterisk-Sachen hinkopiert.
Dazu musste ich es mit dem bei OpenWrt mitinstalliertem Programm "mtd" erasen und konnte es dann als JFFS2-System mounten. JFFS2-Dateisysteme müssen übrigens nicht initialisiert werden; Es reicht, wenn im Flashspeicher die durch das Erasen hinterlassenen Erase-Signaturen stehen. Es gibt zwar auch ein mkjffs2-Programm, aber das dient zum Erstellen eine JFFS2-Images aus einem existierenden Dateibaum.
"spare2"/mtd8 habe ich noch nicht benutzt. [paranoide] Die Größenangabe 12MB hat mich stutzig gemach. Nicht dass es da ein Hardware-Adresswraparound gibt und ich den RedBoot überschreibe.[/paranoide].
1. Nachtrag
Also ich hab diese Flash-Geschichte nochmals genauer untersucht. Der RedBoot-Lader, den D-Link/Maxima da installiert hat, scheint mir etwas vergurkt zu sein.
Da ist ja erstmals, dass der kein TFTP-Zugriff kann. hehol hat in diesem Forum allerdings beschrieben, wie man ihn austauscht mit einer Version, die das kann.
Jetzt diese Flash-Sache. Der RedBoot legt seine Partitionstabelle anscheinend normalerweise in den letzten Block des Flashspeichers. In die Linuxkernels läßt sich nämlich reinkonfigurieren, wo Linux den suchen soll. Bei neueren Kernels gibts da dann die Möglichkeit, mit einem negativen Offset den Ort relativ zum Speicherende anzugeben.
Bei "unserem" Redboot liegt die Partitionstabelle aber am Ende des halben Flashspeichers. Der Redboot kennt den ganzen Rest nicht. Offensichtlich ist vorgesehen, dass es eine HorstBox-Version mit nur halbsogroßem Flashspeicher gibt.
Der 32MiB große Flashspeicher besteht aus 256 Blöcken von 0x20000=131072 Bytes. Bei der Änderung von auch nur einem einzelnem Byte innerhalb eines Blocks muss der gesamte Block neu geflasht werden.
Die erste Hälfte des Speicher besteht also aus den Blöcken 0 bis 127. Und im Block 127 liegt die Partitionstabelle. Und zwar am Anfang des Blocks; der Rest davon ist unbenutzt und damit verschenkt. Dem Kernel muss in einer Konfigurationsoption als Tabellenort der Wert 127 angegeben werden, siehe auch hier.
Egal, könnte man denken, wenn RedBoot den Rest nicht kennt, der Linuxkernel kanns ja besser machen. Der OpenWrt-Kernel (SVN-Entwicklerversion, Nov 2008 ) findet tatsächlich richtig die zweite Hälfte, weist ihr ein mtd-Device mit einer Nummer um Eins größer als die letzte RedBoot-Partition zu, und nennt sie "boardconfig".
Nicht aber der Kernel auf der HorstBox-Entwickler-CD. Der findet zwar auch den freien Platz, aber er erzeugt zwei mtd-Devices und nennt ihre Bereiche spare1 und spare2. Und er macht dies grottenfalsch: sie überlappen sich im Flashspeicher. Hier die Kernelmeldungen, wo man das schön sieht:
Ein Blick in den D-Link-Kernelcode, Datei linux-2.6.16.9/drivers/mtd/maps/ixp4xx.c zeigt dann auch den Fehler:
Lösung? Wahrscheinlich den Code patchen, was ich allerding erstmals lasse. Ansonsten nur spare2 verwenden und spare1 unbenutzt lassen; damit kann man immerhin noch 12MB nutzen.
Also OpenWrt (bleeding edge Kamikaze) läuft jetzt zwar grundsätzlich bei mir. Was ich aber noch haben will und was bei OpenWrt nicht dabei ist:
- Treiber für ISDN und die FXO/FXS-Anschlüsse (Analogtelefonie).
- Asterisk-Zaptelmodul (Bristuff) für ISDN-Aschlüsse.
Aus Zeitgründen habe ich mir jetzt ein gemischtes OpenWrt/DLINK-System hingebastelt:
Das rootfs von OpenWrt, aber:
- Kernel (zImage) von D-Link
- /lib/modules/2.6.16.9/...-Module von D-Link
- /lib/firmware/... von D-Link
- asterisk von D-Link
Die D-Link-Sachen sind dabei aber nicht aus dem Original-Dateisystem im Flash. Stattdessen habe ich mir die Horstbox-Entwicklungsumgebung installiert, und das Zeug neu kompiliert. Damit bekommt man noch weitere Asterisk-Module für /usr/lib/asterisk/modules
Interessant noch: Der Flashspeicher von Horst ist ja angeblich 32MB groß. Er wird von RedBoot jedoch nur halb erkannt und angezeigt. Linux findet dort noch zwei weitere Partitionen. Der Kernel 2.6.16.9 von D-Link findet beim Booten noch eine Partition "spare1" (8MB) in mtd7 an und eine "spare2" in mtd8. Einen Openwrt-Kernel 2.6.26 hatte ich auch mal gebootet, der hatte, glaub ich, die beiden Teile zusammengefasst angezeigt.
Die "spare2" wird jedoch eigenartigerweise als 12MB gemeldet. Hat die Horstbox vielleicht sogar 36MB Flash?
Ich hab bei mir das "spare1" als JFFS2-System eingerichtet und dort die Asterisk-Sachen hinkopiert.
Dazu musste ich es mit dem bei OpenWrt mitinstalliertem Programm "mtd" erasen und konnte es dann als JFFS2-System mounten. JFFS2-Dateisysteme müssen übrigens nicht initialisiert werden; Es reicht, wenn im Flashspeicher die durch das Erasen hinterlassenen Erase-Signaturen stehen. Es gibt zwar auch ein mkjffs2-Programm, aber das dient zum Erstellen eine JFFS2-Images aus einem existierenden Dateibaum.
"spare2"/mtd8 habe ich noch nicht benutzt. [paranoide] Die Größenangabe 12MB hat mich stutzig gemach. Nicht dass es da ein Hardware-Adresswraparound gibt und ich den RedBoot überschreibe.[/paranoide].
1. Nachtrag
Also ich hab diese Flash-Geschichte nochmals genauer untersucht. Der RedBoot-Lader, den D-Link/Maxima da installiert hat, scheint mir etwas vergurkt zu sein.
Da ist ja erstmals, dass der kein TFTP-Zugriff kann. hehol hat in diesem Forum allerdings beschrieben, wie man ihn austauscht mit einer Version, die das kann.
Jetzt diese Flash-Sache. Der RedBoot legt seine Partitionstabelle anscheinend normalerweise in den letzten Block des Flashspeichers. In die Linuxkernels läßt sich nämlich reinkonfigurieren, wo Linux den suchen soll. Bei neueren Kernels gibts da dann die Möglichkeit, mit einem negativen Offset den Ort relativ zum Speicherende anzugeben.
Bei "unserem" Redboot liegt die Partitionstabelle aber am Ende des halben Flashspeichers. Der Redboot kennt den ganzen Rest nicht. Offensichtlich ist vorgesehen, dass es eine HorstBox-Version mit nur halbsogroßem Flashspeicher gibt.
Der 32MiB große Flashspeicher besteht aus 256 Blöcken von 0x20000=131072 Bytes. Bei der Änderung von auch nur einem einzelnem Byte innerhalb eines Blocks muss der gesamte Block neu geflasht werden.
Die erste Hälfte des Speicher besteht also aus den Blöcken 0 bis 127. Und im Block 127 liegt die Partitionstabelle. Und zwar am Anfang des Blocks; der Rest davon ist unbenutzt und damit verschenkt. Dem Kernel muss in einer Konfigurationsoption als Tabellenort der Wert 127 angegeben werden, siehe auch hier.
Egal, könnte man denken, wenn RedBoot den Rest nicht kennt, der Linuxkernel kanns ja besser machen. Der OpenWrt-Kernel (SVN-Entwicklerversion, Nov 2008 ) findet tatsächlich richtig die zweite Hälfte, weist ihr ein mtd-Device mit einer Nummer um Eins größer als die letzte RedBoot-Partition zu, und nennt sie "boardconfig".
Nicht aber der Kernel auf der HorstBox-Entwickler-CD. Der findet zwar auch den freien Platz, aber er erzeugt zwei mtd-Devices und nennt ihre Bereiche spare1 und spare2. Und er macht dies grottenfalsch: sie überlappen sich im Flashspeicher. Hier die Kernelmeldungen, wo man das schön sieht:
Code:
Creating 7 MTD partitions on "IXP4XX-Flash.0":
0x00000000-0x00080000 : "RedBoot"
0x00080000-0x000c0000 : "nvram"
0x000c0000-0x001c0000 : "zImage"
0x001c0000-0x00920000 : "rootfs"
0x00920000-0x00fc0000 : "rootfs_data"
0x00fc0000-0x00fc1000 : "RedBoot config"
0x00fe0000-0x01000000 : "FIS directory"
Creating 2 MTD partitions on "IXP4XX-Flash.0":
0x01000000-0x01800000 : "spare1"
0x01400000-0x02000000 : "spare2"
Code:
#ifdef CONFIG_MACH_HORSTBOX
if (!err && info->mtd->size == 0x2000000 /* 32MB */ ) {
const struct mtd_partition my_partitions[] = {
{
name: "spare1",
offset: 0x1000000,
size: 0x800000
},
{
name: "spare2",
offset: 0x1400000,
},
};
err = add_mtd_partitions(info->mtd, my_partitions, 2);
if(err)
printk(KERN_ERR "Could not add additional partitions\n");
}
#endif
Zuletzt bearbeitet: