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
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.
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
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".
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
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