closed

Loginbox

Please enter your username and password into the following fields to log in.


  • Username:
  • Password:
  •  
  • Auto log in on every visit.


  •  

XMEGA USBsmart zu USBport



pvs-deck offline
PowerUser
Avatar
Gender: male
Location: GERMANY 
Age: 48
Posts: 1015
Registered: 02 / 2009
Homepage Private message
Subject: XMEGA USBsmart zu USBport  -  Posted: 11.06.2019 - 19:17   -  
Hallo Leute,

aus Gründen der Geschwindigkeit will ich in meinem aktuellen Projekt den USBsmart gegen den großen USBport umstellen.

Bei einigen Punkte habe ich aber Probleme mit dem Verständnis, bzw. finde die richtigen Infos nicht in dem Demos und dem Handbuch.

1. Verstehe ich das richtig, das ich bei dem USBPort kein TASK ControlJob mehr brauche, um die Verbindung zum PC aufrecht zu halten?

2. Bei dem Demo USBport wird komischerweise aber ein TaskStack und Frame angelegt warum ist das nötig?
Code
  // optional 
  Scheduler               = iData; 
  TaskStack               = $80, iData; 
  TaskFrame               = $100; 
  IDATA1                  = $5FC0; 

Wird im Treiber evtl. doch ein Task angelegt?

3. Der CallBack Eintrag
Code
  xUSB_UserVendorRequest(@xUSB_VendorRequest); // optional, if you need it!

Ist ja eigentlich für die EP0, Im Demo steht dieser ist optional, sprich ich könnte ihn verwenden, aber das muss ich nicht! Richtig?

4. Angenommen ich möchte NUR über die Pipe 1 / 81 reden, dann könnte ich mir den Kram für die EP0 ersparen? Wie bekommt dann der Controller die Infos was er senden soll? Aktuell mache ich das über die EP0 im USBsmart.

5. Welches Testprogramm (Delphi oder EXE) funktionier mit dem XMega_USBport zum austesten? Ich habe hier keines in Funktion gefunden, das zu dem DEMO passt.

6. Muss ich den Treiber auf allen PCs entfernen und gegen einen neuen austauschen? Im Moment scheint bei den PIPEs 64 Byte zu stehen, hier möchte ich aber gerne 1024 oder besser 2048 stehen haben.

Thorsten
---------------------------------------------------------
Nichts ist unmöglich in der Elektronik und der Software, die Grenzen
setzt nur das Budget, Zeit und der Entwickler! ( P V S - D E C K )
go down go up
miparo offline
Schreiberling
Avatar
Gender: male
Location: GERMANY  Germany
Age: 52
Posts: 670
Registered: 09 / 2007
Private message
Subject: Re: XMEGA USBsmart zu USBport  -  Posted: 11.06.2019 - 20:28   -  
Hi Thorsten,

1. Der Treiber läuft im Interrupt und braucht keinen Task -
2. Leichen Zeilen ?
3. Ist nicht nötig aber für einen HW Reset usw evtl Sinnvoll
4. Die beiden Pipes langen. Protokoll drüber legen !
5. Da ist ein universelles Delphi Demo dabei. Mal suchen ..
6. Die Xmega unterstützen Multipacket - das läuft alles im Hintergrund automatisch -Steht im Xmega Manual

miparo
Kein Support per PN! | No support via PM!
go down go up
pvs-deck offline
PowerUser
Avatar
Gender: male
Location: GERMANY 
Age: 48
Posts: 1015
Registered: 02 / 2009
Homepage Private message
Subject: Re: XMEGA USBsmart zu USBport  -  Posted: 11.06.2019 - 20:55   -  
Hallo miparo,

meine ganze USB Routine läuft in einem Process, kann den Process mit WaitPipe() schlafen legen um die Rechenzeit dann für was anderes frei zu haben?

Thorsten
---------------------------------------------------------
Nichts ist unmöglich in der Elektronik und der Software, die Grenzen
setzt nur das Budget, Zeit und der Entwickler! ( P V S - D E C K )
go down go up
miparo offline
Schreiberling
Avatar
Gender: male
Location: GERMANY  Germany
Age: 52
Posts: 670
Registered: 09 / 2007
Private message
Subject: Re: XMEGA USBsmart zu USBport  -  Posted: 11.06.2019 - 21:10   -  
Deine USB Routine hat ja nichts direkt mit dem USB Treiber zu tun, da kann der schlafen gehen.
Nur der xUSB_UserVendorRequest MUSS bedient werden wenn assigned.

