Bonjour.
Je me suis décidé à installer un
bouton de reset sur ma DreamCast à fin de pouvoir tracer les phases d'initialisation des accessoires connectés sur les ports.
Les traces ont été d'abord capturées à partir de ce modèle de manette acquise chez MoeroShop à une époque où elle était en promotion à 1€.
Cette manette a l'avantage d'être reconfigurable par deux switches facilement accessibles :
- Le premier permet de choisir entre une configuration standard à 4 boutons + gâchettes ou une configuration arcade à 6 boutons.
- Le deuxième permet de mettre en service le vibreur. La présence de ce vibreur étant faite au détriment de celle d'un deuxième logement pour accessoire supplémentaire.
Quelques mots sur l'adressage entre la DreamCast et ses accessoires.L'octet d'adresse est utilisé dans les champs adresse source et/ou adresse destination des entêtes des trames échangées sur le maple bus.
Sur ce schéma sont stylisés :
- La DreamCast ou HOST avec ses 4 ports A, B, C et D.
- Les différents contrôleurs (comme les manettes, le light gun ...) que l'on peut raccorder sur les ports de la DreamCast. Ils sont dénommés "base devices" ou dispositifs de base.
- Les différents accessoires (pack vibreur, MMS ...) que l'on peut insérer dans les logements des différents contrôleurs.Ils sont dénommés "expansion devices" ou dispositifs d'extension.
L'octet d'adresse :
- Deux bits sont utilisés pour le n° de port, ce sont les bits 6 et 7 dans l'octet d'adresse.
- 00 binaire = port A.
- 01 binaire = port B.
- 10 binaire = port C.
- 11 binaire = port D.
- Etant donné que l'on ne peut connecter qu'un seul "Base Device" ou dispositif de base sur un port de la DreamCast, un seul bit lui est réservé, c'est le bit 5 dans l'octet d'adresse.
Il est à 1 pour adresser le "base device" ou dispositif de base, et à 0 pour tous les autres cas. - Il reste donc 5 bits dans cet octet d'adresse, Chacun de ces bits est donc utilisé pour adresser, ou indiquer la présence, du dispositif d'extension associé.
En fait il n'y a que 4 dispositifs physiques possibles et ils sont associés aux bits de 0 à 3. Le cinquième dispostif, celui associé au bit 4, est un dispositif virtuel utilisé par le logiciel de la DreamCast.
Exemples :
- Adresse 0x80 ou 10.0.0000 : Port C seul.
- Adresse 0xE0 ou 11.1.0000 : Dispositif de base sur le Port D.
- Adresse 0x23 ou 00.1.0011 : Pour adresse source uniquement, dispositif de base sur le port A. Par ce moyen, le dispositif de base indique la présence de ses dispostifs d'extension n° 1 et n ° 2.
- Adresse 0x42 ou 01.0.0010 : Dispositif d'extension n° 2 sur le port B.
1) Phases d'initialisation de la manette configurée en standard 4 boutons + gâchettes sans vibreur.Aperçu globalLa fréquence d'échantillonnage a été abaissée à 250 khz histoire d'obtenir un aperçu global des trames échangées qui puisse être contenu dans la fenêtre du Scanalogic 2.
L'affichage étant condensé temporellement, les paires de trames requête + réponse ne peuvent se distinguer l'une de l'autre sur cette capture d'écran, elles se retrouvent figurées dans le même "paquet" par une raie verticale ± épaisse. Certains "paquets" n'y sont même pas figurés pour cause de résolution de l'affichage, ils disparaissent/réapparaissent de la fenêtre en fonction de la contraction/dilatation de l'échelle temporelle. L'emplacement de chacun d'eux est néanmoins indiqué par un marqueur qui a pu être disposé en dilatant temporairement cette échelle.
La première trame qui suit le reset est une requête "Device Status", elle est immédiatement suivie de la réponse "Device Status" indiquant le type d'accessoire connecté sur le port impliqué ainsi que sa configuration.
Les deux autres échanges qui suivent sont des trames "Get Condition" + "Device Reply" où la manette renvoie l'état des boutons, du manche, ainsi que des gâchettes et du manche analogiques.
Après un grand moment d'accalmie (de l'ordre de 400 ms) les échanges "Get Condition"/"Device Reply" reprennent à nouveau cycliquement.
1er échangeLa trame "Device Request" de la requête suivie du début de la trame "Device Status" de la réponseA noter que la fréquence de retransmission de la manette est plus basse que celle de la DC, cette dernière retransmettant avec une horloge de 1 MHz.
|
|
|
DC Request ********** Bloc Octets 00 0x00 0x40 0x60 0x01 CS 0x21
| | | | | | |
| Header (AP = Absolute Position) Bloc.Octet 00.1 Command Code = 1 : Device Request 00.2 Destination AP = 01.1.00000 : Base Device on Port B 00.3 Source AP = 01.0.00000 : Port B of Host (DC) 00.4 Data Size = 0
|
| | |
|
Device Response *************** Bloc Octets 00 0x1C 0x60 0x40 0x05 01 0x01 0x00 0x00 0x00 02 0xFE 0x06 0x0F 0x00 03 0x00 0x00 0x00 0x00 04 0x00 0x00 0x00 0x00 05 0x72 0x44 0x00 0xFF [Dr] 06 0x63 0x6D 0x61 0x65 [eamc] 07 0x20 0x74 0x73 0x61 [ast ] 08 0x74 0x6E 0x6F 0x43 [cont] 09 0x6C 0x6C 0x6F 0x72 [roll] 10 0x20 0x20 0x72 0x65 [er ] 11 0x20 0x20 0x20 0x20 [ ] 12 0x20 0x20 0x20 0x20 [ ] 13 0x64 0x6F 0x72 0x50 [Prod] 14 0x64 0x65 0x63 0x75 [uced] 15 0x20 0x79 0x42 0x20 [ By ] 16 0x55 0x20 0x72 0x6F [or U] 17 0x72 0x65 0x64 0x6E [nder] 18 0x63 0x69 0x4C 0x20 [ Lic] 19 0x65 0x73 0x6E 0x65 [ense] 20 0x6F 0x72 0x46 0x20 [ Fro] 21 0x45 0x53 0x20 0x6D [m SE] 22 0x45 0x20 0x41 0x47 [GA E] 23 0x52 0x45 0x54 0x4E [NTER] 24 0x53 0x49 0x52 0x50 [PRIS] 25 0x4C 0x2C 0x53 0x45 [ES,L] 26 0x20 0x2E 0x44 0x54 [TD. ] 27 0x20 0x20 0x20 0x20 [ ] 28 0x01 0xF4 0x01 0xAE CS 0x19
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| Header (AP = Absolute Position) Bloc.Octet 00.1 Command Code = 5 : Device Status 00.2 Destination AP = 01.0.00000 : Port B of Host (DC) 00.3 Source AP = 01.1.00000 : Base Device on Port B 00.4 Data Size = 28
Device ID Bloc.Octet 01 Function Type(s) = 0x00 0x00 00000000b 00000001b : Only Controller Function 02 Function Definition Block 1 = 0x00 0x0F 0x06 0xFF : Controller 02.1 11111110b : First joystick, buttons Start, A and B used 02.2 00000110b : Only buttons X and Y used 02.3 00001111b : Both triggers and first analogue joystick used 02.4 00000000b : Unused 03 Function Definition Block 2 = 0x00 0x00 0x00 0x00 : 2nd function does not exist 04 Function Definition Block 3 = 0x00 0x00 0x00 0x00 : 3rd function does not exist
Fixed Device Status Bloc.Octet 05.1 Destination Region = 11111111b : Area 4, 3, 2, 1, Europe, Asia, Japon, North America 05.2 Dummy = 0 05.3 Produc Name (30 Ascii) = "Dreamcast controller " 13.1 License (60 Ascii) = "Produced By Or Under License From SEGA ENTERPRISES,LTD. " 28.1 StandBy current consuption (little endian) = 0x01AE = 430 : 43 mA 28.3 Maximun current consuption (little endian) = 0x01F4 = 500 : 50 mA
|
Avec cette réponse la DC a obtenu des informations essentielles sur la manette :
- Les zones géographiques avec lesquelles elle est compatibile.
- Le masque de présence ( Function Definition Block 1 ), elle sait alors quels sont les boutons, les manches et les gâchettes qui équipent cette manette.
2èm échange et échanges suivantsLa DreamCast interroge périodiquement cette manette à l'aide de la paire de trames "Get Condition" / "Data Transfer"
La trame "Get Condition" de la requête DC Request ********** 00 0x01 0x80 0xA0 0x09 01 0x01 0x00 0x00 0x00 CS 0x29
| | | | | | | | |
| Header (AP = Absolute Position) 00.1 Command Code = 9 : Get Condition 00.2 Destination AP = 10.1.00000 : Base Device on Port C 00.3 Source AP = 10.0.00000 : Port C of DC Host 00.4 Data Size = 1
Parameter 01 Function Type(s) = 0x00 0x00 00000000b 00000001b : Only Controller Function
|
Avec cette requête, la DC interroge la manette dans le but d'obtenir :
- L'état des boutons et du manche conventionel.
- Les positions des gâchettes et du manche analogique.
La DC connaît exactement quels sont les boutons, manches et gâchettes qui sont présents sur cette manette, elle a obtenu le masque de présence suite à l'échange "Device Request"/ "Device Status".
La trame "Data Transfer" de la réponse Device Response *************** 00 0x03 0x60 0x40 0x08 01 0x01 0x00 0x00 0x00 02 0000 0000 0xFF 0xFF 03 0x80 0x80 0x80 0x80 CS 0x2A
| | | | | | | | | | | | | | | | | | | | |
| Header (AP = Absolute Position) 00.1 Command Code = 8 : Data Transfer 00.2 Destination AP = 01.0.00000 : Port B of Host (DC) 00.3 Source AP = 01.1.00000 : Base Device on Port B 00.4 Data Size = 3
01 Function Type(s) = 0x00 0x00 00000000b 00000001b : Only Controller Function
02 Function Data : 11111111b 11111111b 0x00 0x00 Buttons and Joysticks Data 02.1 11111111b : Right a, Left a, Down a, Up b, Start, A, B et C 02.2 11111111b : Right b, Left b, Down b, Up b, D, X, Y et Z Analogue Triggers Data 02.3 0x00 : Right Trigger 02.4 0x00 : Left Trigger
03 Function Data : 0x80 0x80 0x80 0x80 Analogue Joysticks Data 03.1 0x80 0x80 : X, Y, First Joystick 03.2 0x80 0x80 : X, Y, Second Joystick
|
Avec cette réponse la DC a obtenu l'état instantané des boutons, des manches conventionels ainsi que les positions des gachettes et manches analogiques.
A l'aide du masque de présence obtenu par l'échange "Device Request"/ "Device Status" elle peut oblitérer ou ignorer les états ou les positions par défaut de ceux et de celles dont la manette n'est pas équipée.