myUSB_ControlRequest() Rückfrage...

pvs-deck
PowerUser
Avatar
Geschlecht:
Alter: 54
Beiträge: 1343
Dabei seit: 02 / 2009
Betreff:

myUSB_ControlRequest() Rückfrage...

 · 
Gepostet: 10.04.2018 - 10:46 Uhr  ·  #1
Hallo miparo,

ich habe ja den USB Callback in meinem Code eingesetzt:
Code
USB_SetControlCallback(@myUSB_ControlRequest); // optional, if you need it!
  USB_Init(@RxBuf);        // Attach USB and connect RxBuf for FIRST RX INT


Ich bin mir bei 2 Punkten unklar und brauche mal eine Info, im Handbuch habe ich nichts passendes gefunden.

Code
{$Validate $}
  //  User function to receive EP0 ControlRequests from Host
Function myUSB_ControlRequest(bRequest : Byte; wValue : word) : boolean;
// need always answer from device
Var
  b : byte;
begin
  Header:= USB_ReadHeader;
  // DebugOut('USBreq1:$'+ ByteToHex( Header.bmRequestType ));

  Case Header.bmRequestType Of
    $0:  //  Diesen Punkt verstehe ich ich nicht ganz...
      Case wValue Of // Host to Dev
          $00 : // do a real RESET
               USB_ControlSend(nil, 0);
               DebugOut('USBcmd:$'+ ByteToHex( bRequest ));
               mDelay(100);
                F16_FlushBufSec; // Sichere offene Dateien
               USB_Detach;
               mDelay(500);
               HardWareReset;
               USB_ControlSend(NIL, 0);  // send back ACK
               Return(True);
            |
           $20 : // write to a Port
//          PortF:= Lo(wValue);
               USB_ControlSend(nil, 0);  // ACK the request
               DebugOut('USBcmd:$'+ ByteToHex( bRequest ));
               ComLed;
               Return(True);
            |
           Else
               USB_ControlSend(Nil, 0);              // unknown vendor request, do an ACK
               DebugOut('USBcmd:$'+ ByteToHex( bRequest )+' unbekannt');
               return(true);
          Endcase;
      |
    $40:  // Diesen Punkt verstehe ich nicht so ganz
      Case wValue Of // Host to Dev
          $00 : // do a real RESET
               USB_ControlSend(nil, 0);
               DebugOut('USBcmd:$'+ ByteToHex( bRequest ));
               mDelay(500);
               F16_FlushBufSec; // Sichere evtl. offene Dateien
               USB_Detach;
               mDelay(600);
               HardWareReset;
               Return(True);
            |
           $81 : // Read a Time/Date from CPU
               USB_ControlSend(@RTCZeitBlock.sekunde, 6);  // send back ACK and Time/Date
               DebugOut('81 USBcmd:$'+ ByteToHex( bRequest ));
               usbAct:= $81;
               Return(True);
            |
           Else
               USB_ControlSend(Nil, 0);              // unknown vendor request, do an ACK
               DebugOut('2USBcmd:$'+ ByteToHex( bRequest ) +'Value:$'+ ByteToHex( Byte(wValue) ));
               return(true);
          Endcase;
      |
     Else
       USB_ControlSend(Nil, 0);              // unknown vendor request, do an ACK
       DebugOut('1USBcmd:$'+ ByteToHex( bRequest ) +'Value:$'+ ByteToHex( Byte(wValue) ));
       return(true);
     Endcase;

end;


Ich hab es etwas gekürzt, das war ursprünglich mal aus einen Deiner Beispiele USBsmart.

Was meinst Du mit diesen beiden Punkten:
1.
Code
  Case Header.bmRequestType Of
    $0:  //  Diesen Punkt verstehe ich ich nicht ganz...
    ...


2.
Code
    $40:  // Diesen Punkt verstehe ich nicht so ganz
      Case wValue Of // Host to Dev


Das ist doch beides vom HostToDev oder?
Was sollen die $0 und die $40, wo ist da der Unterschied für den Treiber? Oder sollen das die Pipes sein?