Du musst halt dir dann ein Bool USBdataAvail erzeugen, was man evtl fürs WaitPipe benutzen kann ?

Der Treiber informiert dich ja über deine verlinkte RX_Receive Funktion - läuft alles im INT:

Code

....
procedure USB_Rx_Receive(Status : tUSBep_Status; nb_transfered : word);
begin
  if Status = USBEP_TRANSFER_OK then
    usbRXCount:= nb_transfered;
    USBdataAvail:= true;
  else
    usbRXCount:= 0;
    USBdataAvail:= true;
  endif;
end;
....



 // main  
  xUSB_RXsetBuffer(1, @USB_Rx_Receive, @RXbuf, 512);     // Link RX Event
  ...
  repeat
    if USBdataAvail then
      ......



oder oder , das hängt immer von der Anwendung ab.

miparo
Kein Support per PN! | No support via PM!
This post has been edited 1-times. Last edit: 11.06.2019 - 21:10 by miparo.
go down go up
miparo offline
Schreiberling
Avatar
Gender: male
Location: GERMANY  Germany
Age: 52
Posts: 670
Registered: 09 / 2007
Private message
Subject: Re: XMEGA USBsmart zu USBport  -  Posted: 11.06.2019 - 21:38   -  
ABER deine USB_Rx_Receive läuft halt im Main, da die aus dem USB Interrupt aufgerufen wird !!

Was du danach mit machst bleibt dir überlassen, der USB nimmt nur solange Pakete an, wie sie in deinen RXbuffer passen und du xUSB_RXsetBuffer neu aufgerufen hast.
Kein Support per PN! | No support via PM!
go down go up
pvs-deck offline
PowerUser
Avatar
Gender: male
Location: GERMANY 
Age: 48
Posts: 1015
Registered: 02 / 2009
Homepage Private message
Subject: Re: XMEGA USBsmart zu USBport  -  Posted: 12.06.2019 - 13:05   -  
Quote by miparo

ABER deine USB_Rx_Receive läuft halt im Main, da die aus dem USB Interrupt aufgerufen wird !!

Was du danach mit machst bleibt dir überlassen, der USB nimmt nur solange Pakete an, wie sie in deinen RXbuffer passen und du xUSB_RXsetBuffer neu aufgerufen hast.


Hallo miparo,

kannst Du mir noch ein paar Infos zu dem Code/Funktion geben:
Code
xUSB_RXsetBuffer(1, @USB_Rx_Receive, @RXbuf, 512);   // Link RX Event


Im Handbuch finde ich dazu leider nichts, keine der im Demo gezeigten Funktionen sind in meinem ProfiDriver-Handbuch zu finden, was sind das für Parameter.

