Forum: PC-Programmierung usb winxp treiber ddk massdata cypress cy7c68001


von fm (Gast)


Lesenswert?

hallo,

ich arbeite gerade mit dem vy7y68001. er soll später ein speichermedium 
beidienen...(flashbaustein)

z.Z. arbeite ich mit den Treibern von Cypress und der dazugehörigen api 
(cyapi) an einem c++ beispiel von cypress (bulkloop).

diese api stellt eine hülle an funktionen zur verfügung, damit ist es 
möglich fast jede beliebige usb anwendung zu bedienen.

momentan stehe ich noch am anfang dieses projektes, es ist bereits 
möglich daten über bestimmte endpunkte zu senden, vendor id und produkt 
id auszulesen usw.. da der cypress chip momentan von einem 
entwicklungskit vorinitialisiert wird.

hier mal mein momentanes beispiel, ausgelesen mit einem unabhängigen usb 
view tool:

Device Descriptor:
bcdUSB:             0x0200
bDeviceClass:         0x00
bDeviceSubClass:      0x00
bDeviceProtocol:      0x00
bMaxPacketSize0:      0x40 (64)
idVendor:           0x04B4 (Cypress Semiconductor)
idProduct:          0x1002
bcdDevice:          0x0000
iManufacturer:        0x01
0x0409: "Cypress"
iProduct:             0x02
0x0409: "EZ-USB SX2"
iSerialNumber:        0x00
bNumConfigurations:   0x01

ConnectionStatus: DeviceConnected
Current Config Value: 0x01
Device Bus Speed:     Full
Device Address:       0x01
Open Pipes:              4

Endpoint Descriptor:
bEndpointAddress:     0x02
Transfer Type:        Bulk
wMaxPacketSize:     0x0200 (512)
bInterval:            0x00

Endpoint Descriptor:
bEndpointAddress:     0x04
Transfer Type:        Bulk
wMaxPacketSize:     0x0200 (512)
bInterval:            0x00

Endpoint Descriptor:
bEndpointAddress:     0x86
Transfer Type:        Bulk
wMaxPacketSize:     0x0200 (512)
bInterval:            0x00

Endpoint Descriptor:
bEndpointAddress:     0x88
Transfer Type:        Bulk
wMaxPacketSize:     0x0200 (512)
bInterval:            0x00

Configuration Descriptor:
wTotalLength:       0x002E
bNumInterfaces:       0x01
bConfigurationValue:  0x01
iConfiguration:       0x00
bmAttributes:         0xA0 (Bus Powered Remote Wakeup)
MaxPower:             0x32 (100 Ma)

Interface Descriptor:
bInterfaceNumber:     0x00
bAlternateSetting:    0x00
bNumEndpoints:        0x04
bInterfaceClass:      0xFF
bInterfaceSubClass:   0x00
bInterfaceProtocol:   0x00
iInterface:           0x00

Endpoint Descriptor:
bEndpointAddress:     0x02
Transfer Type:        Bulk
wMaxPacketSize:     0x0200 (512)
bInterval:            0x00

Endpoint Descriptor:
bEndpointAddress:     0x04
Transfer Type:        Bulk
wMaxPacketSize:     0x0200 (512)
bInterval:            0x00

Endpoint Descriptor:
bEndpointAddress:     0x86
Transfer Type:        Bulk
wMaxPacketSize:     0x0200 (512)
bInterval:            0x00

Endpoint Descriptor:
bEndpointAddress:     0x88
Transfer Type:        Bulk
wMaxPacketSize:     0x0200 (512)
bInterval:            0x00


da ich letztendlich ein massdata storage device "bedienen"  will, stellt 
sich genau jetzt die frage, ob es nicht einen windows treiber plus api 
gibt welche die schnittstellen zu einem massdatastoragedevice bereits 
stellt, da windows ja bereits über die möglichkeit zur kommunikation mit 
eben speichermedien verfügt. dann müsste auf der gegenseite (auf der 
eigentlichen hardware) die bedienung/ausführung und umsetzung der 
windows spezifischen befehle zur ansteuerung eines massdata storage 
devices erfolgen.

hier mal ein beispiel meines usb sticks:

Device Descriptor:
bcdUSB:             0x0200
bDeviceClass:         0x00
bDeviceSubClass:      0x00
bDeviceProtocol:      0x00
bMaxPacketSize0:      0x40 (64)
idVendor:           0x13FE
idProduct:          0x1D00
bcdDevice:          0x0110
iManufacturer:        0x01
0x0409: "Sharkoon"
iProduct:             0x02
0x0409: "Flexi-Drive EC  "
iSerialNumber:        0x03
0x0409: "90730100004A"
bNumConfigurations:   0x01

ConnectionStatus: DeviceConnected
Current Config Value: 0x01
Device Bus Speed:     Full
Device Address:       0x02
Open Pipes:              2

Endpoint Descriptor:
bEndpointAddress:     0x81
Transfer Type:        Bulk
wMaxPacketSize:     0x0200 (512)
bInterval:            0x00

