mikrocontroller.net

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


Autor: ChornHulio (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Zwirbeljupp (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)":
.
.
.
    if(HIDTxHandleBusy(lastTransmission) == 0)
    {
        //copy over the data to the HID buffer
        hid_report_in[0] = buffer[0];
        hid_report_in[1] = buffer[1];
        hid_report_in[2] = buffer[2];

     
        //Send the 3 byte packet over USB to the host.
        lastTransmission = HIDTxPacket(HID_EP, (BYTE*)hid_report_in, 0x03);

        //increment the counter of when to change the data sent
        movement_length++;
    }

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
#define HID_INT_OUT_EP_SIZE     3
#define HID_INT_IN_EP_SIZE      3

... die Größe des Endpoint Descriptors in usb_descriptors.c ändern...
    /* Endpoint Descriptor */
    0x07,/*sizeof(USB_EP_DSC)*/
    USB_DESCRIPTOR_ENDPOINT,    //Endpoint Descriptor
    HID_EP | _EP_IN,            //EndpointAddress
    _INTERRUPT,                       //Attributes
    DESC_CONFIG_WORD(3),                  //size
    0x01                        //Interval

...und natürlich den "Class specific descriptor - HID mouse" in der 
gleichen Datei danach anpassen, was und wie Du übertragen möchtest.

Autor: ChornHulio (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich mein natürlich usbdsc.c

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ChornHulio (Gast)
Datum:

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

Autor: ChornHulio (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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  */

?

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.