Salut
j'ai commencé à faire du reverse engineering des transactions sur le bus USB entre SigmaStudio et la carte USBi équipé du chip Cypress FX2LP.
pour cela il suffit de lancer USBPcap et de logger le flux USB, et ensuite de décoder les packets en utilisant Wiresharc et de comparer avec le flux Data qui apparaît dans la fen^tre inférieur de sigma studio.
Voici un DUMP décortiqué pour l'écriture d'un mot "0" codé sur 4 bytes en mode SPI à l'adresse 4FFF:
- Code: Tout sélectionner
******** SEND B2 : WRITE SPI(ADDR, DATAn...)
URB_CONTROL "OUT" / 36byte
00 : Length : h1C=28
02 : IRP ID : 8 bytes
0A : USBD STATUS : 4bytes= 0 (success)
0E : URB FUNCTION : 2 byte : VENDOR h0017
10 : IRP INFORMATION : 5bytes
15 : ENDPOINT NUM & DIRECTION : 1 byte : 0(OUTPUT)
16 : URB TRANSFER TYPE : 1 byte URB CONTROL à h02
17 : PACKET DATA LENGTH : 4 byte = 8
1B : CONTROL Transfert Stage : 1byte = 0 (SETUP)
1C : URB SETUP:
00 bmRequestType =h40 : host to device, Vendor
01 bRequest = B2 -> WRITE SPI
02 wValue = 0
04 wIndex =h101 -> CHIP SELECT ?
06 wLength =6 -> ADRESSE (2bytes) + DATA(4bytes)
URB_CONTROL OUT / 34byte
00 : Length : h1C=28
02 : IRP ID : 8 bytes
0A : USBD STATUS : 4bytes = 0 (success)
0E : URB FUNCTION : 2 byte : CONTROL TRANSFER h0008
10 : IRP INFORMATION : 5bytes
15 : ENDPOINT NUM & DIRECTION : 1 byte : 0(OUTPUT)
16 : URB TRANSFER TYPE : 1 byte URB CONTROL à h02
17 : PACKET DATA LENGTH : 4 byte = 0006
1B : CONTROL Transfert Stage : 1byte = 1 (DATA)
1C : 4FFF 00 00 00 00
USB URB / 28byte
00 : Length : h1C=28
02 : IRP ID : 8 bytes
0A : USBD STATUS : 4bytes = 0 (success)
0E : URB FUNCTION : 2 byte : VENDOR DEVICE h0008
10 : IRP INFORMATION : 5bytes
15 : ENDPOINT NUM & DIRECTION : 1 byte : 0 (OUTPUT)
16 : URB TRANSFER TYPE : 1 byte URB CONTROL à h02
17 : PACKET DATA LENGTH : 4 byte = 0000
1B : CONTROL Transfert Stage : 1byte = 2 (STATUS)
****** SEND B5 : EXECUTE(FLAG) **********
USB URB CONTROL "IN" / 36 bytes
00 : Length : h1C=28
02 : IRP ID : 8 bytes
0A : USBD STATUS : 4bytes = 0 (success)
0E : URB FUNCTION : 2 byte : VENDOR h0017
10 : IRP INFORMATION : 5bytes
15 : ENDPOINT NUM & DIRECTION : 1 byte : h80 (INPUT)
16 : URB TRANSFER TYPE : 1 byte URB CONTROL à h02
17 : PACKET DATA LENGTH : 4 byte = 0008
1B : CONTROL Transfert Stage : 1byte =0 (SETUP)
00 bmRequestType =hC0 : device to Host, Vendor
01 bRequest = B5 ->
02 wValue = 0
04 wIndex = 0
06 wLength = 1
URB_CONTROL "IN" / 29 bytes
00 : Length : h1C=28
02 : IRP ID : 8 bytes
0A : USBD STATUS : 4bytes = 0 (success)
0E : URB FUNCTION : 2 byte : CONTROL TRANSFER h0008
10 : IRP INFORMATION : 5bytes
15 : ENDPOINT NUM & DIRECTION : 1 byte : h80(INPUT)
16 : URB TRANSFER TYPE : 1 byte URB CONTROL à h02
17 : PACKET DATA LENGTH : 4 byte = 0001
1B : CONTROL Transfert Stage : 1byte = 1 (DATA)
1C : 01
USB URB / 28byte
00 : Length : h1C=28
02 : IRP ID : 8 bytes
0A : USBD STATUS : 4bytes = 0 (success)
0E : URB FUNCTION : 2 byte : VENDOR DEVICE h0008
10 : IRP INFORMATION : 5bytes
15 : ENDPOINT NUM & DIRECTION : 1 byte : h80 (INPUT)
16 : URB TRANSFER TYPE : 1 byte URB CONTROL à h02
17 : PACKET DATA LENGTH : 4 byte = 0000
1B : CONTROL Transfert Stage : 1byte = 2 (STATUS)
on apprend plusieurs choses:
1) la carte USBi est configuré en USB Class "Vendor Specific" code 0xFF
2) la commande "Vendor" 0xB2 est utilisé pour écrire un flux SPI de taille variable
3) l'écriture semble se faire en 2 temps avec une commande supplémentaire 0xB5 pour soit valider l'écriture vers le DSP, ou demander le status de la transaction, ou finaliser la transaction.
Voici le flux pour faire un READBACK d'une variable, sachant que c'est un process spécific qui permet de lire la valeur de façon synchronisée avec les cycles du DSP:
- Code: Tout sélectionner
******** SEND B3 : WRITE READBACK ADRESS SPI (REG ADRESS)
URB_CONTROL "OUT" / 36byte
00 : Length : h1C=28
02 : IRP ID : 8 bytes
0A : USBD STATUS : 4bytes= 0 (success)
0E : URB FUNCTION : 2 byte : VENDOR h0017
10 : IRP INFORMATION : 5bytes
15 : ENDPOINT NUM & DIRECTION : 1 byte : 0(OUTPUT)
16 : URB TRANSFER TYPE : 1 byte URB CONTROL à h02
17 : PACKET DATA LENGTH : 4 byte = 8
1B : CONTROL Transfert Stage : 1byte = 0 (SETUP)
1C : URB SETUP:
00 bmRequestType =h40 : host to device, Vendor
01 bRequest = B3
02 wValue = 0
04 wIndex =h101 -> CHIP SELECT ?
06 wLength =2
URB_CONTROL OUT / 30byte
00 : Length : h1C=28
02 : IRP ID : 8 bytes
0A : USBD STATUS : 4bytes = 0 (success)
0E : URB FUNCTION : 2 byte : CONTROL TRANSFER h0008
10 : IRP INFORMATION : 5bytes
15 : ENDPOINT NUM & DIRECTION : 1 byte : 0(OUTPUT)
16 : URB TRANSFER TYPE : 1 byte URB CONTROL à h02
17 : PACKET DATA LENGTH : 4 byte = 0002
1B : CONTROL Transfert Stage : 1byte = 1 (DATA)
1C : 0014 -> example readback
USB URB / 28byte
00 : Length : h1C=28
02 : IRP ID : 8 bytes
0A : USBD STATUS : 4bytes = 0 (success)
0E : URB FUNCTION : 2 byte : VENDOR DEVICE h0008
10 : IRP INFORMATION : 5bytes
15 : ENDPOINT NUM & DIRECTION : 1 byte : 0 (OUTPUT)
16 : URB TRANSFER TYPE : 1 byte URB CONTROL à h02
17 : PACKET DATA LENGTH : 4 byte = 0000
1B : CONTROL Transfert Stage : 1byte = 2 (STATUS)
****** SEND B5 : EXECUTE ?
****** SEND B4 : READ VALUE READBACK SPI(DATA LENGTH)
USB URB CONTROL "IN" / 36 bytes
00 : Length : h1C=28
02 : IRP ID : 8 bytes
0A : USBD STATUS : 4bytes = 0 (success)
0E : URB FUNCTION : 2 byte : VENDOR h0017
10 : IRP INFORMATION : 5bytes
15 : ENDPOINT NUM & DIRECTION : 1 byte : h80 (INPUT)
16 : URB TRANSFER TYPE : 1 byte URB CONTROL à h02
17 : PACKET DATA LENGTH : 4 byte = 0008
1B : CONTROL Transfert Stage : 1byte =0 (SETUP)
00 bmRequestType =hC0 : device to Host, Vendor
01 bRequest = B4 ->
02 wValue = 0
04 wIndex = h101 -> CHIP SELECT ?
06 wLength = 4
URB_CONTROL "IN" / 29 bytes
00 : Length : h1C=28
02 : IRP ID : 8 bytes
0A : USBD STATUS : 4bytes = 0 (success)
0E : URB FUNCTION : 2 byte : CONTROL TRANSFER h0008
10 : IRP INFORMATION : 5bytes
15 : ENDPOINT NUM & DIRECTION : 1 byte : h80(INPUT)
16 : URB TRANSFER TYPE : 1 byte URB CONTROL à h02
17 : PACKET DATA LENGTH : 4 byte = 0004
1B : CONTROL Transfert Stage : 1byte = 1 (DATA)
1C : 00 00 00 00
USB URB / 28byte
00 : Length : h1C=28
02 : IRP ID : 8 bytes
0A : USBD STATUS : 4bytes = 0 (success)
0E : URB FUNCTION : 2 byte : VENDOR DEVICE h0008
10 : IRP INFORMATION : 5bytes
15 : ENDPOINT NUM & DIRECTION : 1 byte : h80 (INPUT)
16 : URB TRANSFER TYPE : 1 byte URB CONTROL à h02
17 : PACKET DATA LENGTH : 4 byte = 0000
1B : CONTROL Transfert Stage : 1byte = 2 (STATUS)
****** SEND B6 : EXECUTE(FLAG) AND GET ACKNOLEDGEMENT ? **********
USB URB CONTROL "IN" / 36 bytes
00 : Length : h1C=28
02 : IRP ID : 8 bytes
0A : USBD STATUS : 4bytes = 0 (success)
0E : URB FUNCTION : 2 byte : VENDOR h0017
10 : IRP INFORMATION : 5bytes
15 : ENDPOINT NUM & DIRECTION : 1 byte : h80 (INPUT)
16 : URB TRANSFER TYPE : 1 byte URB CONTROL à h02
17 : PACKET DATA LENGTH : 4 byte = 0008
1B : CONTROL Transfert Stage : 1byte =0 (SETUP)
00 bmRequestType =hC0 : device to Host, Vendor
01 bRequest = B6 ->
02 wValue = 0
04 wIndex = 0
06 wLength = 1
URB_CONTROL "IN" / 29 bytes
00 : Length : h1C=28
02 : IRP ID : 8 bytes
0A : USBD STATUS : 4bytes = 0 (success)
0E : URB FUNCTION : 2 byte : CONTROL TRANSFER h0008
10 : IRP INFORMATION : 5bytes
15 : ENDPOINT NUM & DIRECTION : 1 byte : h80(INPUT)
16 : URB TRANSFER TYPE : 1 byte URB CONTROL à h02
17 : PACKET DATA LENGTH : 4 byte = 0001
1B : CONTROL Transfert Stage : 1byte = 1 (DATA)
1C : 01
USB URB / 28byte
00 : Length : h1C=28
02 : IRP ID : 8 bytes
0A : USBD STATUS : 4bytes = 0 (success)
0E : URB FUNCTION : 2 byte : VENDOR DEVICE h0008
10 : IRP INFORMATION : 5bytes
15 : ENDPOINT NUM & DIRECTION : 1 byte : h80 (INPUT)
16 : URB TRANSFER TYPE : 1 byte URB CONTROL à h02
17 : PACKET DATA LENGTH : 4 byte = 0000
1B : CONTROL Transfert Stage : 1byte = 2 (STATUS)
On voit que l'opération se fait en 4 étapes:
1) envoie de la commande 0xB3 avec pour seul paramètre les 2 bytes de l'adresse à lire (0014 dans cet exemple)
2) envoie de la commande 0xB5 (comme dans l'exemplaire précédent) pour valider cette écriture
3)envoie de la commande de lecture 0xB4 avec pour paramètre 1 byte indiquant le nombre de byte à lire (4 ici). La reception des 4 bytes se fait dans la foulée.
4) envoie de la commande 0xB6 avec 1 byte de paramètre à 1 qui semble terminer l'opération (comme pour B5 semble til)
la carte USBi à plusieurs Chips select et il semble que le paramètre "wIndex" associé aux commandes B3 et B4 soit utilisé pour le sectionner.
Au démarrage , SigmaStudio envoie les commandes standard de la class Vendor Specific pour "get descriptor" et "get string" afin d' identifier la carte Usbi.
avec ces infos il est possible de faire une interface dans un device type Atmega32u4, ou dans un XMOS ou dans un FPGA, ce qui ouvre la perspective de travailler avec un SigmaDSP et SigmaStudio sans avoir besoin d'une interface USBi.
on peux aussi , et plus simplement peut être, implémenter ces commandes dans le code source "Vendor_ax" fournit par Cypress, et le faire fonctionner dans une carte à base de CY7C68013A, que l'on trouve sur ebay ou ali express ...
il reste à faire quelques Log avec des fonctions d'écriture plus complex (filtres biquad ou Fir par exemple) pour identifier s'il ya d'autre commandes utiles, et faire aussi quelques tests de lecture écriture en I2C avec la carte d'évaluation ADAU1701, et l'affaire est bouclée
A suivre