USB, HID, DDK? Kann mir einer den Weg ins Leicht zeigen?
-
Also ich hab die Aufgabe eine von mir noch nicht entwickelte hardware später mal über USb anzusprechen.
das Problem: Ich + USB =

Ich würde gern mal wissen wie das ganze theoretisch überhaupt funktioniert, die Schnittstelle etc.
Und dann in wie fern ich das umzusetzen habe.Was ich bisher weis oder weis zu denken dass es richtig sei, ist dass ich eine Verbindung zu meinem Root Hub mit CreateFile herstellen muss.
Wenn diese Verbindung stehen soll muss ich mir von dem sagen lassen welche Geräte (HID?) daran angeschlossen sind.
über den Root Hub muss ich mir nun ein handle auf das entsprechende HID holen?Ist das soweit korrekt?
Wie gehts weiter, für was ist die DKK und welche brauche ich, hätte gern dass die Software auf allen OS von 98-XP läuft wenn das net geht nur für XP bzw. die NT Familie.Kann mir jemand meine Theorie etwas paraktisch weiter führen, sprich erklären wie es funktioniert und wie ich die einzelnen sachen etwa erreichen kann?
Habe noch nie mit Schnittstellen gearbeitet, und wenn man dann sowas sieht:
(
Außer mal in Vb mit dem activX Steuerelement der Com Schnittstelle
*lach*)hTreiber = CreateFile("\\\\.\\hid#vid_0908&pid_0200#6&1d2d6ffa&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);gemeint ist das argument:
\\\.\\hid#vid_0908&pid_0200#6&1d2d6ffa&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}
Ist man doch schon leicht stark irritiert.Hilfe, Hilfe Hilfe

mfg BigMama
-
wenn du eine hardware entwickelst musst du erstmal für jedes bs einen treiber schreiben
dafür is das ddk da
treiber laufen auf ring 0 wos kaum sicherheitschecks und schnickschnack gibt
d.h. es is dort kinderleicht das ganze system zu crashen-> du brauchst n zweiten rechner für remote debuggingder treiber sollte den standards der schnittstelle entsprechen, damit das bs richtig mit ihm kommunizieren kann
d.h. z.b. wenn das bs dir die nachricht schickt, dass der user das usb gerät ausstecken will, solltest du es deinitialisierennormale programme laufen in ring3 und können desshalb keine funktionen von treibern aufufen... mit createfile kannst du dir allerdings ein handle auf ein gerät erzeugen und ihm kommandos schicken wie z.b. "ich will das gerät rausziehn"
das war erstmal ein grober überblick
ich persönlich find treiberentwicklung unter linux übrigends viel einfacher weil man mehr infos und quellcodes findet
wie auch immer... um ein buch zum thema kommst du hier auf keinen fall rum
-
Hallo Sovok,
geb den Kollegen bigmama vollkommen recht. Bin auch gerade dabei mich diese "Programmierkunst" einzuarbeiten....
Finde das Buch von Walter Oney http://www.oneysoft.com ganz gut. Die deutschsprachrigen kannst Du leider total vergessen.
Interessant ist auch noch die Seite [url] http://www.osr.com[/url].
Aber am Anfang sieht man vor lauter Bäume den Wald nicht mehr...
Gruß
Chris
-
Was sollen die Geräte denn überhaupt können/ machen? Wenn es reicht, ein paar Bytes auszutauschen, kann das Gerät als HID ausgelegt werden. Dazu braucht Ihr keinen eigenen Treiber, da könnt Ihr den mitgelieferten nehmen. Allerdings werdet Ihr direkt API programmieren müssen, von den MFC gibt'S keine Unterstützung (deswegen ist der Beitrag hier OT, IMO). Auch braucht Ihr nicht über den Root Hub zu gehen, sondern sprecht die Geräte direkt an.
Als Buch empfehle ich USB | ISBN: 3826606981, oder online: http://www.lvr.com/usb.htm. Mit Walter Oney könnt Ihr Euch dann später noch beschäftigen, wenn es denn überhaupt noch sein muß.
Die Spezifikation gibt's übrigens hier: http://www.usb.org/developers/docs.
-
welchen mitgelieferten?
-
Den Klassentreiber für HIDs.
-
is der quelloffen?
-
Nein.
-
schade
-
Notfalls findest Du im DDK Samples für Isochrone- und Bulk-Transfers. Ob Du damit etwas anfangen kannst weiß ich nicht. Ich weiß aber auch immer noch nicht, worauf Du eigentlich hinaus wolltest.
Zur erfolgreichen Anwendung des HID class drivers benötigst Du jedenfalls keinen Quell, das geht auch so.

-
So also erstmal ein großes Dankeschön.
Ich weis jetzt immerhin mal was so theoretisch alles abgeht wenn ich nen USB gerät anspreche

Will sagen dass ich nun endlich nen Überblick habe was zu machen ist.
So zum Gerät, es wird eigentlich nichts besonderes.
Es ist ein Computergesteuertes Regal, andem ein kleiner "roboter" meine CDs verwaltet.
der roboter selber wird ja via microcontroller -> ASM realisiert, also zu mindest sein "IQ" ^^, die USB schnittstelle dient lediglich um dem IC befehle zu senden, also müsste ich wahrscheinlich keinen eigenen Treiber verwenden da ich ja im Prinzip nur Daten über die USB Schnittstelle raushaue, wie sie zu interpretieren sind weis dann ja wieder der "Empfänger".
So weiterhin mal ein dankeschön für die Quellen (Bücher, websites, etc).
Weil via google etwas zu finden, naja fast ausgeschlossen
tausende von suchergebnissen ^^Kennt jemand ein gutes deutsches Buch zur Schnittstellen ansteuerung, vielleicht grad auf USB bezogen, weil meine Englisch Kenntnisse sind zwar nicht unbedingt schlecht, allerdings auch nicht grad die besten womit ich dann wohl leider mit große Zeiteinbusungen zu rechnen hätte.
Weiterhin denk ich mal werd ich dieses Forum zu meinem Lebendsinhalt erklären dürfen bis mein Projekt mal läuft *gg*
Das Prob ist halt die Zeit hab etwa ein Jahr noch Zeit und der Hauptschwerpunkt beim Projekt liegt bei mir eigentlich vor allem bei der Hardware, will say der roboter, die elektronik daher will ich so schnell wie möglich die software schreiben. um mich dann ganz allein der hardware witmen zu können.
mfg Alex
-
Da Du lediglich ein paar Bytes hin- und hersenden willst, brauchst Du mit Sicherheit keinen eigenen Treiber. Du kannst das Gerät als HID auslegen, und da hat Windows bereits alles nötige an Bord (auch wenn es hier Unterschiede zwische 98 und 98SE gibt).
Und ein gutes deutsches HID bezogenes Buch, das auch noch Beispiel-Quellen in ASM (Firmware) und Windows API enthält, habe ich bereits weiter oben erwähnt.
-
Hi Leute
wie vorausgesagt werd ich mich jetzt auch wieder melden 
Folgendes Problem:
Also um einfach mal die Kommunikation zwischen USB und rechner zu lernen hab ich mir im Laden eine Kartenlesegerät geholt für Smart Media Karten.
Nun hab ich vor einfach mal auszulesen was an der USB schnittstelle so abgeht bzw das Kartelesegerät anzusprechen. Dazu hab ich mir WinObj runtergeladen und nach der Vid/Pid wie auch immer des Geräts gekuckt, gesucht gefunden, sie lautet:
USBSTOR#Disk&Ven_Generic&Prod_STORAGE_DEVICE&Rev_0125#04601&1#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}So nun bin ich hergegangen und hab ne simple MFC anwendung erstellt.
In ihr ein Editfeld das einfach als Log Window dient und dann einen Start und Stop Button wann gelesen werden soll (Timer wird gesartet/gestoppt...)Hier mal der Code:
void CGhjghjDlg::OnButton2() { UpdateData(TRUE); char buf[200]; m_CtrlStart.EnableWindow(FALSE); m_CtrlStop.EnableWindow(TRUE); m_strLog=""; hTreiber = CreateFile("\\\\.\\USBSTOR#Disk&Ven_Generic&Prod_STORAGE_DEVICE&Rev_0125#04601&1#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}",GENERIC_READ,FILE_SHARE_READ, 0,OPEN_EXISTING,0,0); if (hTreiber == INVALID_HANDLE_VALUE) { m_strLog="INVALID_HANDLE_VALUE!\r\n"; sprintf(buf,"GetLastError=%d",GetLastError()); m_strLog+=buf; m_strLog+="\n"; CloseHandle(hTreiber); m_CtrlStart.EnableWindow(TRUE); m_CtrlStop.EnableWindow(FALSE); UpdateData(FALSE); } else { m_strLog="USb Connection created!\r\n"; /*unsigned long BytesReturned; char read[200]; if(DeviceIoControl(hTreiber,IOCTL_STORAGE_LOAD_MEDIA,0,0,read,sizeof(read),&BytesReturned,0)!=0) { sprintf(read,"%x Bytes:%d",read,BytesReturned); MessageBox(read); } else { char buf[200]; sprintf(buf,"Fehler: %d",GetLastError()); MessageBox(buf); }*/ SetTimer(ID_TIMER,1000,NULL); UpdateData(FALSE); } } void CGhjghjDlg::OnButton3() { m_CtrlStart.EnableWindow(TRUE); m_CtrlStop.EnableWindow(FALSE); KillTimer(ID_TIMER); CloseHandle(hTreiber); } void CGhjghjDlg::OnTimer(UINT nIDEvent) { if(nIDEvent==ID_TIMER) { UpdateData(TRUE); char buf[200]; char getstring[800]; unsigned long BytesRead; int bResult = ReadFile(hTreiber, &getstring, 4, &BytesRead, NULL); if ((bResult && BytesRead) != 0) { sprintf(getstring,"%c",getstring); m_strLog+="P: "; m_strLog+=getstring; m_strLog+="\r\n"; UpdateData(FALSE); } else { sprintf(buf,"GetLastError=%d",GetLastError()); m_strLog+="N: "; m_strLog+=buf; m_strLog+="\r\n"; UpdateData(FALSE); } } CDialog::OnTimer(nIDEvent); }hTreiber ist public HANDLE hTreiber;
So in der Log sagt er mir dasder USB erfolgreich kontaktiert wurde (CreateFile ist also nicht INVALID!)
Aber sobald ie Lesenfuntion im Timer kommt spuckt er einen Fehler 87 aus was soviel heist wie ungültiger Parameter.
ABER welcher Parameter soll falsch sein, ist doch eigentlich richtig, oder wo ist der Fehler?HILFE

-
Hallo,
kurzes Drüberschauen zeigt mir erst mal einen Fehler:
int bResult = ReadFile(hTreiber, &getstring, 4, &BytesRead, NULL);das ist falsch, getstring ist doch schon ein Zeiger, richtiger ist das:
int bResult = ReadFile(hTreiber, getstring, 4, &BytesRead, NULL);Außerdem erst Array initialisieren:
char getstring[800] = {0,};falls String-Ausgaben passieren sollen. Das hier:
sprintf(getstring,"%c",getstring);paßt auch nicht, getstring ist ein Zeiger, und kein Zeichen, und das erste Zeichen von getstring wieder in getstring zu platzieren, kann gut gehen aber auch nicht (bei überlappenden Strings), deshalb besser eigene Variable definieren, z.B.:
sprintf(pBuf,"%c",*getstring);jetzt mal prüfen, was dann passiert.
MfG
-
So ok hab alle deine entdeckten Fehler ausgebessert, allerdings krieg ich beim Lesen immernoch Fehler 87, incorrect Parameter, der Code sieh´t mitlerweile so aus:
void CGhjghjDlg::OnButton2() { UpdateData(TRUE); char buf[200]; m_CtrlStart.EnableWindow(FALSE); m_CtrlStop.EnableWindow(TRUE); m_strLog=""; hTreiber = CreateFile("\\\\.\\USBSTOR#Disk&Ven_Generic&Prod_STORAGE_DEVICE&Rev_0125#04601&1#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}",GENERIC_READ,FILE_SHARE_READ, 0,OPEN_EXISTING,0,0); if (hTreiber == INVALID_HANDLE_VALUE) { m_strLog="INVALID_HANDLE_VALUE!\r\n"; sprintf(buf,"GetLastError=%d",GetLastError()); m_strLog+=buf; m_strLog+="\n"; CloseHandle(hTreiber); m_CtrlStart.EnableWindow(TRUE); m_CtrlStop.EnableWindow(FALSE); UpdateData(FALSE); } else { m_strLog="USb Connection created!\r\n"; SetTimer(ID_TIMER,1000,NULL); UpdateData(FALSE); } } void CGhjghjDlg::OnButton3() { m_CtrlStart.EnableWindow(TRUE); m_CtrlStop.EnableWindow(FALSE); KillTimer(ID_TIMER); CloseHandle(hTreiber); } void CGhjghjDlg::OnTimer(UINT nIDEvent) { if(nIDEvent==ID_TIMER) { UpdateData(TRUE); char buf[800]; char getstring[800]={0,}; unsigned long BytesRead; int bResult = ReadFile(hTreiber, getstring, sizeof(getstring), &BytesRead, NULL); if ((bResult && BytesRead) != 0) { sprintf(buf,"%c",*getstring); m_strLog+="P: "; m_strLog+=buf; m_strLog+="\r\n"; UpdateData(FALSE); } else { sprintf(buf,"GetLastError=%d",GetLastError()); m_strLog+="N: "; m_strLog+=buf; m_strLog+="\r\n"; UpdateData(FALSE); } } CDialog::OnTimer(nIDEvent); }
-
*push*

-
*push*

-
*push*

-
sagmal irgend jemand muss doch irgendeine Ahnung haben und mir helfen können!