mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik EZUSB FX2 auf Hostseite in VS2008


Autor: Tom A. (thomas_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

also meine FW sollte soweit laufen. Jetzt möchte ich mich an die Host 
seite ranwagen. Wie immer wollte ich mir ersteinmal ein paar Beispiele 
verstehen und das dann auf meine Bedürfnisse anpassen. Im Dev. Kit sind 
ja welche dabei.

Gesagt getan. Dazu habe ich das Cydesc genommen.

cydesc example
--------------
a simple console based application to demonstrate access to the Cypress
Generic USB Driver via the CyApi class library.  this example displays
the device descriptors for all devices bound to the Cypress driver.

Hier geht es dann schon los. Es ist ein VC++ 6 Projekt ich habe VS2008.
Gut ich konvertiere es. Kompilieren geht nicht da die header Datei 
fehlt. Diese binde ich ein (groß kleinschreibung muss auch noch 
angepasst werden von <cyapi.h> zu "CyAPI.h").

Und dann kommen schon die nächsten Fehlermeldungen.
Fehler  1  error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.  c:\cypressdev\usb\util\cydesc\cyapi.h  94
Fehler  2  error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.  c:\cypressdev\usb\util\cydesc\cyapi.h  95
Fehler  3  error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.  c:\cypressdev\usb\util\cydesc\cyapi.h  96
Fehler  4  fatal error C1083: Datei (Include) kann nicht geöffnet werden: "iostream.h": No such file or directory  c:\cypressdev\usb\util\cydesc\cydesc.cpp  5
Jetzt die Frage, hat jmd. von euch ein schon funktionierendes Projekt? 
Das mir als kleines Beispiel dienen kann? Oder soll ich weiterhin nach 
bestem wissen und gewissen diese Fehlermeldungen ausmärzen? Ich glaube 
aber nicht, dass dies der richtig weg ist, weil jetzt tauchen die Fehler 
eben schon in der Header datei auf ...

Vielen Dank für eure Tipps.
Grüße Tom

Autor: Tom A. (thomas_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
im Laufe des Tages haben sich jede Menge weitere Fragen ergeben ;) Und 
natürlich auch einiges geklärt.

Zuerst ein paar grundlegende Sachen zu meinem Problem. Mein USB Device 
ist eigentlich recht einfach. Ich möchte mit meinem Host nur bisher nur 
paar Daten auslesen. Dazu muss ich aber ja das device dazu veranlassen 
mir welche zu schicken (Master/Slave Verfahren). Jetzt ist es so, das 
ich nicht immer zu meinem Device verbunden bin und mich nur nach bedarf 
anschließe zum Daten auslesen.

Dann will ich ja einen Interrupt schicken, dass das Device auffordert 
mir Daten zu schicken. Dazu möchte in den EP1 verwenden.
Dazu versuche ich die ISR auszulösen mit dem folgenden C Code
#include <windows.h>
#include "CyAPI.h"

void main(void)
{

  CCyUSBDevice *USBDevice  = new  CCyUSBDevice();

    int   devices = USBDevice->DeviceCount(); 

    int   vID, pID; 
    int  d =  0; 


  // Search for the right usb-device
    do   { 
        USBDevice->Open(d);   // Open automatically  calls Close() if necessary 
        vID = USBDevice->VendorID; 
        pID  = USBDevice->ProductID;
        d++;             
    }   while  ((d < devices ) && (vID != 0x04B4) &&  (pID != 0x8613));
  
  char buf[12] = "hello world";
  LONG length = 11;
  USBDevice->EndPoints[1]->XferData((PUCHAR) buf,length);

}

Wenn dieser Befehl ausgeführt wird müsste es doch einen Interrupt geben 
und es müsste die die folgende ISR starten oder nicht?
void ISR_Ep1out(void) interrupt 0

In dieser ISR könnte ich dann die Daten aus meinem Puffer lesen und 
verarbieten oder nicht?

Kann es sein, dass meine Descriptoren falsch sind?
Ich hab sie hier auch einfach mal eingefügt.
;;-----------------------------------------------------------------------------
;;   File:      dscr.a51
;;   Contents:   This file contains descriptor data tables.  
;;
;;   Copyright (c) 1997 AnchorChips, Inc. All rights reserved
;;-----------------------------------------------------------------------------
   
DSCR_DEVICE       equ    1      ;; Descriptor type: Device
DSCR_CONFIG       equ    2      ;; Descriptor type: Configuration
DSCR_STRING       equ    3      ;; Descriptor type: String
DSCR_INTRFC       equ    4      ;; Descriptor type: Interface
DSCR_ENDPNT       equ    5      ;; Descriptor type: Endpoint
DSCR_DEVQUAL      equ    6      ;; Descriptor type: Device Qualifier

DSCR_DEVICE_LEN   equ   18
DSCR_CONFIG_LEN   equ    9
DSCR_INTRFC_LEN   equ    9
DSCR_ENDPNT_LEN   equ    7
DSCR_DEVQUAL_LEN  equ   10

ET_CONTROL        equ    0      ;; Endpoint type: Control
ET_ISO            equ    1      ;; Endpoint type: Isochronous
ET_BULK           equ    2      ;; Endpoint type: Bulk
ET_INT            equ    3      ;; Endpoint type: Interrupt

public      DeviceDscr, DeviceQualDscr, HighSpeedConfigDscr, FullSpeedConfigDscr, StringDscr, UserDscr

;; TGE  DSCR   SEGMENT   CODE

;;-----------------------------------------------------------------------------
;; Global Variables
;;-----------------------------------------------------------------------------

;; TGE      rseg DSCR                 ;; locate the descriptor table in on-part memory.

;      cseg at 90H               ;; TODO: this needs to be changed before release
      cseg at 0x0090               
DeviceDscr:   
      db   DSCR_DEVICE_LEN      ;; Descriptor length => 18 bytes
      db   DSCR_DEVICE          ;; Decriptor type => this is device descriptor = 01h
      dw   0002H                ;; Specification Version (BCD)
      db   0FFH                 ;; Device class => vendor specific
      db   0FFH                 ;; Device sub-class => vendor specific
      db   0FFH                 ;; Device protocol => vendor specific  
      db   64                   ;; Maximum packet size of EP0 =>  
      dw   0xB404          ;; Vendor ID => Cypress Semi
      dw   0x1386          ;; Product ID (Sample Device) => ES USB FX2LP
      dw   0100H                ;; Product version ID / Device Release Number
      db   StringDscr1          ;; Manufacturer string index
      db   StringDscr2          ;; Product string index
      db   0                    ;; Serial number string index
      db   1                    ;; Number of configurations

DeviceQualDscr:
      db   DSCR_DEVQUAL_LEN     ;; Descriptor length
      db   DSCR_DEVQUAL         ;; Decriptor type
      dw   0002H                ;; Specification Version (BCD)
      db   0FFH                  ;; Device class
      db   0FFH                  ;; Device sub-class
      db   0FFH                  ;; Device protocol
      db   64                   ;; Maximum packet size
      db   1                    ;; Number of configurations
      db   0                    ;; Reserved

HighSpeedConfigDscr:   
      db   DSCR_CONFIG_LEN      ;; Descriptor length
      db   DSCR_CONFIG          ;; Descriptor type
      db   (HighSpeedConfigDscrEnd-HighSpeedConfigDscr) mod 256 ;; Total Length (LSB)                   ?
      db   (HighSpeedConfigDscrEnd-HighSpeedConfigDscr)  /  256 ;; Total Length (MSB)                   ?
      db   1                    ;; Number of interfaces
      db   1                    ;; Configuration value , which one should be selected by set_config request
      db   0                    ;; Configuration string
      db   80H                  ;; Attributes: Bus powered (b7) , no wakeup
      db   7DH                  ;; 7DH = 125 * 2mA = 250mA (maximum requestable)

;; Interface Descriptor
      db   DSCR_INTRFC_LEN      ;; Descriptor length
      db   DSCR_INTRFC          ;; Descriptor type
      db   0                    ;; Zero-based index of this interface
      db   0                    ;; Alternate setting
      db   2                    ;; Number of end points        
      db   0FFH                 ;; Interface class
      db   0FFH                 ;; Interface sub class
      db   0FFH                 ;; Interface protocol
      db   0                    ;; Interface descriptor string index
  
;; Endpoint Descriptor 1 IN
      db   DSCR_ENDPNT_LEN      ;; Descriptor length
      db   DSCR_ENDPNT          ;; Descriptor type
      db   81H                  ;; Endpoint number, and direction ;; EP 1 IN
      db   ET_BULK              ;; Endpoint type
      db   00H                  ;; Maximun packet size (LSB)
      db   04H                  ;; Max packect size (MSB)
      db   00H                  ;; Polling interval

;; Endpoint Descriptor 1 OUT
      db   DSCR_ENDPNT_LEN      ;; Descriptor length
      db   DSCR_ENDPNT          ;; Descriptor type
      db   01H                  ;; Endpoint number, and direction ;; EP 1 OUT
      db   ET_BULK              ;; Endpoint type
      db   00H                  ;; Maximun packet size (LSB)
      db   04H                  ;; Max packect size (MSB)
      db   00H                  ;; Polling interval
HighSpeedConfigDscrEnd:

FullSpeedConfigDscr:   
      db   DSCR_CONFIG_LEN      ;; Descriptor length
      db   DSCR_CONFIG          ;; Descriptor type
      db   (FullSpeedConfigDscrEnd-FullSpeedConfigDscr) mod 256 ;; Total Length (LSB)
      db   (FullSpeedConfigDscrEnd-FullSpeedConfigDscr)  /  256 ;; Total Length (MSB)
      db   1                    ;; Number of interfaces
      db   1                    ;; Configuration number
      db   0                    ;; Configuration string
      db   80H                  ;; Attributes (b7 - buspwr, b6 - selfpwr, b5 - rwu)
      db   7DH                  ;; Power requirement (div 2 ma)

;; Interface Descriptor
      db   DSCR_INTRFC_LEN      ;; Descriptor length
      db   DSCR_INTRFC          ;; Descriptor type
      db   0                    ;; Zero-based index of this interface
      db   0                    ;; Alternate setting
      db   2                    ;; Number of end points   
      db   0ffH                 ;; Interface class
      db   0ffH                  ;; Interface sub class
      db   0ffH                  ;; Interface sub sub class
      db   0                    ;; Interface descriptor string index

 
;; Endpoint Descriptor 1 IN
      db   DSCR_ENDPNT_LEN      ;; Descriptor length
      db   DSCR_ENDPNT           ;; Descriptor type
      db   81H                  ;; Endpoint number, and direction ;; EP 1 IN
      db   ET_BULK              ;; Endpoint type
      db   40H                 ;; Maximun packet size (LSB)
      db   00H                 ;; Max packect size (MSB)
      db   00H                 ;; Polling interval

;; Endpoint Descriptor 1 OUT
      db   DSCR_ENDPNT_LEN      ;; Descriptor length
      db   DSCR_ENDPNT           ;; Descriptor type
      db   01H                  ;; Endpoint number, and direction ;; EP 1 OUT
      db   ET_BULK              ;; Endpoint type
      db   40H                 ;; Maximun packet size (LSB)
      db   00H                 ;; Max packect size (MSB)
      db   00H                 ;; Polling interval

FullSpeedConfigDscrEnd:   

StringDscr:

StringDscr0:   
      db   StringDscr0End-StringDscr0      ;; String descriptor length
      db   DSCR_STRING
      db   09H,04H
StringDscr0End:

StringDscr1:   
      db   StringDscr1End-StringDscr1      ;; String descriptor length
      db   DSCR_STRING
      db   'x',00
      db   'x',00
      db   'x',00
      db   '/',00
      db   'x',00
      db   'x',00
      db   'x',00
StringDscr1End:

StringDscr2:   
      db   StringDscr2End-StringDscr2      ;; Descriptor length
      db   DSCR_STRING
      db   'x',00
      db   'x',00
      db   'x',00
      db   '-',00
      db   'x',00
      db   'x',00
      db   'x',00
      db   'x',00
      db   'x',00
StringDscr2End:

UserDscr:      
      dw   0000H
      end
      

Ich hoffe ihr könnt mir etwas weiterhelfen.
Grüße Tom

Autor: Tom A. (thomas_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, die Annahme war scheinbar falsch. Man muss die Daten in TD_poll() 
"bearbeiten".

Jetzt hab ich eine weitere frage. In TD_poll() baue ich mir dann so eine 
art statemaschine auf richtig? Also switch case anweisungen.

Und dann überlege ich mir. ok, wenn du eine 1 bekommst, dann schicke den 
Datensatz zurück, wenn du eine zwei bekommst dann den Datensatz Y usw. 
oder?

Jetzt schicke ich auf meiner host seite mit dem Befehlen
   char  inBuf[128]; 
   ZeroMemory(inBuf,  128); 

   char buffer[128]= "Das ist ein test!";
   //ZeroMemory(inBuf,  128);

   LONG  length = 128; 

   // Just to  be cute, request the return data before initiating the loopback  
   UCHAR  *inContext = USBDevice->BulkInEndPt->BeginDataXfer((PUCHAR)inBuf, length, &inOvLap); 
   UCHAR  *outContext = USBDevice->BulkOutEndPt->BeginDataXfer((PUCHAR) buffer, length, &outOvLap); 

   USBDevice->BulkOutEndPt->WaitForXfer(&outOvLap,100); 
   USBDevice->BulkInEndPt->WaitForXfer(&inOvLap,100); 

   USBDevice->BulkOutEndPt->FinishDataXfer((PUCHAR)buffer, length, &outOvLap,outContext); 
   USBDevice->BulkInEndPt->FinishDataXfer((PUCHAR)inBuf, length, &inOvLap,inContext); 

   CloseHandle(outOvLap.hEvent); 
   CloseHandle(inOvLap.hEvent);

die Daten raus. In TD_poll() muss ja dann meine switch case anweisung 
die unterscheidung machen.

Jetzt wird mein FIFO ja beschrieben mit dem Text: "Das ist ein test!".
d.h. An der Stelle 0xF000 oder an der STelle 0xF200 steht dann mein D 
usw.

Die Adresse welches FIFO gerade beschrieben wird bekomme ich ja mit: 
&EP2FIFOBUF und dann müsste mein D ja an der Stelle MSB(&EP2FIFOBUF) 
stehen oder nicht?

Ich wollte das einfach in TD_poll() prüfen mit:
    if(APTR1H == 68)
    {
      EXTAUTODAT2 = 2;
    }

ein char[] zurück kommen, welches an der stelle char[0] eine zwei stehen 
hat oder nicht (also keine zwei sondern das zeichen für eine 2, wenn ihr 
wisst was ich meine ;))?

Ich kann leider in Keil nicht debugen :-/ Das geht mit dem High speed 
interface von braintechnologie soweit ich weiß nicht, weil es ja keine 
JTAG schnittstelle hat :-/

Kennt jmd. ein board, welches gleich aufgebaut ist und zum entwickeln 
verwendet werden kann?

Vielen Dank schonmal für eure Hilfe.

Grüße Thomas

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.