Endpoint Descriptor:
bEndpointAddress:     0x02
Transfer Type:        Bulk
wMaxPacketSize:     0x0200 (512)
bInterval:            0x00

Configuration Descriptor:
wTotalLength:       0x0020
bNumInterfaces:       0x01
bConfigurationValue:  0x01
iConfiguration:       0x00
bmAttributes:         0x80 (Bus Powered )
MaxPower:             0x64 (200 Ma)

Interface Descriptor:
bInterfaceNumber:     0x00
bAlternateSetting:    0x00
bNumEndpoints:        0x02
bInterfaceClass:      0x08
bInterfaceSubClass:   0x06
bInterfaceProtocol:   0x50
iInterface:           0x00

Endpoint Descriptor:
bEndpointAddress:     0x81
Transfer Type:        Bulk
wMaxPacketSize:     0x0200 (512)
bInterval:            0x00

Endpoint Descriptor:
bEndpointAddress:     0x02
Transfer Type:        Bulk
wMaxPacketSize:     0x0200 (512)
bInterval:            0x00


ich wäre für informationen zu dem thema sehr dankbar, eventuell gibt es 
ja ein ddk o.ä. das sich genau auf solche ansprüche umsetzen lässt - es 
geht momentan erstmal um die windows seite, die hardwareansprüche 
sollten allerdings ersehbar sein, also wenn es dann in dem win treiber 
ein befehl (schreibe daten in sektor (x,y), lösche device()) gibt, 
müsste schon ersichtlich sein, in welcher pipe der befehl wie codiert 
gesendet wird, und wie sich das device daraufhin verhalten muss. soweit 
ich bis jetzt ersehen habe, haben massdata storage devices wie usb 
sticks usw. ja scheinbar einen in und einen out endpunkt.

gruß,
fm

von Christian R. (supachris)


Lesenswert?

Es gibt doch von Cypress direkt ein Referenz-Design für ein USB zu ATA 
Wandler. Original wird da der FX2 (68013...) benutzt. Da dein SX2 ja 
keinen integrierten Core hat, muss sich dein an den SX2 angeschlossener 
Host-Prozessor um die Umsetzung der Kommandos kümmern. Aber das 
Referenzdesign wäre sicher ein guter Startpunkt. Wir benutzen das, um 
CF-Karten direkt in´s Windows einzubinden.

von fm (Gast)


Lesenswert?

Hallo Christian,

vielen dank...hört sich interessant an, könntest du mal den link 
einstellen? kenne die applikation nicht. ist es dort das ziel usb zu ata 
umszusetzen und umgekehrt, um dann eine ata platte per usb an windows 
anbinden zu können!? ich frage nur weil es mich dann wundert - ich 
dachte sowas kann man kaufen - nicht das wir uns falsch verstehen.

ich bin gerade auf den treiber usbstor unter windows gestoßen, 
theoretisch brauche ich eine api dazu, und die möglichkeit das cypress 
device diesem treiber hinzuzufügen, sodass auch der cypress sx2 mit 
seiner momentanen vid+pid vom system als massdatastorage erkannt wird - 
aber warscheinlich stelle ich mir das nur zu einfach vor.

ich versuche es gerade umgekehrt, also meinen usb stick mit dem cypress 
treiber zu laden - ist hakelig - falls es überhaupt geht.

gruß,
fm

von fm (Gast)


Lesenswert?


von Christian R. (supachris)


Lesenswert?

Ja genau, das meine ich. Nur dem System "vorgaukeln" bringt nix, die 
Firmware auf der USB-Device Seite, also in deinem Prozessor, der am SX2 
hängt muss ja alle Kommandos handhaben. Ansonsten hängt das nicht an der 
VID/PID, sondern an den Interface Descriptoren und DeviceClass 
Einträgen. Dein SX2 ist ja ohne externen Prozessor "dumm", das heißt, er 
kann höchstens Daten, die du in die Endpunkte schreibst, ausgeben bzw. 
eben umgekehrt. Mass-Storage geht nur mit externer "Intelligenz".

von whitenoise (Gast)


Lesenswert?

hi christian,

>>Ansonsten hängt das nicht an der
VID/PID, sondern an den Interface Descriptoren und DeviceClass
Einträgen. Dein SX2 ist ja ohne externen Prozessor "dumm", das heißt, er
kann höchstens Daten, die du in die Endpunkte schreibst, ausgeben bzw.
eben umgekehrt. Mass-Storage geht nur mit externer "Intelligenz".<<

-das weiß ich, deswegen schrieb ich ja schon:
momentan stehe ich noch am anfang dieses projektes, es ist bereits
möglich daten über bestimmte endpunkte zu senden, vendor id und produkt
id auszulesen usw.. da der cypress chip momentan von einem
--->>>entwicklungskit vorinitialisiert wird.

-dort ist ein programm enthalten welches den 68001 initialisiert und 4 
endpunkte eröffnet, von denen eben 2 in und 2 out sind, und ein kanal 
einfach stumpf gespiegelt wird, wie damals bei den seriellen devices ein 
"echo", jetzt das echo auf eínem in und out kanal des usb.

