Compact flash change over for Fantom XR
Reverse engineering procedure
16 Settembre 2018-09-16
Lo scopo del seguente studio è quello di poter costruire un commutatore che permetta la sostituzione elettronica della compact flash a bordo dell’espander Roland Fantom XR.
C’è infatti l’esigenza di poter superare il limite delle 256 memorie per i patch contenute nella Compact Flash. La Compact flash viene inserita nel Fantom mediante un adattatore PC card-Compact flash.
Da Wikipedia:
“La PC Card, inizialmente denominata PCMCIA Card o brevemente PCMCIA (sigla dell'associazione sviluppatrice, o di "Peripheral Component Microchannel Interconnect Architecture" attribuito in seguito dall'IBM), era uno standard d'interfaccia elettronica ideato nel 1990, destinata a computer portatili, o altri tipi di dispositivi elettronici portatili, e accessibile dall'esterno, sviluppata dalla Personal Computer Memory Card International Association al fine di permettere l'espansione delle funzionalità di tali dispositivi portatili.” https://it.wikipedia.org/wiki/PC_Card
Dimensioni: 85 x 54 x 5 mm
Velocità trasferimento dati: 16,6 MB/s
Resistenza alle vibrazioni: 15 g
Resistenza agli urti: 1000 g
Consumo di corrente: max 70 mA
Alimentazione: 3,3 / 5 V
Durata: 300.000 cicli di cancellazione
MTBF: 1.000.000 di ore
Qui è riportato il pinout della PC Card: http://pinouts.ws/pcmcia-pinout.html
Mentre la PC Card ha un connettore da 64 pin la Compact Flash utilizza un subset del segnali della PC_Card pertanto il suo connettore è da 50 pin
Qui sono riportate le specifiche della Compact Flash
In particolare vengono descritti i tre modi di funzionamento:
“The CompactFlash Storage Card functions in
three basic modes:
1) PC Card ATA using I/OMode
2) PC Card ATA using Memory Mode
3) True IDE Mode, which is compatible with most disk drives
Quindi il primo obiettivo era quello di capire in che modo dei tre venisse utilizzata la CF (Compact Flash)
Di seguito riporto alcune misurazioni effettuate sul Fantom:
Faccio riferimento allo schema elettrico che trovate in fondo al service manual del Fantom XR
Inserimento PC_Card:
Il segnale 1 (pin 9 IC113) è il segnale PC-CD2 che
corrisponde al pin 25 della CF.
I pin 25 e 26 della CF sono cortocircuitati internamente a Ground e quindi
quando si inserisce la card sul pin9 viene presentato un fronte negativo.
Questo segnale giunge al pin 134 della CPU SH7706 (IC1) e la informa che è
stata inserita una PC_card/CF
Il segnale 2 (pin 4 Q17) è il segnale Card Power.
Quando è a livello logico basso viene fornita alimentazione di 5v alla PC_card.
Questo avviene dopo 470mSec che è stata inserita la PC_Card
Il segnale 3 (pin 3 Q16) è il segnale di reset della
PC_card, quando è alto è attivo e la scheda è in reset.
La cpu mantiene la scheda in reset per 630mSec dopo averle fornito
alimentazione
Quindi dopo c 1,1 secondi dall’inserimento della PC card il processore interno alla scheda va in run.
In questa foto i segnali 1 e 3 sono gli stessi della foto precedente
Il segnale 2 (pin 17 IC117) è il segnale CE1 (Chip
Enable) che corrisponde al pin 7 della CF.
Il chip enable viene portato a livello basso quando la CPU vuole indirizzare la
PC card.
Esiste anche un altro chip enable (CE2) che corrisponde al
pin 32 ma su questo non ho mai rilevato attività.
Le specifiche riportano: “These signals are required only for 16 bit accesses”
sebbene il bus della PC card sia collegato a 16 bit ????
Dalla foto si vede che dopo 1.49 secondi dall’uscita dal
reset la CPU colloquia con la CF.
Successivamente il segnale CE1 rimane alto e quindi posso supporre che la CPU
legga e trasferisca in RAM tutto il contenuto della CF.
La lettura di tutta la memoria viene eseguita in 1.04 secondi circa
Non ci sono altri impulsi negativi su CE ….
Successivamente ho analizzato gli altri segnali durante la lettura della scheda.
Segnale REG
CH 2) segnale CE1
CH 3) Pin 15 IC 129 XCA REG
Il segnale REG risulta basso in molte operazioni di accesso alla CF
In particolare ho notato che:
1) Il segnale OE (pin 9 CF) misurato al pin 11 dell’IC119 rimane sempre a livello logico alto
2) Il segnale WE (pin 36 CF) misurato al pin 12 dell’IC119 rimane sempre a livello logico alto
Mentre di seguito invece riporto i segnali IORD e IOWR che invece risultano attivi nell’intervallo di lettura ella CF.
Segnale 2 – CE01 Segnale 2 – CE01
Segnale 3 – IORD (ritardo primo impulso IORD rispetto a CE = 90nSec Segnale 3 – IOWR
Gli impulsi di comando sono sempre larghi 200nSec circa.
Nella foto si evidenzia una operazione di scrittura (probabilmente un registro)
durante una fase CE1=0.
Al di fuori dell’intervallo CE1=0 il segnale IOWR non ha significato.
I segnali sono stati catturati utilizzando l’ingresso 1 come
trigger collegato al segnale PC-CD2 (inserimento PC_card).
Sull’oscilloscopio è stata utilizzata la base di tempo ritardata di 3 secondi,
trascorsi i quali il DO (Digital Oscilloscope) aspettava il trigger sull’ingresso
2 (slope negativo).
Il campionamento è stato effettuato a 100MS/s e poi zummato a 250 ns/div
Come si vede dai dati delle CF “Delkin” i tempi tw(IORD) sono rispettati 200ns > 165ns, tsuCE(IORD) 90ns > 70ns
Come si nota vengono fatti due accessi IO Read Data ogni impulso CE.
Infatti questo ci fa capire che l’accesso è di tipo Input/Output a 8 bit quindi occorrono due letture che differiscono per l’indirizzo A0, che però non ho misurato.
Questo è quello che viene riportato nelle specifiche (pag 36)
“Data Signals: the host and each card
shall present a load no larger than 50pF 10 at a DC current of
450µA and 150µA high state. The host and each card shall be able to drive at
least the following load
10 while meeting all AC timing requirements: 100pF with DC current 1.6mA low
state and 300µA high
state. This permits the host to wire two sockets in parallel without derating
the card access speeds.”
Si dedurrebbe che almeno due CF possono essere collegate in parallelo secondo le specifiche.
Però penso che tutto questo si riferisca al modo Ultra-DMA anche per le misure che ho effettuato in seguito
SCHEMA Interfaccia Fantom - CF
Estratto dal service manual relativo alla scheda in cui c’è l’adattatore PC_card
Pinout tra la PC_card e la CF nell’adattatore:
In rosso ho evidenziato i pin non collegati nella scheda PC-Card Slot
In verde ho indicato i pin che sono uscite della CF e che quindi vanno multiplexate per fare il change over
In giallo i due pin che essendo collegati internamente alla CF a GND rivelano l’inserimento/estrazione della CF alla CPU.
I tre pin che risultano essere uscite in realtà non presentano segnali rilevanti, in particolare:
1) IOIS16 (pin 24 CF) sempre a ‘0’
2) Card_wait (pin 42 CF) sempre a ‘1’
3) RDY (pin 37 CF) presenta un solo impulse negative nell’intevallo di lettura della CF (vedi foto seguente con e senza ZOOM)
Segnale 2 – CE01
Segnale 3 – RDY (pin 16 IC119)
Nel modo Input/Output il segnale Ready è usato come segnale di interrupt IRQ e arriva alla CPU al pin 152 IRQ1 (XPCMCIA-IRL)
Non potendo escludere un loro utilizzo durante tutto il processo di lettura/scrittura sono costretto comunque a multiplexarli.
Ipotesi di lavoro
Alla luce delle misurazioni effettuate l’idea di base è
quella di sostituire all’interno del Fantom XR la scheda PC-Card Slot.
La scheda presenta quattro punti di ancoraggio da 3,5mm ai vertici di un
rettangolo di lati 87 e 56 mm
Con una scheda che presenterà lo stesso connettore verso la scheda madre e
alloggerà quattro connettori per quattro CF.
Sarà inoltre necessario forare il coperchio superiore del Fantom per permettere
l’inserimento delle quattro CF.
Il connettore verso la scheda madre è questo:
Si tratta di un Molex codice 54104-5092 (schema elettrico) attualmente non più in commercio.
Credo possa essere sostituito dal Molex codice 54104-5031 reperibile presso
RS-components codice RS 670-2597
https://it.rs-online.com/web/p/connettori-fpc/6702597/
Qui il datasheet del connettore
Connettori Compact Flash
Sulla scheda dovranno trovar posto quattro connettori verticali per CF del tipo:
Reperibili presso RS Components: https://it.rs-online.com/web/p/connettori-per-memorie-e-sim/7198713/
Costruttore TE Connectivity codice costruttore 146839-4
Codice RS: 719-8713
Data sheet connettore
Disabilitazione controllo alimentazione CF
Sarà necessario inoltre disattivare il controllo dell’alimentazione da parte della CPU del Fantom per permettere al uC della nostra scheda change over di continuare ad essere alimentato durante il cambio delle schede.
Questa modifica renderà pericoloso l’inserimento delle compact flash con il Fantom acceso
Per fare questo sarà necessario cortocircuitare i pin 2 e 3 di Q18
Prelievo segnale MIDI di ingresso
La scheda avrà inoltre la necessità di accedere ai segnali
midi di ingresso per poter prelevare i comandi MIDI per la commutazione delle
CF.
Un punto di prelievo può essere sulla resistenza R87
Alcune misure per capire l’influenza del parallelo di 4 Compact Flash
Allo scopo di capire se fosse possibile collegare in parallelo 4 o più Compact Flash ho realizzato un set di misura come da foto collegando 4 CF a quella attuale montata sul Fantom XR
In particolare ho collegato:
1) VCC (pin 38 e 13) e GND (1 e 50) per alimentare le schede. Questi pin sono stati intelligentemente scelti in modo tale che invertendo la scheda l’alimentazione non si inverte!.
2) Il Pin 41 di Reset
3) I segnali di lettura e scrittura: -IORD pin34 –IOWR pin 35 che sono attivi durante la lettura della CF
4) Ho inoltre collegato il bit D00 (Pin 21) dei dati e il bit A00 (pin 20) per vedere se il carico aggiuntivo causato dall’impedenza di 4 CF in parallelo deformasse i segnali
5) I pin -CE1 (pin 7) e –CE2 (pin 32) sono stati collegati a VCC per mantenere le 4CF disabilitate come dovrebbero stare nel nostro ChangeOver
Non è stato affatto facile saldare sul pettine del connettore PCM-CIA con pitch di 0.65 mm, per cui mi sono limitato a collegare solo questi segnali.
Segnale -IOWR con 1CF Segnale –IORW con 5CF
Segnale A00 con 1CF Segnale A00 con 5CF
Come si può notare i segnali non risultano modificati con il carico aggiuntivo di 4CF
Fronte di discesa A00 con 1CF Fronte di discesa A00 con 5CF
Fronte di salita A00 con
1CF
Fronte di salita A00 con 5CF
Qui ho evidenziato il leggero aumento del falling e rising time dell’indirizzo A00 con il carico di 4CF. Siamo ai limiti delle capacita dell’oscilloscopio che sta campionando in real time a 100MS/s quindi un campione reale ogni 10nSec, questo significa che c’è un campione reale ogni mezzo quadretto orizzontale il resto della curva è ricostruito per interpolazione sin(x)/x
Bit D00 con 5CF in
parallelo
Bit D00 Con 9CF in parallelo
Parallelando i bit D00 e D01 delle 4CF ho verificato che cosa succede con un carico di 9CF in parallelo. Il segnale non è particolarmente alterato.
Primo Bit D00 con
1CF
Primo Bit D00 Con 5CF in parallelo
Si nota che è nella fase iniziale quando le uscite sono in
tri state il segnale su D0 non è a 5 volt. Evidentemente le resistenze RA106 da
100K non sono sufficienti a mantenere alto i pin in tri-state.
Forse conviene aggiungere una resistenza da 100K verso i 5V???
Pin di uscita Ready
Quello che invece ho scoperto è il comportamento del Pin Ready di una delle CF mantenute disabilitate.
Canale 1) Ready
Canale 2) Reset
Come si vede dopo 23.6mSec che il pin di Reset viene posto a
‘1’ il pin di Ready (uscita da una CF) torna ad ‘1’ indicando che la CF è
pronta a ricevere comandi.
Anche quando il Pin di Reset ritorna dopo 628mSec a ‘0’ il pin di Ready viene
portato di nuovo a ‘0’ per altri 4.22 mSec.
Sembrerebbe come se il reset delle schede avvenisse due volte sia quando il pin
Reset viene posto a 1 sia quando ritorna a 0.
Le specifiche della CF riportano questo:
( Memory Mode) This signal is set high when the CompactFlash
Storage Card or CF+ Card is ready to accept a new data transfer
operation and is held low when the card is busy.
At power up and at Reset, the READY signal is held low (busy)
until the CompactFlash Storage Card or CF+ Card has
completed its power up or reset function. No access of any type
should be made to the CompactFlash Storage Card or CF+ Card
during this time.
Note, however, that when a card is
powered up and used with
RESET continuously disconnected or asserted, the Reset
function of the RESET pin is disabled. Consequently, the
continuous assertion of RESET from the application of power
shall not cause the READY signal to remain continuously in the
busy state.
Negli altri due modi di funzionamento delle CF il pin Ready dovrebbe essere utilizzato come Interrupt Request (-IREQ).
(I/O Operation) – After the CompactFlash Storage Card or CF+
Card has been configured for I/O operation, this signal is used as
-Interrupt Request. This line is strobed low to generate a pulse
mode interrupt or held low for a level mode interrupt. INTRQ
(True IDE Mode)
In True IDE Mode signal is the active high Interrupt Request to the host.
In effetti la linea Ready è collegata al pin 152 (IRL1) (interrupt
level) della CPU SH7706 IC1
Change Over 16 Compact Flash
Collegamento Midi
L’ingresso e l’uscita Midi vengono presi a cavallo della resistenza R87. La resistenza va eliminata e dalla parte di R1 è collegato l’ingresso Midi (Giallo) del Change Over mentre dalla parte di C2 l’uscita (Rosso).
In questo modo però il midi thru è l’uscita della scheda Change Over e non esattamente uguale a Midi_IN (durante il cambio CF)
Quindi nello schema del CO16 avremo
Pin 1: Calza (GND)
Pin 2: Rosso (Out Midi CO16)
Pin 3: Giallo (In Midi CO16)
Misure Change Over 16Compact Flash
Canale 1) Impulso CE1
Canale 2) Impulso IORD (doppia lettura 8 bit?)
Canale 3) Linea Dati D0
Misura del rise time e fall time con cambio della resistenza serie. Si nota soltanto un piccolissimo overshoot poco prima della commutazione nel caso di resistenza=0
Resistenza serie 0 ohm (16 compact flash inserite) Resistenza
serie 15 ohm (16 compact flash inserite)
Due accessi alla CF, il primo in lettura e dopo 2.57uSec in scrittura
Canale 1) Impulso CE1
Canale 2) Impulso IORD –lettura-
Canale 3) Impulso IOWR –scrittura-
Controllo Errori di Lettura
Ho inserito nel firmware tre controlli per evidenziare 3 errori che possono capitare saltuariamente durante la lettura della Compact Flash.
Errore 0) Mancata lettura da parte del Fantom: il firmware, dopo aver portato a ‘0’ CD1 simulando al Fantom l’inserimento di una CF, attende al massimo 12 secondi. Se entro questo tempo non arrivano impulsi CE1 di lettura viene settato il flag di Errore_0 (Visualizza E0) per mancata lettura da Fantom
Errore 1) Se dopo l’arrivo degli impulsi CE1 dal Fantom e trascorsi successivamente 100mSec il Reset risulta ‘H’ viene settato il flag di Errore_1 (Visualizza E1): il Fantom non riesce a leggere la CF
Errore 2) Dopo un certo tempo (variabile) che CD1 è stato portato a ‘1’ (open collector), cioè viene simulata l’estrazione della CF, il Fantom pone a ‘1’ il Reset e contemporaneamente la CF dovrebbe rispondere portando a ‘0’ la linea Ready. Su alcune CF questo non succede pur continuando a caricare e leggere normalmente la scheda. Segnalo questa anomalia (?) visualizzando il punto (virgola) a destra delle unità sul display.
Ready 1)CD1 2)Reset 3)Ready Not Ready 1)Reset 2)CD1 3)Ready
I segnali Reset e Ready iniziano contemporaneamente, mentra
Ready tora a ‘1’ dopo un certo tempo che Reset è stato posto a ‘0’.
Ho misurato questo tempo ma non è mai lo stesso… (55mSec – 4,8mSec)
L’impuls di CD1 è invece il firmware ad imporlo come minimo a 700mSec
Decoder Midi_in con Running Status
In questa realizzazione ho implementato un algoritmo per decodificare i messaggi midi in ingresso anche con il running status attivo. Questo perché alcune interfacce midi su PC non rispettano l’impostazione Running Status Off e quindi fanno uscire messaggi midi senza il byte di status. Ho verificato che l’intefaccia MidAir della M-audio si comporta così, anche chiamando direttamente l’API secondo la definizione di running status OFF alla sua uscita MIDI (non wireless) non escono i byte di status (running Status ON).
L’algoritmo non memorizza i messaggi midi tranne quelli riconosciuti che determinano il cambio della CF. Dopo il campio vengono riletti dalla memoria e rispediti all’uscita. Con Il PIC16F628A sono riuscito a creare un buffer di ingresso e di uscita midi di soli 40 byte più che sufficienti visto che non ci sono grossi problemi di latenza. La seriale Midi è gestita in interrupt.