Forum: Mikrocontroller und Digitale Elektronik PIC18 - Microchip HID-Mouse-Beispiel - Übertragungsgröße verändern


von ChornHulio (Gast)


Lesenswert?

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

von Zwirbeljupp (Gast)


Lesenswert?

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

von ChornHulio (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Martin (Gast)


Lesenswert?

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

von Martin (Gast)


Lesenswert?

ich mein natürlich usbdsc.c

von Martin (Gast)


Lesenswert?

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

von ChornHulio (Gast)


Lesenswert?

Perfekt Danke! Mit deinem letzten Post hats geklappt! Da wäre ich ja nie 
drauf gekommen... :D

von ChornHulio (Gast)


Lesenswert?

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  */

?

von Martin (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.