...was ich benötige ist eine beschreibung dieser "daten" - und wie man 
den windows treiber dazu bekommt, das cypress device mit in die liste 
der bekannten devices aufzunehmen, der treiber heißt wohl usbstor und 
bedient alle massdata storages unter windows, die frage ist wie? damit 
man eben genau diese kommunikationsanfragen an den cypress korrekt 
beantworten kann.

also

1) wie kann ich den treiber erweitern (usbstor) windows treiber für 
massdata storages
2) gibt es ein cpp konforme ddk dazu, mit dem man dann auf diese 
funktionen zugreifen kann, oder ist das alles quatsch!?
3)wie sieht die kommunikation zum win treiber auf der schicht eines 
massdata storage devices aus, um diese richtig beantworten zu können.


ich habs übrigens geschafft, meinen usb stick mit dem cypress treiber 
anzusprechen, und mit der cypress api auszulesen...
-pipes
-device infos usw..

das geht also.

gruß,
fm

von fm (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

ich habe mal meinen momentanen stand angehängt, jetzt lassen sich 
bereits daten übertragen, von der hardware zum Host. das ganze geschieht 
auf basis der usb klasse, also direkt über die endpoints.

für die emulierung eines massdata storage devices muss ein sogenannter 
command block wrapper erzeugt/bedient werden - hat das schonmal jemand 
von euch gemacht, momentan frage ich mich auf welcher pipe diese 
kommunikation abläuft (endpoint 0!?) wenn ja, wie kann ich ihn bedienen?

ich hänge hier nochmal die struktur eines usb sticks ein:

Device Descriptor:
bcdUSB:             0x0200
bDeviceClass:         0x00
bDeviceSubClass:      0x00
bDeviceProtocol:      0x00
bMaxPacketSize0:      0x40 (64)
idVendor:           0x13FE
idProduct:          0x1D00
bcdDevice:          0x0110
iManufacturer:        0x01
0x0409: "Sharkoon"
iProduct:             0x02
0x0409: "Flexi-Drive EC  "
iSerialNumber:        0x03
0x0409: "90730100004A"
bNumConfigurations:   0x01

ConnectionStatus: DeviceConnected
Current Config Value: 0x01
Device Bus Speed:     Full
Device Address:       0x01
Open Pipes:              2

Endpoint Descriptor:
bEndpointAddress:     0x81
Transfer Type:        Bulk
wMaxPacketSize:     0x0200 (512)
bInterval:            0x00

Endpoint Descriptor:
bEndpointAddress:     0x02
Transfer Type:        Bulk
wMaxPacketSize:     0x0200 (512)
bInterval:            0x00

Configuration Descriptor:
wTotalLength:       0x0020
bNumInterfaces:       0x01
bConfigurationValue:  0x01
iConfiguration:       0x00
bmAttributes:         0x80 (Bus Powered )
MaxPower:             0x64 (200 Ma)

Interface Descriptor:
bInterfaceNumber:     0x00
bAlternateSetting:    0x00
bNumEndpoints:        0x02
bInterfaceClass:      0x08
bInterfaceSubClass:   0x06
bInterfaceProtocol:   0x50
iInterface:           0x00

Endpoint Descriptor:
bEndpointAddress:     0x81
Transfer Type:        Bulk
wMaxPacketSize:     0x0200 (512)
bInterval:            0x00

Endpoint Descriptor:
bEndpointAddress:     0x02
Transfer Type:        Bulk
wMaxPacketSize:     0x0200 (512)
bInterval:            0x00

in endpoint 0 liegen ja, so wie ich das verstanden habe, die gesamten 
informationen über das device selbst in Form von descriptoren...(device, 
konfiguration, interface und letzendlich endpoints).

mein ziel ist es das das flash in der hardware (siehe anhang) als 
physikalisches device von windows erkannt wird, da kein fs auf dem 
device vorhanden ist, dies ist auch vorerst nicht nötig.

ich frage mich jetzt, wie windows über den command bock wrapper z.B. 
erfährt wie groß das physikalische medium ist, in der spec steht zwar 
der aufbau des cbw/csw und auch der kommunikationsablauf, aber nicht, 
wie die anfrage codiert werden...

auf der windows seite ist der zugriff auf ein physikalisches device 
soweit erstmal vorhanden. das ganze läuft dort ja überall (also an jeder 
stelle ob nun auf fs ebene, auf raw ebene, oder sogar auf device ebene 
auf der basis von filezugriffen ab)

die bereiche sind in der zeichnung rot markiert.

hat das schonmal jemand von euch gemacht?

des weiteren wäre es mal interessant zu erfahren ob man windows ein 
filesystem hinzufügen kann, und wenn ja, wo und wie man dort infos 
erhalten kann - ist aber nur rein interessenhalber....

am wichtigesten ist der umgang mit dem command block wrapper und wie die 
befehle dort eingebracht werden, zum beispeil anhand einer anfrage des 
systems über die größe des angeschlossenen speicher mediums...

gruß,
fm

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.