XMEGA USBsmart zu USBport

  • 1
  • 2
  • 3
  • 4
  • 5
  • Page 2 of 5
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: XMEGA USBsmart zu USBport

 · 
Posted: 12.06.2019 - 22:09  ·  #9
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
miparo
Administrator
Avatar
Gender:
Location: Germany
Age: 58
Posts: 959
Registered: 09 / 2007
Subject:

Re: XMEGA USBsmart zu USBport

 · 
Posted: 13.06.2019 - 02:57  ·  #10
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
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: XMEGA USBsmart zu USBport

 · 
Posted: 13.06.2019 - 09:00  ·  #11
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
Attachments
USB_EpRun
Filename: 13-06-_2019_08-34-25.jpg
Filesize: 23.82 KB
Title: USB_EpRun
Information: USB_EpRun
Download counter: 127
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: XMEGA USBsmart zu USBport

 · 
Posted: 13.06.2019 - 12:42  ·  #12
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
Attachments
USBsmart
Filename: 13-06-_2019_12-02-26.jpg
Filesize: 316.03 KB
Title: USBsmart
Information: USBsmart
Download counter: 117
USBport Treiber Gross
Filename: 13-06-_2019_12-11-54.jpg
Filesize: 382.46 KB
Title: USBport Treiber Gross
Information: USBport Treiber Gross
Download counter: 113
TimeOut 4s
Filename: 13-06-_2019_12-20-13.jpg
Filesize: 200.49 KB
Title: TimeOut 4s
Information: TimeOut 4s
Download counter: 112
miparo
Administrator
Avatar
Gender:
Location: Germany
Age: 58
Posts: 959
Registered: 09 / 2007
Subject:

Re: XMEGA USBsmart zu USBport

 · 
Posted: 13.06.2019 - 12:52  ·  #13
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
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: XMEGA USBsmart zu USBport

 · 
Posted: 13.06.2019 - 13:26  ·  #14
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
miparo
Administrator
Avatar
Gender:
Location: Germany
Age: 58
Posts: 959
Registered: 09 / 2007
Subject:

Re: XMEGA USBsmart zu USBport

 · 
Posted: 13.06.2019 - 13:55  ·  #15
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.
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: XMEGA USBsmart zu USBport

 · 
Posted: 13.06.2019 - 14:10  ·  #16
Quote by miparo

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.


Hallo miparo,

Du das sind im Moment einfach nur Testausgaben, weil ich versuche irgendwie den Fehler einzukreisen. Diese ganzen DebugAusgaben fliegen wieder raus, wenn es funktioniert.
Ich habe das ganze mal als Testprogramm auf Basis des 384erC3 und als Grundlage das DemoProgramm XMEGA_USBport fertig gemacht. Soll ich Dir das XMEGA-Programm und das auf Wunsch das Windows-Programm (EXE) und den Treiber mit meiner PID/VID zusenden?
Oder Du stellst einfach einen Deiner Pid/Vids ein :-)

Ich habe leider keine Leiterplatte mehr mit einem XMEGA256, sonst hätte ich das mal testen können.
Meine letzten XMEGA256er sind jetzt bei Harry im Einsatz :-)

Thorsten
  • 1
  • 2
  • 3
  • 4
  • 5
  • Page 2 of 5
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: 17 · Cache Hits: 15   143   158 · Page-Gen-Time: 0.047478s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI