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.

FantomXR.jpg

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.

PCcard_to_CompactFlash.jpg

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

image009

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:

image002.jpg

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.

 

image003.jpg

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

image004.jpg  image005.jpg

Non ci sono altri impulsi negativi su CE ….

Successivamente ho analizzato gli altri segnali durante la lettura della scheda.

Segnale REG

image006.jpg
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.

image007.jpg  image008.jpg

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

image009.jpg

Pinout tra la PC_card e la CF nell’adattatore:

image011.jpg

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.

image012.jpg

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)

image013.jpg   image014.jpg

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:

image015.jpg

Si tratta di un Molex codice 54104-5092 (schema elettrico) attualmente non più in commercio.

image016.jpg
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:

image017.jpg

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

image018.jpg

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.

 image019.jpgimage020.jpg

Segnale -IOWR con 1CF                                                                                                                                               Segnale –IORW con 5CF

 

image022.jpg  image022.jpg

Segnale A00 con 1CF                                                                                                                                       Segnale A00 con 5CF

Come si può notare i segnali non risultano modificati con il carico aggiuntivo di 4CF

image023.jpg image024.jpg

Fronte di discesa A00 con 1CF                                                                                                        Fronte di discesa A00 con 5CF

image025.jpg  image026.jpg
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

image027.jpg  image028.jpg
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.

image029.jpg  image030.jpg
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.

image031.jpg  image032.jpg

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

Schema

 

IMG_20190228_224549712.jpg

 

 


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.

1)CD1 2)Reset 3)Ready.jpg 1)CD1 2)Reset 3)Not_Ready.jpg

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.

Flowchart dell’algoritmo