logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ATTiny2313/C] Biblioteka V-USB, rozpoznawanie urządzenia

ADI-mistrzu 02 Sty 2010 13:41 3520 4
REKLAMA
  • #1 7471768
    ADI-mistrzu
    Poziom 30  
    Witam!

    Zazwyczaj komunikuje się z moimi urządzeniami przez RS232. Ale niestety, jak wiadomo zostało to wyparte przez USB i podłączenie swoich urządzeń do laptopów staje się bardzo kłopotliwe.
    Dlatego chciałem w końcu wziąć się za to USB. Z tego co wyszperałem, najlepiej jest skorzystać z gotowej biblioteki V-USB, która posiada obsługę HID co bardzo by mnie interesowało.

    Próbowałem napisać jakiś krótki program, dzięki któremu by wykrył µC jako jakieś tam urządzenie. Niestety efekt jest taki, że dostaje komunikat o niezidentyfikowanym urządzeniu pod Windowsem jak i pod Linuksem.
    Kombinuje z tymi tablicami HID w każdą stronę, próbowałem kopiować czyjeś projekty z wykorzystaniem USB na ATTiny2313 ale efekt ciągle ten sam, sprzęt widoczny ale nie rozpoznawalny.

    Poniżej program: (plik usbconfig.h w załączniku)
    #include <avr/io.h>
    #include <avr/wdt.h>
    #include <avr/interrupt.h> 
    
    #define F_CPU 12000000L
    #include <util/delay.h>   
    #include <avr/pgmspace.h>
    #include "usbdrv.h"
    
    
    PROGMEM char usbHidReportDescriptor[52] = { /* USB report descriptor, size must match usbconfig.h */
        0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
        0x09, 0x02,                    // USAGE (Mouse)
        0xa1, 0x01,                    // COLLECTION (Application)
        0x09, 0x01,                    //   USAGE (Pointer)
        0xA1, 0x00,                    //   COLLECTION (Physical)
        0x05, 0x09,                    //     USAGE_PAGE (Button)
        0x19, 0x01,                    //     USAGE_MINIMUM
        0x29, 0x03,                    //     USAGE_MAXIMUM
        0x15, 0x00,                    //     LOGICAL_MINIMUM (0)
        0x25, 0x01,                    //     LOGICAL_MAXIMUM (1)
        0x95, 0x03,                    //     REPORT_COUNT (3)
        0x75, 0x01,                    //     REPORT_SIZE (1)
        0x81, 0x02,                    //     INPUT (Data,Var,Abs)
        0x95, 0x01,                    //     REPORT_COUNT (1)
        0x75, 0x05,                    //     REPORT_SIZE (5)
        0x81, 0x03,                    //     INPUT (Const,Var,Abs)
        0x05, 0x01,                    //     USAGE_PAGE (Generic Desktop)
        0x09, 0x30,                    //     USAGE (X)
        0x09, 0x31,                    //     USAGE (Y)
        0x09, 0x38,                    //     USAGE (Wheel)
        0x15, 0x81,                    //     LOGICAL_MINIMUM (-127)
        0x25, 0x7F,                    //     LOGICAL_MAXIMUM (127)
        0x75, 0x08,                    //     REPORT_SIZE (8)
        0x95, 0x03,                    //     REPORT_COUNT (3)
        0x81, 0x06,                    //     INPUT (Data,Var,Rel)
        0xC0,                          //   END_COLLECTION
        0xC0,                          // END COLLECTION
    };
    
    static	unsigned char volatile	flags = 0;
    static	uchar    				reportBuffer[3];    
    
    uchar	usbFunctionSetup(uchar data[8])
    {
    usbRequest_t    *rq = (void *)data;
    
        usbMsgPtr = reportBuffer;
        if((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS){    /* class request type */
            if(rq->bRequest == USBRQ_HID_GET_REPORT){  /* wValue: ReportType (highbyte), ReportID (lowbyte) */
                /* we only have one report type, so don't look at wValue */
                //makeReport();
                return sizeof(reportBuffer);
            }
        }else{
            /* no vendor specific requests implemented */
        }
    	return 0;
    }
    
    
    int	main(void)
    {
    	wdt_enable(WDTO_2S);
    	usbInit();
    	usbDeviceConnect();
    	sei();
    
    	for(;;){	/* main event loop */
    		wdt_reset();
    		usbPoll();
    	}
    	return 0;
    }
    

    Jak widać, urządzenie ma nic nie robić, po za tym że ma być wykryte jako mysz USB.
    I za nic nie wiem co dalej z tym zrobić, wydaje mi się że konfiguracja (w usbconfig.h) jest poprawna, fusebity ustawione, kwarc 12Mhz.

    Może już ktoś miał podobny problem lub wie co z tym zrobić ?

    Pozdrawiam
  • REKLAMA
  • #2 7472037
    Karol966
    Poziom 31  
    Wiem, że ten układ jest na Atmeg8 ale może wyszukasz jakieś informacje. Gdzieś pobrałem cały projekt (wszystkie pliki). Jak również to znajdziesz to na pewno podpatrzysz jak to jest zrobione.
    http://www.fischl.de/usbasp/

    Zbudowałem też jakąś przejściówkę USB->LPT również na Atmega8 - tam również można podejrzeć wszystkie pliki projektu.
    http://www-user.tu-chemnitz.de/~heha/bastelecke/Rund%20um%20den%20PC/USB2LPT/index.html.en
  • REKLAMA
  • #3 7472049
    ADI-mistrzu
    Poziom 30  
    http://www.obdev.at/products/vusb/projects.html

    Tutaj są przykładowe prace na różnych kontrolerach. Są tam i ATTiny2313 i podobne na których się opierałem, ale nic z tego nie wyszło, tak jak pisze, urządzenie nie rozpoznawalne.
  • REKLAMA
  • #4 7472185
    Konto nie istnieje
    Poziom 1  
  • #5 7472593
    ADI-mistrzu
    Poziom 30  
    Już wiem co było, w Fusebit'ach jednak źle ustawiłem, bo używam kalkulatora i nie odznaczyłem bitu CKSEL3.
    Teraz ładnie chodzi :D
REKLAMA