Hallo zusammen, Ich benutze einen PIC18F2455 und MPLAB IDE. Jetzt baue ich auf dem USB-HID-Mouse-Beipiel von Microchip auf und möchte die Übertragung von 3 Bytes auf 5 Bytes ändern. Also ich möchte an den PC immer 5Byte-Packete per USB schicken. Ich habe schon ein ganzen Haufen Sachen ausprobiert, aber immer wenn ich irgendwas in der Firmware änder kommen entweder immer noch 3 Bytes, oder er sendet gar nichts mehr (meldet sich erfolgreich an und dann tut sich nix mehr). Kann mir jemand sagen, wo ihr die Stellschraube ist; Welche Variablen ich hier umändern muss? Danke für eure Antworten! Gruß Tobias
> Ich habe schon ein ganzen Haufen Sachen ausprobiert
Zum Beispiel?
Üblicherweise würde ich dort ansetzen, wo das Paket geschnürt und
versendet wird, in der Funktion "Emulate_Mouse(void)":
1 | .
|
2 | .
|
3 | .
|
4 | if(HIDTxHandleBusy(lastTransmission) == 0) |
5 | {
|
6 | //copy over the data to the HID buffer
|
7 | hid_report_in[0] = buffer[0]; |
8 | hid_report_in[1] = buffer[1]; |
9 | hid_report_in[2] = buffer[2]; |
10 | |
11 | |
12 | //Send the 3 byte packet over USB to the host.
|
13 | lastTransmission = HIDTxPacket(HID_EP, (BYTE*)hid_report_in, 0x03); |
14 | |
15 | //increment the counter of when to change the data sent
|
16 | movement_length++; |
17 | }
|
Wenn Du hier die Buffergröße auf 5 Bytes erweiterst und dann aus der 0x03 eine 0x05 machst, sollten auch 5 Bytes übertragen werden. Zusätzlich musst Du noch die Endpoint-Größe in usb_config.h anpassen
1 | #define HID_INT_OUT_EP_SIZE 3
|
2 | #define HID_INT_IN_EP_SIZE 3
|
... die Größe des Endpoint Descriptors in usb_descriptors.c ändern...
1 | /* Endpoint Descriptor */
|
2 | 0x07,/*sizeof(USB_EP_DSC)*/ |
3 | USB_DESCRIPTOR_ENDPOINT, //Endpoint Descriptor |
4 | HID_EP | _EP_IN, //EndpointAddress |
5 | _INTERRUPT, //Attributes |
6 | DESC_CONFIG_WORD(3), //size |
7 | 0x01 //Interval |
...und natürlich den "Class specific descriptor - HID mouse" in der gleichen Datei danach anpassen, was und wie Du übertragen möchtest.
Danke für deine schnelle Antwort! Diese Variablen habe ich alle geändert, aber es funktioniert immer noch nicht. Der PIC versucht jetzt die Verbindung immer wieder aufzubauen, schickt dann einmal 5 Byte und baut die Verbindung dann wieder auf - so mein ich das auf jeden Fall zu sehen, wenn ich einen USB-Tracker dazwischen hänge. Wenn ich HID_INT_IN_EP_SIZE = 3 setze und HIDTxPacket(buffer, 3) sende funktioniert alles Problemlos Ich schick mal mein (auf 5-Byte geänderter) Projektordner mit. Vielleicht sieht noch jemand einen Fehler.
guck mal in der usbdsc.h im "rom struct{byte report[HID_RPT01_SIZE];}hid_rpt01" dort hast du drei Bits für die drei Tasten und ein padding auf 8 Bit. Das entspricht einem Byte. dann gehts unten weiter mit den zwei Achen, X und Y. Die haben jeweils auch ein Byte. also ingesamt 3 Byte mit den Tasten zusammen. Wenn du jetzt 5 bytes senden willst, musst du den HID descriptor ändern. Das ist original: 0x05, 0x09, /* Usage Page (Buttons) */ 0x19, 0x01, /* Usage Minimum (01) */ 0x29, 0x03, /* Usage Maximum (03) */ 0x15, 0x00, /* Logical Minimum (0) */ 0x25, 0x01, /* Logical Maximum (0) */ 0x95, 0x03, /* Report Count (3) */ 0x75, 0x01, /* Report Size (1) */ 0x81, 0x02, /* Input (Data, Variable, Absolute) */ 0x95, 0x01, /* Report Count (1) */ 0x75, 0x05, /* Report Size (5) */ 0x81, 0x01, /* Input (Constant) ;5 bit padding */ und geändert: 0x05, 0x09, /* Usage Page (Buttons) */ 0x19, 0x01, /* Usage Minimum (01) */ 0x29, 0x03, /* Usage Maximum (03) */ 0x15, 0x00, /* Logical Minimum (0) */ 0x25, 0x01, /* Logical Maximum (0) */ 0x95, 0x03, /* Report Count (3) */ 0x75, 0x01, /* Report Size (1) */ 0x81, 0x02, /* Input (Data, Variable, Absolute) */ 0x95, 0x01, /* Report Count (1) */ 0x75, 0x05, /* Report Size (5) */ 0x81, 0x01, /* Input (Constant) ;5 bit padding */ 0x95, 0x03, /* Report Count (2) */ 0x75, 0x01, /* Report Size (8) */ 0x81, 0x02, /* Input (Data, Variable, Absolute) */ Damit haste zwei Bytes mehr. Musst natürlich in den anderen Desctriptoren noch die Lände des HID Descriptors anpassen. Gruß, Martin D
0x05, 0x09, /* Usage Page (Buttons) */ 0x19, 0x01, /* Usage Minimum (01) */ 0x29, 0x03, /* Usage Maximum (03) */ 0x15, 0x00, /* Logical Minimum (0) */ 0x25, 0x01, /* Logical Maximum (0) */ 0x95, 0x03, /* Report Count (3) */ 0x75, 0x01, /* Report Size (1) */ 0x81, 0x02, /* Input (Data, Variable, Absolute) */ 0x95, 0x01, /* Report Count (1) */ 0x75, 0x05, /* Report Size (5) */ 0x81, 0x01, /* Input (Constant) ;5 bit padding */ 0x19, 0x01, /* Usage Minimum (01) */ 0x29, 0x08, /* Usage Maximum (08) */ 0x95, 0x02, /* Report Count (2) */ 0x75, 0x08, /* Report Size (8) */ 0x81, 0x02, /* Input (Data, Variable, Absolute) */ sorry für tripple post, ist jetzt hoffentlich richtig :D
Perfekt Danke! Mit deinem letzten Post hats geklappt! Da wäre ich ja nie drauf gekommen... :D
Was mich da auch gerade noch interessieren würde: Warum muss man die zwei Bytes zusätzlich hinzufügen, warum kann man nicht weiter oben statt 3 eine 5 hinschreiben - also 0x05, 0x09, /* Usage Page (Buttons) */ 0x19, 0x01, /* Usage Minimum (01) */ 0x29, 0x03, /* Usage Maximum (03) */ 0x15, 0x00, /* Logical Minimum (0) */ 0x25, 0x01, /* Logical Maximum (0) */ 0x95, 0x05, /* Report Count (3) <------*/ 0x75, 0x01, /* Report Size (1) */ 0x81, 0x02, /* Input (Data, Variable, Absolute) */ 0x95, 0x01, /* Report Count (1) */ 0x75, 0x05, /* Report Size (5) */ 0x81, 0x01, /* Input (Constant) ;5 bit padding */ ?
du hast da ne reportsize von 1. Das heißt 1Bit. Jede taste wird sozusagen auf ein Bit gemappt. wenn du 5 hinschreibst, dann hättest du 5 tasten. dann braüchtest du nur 3 padding bits. unten hab ich ja die reportsize auf 8 bit geändert, also 1 byte.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.