Mit dieser Library kann eine USB-Maus oder eine USB-Tastatur am USB-OTG-Port vom Discovery-Modul betrieben werden.
Die Library hat vier Funktionen :
1. Eine “Init-Funktion”
Die muss beim start einmal aufgerufen werden.
2. Die “HOST_Do-Funktion”
Diese muss zyklisch, am besten in der while(1) aufgerufen werden. Sie liefert den Status vom USB-Device zurück. Dieser Status muss ausgewertet werden und erst wenn ein USB-Device (Mouse oder Keyboard) erkannt wurde, darf auf das Device zugegriffen werden.
3. Die “GetKey-Funktion” liefert (wenn eine USB-Tastatur angeschlossen ist) den Ascii-Code der gedrückten Taste zurück (bzw. 0 wenn keine Taste gedrückt ist)
4. Die “GetMouse-Funktion” liefert (wenn eine USB-Maus angeschlossen ist) eine “1″ zurück, wenn neue Maus-Daten vorhanden sind, ansonsten eine “0″. Die Mausdaten stehen in der Struktur “USB_MOUSE_DATA”
Hinweis : bei mir kommt es ab und zu vor, das nach dem einstecken von einem Device, dieses nicht erkannt wird (Status = “USB_HID_DEV_NOT_SUPPORTED”). Ein abziehen und erneutes einstecken bringt dann nichts mehr, es muss ein Hardware Reset ausgelöst werden !! -> keine Ahnung was das ist, falls da jemand Fehler suchen will …viel Spass.
USB-Tastatur :
es wird nur das drücken einer Taste erkannt, eine gedrückt gehaltene Taste löst kein neues event aus (Tasten repeat funktioniert also nicht)
USB-Maus :
ein Mausrad wird nicht unterstützt
die Grenzen der Maus-Koordinaten können in einem H-File eingestellt werden
(im Moment 320 x 240)
Benutzte Pins :
1 2 3 4 5 | PA9 -> USB_OTG_VBUS PA10 -> USB_OTG_ID PA11 -> USB_OTG_DM PA12 -> USB_OTG_DP PC0 -> USB_VBUS_Enable |
Voraussetzungen :
1 2 | Benutzte Module der CooCox-IDE : GPIO, MISC Benutzte Librarys : keine |
Enumerationen :
1 2 3 4 5 6 7 8 9 10 11 | typedef enum { USB_HID_HOST_NO_INIT =0, // USB-Schnittstelle noch nicht initialisiert USB_HID_DEV_DETACHED, // kein Device angeschlossen USB_HID_SPEED_OK, // USB-Speed wird unterstützt USB_HID_SPEED_ERROR, // USB-Speed wird nicht unterstützt USB_HID_DEV_NOT_SUPPORTED, // Device wird nicht untersützt USB_HID_OVER_CURRENT, // Überstrom erkannt USB_HID_DEV_CONNECTED, // Device verbunden noch nicht bereit USB_HID_MOUSE_CONNECTED, // Mouse verbunden und bereit USB_HID_KEYBOARD_CONNECTED // Tastatur verbunden und bereit }USB_HID_HOST_STATUS_t; |
Funktionen :
1 2 3 4 | void UB_USB_HID_HOST_Init(void); // zum init des USB-Host USB_HID_HOST_STATUS_t UB_USB_HID_HOST_Do(void); // zum check vom Device-Status uint8_t UB_USB_HID_HOST_GetKey(void); // zum auslesen der Keyboard-Daten uint8_t UB_USB_HID_HOST_GetMouse(void); // zum auslesen der Maus-Daten |
Beispiel :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | //-------------------------------------------------------------- // File : main.c // Datum : 28.08.2013 // Version : 1.0 // Autor : UB // EMail : mc-4u(@)t-online.de // Web : www.mikrocontroller-4u.de // CPU : STM32F4 // IDE : CooCox CoIDE 1.7.4 // GCC : 4.7 2012q4 // Module : CMSIS_BOOT, M4_CMSIS_CORE // Funktion : Demo der USB-HID-Host Library // Hinweis : Diese zwei Files muessen auf 8MHz stehen // "cmsis_boot/stm32f4xx.h" // "cmsis_boot/system_stm32f4xx.c" //-------------------------------------------------------------- #include "main.h" #include "stm32_ub_led.h" #include "stm32_ub_usb_hid_host.h" //-------------------------------------------------------------- void mouse_function(void) { UB_Led_On(LED_ORANGE); // Maus-Daten abfragen UB_USB_HID_HOST_GetMouse(); // Grüne LED mit linker Maustaste ein/ausschalten if(USB_MOUSE_DATA.btn_left==MOUSE_BTN_PRESSED) { UB_Led_On(LED_GREEN); // grüne LED einschalten } else { UB_Led_Off(LED_GREEN); // grüne LED ausschalten } } //-------------------------------------------------------------- void key_function(void) { uint8_t akt_key=0; UB_Led_On(LED_BLUE); // Keyboard-Daten abfragen akt_key=UB_USB_HID_HOST_GetKey(); // Grüne LED mit Tasten "1" und "2" ein/auschalten if(akt_key=='1') { UB_Led_On(LED_GREEN); // grüne LED einschalten } if(akt_key=='2') { UB_Led_Off(LED_GREEN); // grüne LED ausschalten } } //-------------------------------------------------------------- int main(void) { USB_HID_HOST_STATUS_t host_status; SystemInit(); // Quarz Einstellungen aktivieren // Init der LEDs UB_Led_Init(); // Init vom USB-OTG-Port als HID-HOST // (zum betreiben von USB-Mouse oder USB-Tastatur) UB_USB_HID_HOST_Init(); while(1) { // pollen vom USB-Status host_status=UB_USB_HID_HOST_Do(); if(host_status==USB_HID_MOUSE_CONNECTED) { // wenn USB-Maus gefunden wurde mouse_function(); } else if(host_status==USB_HID_KEYBOARD_CONNECTED) { // wenn USB-Keyboard gefunden wurde key_function(); } else if(host_status==USB_HID_DEV_NOT_SUPPORTED) { // wenn Fehler beim USB-Device UB_Led_On(LED_RED); } else { // wenn kein USB-Device vorhanden UB_Led_Off(LED_ORANGE); UB_Led_Off(LED_BLUE); UB_Led_Off(LED_GREEN); } } } |
Hier die Library zum Download :
Hier der komplette CooCox-Projektordner zum Download :
Hello, I’m trying to read a gamepad USB with a STM32F407 board. Can you help me?
Hello, I’m trying to convert this library to read a gamepad, but I’m realy confused. Can you help me?
Thanks a lot.