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 ).
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é.