Ich dachte man könnte mit dem Controlrequest direkt einige Bytes (8 Bytes) senden und empfangen.
Leider finde ich im Handbuch den Befehl "usb_controlSend()" nicht mehr, stattdesen ist nun der "msgusb_control_msg" wahrscheinlich der richtige, oder?

Auf der Delphi Seite:
Code
if devOpen then USBdevWrite(ADevice, $81, $81, 1, 0);


Sende ich es ja so in etwa, aber mit diesen Kommandos kann ich ja keine direkten Lesebefehle ausführen. Ich war der Meinung das ging für einige Bytes ohne Probleme bei USB.
Oder kann ich bei dem Treiber nur mit der USB_RxTx()
Code
...
USB_TxSend(@TxBuf,64);
...


Die Daten zum PC senden?

Thorsten
miparo
Schreiberling
Avatar
Geschlecht:
Herkunft: Germany
Alter: 59
Beiträge: 988
Dabei seit: 09 / 2007
Betreff:

Re: myUSB_ControlRequest() Rückfrage...

 · 
Gepostet: 10.04.2018 - 16:32 Uhr  ·  #2
Hi Thorsten,

bmRequestType $C0 ist eine "Anfrage" zum Device(Xmega) d.h du musst was zurück senden.
Wobei hier natürlich auch gleich Daten für den Xmega mitgesendet werden können.
Da das Control Messages sind musst du mit USB_ControlSend(@xxx, 1) was zurück senden.

Mit bmRequestType $40 bekommt dein Xmega was vom PC.

Wie das mit den Control Req funzt steht unter AVRcoDemosXMega_USBsmart2Delphi


miparo
rh
Administrator
Avatar
Geschlecht:
Herkunft: Germany
Alter: 25
Homepage: e-lab.de
Beiträge: 5558
Dabei seit: 03 / 2002
Betreff:

Re: myUSB_ControlRequest() Rückfrage...

 · 
Gepostet: 10.04.2018 - 18:26 Uhr  ·  #3
Hallo Thorsten,

beim USB muss man immer dran denken dass der AVR ein "USB Slave" ist.
Er kann von sich aus garnichts tun. Alles muss vom PC angestossen werden.
über das ControlRequest werden nicht nur Daten angeliefert sondern auch
abgefragt.
Dazu sind diverse "private" CMDs da.

rolf
pvs-deck
PowerUser
Avatar
Geschlecht:
Alter: 54
Beiträge: 1343
Dabei seit: 02 / 2009
Betreff:

Re: myUSB_ControlRequest() Rückfrage...

 · 
Gepostet: 10.04.2018 - 18:55 Uhr  ·  #4
Zitat geschrieben von miparo

...bmRequestType $C0 ist eine "Anfrage" zum Device(Xmega) d.h du musst was zurück senden.
Wobei hier natürlich auch gleich Daten für den Xmega mitgesendet werden können.
Da das Control Messages sind musst du mit USB_ControlSend(@xxx, 1) was zurück senden.

Mit bmRequestType $40 bekommt dein Xmega was vom PC.

Wie das mit den Control Req funzt steht unter AVRcoDemosXMega_USBsmart2Delphi

Hallo miparo,

ich schaue mir das Demo mal an, das mit dem "USB_ControlSend(@xxx, 1)" hatte ich mir schon so gedacht, nur habe ich auf der DELPHI-Seite mit der LIBUsb noch nicht verstanden wo ich dann da auf diese Daten zugreifen kann.

Ich hatte den Treiber vor 3 Jahren das letzte mal angepasst, seit dem musste ich da nix mehr machen. Aber jetzt muss ich da einiges anpassen um Dateien von und zur SD-Card zu übertragen.
Gewählte Zitate für Mehrfachzitierung:   0

Registrierte in diesem Topic

Aktuell kein registrierter in diesem Bereich

Die Statistik zeigt, wer in den letzten 5 Minuten online war. Erneuerung alle 90 Sekunden.
MySQL Queries: 15 · Cache Hits: 14   81   95 · Page-Gen-Time: 0.037858s · Speichernutzung: 2 MB · GZIP: ein · Viewport: SMXL-HiDPI