Hallo miparo,
ich habe ja den USB Callback in meinem Code eingesetzt:
Ich bin mir bei 2 Punkten unklar und brauche mal eine Info, im Handbuch habe ich nichts passendes gefunden.
Ich hab es etwas gekürzt, das war ursprünglich mal aus einen Deiner Beispiele USBsmart.
Was meinst Du mit diesen beiden Punkten:
1.
2.
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:
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()
Die Daten zum PC senden?
Thorsten
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
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;
// 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...
...
$0: // Diesen Punkt verstehe ich ich nicht ganz...
...
2.
Code
$40: // Diesen Punkt verstehe ich nicht so ganz
Case wValue Of // Host to Dev
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);
...
USB_TxSend(@TxBuf,64);
...
Die Daten zum PC senden?
Thorsten