1: ??? (Ist das evtl. die Pipe ?
@USB_Rx_Receive: Dies ist der Pointer zu den Empfangsfunktion, wann wird dieser aufgerufen, erst wenn der Buffer voll ist? Oder beim Empfang von allen Daten?
RxBuf: Empfangsspeicher
512: Anzahl der max. Daten?

Muss ich das denn jedesmal beim gewünschten Empfang anlegen?

Eigentlich würde doch einmal nach dem "xUSB_Attach" und "UsbDriverConnect" ausreichen oder?

In der Demo:
Code
    xUSB_RXsetBuffer(1, @USB_Rx_Receive, @RXbuf, 512);   // Link RX Event
    while UsbDriverConnect {and USBvBUS.USBvBUSpin}  do
      USBMainLoop;
    endwhile;
 


Bei der Funktion usbRxBuf wird es aber erneut gemacht, mir ist der angedachte Ablauf noch nicht so klar.
Code
function usbRxBuf(p: pointer; c: word): boolean;
var
  i   : word;
begin
  if HostFailed or (not UsbDriverConnect) then
    c:= 0;
    return(false);
  endif;

  SetSysTimer(TimerU, 2000 div SysTick);
  repeat
  until isSysTimerZero(TimerU) or USBdataAvail;
  if c > usbRXCount then
    c:= usbRXCount;
  endif;

  _usbRxTimeOut:= isSysTimerZero(TimerU);

  _Rx:= usbRXCount;
  CopyBlock(@RXBuf[2], p, c); // the first two bytes define the data length
  USBdataAvail:= false;       //
  usbRXCount:= 0;
  xUSB_RXsetBuffer(1, @USB_Rx_Receive, @RXBuf, 512);
  return(_Rx > 0);
end;


@miparo;
Vielleicht hast Du noch eine Idee was hier mein Denkfehler ist, ich muss das ganze frei von den LOOPs machen, damit dies nicht meine anderen Prozesse blockt. Wenn ich es als LOOP lasse bleibt das ganze Connected. Aber so blockiere ich meine Steuerung dann.

Code
{--------------------------------------------------------------}
Process USB_RxTx (256, 512 : iData ); {Stacksize = 256 bytes, Framesize = 512bytes}
begin
 if not FirstStartUSB then   // Beim ersten Start des Process Init-Aufgaben erledigen!
  xUSB_UserVendorRequest(@xUSB_VendorRequest); // optional, if you need it!
   xUSB_Enable;        // Attach USB and connect RxBuf for FIRST RX INT
    FirstStartUSB:= true;
       DebugOut('USB: First Start');
  endif;

      xUSB_Attach;

      mDelay(200); // ohne das kommt kein UsbDriverConnect  Warum???? 
   if UsbDriverConnect then   // Ist das USB Device angeschlossem?
       DebugOut('USB: Connect');

                                       // wait for Windows Setconfiguration
    xUSB_RXsetBuffer(1, @USB_Rx_Receive, @RXbuf, 512);   // Link RX Event

      USBMainLoop;

   
   else
    // Kein USB angeschlossen, Rechenzeit freigeben
     DebugOut('USB: Disconnect');

     HostFailed:= true;
   //   xUSB_Detach;
       Schedule;       // Rechenzeit freigeben
   endif;

end; // Ende der Funktion


Hier mein USBMainLoop
Code
//---------------------------------------
procedure USBMainLoop;      // Hauptroutine USB COM
var
  ch   : char;
begin
//  repeat
    if USBdataAvail then
            DebugOut('USB: USBdataAvail');

      HostCmd:= RxCmd;
      ch:= HostCmd.cmd;
      case HostCmd.typ of
        CTRLcmd :
                 // here your comands from PC are received
                  if ch = 'S' then
                    DebugOut( 'Senddata');
                    mDelay(50);
                    SendFiledata();
                  endif;
                 // ....
                |
      else
        DebugOut('Unknown cmd');
        TXchar('?');
      endcase;
     else
            DebugOut('USB: NoUSBdataAvail');
    endif;
    
//  until (not UsbDriverConnect) {or (not USBvBUS.USBvBUSpin)} ;
end USBMainLoop;


Wenn ich das so mache kommt beim einstecken USB: Connect, da noch keine Daten vorhanden sind kommt dann "USB: NoUSBdataAvail". Und dann kommt er wieder in das "USB: Disconnect"
Müsste er nicht trotzdem die Verbindung halten, so lange er mit dem PC verbunden ist?
Sprich "UsbDriverConnect" sollte doch die ganze Zeit TRUE bleiben. Oder habe ich hier einen Denkfehler für den Ablauf?

Thorsten
---------------------------------------------------------
Nichts ist unmöglich in der Elektronik und der Software, die Grenzen
setzt nur das Budget, Zeit und der Entwickler! ( P V S - D E C K )
This post has been edited 1-times. Last edit: 12.06.2019 - 15:20 by pvs-deck.
go down go up
miparo offline
Schreiberling
Avatar
Gender: male
Location: GERMANY  Germany
Age: 52
Posts: 670
Registered: 09 / 2007
Private message
Subject: Re: XMEGA USBsmart zu USBport  -  Posted: 12.06.2019 - 15:35   -  
Hi Thorsten,
der "große" USB wird tatsächlich nicht im Manual erwähnt.

Code

xUSB_RXsetBuffer(1, @USB_Rx_Receive, @RXbuf, 512);   // Link RX Event

//  RX Pipe NUmmer,  prt Callback RX Funktion , ptr RX Buffer und RX Buffer größe

Das ist mehr ein Job für den USB Treiber.

Der USB Int ruft beim Empfang von Daten dein USB_Rx_Receive auf, wo man nur Flags bearbeiten sollte, da das Teil ja aus dem Interrupt kommt.
Der USB Treiber nimmt aber keiner weiteren Pakete an bevor du diesen Job nicht bearbeitet hast.
Also im usbRxBuf alles abholen bzw. bearbeiten und einen neuen Job anlegen mit xUSB_RXsetBuffer(1, @USB_Rx_Receive, @RXbuf, 512);

Wenn du jetzt von der PC Seite ein bulkl_write(Datan, 1024, TimeOut) machst, da bekommst du halt zwei Ints mit je 512 Bytes an Daten.
Das Timeout nicht zu kurz machen, da dein Xmega kein I7 Core ist.

Das ganze läuft so mit 1MB/s, je nach Puffergröße.

Ich würde mal im Demo testen und nicht in deiner 300kB App dann sieht man was wo passiert.

Eine Win App gibt es auch unter ..AVRcoIDEUSBtester dazu.

miparo
Kein Support per PN! | No support via PM!
go down go up
pvs-deck offline
PowerUser
Avatar
Gender: male
Location: GERMANY 
Age: 48
Posts: 1015
Registered: 02 / 2009
Homepage Private message
Subject: Re: XMEGA USBsmart zu USBport  -  Posted: 12.06.2019 - 19:17   -  
Quote by miparo

...
Das ist mehr ein Job für den USB Treiber.
...
Wenn du jetzt von der PC Seite ein bulkl_write(Datan, 1024, TimeOut) machst, da bekommst du halt zwei Ints mit je 512 Bytes an Daten.
...
Ich würde mal im Demo testen und nicht in deiner 300kB App dann sieht man was wo passiert.

Eine Win App gibt es auch unter ..AVRcoIDEUSBtester dazu.

miparo


Hallo miparo,

was ich nicht ganz verstehe. Das "UsbDriverConnect" wann wird dies wieder FALSE, beim abziehen der PC-Verbindung oder wenn der HOST-PC die Daten gesendet hat?

Die Demo bekomme ich leider nicht sauber zusammen mit dem xUSBPort ans laufen, er kann zwar EP0 empfangen bekommt auch oft mal ein "unknown CMD", aber ich erhalte im Delphi Demo sehr oft die Fehlermeldung das er versucht auf PID $0 und VID $0 zu schreiben bzw. zu lesen.

Zum Verständnis:

1. für den EP0 richte ich den "xUSB_UserVendorRequest()" ein, wenn gewünscht.
2. Beim Start vom XMEGA starte ich "xUSB_Enable", hiermit aktiviere ich den USB-Treiber im XMEGA und den CallBack "xUSB_UserVendorRequest"
3. Mit dem xUSB_Attach, Connecte ich den XMEGA mit dem PC (DingDong am PC)
4. Was passiert mit dem "UsbDriverConnect", wann wird dieser TRUE?
5. Wenn "UsbDriverConnect" true ist erzeuge ich einen Receive-Job mit "xUSB_RXsetBuffer(1, @USB_Rx_Receive, @RXbuf, 512);"
6. im USB-Rx_Receive prüfe ich kurz ob Daten vorhanden sind und wieviele. Sind Daten vorhanden setze ich das "USBdataAvail" auf TRUE
7. In meinen anderen Process prüfe ich auf "USBdataAvail" wenn true, dann verarbeite die Daten aus dem RxBuff und setzte am Ende das "USBdataAvail" False, "usbRXCount:= 0;" und starte einen erneuten JOB. Bei False beende ich den Process sofort und gebe die Rechenleistung mit "Schedule" frei.

Der Punkt 4 ist für mich besonderst wichtig, im Moment verstehe ich nicht wann dieser TRUE bzw FALSE wird.

Thorsten
---------------------------------------------------------
Nichts ist unmöglich in der Elektronik und der Software, die Grenzen
setzt nur das Budget, Zeit und der Entwickler! ( P V S - D E C K )
This post has been edited 1-times. Last edit: 12.06.2019 - 19:18 by pvs-deck.
go down go up
pvs-deck offline
PowerUser
Avatar
Gender: male
Location: GERMANY 
Age: 48
Posts: 1015
Registered: 02 / 2009
Homepage Private message
Subject: Re: XMEGA USBsmart zu USBport  -  Posted: 12.06.2019 - 22:09   -  
Hallo miparo,

das schreiben in der PIPE $81 funktioniert leider nicht, egal ob mit der Demo oder mit meinen Programm, ich erhalte beim usbTxBuf() immer False:
Code
function usbTxBuf(p: pointer; Count: word): boolean;
begin
  if HostFailed or (not UsbDriverConnect) then
    return(false);
  endif;
   DebugOut('TX:1');
  TxJob:= xUSB_EpGetJob($81);
  SetSysTimer(TimerU, 2000 div SysTick);
  repeat
   DebugOut('TX:2');

    if not TxJob^.busy then
   DebugOut('TX:3');

      cnt:= Count;
      CopyBlock(p, @TXbuf[2], Count);
      if xUSB_DoJob($81, true, @TXbuf, Count + 2, nil) then     // Job still busy?
       DebugOut('TX:TRUE');
        return(true);
      else
       DebugOut('TX:False');
        return(false);
      endif;
    endif;
  until isSysTimerZero(TimerU);
  return(false);
end;


Kannst Du mir die Parameter "xUSB_DoJob($81, true, @TXbuf, Count + 2, nil)" erklären?
$81: ist die Pipe
true: ????
@Txbuf: Pointer auf den Übertragungsspeicher
Count+2: Übertragungsanzahl
nil: ????

Darf bei einem "xUSB_DoJob()" evtl. nicht der "xUSB_RXsetBuffer()" aktiv sein?

Thorsten
---------------------------------------------------------
Nichts ist unmöglich in der Elektronik und der Software, die Grenzen
setzt nur das Budget, Zeit und der Entwickler! ( P V S - D E C K )
go down go up
miparo offline
Schreiberling
Avatar
Gender: male
Location: GERMANY  Germany
Age: 52
Posts: 670
Registered: 09 / 2007
Private message
Subject: Re: XMEGA USBsmart zu USBport  -  Posted: 13.06.2019 - 02:57   -  
Hi,
bei mir heißt das USB_EpRun(... ??

1. Dein RX Endpoint Addr $81 ( Bezeichungen gelten immer vom Master aus also PC Seite)
2: Shortpacket - wenn dein PC 64 bytes haben möchte aber du nur mit 22 Bytes anwortest. Ein dauer True schadet aber nicht.
3. prt TX buffer
4. buffer size
5. Notify callback wenn der Job erledigt ist.

Dein usbTxBuf funktioniert vermutlich nicht, weil dein PC Prog keine usbbulk_read gemacht hat?
Der Slave darf NIE was von alleine senden.
Also immer: Frage Antwort Spiel - PC <> MCU

Eine USB CDC (serielle) macht das nicht anders. Pollt halt nur alle 20-50ms von der PC Seite.

Oder wenn du mal einen USB Drucker Logst: Hier möchte WIn ja wissen, ob du am Drucker eine Taste zum Scannen gedrückt hast aber der Drucker darf ja NIE von alleine was senden. Landet im Nirvana das Paket. Also pollt der PC die ganze Zeit den Drucker ...

xUSB_RXsetBuffer() MUSS immer gesetzt sein und hat damit nicht zu tun.
Der Treiber kann 8 EP Pärchen zeitgleich bearbeiten.

Du kannst ja X EPs benutzen, da pollt einer vom PC alle 50ms für den Status und wenn du hier nichts im TX Buffer hast sendet der automatisch ein NAK.
UNd andere EPs sind für den dicken Datenaustausch. Alles Anwendungssache.


miparo
Kein Support per PN! | No support via PM!
go down go up
pvs-deck offline
PowerUser
Avatar
Gender: male
Location: GERMANY 
Age: 48
Posts: 1015
Registered: 02 / 2009
Homepage Private message
Subject: Re: XMEGA USBsmart zu USBport  -  Posted: 13.06.2019 - 09:00   -  
Hallo miparo,

Quote by miparo

Hi,
bei mir heißt das USB_EpRun(... ??

Das ist komisch, wenn ich die Funktion umbenenne bekomme ich einen Compiler-Fehler (siehe Bild)
Benutzt Du evtl. doch einen anderen Treiber/Unit als "USBport"??

Quote by miparo

1. Dein RX Endpoint Addr $81 ( Bezeichungen gelten immer vom Master aus also PC Seite)
2: Shortpacket - wenn dein PC 64 bytes haben möchte aber du nur mit 22 Bytes anwortest. Ein dauer True schadet aber nicht.
3. prt TX buffer
4. buffer size
5. Notify callback wenn der Job erledigt ist.

Danke für die Infos, die Funktion gibt ja ein BOOLEAN zurück, ist diese gleich mit dem Callback wenn der Job erledigt ist?

Quote by miparo

Dein usbTxBuf funktioniert vermutlich nicht, weil dein PC Prog keine usbbulk_read gemacht hat?
Der Slave darf NIE was von alleine senden.
Also immer: Frage Antwort Spiel - PC <> MCU
...

Das ist mir bewusst, das mache ich auch, genau wie beim alten USBsmart.
Über EP0 fordert der HOST/PC ein Paket an und geht dann sofort in "usb_bulk_read()", TimeOut liegt bei 2000ms/2s, aber ich bekomme immer ein False aus der Funktion zurück. Im USBsmart funktioniert die gleiche vorgehensweise ja. Muss ich evtl im XMEGA eine klein ZWangspause einrichten, bevor er sendet?

Delphi Ausschnitt:
Code
        // read bulk IN - always read max EP size(64), as well request size < EP size - is saver
         Received:= usb_bulk_read(ADevice.Handle, $81, RxBuf, 64, USB_TIMEOUT);
        if Received <= 0 then
        begin
        //  MessageDlg('bulk read failed', mtError, [mbOK], 0);
          SDIAppForm.USBInitialize;
           WriteLog('Fehler Daten <0');
          Exit;
        end;


Im Alten USBsmart "USB_VendorRequest", hatte ich nach dem Empfang des EP0 immer den
Code
USB_ControlSend(NIL, 0);  // send back ACK

gemacht. In der Demo war das nicht drinnen und der "USB_ControlSend" Function-Name weiss ich leider mangels passender Doku nicht. Evtl. ist das auch ausschlaggebend / zeitverzögernd.
Könnte das daran liegen?

Quote by miparo

...
xUSB_RXsetBuffer() MUSS immer gesetzt sein und hat damit nicht zu tun.
Der Treiber kann 8 EP Pärchen zeitgleich bearbeiten.
...

OK, dann sollte daher kein Problem auftauchen. Evtl. ist es doch ein zeitliches Problem oder das "USB_ControlSend(NIL, 0); // send back ACK" fehlt.

Thorsten
You must be logged in or your permissions are to low to see this Attachment(s).
---------------------------------------------------------
Nichts ist unmöglich in der Elektronik und der Software, die Grenzen
setzt nur das Budget, Zeit und der Entwickler! ( P V S - D E C K )
go down go up
pvs-deck offline
PowerUser
Avatar
Gender: male
Location: GERMANY 
Age: 48
Posts: 1015
Registered: 02 / 2009
Homepage Private message
Subject: Re: XMEGA USBsmart zu USBport  -  Posted: 13.06.2019 - 12:42   -  
Hallo miparo,

ich habe mal mein USBanalyser angeworfen. Bei allen Versuchen ist es die gleiche PC-Software:

Bei allen Versuchen die gleiche Hardware:

1. Versuch / USBsmart:
PC/Host: VendorRequest $60,$60
XMEGA : ACKN $60,$60 (ein paar ms später)
XMEGA : Bulk Transfer $81 (ein paar ms später)

2. Versuch / USBport:
PC/Host: VendorRequest $60,$60
XMEGA : ACKN $60,$60 (ein paar ms später)
PC/Host: Abort Pipe (2s später, TimeOut)
XMEGA : Bulk Transfer $81 (nach Abort PC)
XMEGA : Abort Pipe (ein paar ms später, TimeOut???)

Das hochsetzen des TimeOuts am PC hat nichts gebracht, bis zum Abbruch vom PC dauert es nur länger. Der Treiber sendet nichts oder versucht erst nach dem Abort vom PC Daten zu senden.
Da bin ich mir beim Analyser nicht ganz sicher, es könnte sein, das der auch nur das fehlende Telegramm anzeigt. Als Hinweis!

Hast Du noch eine Idee wo ich hingreifen könnte?

Thorsten
You must be logged in or your permissions are to low to see this Attachment(s).
---------------------------------------------------------
Nichts ist unmöglich in der Elektronik und der Software, die Grenzen
setzt nur das Budget, Zeit und der Entwickler! ( P V S - D E C K )
go down go up
miparo offline
Schreiberling
Avatar
Gender: male
Location: GERMANY  Germany
Age: 52
Posts: 670
Registered: 09 / 2007
Private message
Subject: Re: XMEGA USBsmart zu USBport  -  Posted: 13.06.2019 - 12:52   -  
Moin,
Code

function USB_VendorRequest(const Req: tUSB_Setup_Req): boolean;
begin
case Req.bmRequestType of
    $C0:
         case Req.bRequest of      // Device to Host
           0:
              if Req.wLength > 0 then
                b:= $FF;
                xUSB_CTRLsend(@b, 1);
                ret:= true;
              endif;
            |
           1:
              if Req.wLength > 0 then
                b:= $FF;
                xUSB_CTRLsend(@b, 1);
                ret:= true;
              endif;
            |
         endcase;
       |
 $40:
         case Req.bRequest of      // Host to Device
  ...


   return(true);    // das ist wichtig wenn du den Request behandelt hast
Kein Support per PN! | No support via PM!
This post has been edited 1-times. Last edit: 13.06.2019 - 13:00 by miparo.
go down go up
pvs-deck offline
PowerUser
Avatar
Gender: male
Location: GERMANY 
Age: 48
Posts: 1015
Registered: 02 / 2009
Homepage Private message
Subject: Re: XMEGA USBsmart zu USBport  -  Posted: 13.06.2019 - 13:26   -  
Hallo miparo,

das macht leider keinen Unterschied:
Code
|
           $60 : // empfange ONLINE Status
               xUSB_CTRLsend(@b, 1);  // send back ACK
               DebugOut('Online USBcmd:$'+ ByteToHex( Req.bRequest ) +'Value:$'+ ByteToHex( Byte(Req.wValue) ));
               usbAct:= $60;
               comAktive; // Com Anzeige Timer neu setzen
               Return(True);
            |


Ich glaube langsam daran, das es hier ein Problem mit XMEGA384c3 und dem Treiber gibt.
Hast Du noch die Leiterplatte mit dem 384er die ich Dir gesendet habe greifbar?
Dann mache ich mal ein kleines Testprogramm zurecht, das mit meinem Tool WindowsTool arbeitet.

Denn ich habe alles ausprobiert und weiß jetzt nicht mehr wo ich noch suchen soll :-(
Ich habe mal die Debugausgabe neben dem Analyser laufen lassen. Rückmeldung "TX:False" kommt direkt lange bevor der PC den PIPE Abbruch macht.

Code
      if xUSB_DoJob($81, TRUE, @TXbuf, Count, NIL) then     // Job still busy? //
            DebugOut('TX:OK');
        return(true);
      else
          DebugOut('TX:FALSE');
        return(false);
      endif;


Das False kommt direkt nach dem Aufruf, was führt denn alles zum False in Deiner Funktion "xUSB_DoJob"?

Thorsten
---------------------------------------------------------
Nichts ist unmöglich in der Elektronik und der Software, die Grenzen
setzt nur das Budget, Zeit und der Entwickler! ( P V S - D E C K )
go down go up
miparo offline
Schreiberling
Avatar
Gender: male
Location: GERMANY  Germany
Age: 52
Posts: 670
Registered: 09 / 2007
Private message
Subject: Re: XMEGA USBsmart zu USBport  -  Posted: 13.06.2019 - 13:55   -  
Hmm
Das wird wohl nicht das Problem sein aber so was ist natürlich überhaupt nicht gut im Interrupt.
Das ist ja ein String Eumel gehändel.

Code

function USB_VendorRequest
..
DebugOut('Online USBcmd:$'+ ByteToHex( Req.bRequest ) +'Value:$'+ ByteToHex( Byte(Req.wValue) ));



Ich werde das mal auf dem 384er testen.

Der Treiber selbst läuft ja auf allen X Programmern seit Jahren.
Kein Support per PN! | No support via PM!
This post has been edited 1-times. Last edit: 13.06.2019 - 13:56 by miparo.
go down go up
 


Registered users in this topic
Currently no registered users in this section

Delete cookies of this forum  •  FAQ / Help  •  Team page  •  Imprint   |  Local time: 20.06.2019 - 15:36