PIC18 - Microchip HID-Mouse-Beispiel - Übertragungsgröße verändern

Gast #1398580
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
Gast #1398604
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.
Gast #1398651
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.
Angehängte Dateien:
Gast #1398671
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
Gast #1398674
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
Gast #1398976
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  */

?
Gast #1399086
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren