diff options
author | Christian Pointner <equinox@spreadspace.org> | 2013-02-16 21:44:47 +0000 |
---|---|---|
committer | Christian Pointner <equinox@spreadspace.org> | 2013-02-16 21:44:47 +0000 |
commit | c5b6b62412d6d4df1f364ae7a6dca5488a1cd7f5 (patch) | |
tree | 4e6987a4e47b137d0f73a7a07e1255837e05a6b2 /usb-keyboardmouse | |
parent | usbdualserial descriptor cleanup (diff) |
added keyoard mouse example
git-svn-id: https://svn.spreadspace.org/avr/trunk@192 aa12f405-d877-488e-9caf-2d797e2a1cc7
Diffstat (limited to 'usb-keyboardmouse')
-rw-r--r-- | usb-keyboardmouse/Makefile | 41 | ||||
-rw-r--r-- | usb-keyboardmouse/usb-keyboardmouse.c | 177 |
2 files changed, 218 insertions, 0 deletions
diff --git a/usb-keyboardmouse/Makefile b/usb-keyboardmouse/Makefile new file mode 100644 index 0000000..5e20ae0 --- /dev/null +++ b/usb-keyboardmouse/Makefile @@ -0,0 +1,41 @@ +## +## spreadspace avr utils +## +## +## Copyright (C) 2013 Christian Pointner <equinox@spreadspace.org> +## +## This file is part of spreadspace avr utils. +## +## spreadspace avr utils is free software: you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## any later version. +## +## spreadspace avr utils is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with spreadspace avr utils. If not, see <http://www.gnu.org/licenses/>. +## + +NAME := usb-keyboardmouse +BOARD_TYPE := teensy2 +OBJ := $(NAME).o +LIBS := util led lufa-descriptor-keyboardmouse +EXTERNAL_LIBS := lufa + +LUFA_PATH := ../contrib/LUFA-120219 +LUFA_OPTS = -D USB_DEVICE_ONLY +LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8 +LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1 +LUFA_OPTS += -D USE_FLASH_DESCRIPTORS +LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" + +LUFA_OPTS += -D USB_MANUFACTURER="L\"equinox\"" +LUFA_OPTS += -D USB_PRODUCT="L\"$(NAME)\"" + +LUFA_COMPONENTS := USB USBCLASS + +include ../include.mk diff --git a/usb-keyboardmouse/usb-keyboardmouse.c b/usb-keyboardmouse/usb-keyboardmouse.c new file mode 100644 index 0000000..de796f5 --- /dev/null +++ b/usb-keyboardmouse/usb-keyboardmouse.c @@ -0,0 +1,177 @@ +/* + * spreadspace avr utils + * + * + * Copyright (C) 2013 Christian Pointner <equinox@spreadspace.org> + * + * This file is part of spreadspace avr utils. + * + * spreadspace avr utils is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * spreadspace avr utils is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with spreadspace avr utils. If not, see <http://www.gnu.org/licenses/>. + */ + + +#include <avr/io.h> +#include <avr/wdt.h> +#include <avr/interrupt.h> +#include <avr/power.h> + +#include "util.h" +#include "led.h" + +/* + LUFA Library + Copyright (C) Dean Camera, 2012. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ +#include <LUFA/Drivers/USB/USB.h> +#include "lufa-descriptor-keyboardmouse.h" + +static uint8_t PrevKeyboardHIDReportBuffer[sizeof(USB_KeyboardReport_Data_t)]; +static uint8_t PrevMouseHIDReportBuffer[sizeof(USB_MouseReport_Data_t)]; + +USB_ClassInfo_HID_Device_t Keyboard_HID_Interface = + { + .Config = + { + .InterfaceNumber = 0, + + .ReportINEndpointNumber = KEYBOARD_IN_EPNUM, + .ReportINEndpointSize = HID_EPSIZE, + .ReportINEndpointDoubleBank = false, + + .PrevReportINBuffer = PrevKeyboardHIDReportBuffer, + .PrevReportINBufferSize = sizeof(PrevKeyboardHIDReportBuffer), + }, + }; + +USB_ClassInfo_HID_Device_t Mouse_HID_Interface = + { + .Config = + { + .InterfaceNumber = 1, + + .ReportINEndpointNumber = MOUSE_IN_EPNUM, + .ReportINEndpointSize = HID_EPSIZE, + + .PrevReportINBuffer = PrevMouseHIDReportBuffer, + .PrevReportINBufferSize = sizeof(PrevMouseHIDReportBuffer), + }, + }; + + +void EVENT_USB_Device_ConfigurationChanged(void) +{ + HID_Device_ConfigureEndpoints(&Keyboard_HID_Interface); + HID_Device_ConfigureEndpoints(&Mouse_HID_Interface); + + USB_Device_EnableSOFEvents(); +} + +/** Event handler for the library USB Control Request reception event. */ +void EVENT_USB_Device_ControlRequest(void) +{ + HID_Device_ProcessControlRequest(&Keyboard_HID_Interface); + HID_Device_ProcessControlRequest(&Mouse_HID_Interface); +} + +/** Event handler for the USB device Start Of Frame event. */ +void EVENT_USB_Device_StartOfFrame(void) +{ + HID_Device_MillisecondElapsed(&Keyboard_HID_Interface); + HID_Device_MillisecondElapsed(&Mouse_HID_Interface); +} +/* end LUFA CDC-ACM specific definitions*/ + + +bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, + uint8_t* const ReportID, + const uint8_t ReportType, + void* ReportData, + uint16_t* const ReportSize) +{ + if (HIDInterfaceInfo == &Keyboard_HID_Interface) { + USB_KeyboardReport_Data_t* KeyboardReport = (USB_KeyboardReport_Data_t*)ReportData; + + /* no key has been pressed - just return */ + return 0; + +/* + KeyboardReport->Modifier = HID_KEYBOARD_MODIFIER_LEFTSHIFT; + KeyboardReport->KeyCode[0] = HID_KEYBOARD_SC_A; + + *ReportSize = sizeof(USB_KeyboardReport_Data_t); + return false; +*/ + } + else + { + USB_MouseReport_Data_t* MouseReport = (USB_MouseReport_Data_t*)ReportData; + + MouseReport->Y = 0; + MouseReport->X = 0; +/* + MouseReport->Y = -1; // UP + MouseReport->Y = 1; // DOWN + MouseReport->X = -1; // LEFT + MouseReport->X = 1; // RIGHT +*/ +/* + MouseReport->Button |= (1 << 0); // Button 1 +*/ + *ReportSize = sizeof(USB_MouseReport_Data_t); + return true; + } +} + +void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, + const uint8_t ReportID, + const uint8_t ReportType, + const void* ReportData, + const uint16_t ReportSize) +{ + if (HIDInterfaceInfo == &Keyboard_HID_Interface) + { + uint8_t* LEDReport = (uint8_t*)ReportData; + + /* if (*LEDReport & HID_KEYBOARD_LED_NUMLOCK) */ + /* // do something */ + + if (*LEDReport & HID_KEYBOARD_LED_CAPSLOCK) + led_on(); + else + led_off(); + + /* if (*LEDReport & HID_KEYBOARD_LED_SCROLLLOCK) */ + /* // do something */ + } +} + +int main(void) +{ + MCUSR &= ~(1 << WDRF); + wdt_disable(); + + cpu_init(); + led_init(); + USB_Init(); + sei(); + + for(;;) { + HID_Device_USBTask(&Keyboard_HID_Interface); + HID_Device_USBTask(&Mouse_HID_Interface); + USB_USBTask(); + } +} |