/* * spreadspace avr utils * * * Copyright (C) 2013 Christian Pointner * * 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 . */ #include #include #include #include #include "util.h" #include "led.h" /* LUFA Library Copyright (C) Dean Camera, 2012. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ #include #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(); } }