Cloner un périphérique USB
Répondre à la discussion
Affichage des résultats 1 à 6 sur 6

Cloner un périphérique USB



  1. #1
    Luciol44

    Cloner un périphérique USB


    ------

    Bonjours,
    Je tente actuellement de cloner un périphérique USB à des fins personnel et non commercial (utilisation personnel et privé). J’utilise un Atmega32U4 comme µc pour le clonage avec la lib LUFA. J’ai déjà fait le descripteur et il fonctionne bien (périphérique reconnue par le système). La ou ca bloque, c’est avec le logiciel de contrôle. Le périphérique est bien reconnu par le logiciel, mais quand le logiciel envoie les données au périphérique, le périphérique doit retourner un message en retour et il ne le fait pas. J’explique en détail :
    Envoie de 832 Octets de l’hôte vers le périphérique (le EndpointSize = 32, donc 26 paquets de 32 Octets).
    A la fin de cet envoie le périphérique doit répondre un message de 32 octets, et c’est la que ca ne se fait pas et le logiciel bloque un peu.
    Voila ma fonction Task :

    Code:
    void Device::Device_Task(void)
    {
    	/* Device must be connected and configured for the task to run */
    	if (USB_DeviceState != DEVICE_STATE_Configured)
    	return;
    	
    	/* Select the Serial Rx Endpoint */
    	Endpoint_SelectEndpoint(ENDPOINT_DIR_OUT | 1);
    
    	/* Throw away any received data from the host */
    	if (Endpoint_IsOUTReceived())
    	{
    		/* Create a temp buffer big enough to hold the incoming endpoint packet */
    		char  Buffer[Endpoint_BytesInEndpoint()];
    
    		/* Remember how large the incoming packet is */
    		uint16_t DataLength = Endpoint_BytesInEndpoint();
    
    		/* Read in the incoming packet into the buffer */
    		Endpoint_Read_Stream_LE(&Buffer, DataLength, NULL);
    
    		/* Finalize the stream transfer to send the last packet */
    		Endpoint_ClearOUT();
    		
    		if ((Buffer[0]==0xA0) && (Buffer[4]==0x00))
    		{
    			Endpoint_SelectEndpoint(ENDPOINT_DIR_IN | 1);
    			Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
    			char Message[] = {0x37, 0xFF, 0x00, 0xB2, 0x20, 0x62, 0x38, 0x43, 0xAE, 0xF4, 0x4F, 0xED, 0x9B, 0x44, 0xD6};
    			Endpoint_Write_Stream_LE(&Message,15,NULL);
    			Endpoint_ClearIN();
    		}
    		if ((Buffer[0]==0xA0) && (Buffer[4]==0x06))
    		{
    			Endpoint_SelectEndpoint(ENDPOINT_DIR_IN | 1);
    			Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
    			char Message[] = {	0x30, 0xFF, 0x00, 0x05, 0x20, 0x62, 0x38, 0x43, 0xAE, 0xF4, 0x4F, 0xED, 0x9B, 0x44, 0xD6, 0x26,
    								0xA4, 0x0A, 0xA9, 0x86, 0x29, 0x46, 0x5D, 0xF3, 0xC1, 0x92, 0x50, 0x0B, 0xDD, 0x79, 0xF0, 0xE5};
    			Endpoint_Write_Stream_LE(&Message,32,NULL);
    			Endpoint_ClearIN();
    		}
    		if ((Buffer[0]==0x80) && (Buffer[1]==0xFA))
    		{
    			Endpoint_ClearOUT();
    			Endpoint_SelectEndpoint(ENDPOINT_DIR_IN | 1);
    			Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
    			char Message[] = {	0x30, 0xFF, 0x00, 0xF8, 0x20, 0x62, 0x38, 0x43, 0xAE, 0xF4, 0x4F, 0xED, 0x9B, 0x44, 0xD6, 0x26,
    								0xA4, 0x0A, 0xA9, 0x86, 0x29, 0x46, 0x5D, 0xF3, 0xC1, 0x92, 0x50, 0x0B, 0xDD, 0x79, 0xF0, 0xE5};
    			Endpoint_Write_Stream_LE(&Message,32,NULL);
    			Endpoint_ClearIN();
    		}
    		Endpoint_WaitUntilReady();
    		Endpoint_SelectEndpoint(ENDPOINT_DIR_OUT | 1);
    		Endpoint_SetEndpointDirection(ENDPOINT_DIR_OUT);
    	}
    }
    
    Les autres messages marchent bien, c’est vraiment quand l’hôte envoie le gros transfère que ça plante. Pour répondre au gros transfère je recherche le dernier message de 32 octets puis j’envoie le message retour.
    Voici une copie des message envoyer (quand ça marche) :
    
    000003: Bulk or Interrupt Transfer (DOWN), 2017-01-23 10:22:00,8852872 +0,1195702 (1. Device: VMware USB Device)
    Pipe Handle: 0x2e83f8a8 (Endpoint Address: 0x1)
    Send 0x8 bytes to the device
    
     90 51 02 00 00 D5 96 75	
    
    000005: Bulk or Interrupt Transfer (DOWN), 2017-01-23 10:22:00,9321409 +0,0454203 (1. Device: VMware USB Device)
    Pipe Handle: 0x2e83f8a8 (Endpoint Address: 0x1)
    Send 0x8 bytes to the device
    
     A0 51 01 00 00 D5 96 75	 
    
    000008: Bulk or Interrupt Transfer (UP), 2017-01-23 10:22:00,9877233 +0,0016831. (1. Device: VMware USB Device) Status: 0x00000000
    Pipe Handle: 0x2e83f8d8 (Endpoint Address: 0x81)
    Get 0xf bytes from the device
    
     37 FF 00 B2 20 62 38 43 AE F4 4F ED 9B 44 D6	
    
    000009: Bulk or Interrupt Transfer (DOWN), 2017-01-23 10:22:01,0329590 +0,0452357 (1. Device: VMware USB Device)
    Pipe Handle: 0x2e83f8a8 (Endpoint Address: 0x1)
    Send 0x8 bytes to the device
    
     90 51 02 00 06 62 38 43	
    
    000011: Bulk or Interrupt Transfer (DOWN), 2017-01-23 10:22:01,0863051 +0,0515892 (1. Device: VMware USB Device)
    Pipe Handle: 0x2e83f8a8 (Endpoint Address: 0x1)
    Send 0x8 bytes to the device
    
     A0 51 01 00 06 62 38 43	
    
    000014: Bulk or Interrupt Transfer (UP), 2017-01-23 10:22:01,1507200 +0,0019240. (1. Device: VMware USB Device) Status: 0x00000000
    Pipe Handle: 0x2e83f8d8 (Endpoint Address: 0x81)
    Get 0x20 bytes from the device
    
     30 FF 00 05 20 62 38 43 AE F4 4F ED 9B 44 D6 26
     A4 0A A9 86 29 46 5D F3 C1 92 50 0B DD 79 F0 E5	
    
    000015: Bulk or Interrupt Transfer (DOWN), 2017-01-23 10:22:01,2021720 +0,0514520 (1. Device: VMware USB Device)
    Pipe Handle: 0x2e83f8a8 (Endpoint Address: 0x1)
    Send 0x20 bytes to the device
    
     B0 00 00 01 05 00 00 00 00 00 00 00 01 00 00 00
     01 00 00 00 74 F1 18 00 E4 95 C6 00 5C 63 21 01	
    
    000017: Bulk or Interrupt Transfer (DOWN), 2017-01-23 10:22:08,3701297 +7,1664144 (1. Device: VMware USB Device)
    Pipe Handle: 0x2e83f8a8 (Endpoint Address: 0x1)
    Send 0x340 bytes to the device
    
     80 00 84 FF FF FF FF 02 84 FF FF 00 00 04 84 00
     00 00 00 06 84 00 00 00 00 08 04 00 00 00 00 00
     80 0A 84 00 00 00 00 0C 84 00 00 00 00 0E 84 00
     00 00 00 10 84 00 00 00 00 12 04 00 00 00 00 00
     80 14 84 00 00 00 00 16 84 00 00 00 00 18 84 00
     00 00 00 1A 84 00 00 00 00 1C 04 00 00 00 00 00
     80 1E 84 00 00 00 00 20 84 00 00 00 00 22 84 00
     00 00 00 24 84 00 00 00 00 26 04 00 00 00 00 00
     80 28 84 00 00 00 00 2A 84 00 00 00 00 2C 84 00
     00 00 00 2E 84 00 00 00 00 30 04 00 00 00 00 00
     80 32 84 00 00 00 00 34 84 00 00 00 00 36 84 00
     00 00 00 38 84 00 00 00 00 3A 04 00 00 00 00 00
     80 3C 84 00 00 00 00 3E 84 00 00 00 00 40 84 00
     00 00 00 42 84 00 00 00 00 44 04 00 00 00 00 00
     80 46 84 00 00 00 00 48 84 00 00 00 00 4A 84 00
     00 00 00 4C 84 00 00 00 00 4E 04 00 00 00 00 00
     80 50 84 00 00 00 00 52 84 00 00 00 00 54 84 00
     00 00 00 56 84 00 00 00 00 58 04 00 00 00 00 00
     80 5A 84 00 00 00 00 5C 84 00 00 00 00 5E 84 00
     00 00 00 60 84 00 00 00 00 62 04 00 00 00 00 00
     80 64 84 00 00 00 00 66 84 00 00 00 00 68 84 00
     00 00 00 6A 84 00 00 00 00 6C 04 00 00 00 00 00
     80 6E 84 00 00 00 00 70 84 00 00 00 00 72 84 00
     00 00 00 74 84 00 00 00 00 76 04 00 00 00 00 00
     80 78 84 00 00 00 00 7A 84 00 00 00 00 7C 84 00
     00 00 00 7E 84 00 00 00 00 80 04 00 00 00 00 00
     80 82 84 00 00 00 00 84 84 00 00 00 00 86 84 00
     00 00 00 88 84 00 00 00 00 8A 04 00 00 00 00 00
     80 8C 84 00 00 00 00 8E 84 00 00 00 00 90 84 00
     00 00 00 92 84 00 00 00 00 94 04 00 00 00 00 00
     80 96 84 00 00 00 00 98 84 00 00 00 00 9A 84 00
     00 00 00 9C 84 00 00 00 00 9E 04 00 00 00 00 00
     80 A0 84 00 00 00 00 A2 84 00 00 00 00 A4 84 00
     00 00 00 A6 84 00 00 00 00 A8 04 00 00 00 00 00
     80 AA 84 00 00 00 00 AC 84 00 00 00 00 AE 84 00
     00 00 00 B0 84 00 00 00 00 B2 04 00 00 00 00 00
     80 B4 84 00 00 00 00 B6 84 00 00 00 00 B8 84 00
     00 00 00 BA 84 00 00 00 00 BC 04 00 00 00 00 00
     80 BE 84 00 00 00 00 C0 84 00 00 00 00 C2 84 00
     00 00 00 C4 84 00 00 00 00 C6 04 00 00 00 00 00
     80 C8 84 00 00 00 00 CA 84 00 00 00 00 CC 84 00
     00 00 00 CE 84 00 00 00 00 D0 04 00 00 00 00 00
     80 D2 84 00 00 00 00 D4 84 00 00 00 00 D6 84 00
     00 00 00 D8 84 00 00 00 00 DA 04 00 00 00 00 00
     80 DC 84 00 00 00 00 DE 84 00 00 00 00 E0 84 00
     00 00 00 E2 84 00 00 00 00 E4 04 00 00 00 00 00
     80 E6 84 00 00 00 00 E8 84 00 00 00 00 EA 84 00
     00 00 00 EC 84 00 00 00 00 EE 04 00 00 00 00 00
     80 F0 84 00 00 00 00 F2 84 00 00 00 00 F4 84 00
     00 00 00 F6 84 00 00 00 00 F8 04 00 00 00 00 00
     80 FA 84 00 00 00 00 FC 84 00 00 00 00 FE 04 00
     00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00	
    
    000020: Bulk or Interrupt Transfer (UP), 2017-01-23 10:22:08,3907039 +0,0016899. (1. Device: VMware USB Device) Status: 0x00000000
    Pipe Handle: 0x2e83f8d8 (Endpoint Address: 0x81)
    Get 0x20 bytes from the device
    
     30 FF 00 F8 20 62 38 43 AE F4 4F ED 9B 44 D6 26
     A4 0A A9 86 29 46 5D F3 C1 92 50 0B DD 79 F0 E5
    Le dernier message en rouge est le message que le périphérique doit retourner à l’hôte mais qui ne se fait pas.

    Merci pour votre aide.

    -----
    Dernière modification par gienas ; 04/02/2017 à 09h12. Motif: Ajouté les balises code, obligatoires pour les programmes

  2. #2
    Luciol44

    Re : Cloner un périphérique USB

    Personne pour m'aider? Je pause des questions trop dur?

  3. #3
    Antoane
    Responsable technique

    Re : Cloner un périphérique USB

    Bonjour,

    je déplace vers informatique> Logiciels - Software - Open Source, ils auront peut-être plus d'idées qu'en électronique
    Deux pattes c'est une diode, trois pattes c'est un transistor, quatre pattes c'est une vache.

  4. #4
    Luciol44

    Re : Cloner un périphérique USB

    Merci Antoane

  5. A voir en vidéo sur Futura
  6. #5
    polo974

    Re : Cloner un périphérique USB

    tu écris
    if ((Buffer[0]==0x80) && (Buffer[1]==0xFA))
    mais le host envoie:
    80 00 84 FF FF FF FF 02 84 FF FF 00 00 04 84 00

    donc ne faudrait-il pas:
    ... (Buffer[1]==0x00))

    (ou bien, j'ai pas tout saisi (manque de commentaire, ce code...))
    Jusqu'ici tout va bien...

  7. #6
    Luciol44

    Re : Cloner un périphérique USB

    Merci polo974 pour ta réponse,
    Alors je m'explique:
    Le gros envoie de 832 octets est reçut par le périphérique par paquets de 32 octets, donc je cherche le dernier paquet de 32 envoyé pour répondre. Et c'est la que la réponse ne se fait pas. Le dernier paquet commence toujours par 0x80 0xFA. Je précise que le Endpointsize est de 32 Octets, d'où le réception par paquet de 32 octets.

Discussions similaires

  1. [RF/Radioelec] Cloner une clé de voiture
    Par JS7777 dans le forum Électronique
    Réponses: 10
    Dernier message: 28/06/2016, 03h49
  2. Cloner mon pc
    Par LM747 dans le forum Matériel - Hardware
    Réponses: 15
    Dernier message: 28/05/2009, 14h36
  3. Cloner un disque dur
    Par SunnySky dans le forum Logiciel - Software - Open Source
    Réponses: 9
    Dernier message: 06/10/2008, 20h36
  4. Cloner un disque dur sur un portable
    Par invitedb9df5ec dans le forum Matériel - Hardware
    Réponses: 2
    Dernier message: 03/03/2007, 13h26
  5. Cloner le disque C:
    Par invite7e1cacfb dans le forum Matériel - Hardware
    Réponses: 5
    Dernier message: 23/05/2004, 11h06
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...