habe mal einen kombinierten mmc Treiber (mmccombo.o) gemacht und die Sourcen heute eingecheckt. Hier eine Auflistung von (neuen) Eigenschaften:
- unterstützt die mmc Verkabelung
- unterstützt die mmc2 Verkabelung
- Unterstützt eine weitere neue Verkabelung über PB[16:19] - damit geht auch in der Philips die SD, ohne PA8 und PA9 von der tts/1 zu klauen. Die 1er Vekabelung ist hier nicht möglich, PB22 und PA7 sind nicht aus der CPU-landingzone raus geroutet, PB23 hängt am FP.
- Leseoptimierungen aus dem mmc2 auch auf die anderen Verkabelungen übertragen.
- Schreiboptimierung für 1er und 4er Verkabelung ist deutlich schneller (1/3 und mehr), als im mmc Treiber
- Treiber unterstützt die IO Routinen aus dem mmc Treiber oder die optimierten über opt=[0:1] mit default zu 1
- Treiber nimmt keine Resourcen, die der CPM zugeschlagen sind ohne dazu über forcehw=1 (default zu0) "gezwungen" zu werden. - Also mmc2 Verkabelung üblicherweise nur mit forcehw=1
- Treiber kann für eine bestimmte Verkabelung gestartet werden oder automatisch die verwendete Variante ermitteln über wiringopt=[0:4], wobei 0 für die Automatik (default) steht und 3 nicht unterstützt wird (der Vollständigkeit halber dem mmc3test entnommen).
Bei der Arbeit am Treiber fiel mir ein Problem im Zusamenhang mit der cam.o auf, die bei Ihrem Init (ich denke) unnötigerweise den kompletten Port-B nullt. Dadurch werden in allen mmc Verkabelungen die SD_CS Leitung low gezogen und die SD Karte damit selektiert, weitere Portspielereien können dann leicht zu Fehlverhalten führen, wenn der mmc Treiber vor dem cam.o gestartet wurde. Ich habe in der cam.c eine Änderung diesbezüglich gemacht, die bei mir auf einer Nokia problemlos läuft. Habe es selbst noch nicht auf Sagem und Philips getestet. Daher noch nicht ins CVS eingecheckt. Hänge es mal hier an, wer mag, kann es dann ja auf Sagem und Philips testen. Die Änderung betrifft nur den Treiber Init, wenn also der µCode im SEC ist, dann ist alles glatt gegangen.
cam.rar
Folgend noch ein paar Infos zu Anschluß und Belegung:
Code: Alles auswählen
//
// ----------------
// / 1 2 3 4 5 6 7 x| MMC/SC Card
// |x |
//
1 SD_CS
2 SD_DI
3 GND
4 +3.3V
5 SD_CLK
6 GND
7 SD_DO
Connect a 50k to 100k resistor as pullup between SD_DO and +3.3V (7 to 4)
NOKIA MODEMCON:
//
// |
// _----------------------------------------
// | | dbox2 tuner |
// ~----------------------------------------
// |
// |
// | 1 3 5 7 9 11 13 15 17 19
// | 2 4 6 8 10 12 14 16 18 20
// |
01 GND
02 PB17
03 PC15
04 PB18
05 PB23
06 PB16
07 NC
08 +5V
09 RST(6) (not sure about index)
10 GND
11 PA8
12 PA9
13 PC4
14 PA7
15 GND
16 +3V
17 PB19
18 PB22
19 GND
20 SLEEP(1)
PHILIPS MODEMCON:
[power supply]
DCD 12 11 PA09
RTS 10 09 PA08
NC 08 07 PB17
toFP 06 05 PB16
GND 04 03 NC
GND 02 01 5V
Softmodem {
PB17 = DTR
PC15 = DCD
PA08 = TXD
PA09 = RXD
PC04 = RTS
}
IDE-IF {
PC15 = IRQ (standard, alternative IRQ = 6 -> not on modem-connector, RI of RS232)
}
mmc1 wiring {
PB23 = SD_CS
PA07 = SD_DO
PB19 = SD_DI
PB22 = SD_SCL
}
mmc2 wiring {
PB16 = SD_CS
PA09 = SD_DO
PA08 = SD_DI
PB17 = SD_CLK
}
mmc3 wiring {
PB22 = SD_CS
PA09 = SD_DO
PA08 = SD_DI
PA07 = SD_CLK
}
mmc4 wiring {
PB16 = SD_CS
PB18 = SD_DO
PB19 = SD_DI
PB17 = SD_CLK
}
Hier noch eine Schreibtimingübersicht:
1er und 4er Verkabelung:
2er Verkabelung:
Der Weg aus dem PPC Core zu den GPIOs ist leider 5 clocks lang, ich habe keine Ahnung, ob das durch einem speziellen (eigenen) µCODE im CPM umgehbar wäre, kenne mich da noch nicht so aus, ist eine Art Anfängerprojekt. Also ist von Portänderung zu Portänderung mit einem minimum Delay von etwa 75ns zu rechnen. Das heißt für das schreiben in der 1er und 4er Verkabelung mit gleichzeitigem setzen von clock low und SD_DI geht es nicht unter 150ns pro Bit. Im combotreiber ist das aktuell nicht erreicht, im standalone aber sehr wohl. Hatte noch keine Zeit herauszufinden wieso. Hier lässt sich aber sicherlich in der äußeren Schleife für den Block was optimieren. - Am Ende kommen beide Treiber aber auf ähnliche Geschwindigkeiten, da der Overhead beim Standalone (siehe weiter unten) höher ist. Mal zur Vollständigkeit auch dazu ein Auszug:
Ein circa Vergleich der verschiedenen low-level Teile:
Code: Alles auswählen
mmc driver continuous write:
- clocking 8 Bits to card 4860ns
- inbetween bytes 920ns
- byte total 5780ns
-> write benchmark 1.00
mmc driver continuous read:
- clocking 8 Bits out of card 4840ns
- inbetween bytes 960ns
- byte total 5800ns
-> read benchmark 1.00
mmc_opt driver continuous write:
- clocking 8 Bits to card 1040ns
- inbetween bytes 620ns
- byte total 1660ns
-> write benchmark 3.48
mmc_opt driver continuous read:
- clocking 8 Bits out of card 1590ns
- inbetween bytes 290ns
- byte total 1880ns
-> read benchmark 3.09
mmc2 driver continuous write:
- clocking 8 Bits to card 1660ns
- inbetween bytes 630ns
- byte total 2290ns
-> write benchmark 2.52
mmc2 driver continuous read:
- clocking 8 Bits out of card 1630ns
- inbetween bytes 310ns
- byte total 1940ns
-> read benchmark 2.99
Standalone für 1er Verkabelung
Standalone für 4er Verkabelung
Damit steht also auch für die 1er Verkabelung ein optimierter Treiber zur Verfügung, die ja auch von der kommenden d2µSD Platine für den Nokia Abgriff verwendet wird:
Viel Spaß damit und noch einen schönen Sonntag.