Fabriquez une carte dans le style "Xfer"
Mise à jour le 06/01/2006 : Tests avec un cable rapide.
Mise à jour le 08/10/2004 : J'ai reçu l'uart et le quartz
de remplacement et ajouté quelques images.
Mise à jour le 21/09/2004 (après avoir dormi ;-) : Ajout
de comment ça marche.
Première version le 21/09/2004
Le nom
"carte Xfer" vient de :
http://www.doubledutchdesigns.com/soopa.htm
En réfléchissant un peu aux modes de transfert
série de la dreamcast j'ai décidé de modifier une
carte d'entrées/sorties pour atteindre le débit maximum
de celle-ci, mais je ne suis pas le premier à y avoir
pensé (Les gens de doubledutch ont même plusieurs
années d'avance sur moi). Mais il y a plus de modifications a
effectuer sur ma carte (ce n'est pas le même modèle qu'ils
utilisent) et les explications seront plus détaillées. Il
devrait être facile d'adapter ces informations à des
cartes séries de modèles différents.
Le but de la modification est de
transformer une carte série standard pour atteindre la vitesse de
transfert de 1,5625 Mbps. Alors comment fait-on ?
La puce qui fait tout le travail s'appelle un uart (Universal
Asynchronous Receiver Transmitter ou Transmetteur receveur asynchrone
universel), il utilise un signal d'horloge qui est divisé par
une valeur programmable préétablie pour donner le taux de
transfet désiré. En fait il y a une valeur minimale qui
est multipliée par 1, 2, 3... Sur les 16450, 16550 que l'on
trouvait dans les pc cette valeur est 16, la vitesse maximale de
transfert est donc horloge/16, on peut aussi programmer l'uart pour
avoir les taux horloge/32, horloge/48, horloge/64 etc...
La vitesse maximale de transfert de la dreamcast est 1562500 bps.
1562500*16 = 25000000. Donc si on utilise un quartz de 25Mhz sur un
uart de type 16550 on obtiendra les mêmes vitesses que la dreamcast.
J'ai regardé les datasheets de quelques uarts :
Le TL16C550 de Texas instrument peut monter jusqu'à 16Mhz avec
une vitesse maximale de 1Mbps, c'est trop bas.
Les ST16C550 de Exar et PC16550 de National semiconductor montent
jusqu'à 1,5Mbps avec des quartz de 24Mhz. On doit pouvoir les
"surcadencer" à 25Mhz sans trop de problèmes,
éventuellement avec un radiateur.
Enfin le SC16C550 de Philips monte jusqu'à 48Mhz, pas de
problèmes pour l'utiliser a 25Mhz.
Pour cette bidouille, j'ai
utilisé une vieille carte isa qui comporte 2 ports série,
un port parallèle et un port joystick (une petite image là).
Après avoir cherché un peu je l'ai configurée
pour que le port parallèle soit en 278h et le port série
en 3E8h (com3 sous dos).
voici une autre image avec
une identification des composants principaux de la carte.
Les uA1488 et MC1489 sont des drivers de ligne, pour transformer
les niveaux ttl des uarts en niveaux rs232 et vice-versa.
Le quartz est à 18,432Mhz
Les uarts sont des 16c450 Mosic, impossible de trouver leur
datasheet, tant pis on va tester quand même à 5Mhz.
Le Pal 16L8 est chargé de décoder les adresses du
bus isa pour valider les différentes composantes de la carte.
Les 4 composants au dessu du pal (74LS32, 74LS125, 74LS244 et
NE558) servent sans doute pour le port série, on s'en moque.
Le 74ls245 sert de buffer pour les entrées/sorties du bus
isa vers les puces.
L'umc82c11, enfin, est un composant qui sert à la fois
à gérer le port parallèle, mais aussi à
générer l'horloge pour les uarts. En fait il ressort sur
sa patte 3 un signal d'horloge à la même fréquence
que le quartz et sur sa patte 4 un signal d'horloge divisé par
10, c'est ce signal qui est cablé sur les uarts (et donc ils
reçoivent un signal de fréquence 1,8432Mhz ce qui
divisé par au minimum 16 donne 115200bps pour le mode le plus
rapide).
Pour tester, en attendant d'avoir un uart 16550 et un quartz de
25Mhz, j'ai changé le quartz
existant par un 5Mhz et coupé une piste (flèche du
bas sur cette image) pour
relier directement sur les uarts le signal
d'horloge de la patte 3 au lieu du signal
divisé par 10 (flèche du haut),
cela devrait permettre de tester un transfert de 312500 bps.
Pour l'instant je galère sur les tests, j'ai du mal à
recompiler dc-tool que ce soit sous cygwin ou linux et de toutes
façons la carte n'a pas l'air de fonctionner sous linux (mais
elle fonctionne sous win98se).
Mise à jour : la carte fonctionne sous linux, il fallait
régler le numéro de la ligne d'interruption, celle
donnée au démarrage du noyau n'était pas bonne.
Maintenant j'ai un PC16550 de National
semiconductor et un quartz à 25Mhz, voici une image de la carte
modifiée. J'ai aussi ajouté un
petit radiateur sur l'uart au cas où, car il n'est pas
censé dépasser les 24Mhz.
J'ai effectué quelques tests avec mon "coders cable" que j'ai
fabriqué avec un Max3232, le cable supporte des débits
jusqu'à 520833 bps (ce qui est déja pas mal, presque 5
fois plus rapide que le taux garanti de 115200 de la puce).
L'étape prochaine va être ou bien de changer le max3232
pour une puce plus rapide, ou d'enlever les drivers de ligne de la
carte série pour dialoguer directement en 5V avec la dreamcast (qui elle est en 3,3V pour le port série, donc il faut adapter les niveaux).
Erwan a travaillé sur un cable série à haute vitesse, je l'ai construit et avec la dernièe version de dc-tool, j'ai pu atteindre la vitesse maximum de la dreamcast.
Voici quelques test de vitesse que j'ai faits avec un fichier incompressible de 4Mo :
À 115200bps (cable standard) : 365s, vitesse effective : 11490,52 octets/s
À 520833bps : 82s, vitesse effective : 51204,85 o/s
À 781250bps : 55s, vitesse effective : 76522,36 o/s
À 1562500bps : 30s, vitesse effective : 143419,75 o/s
Un peu d'aide pour la configuration de Linux :
Il faut utiliser setserial pour définir la vitesse de base de la carte, quelque chose comme :
setserial /dev/ttyS2 baud_base 1562500
Vérifiez bien que vous utilisez le bon port et la bonne interruption, et modifiez les avec setserial si nécessaire (l'autodetection n'est pas fiable). Gardez le drapeau spd_normal. Avec ces réglages, si vous demandez 1,5Mo/s à dc-tool, vous obtiendrez 1,5625Mo/s, si vous demandez 1Mo/s, vous obtiendrez 781,25Ko/s, si vous demandez 500Ko/s, vous obtiendrez 520,833Ko/s.
Voila c'est tout, je suis content du résultat et suis trop paresseux pour tester/modifier dc-tool sous cygwin pour l'instant, donc je considère ce projet comme terminé.