myUSB_ControlRequest() Rückfrage...

pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

myUSB_ControlRequest() Rückfrage...

 · 
Posted: 10.04.2018 - 10:46  ·  #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
Administrator
Avatar
Gender:
Location: Germany
Age: 58
Posts: 959
Registered: 09 / 2007
Subject:

Re: myUSB_ControlRequest() Rückfrage...

 · 
Posted: 10.04.2018 - 16:32  ·  #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
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: myUSB_ControlRequest() Rückfrage...

 · 
Posted: 10.04.2018 - 18:26  ·  #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
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: myUSB_ControlRequest() Rückfrage...

 · 
Posted: 10.04.2018 - 18:55  ·  #4
Quote by 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.
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 15 · Cache Hits: 14   80   94 · Page-Gen-Time: 0.030626s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI