3      Copyright (C) Dean Camera, 2009. 
   5   dean [at] fourwalledcubicle [dot] com 
   6       www.fourwalledcubicle.com 
  10   Copyright 2009  Dean Camera (dean [at] fourwalledcubicle [dot] com) 
  11   Copyright 2009  Denver Gingerich (denver [at] ossguy [dot] com) 
  13   Permission to use, copy, modify, and distribute this software 
  14   and its documentation for any purpose and without fee is hereby 
  15   granted, provided that the above copyright notice appear in all 
  16   copies and that both that the copyright notice and this 
  17   permission notice and warranty disclaimer appear in supporting 
  18   documentation, and that the name of the author not be used in 
  19   advertising or publicity pertaining to distribution of the 
  20   software without specific, written prior permission. 
  22   The author disclaim all warranties with regard to this 
  23   software, including all implied warranties of merchantability 
  24   and fitness.  In no event shall the author be liable for any 
  25   special, indirect or consequential damages or any damages 
  26   whatsoever resulting from loss of use, data or profits, whether 
  27   in an action of contract, negligence or other tortious action, 
  28   arising out of or in connection with the use or performance of 
  34  *  Main source file for the KeyboardMouse demo. This file contains the main tasks of 
  35  *  the demo and is responsible for the initial application hardware configuration. 
  38 #include "KeyboardMouse.h" 
  40 /** LUFA HID Class driver interface configuration and state information. This structure is 
  41  *  passed to all HID Class driver functions, so that multiple instances of the same class 
  42  *  within a device can be differentiated from one another. This is for the keyboard HID 
  43  *  interface within the device. 
  45 USB_ClassInfo_HID_t Keyboard_HID_Interface 
= 
  49                 .ReportINEndpointNumber  
= KEYBOARD_IN_EPNUM
, 
  50                 .ReportINEndpointSize    
= HID_EPSIZE
, 
  52                 .ReportINBufferSize      
= sizeof(USB_KeyboardReport_Data_t
), 
  57 /** LUFA HID Class driver interface configuration and state information. This structure is 
  58  *  passed to all HID Class driver functions, so that multiple instances of the same class 
  59  *  within a device can be differentiated from one another. This is for the mouse HID 
  60  *  interface within the device. 
  62 USB_ClassInfo_HID_t Mouse_HID_Interface 
= 
  66                 .ReportINEndpointNumber  
= MOUSE_IN_EPNUM
, 
  67                 .ReportINEndpointSize    
= HID_EPSIZE
, 
  69                 .ReportINBufferSize      
= sizeof(USB_MouseReport_Data_t
), 
  72 /** Main program entry point. This routine contains the overall program flow, including initial 
  73  *  setup of all components and the main program loop. 
  79         LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY
); 
  83                 USB_HID_USBTask(&Keyboard_HID_Interface
); 
  84                 USB_HID_USBTask(&Mouse_HID_Interface
); 
  89 /** Configures the board hardware and chip peripherals for the demo's functionality. */ 
  92         /* Disable watchdog if enabled by bootloader/fuses */ 
  93         MCUSR 
&= ~(1 << WDRF
); 
  96         /* Disable clock division */ 
  97         clock_prescale_set(clock_div_1
); 
  99         /* Hardware Initialization */ 
 104         /* Millisecond timer initialization, with output compare interrupt enabled for the idle timing */ 
 105         OCR0A  
= ((F_CPU 
/ 64) / 1000); 
 106         TCCR0A 
= (1 << WGM01
); 
 107         TCCR0B 
= ((1 << CS01
) | (1 << CS00
)); 
 108         TIMSK0 
= (1 << OCIE0A
); 
 111 /** Event handler for the library USB Connection event. */ 
 112 void EVENT_USB_Connect(void) 
 114     LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING
); 
 117 /** Event handler for the library USB Disconnection event. */ 
 118 void EVENT_USB_Disconnect(void) 
 120     LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY
); 
 123 /** Event handler for the library USB Configuration Changed event. */ 
 124 void EVENT_USB_ConfigurationChanged(void) 
 126         LEDs_SetAllLEDs(LEDMASK_USB_READY
); 
 128         if (!(USB_HID_ConfigureEndpoints(&Keyboard_HID_Interface
))) 
 129           LEDs_SetAllLEDs(LEDMASK_USB_ERROR
); 
 131         if (!(USB_HID_ConfigureEndpoints(&Mouse_HID_Interface
))) 
 132           LEDs_SetAllLEDs(LEDMASK_USB_ERROR
); 
 135 /** Event handler for the library USB Unhandled Control Packet event. */ 
 136 void EVENT_USB_UnhandledControlPacket(void) 
 138         USB_HID_ProcessControlPacket(&Keyboard_HID_Interface
); 
 139         USB_HID_ProcessControlPacket(&Mouse_HID_Interface
); 
 142 /** ISR to keep track of each millisecond interrupt, for determining the HID class idle period remaining when set. */ 
 143 ISR(TIMER0_COMPA_vect
, ISR_BLOCK
) 
 145         if (Keyboard_HID_Interface
.IdleMSRemaining
) 
 146           Keyboard_HID_Interface
.IdleMSRemaining
--; 
 148         if (Mouse_HID_Interface
.IdleMSRemaining
) 
 149           Mouse_HID_Interface
.IdleMSRemaining
--; 
 152 /** HID class driver callback function for the creation of HID reports to the host. 
 154  *  \param HIDInterfaceInfo  Pointer to the HID class interface configuration structure being referenced 
 155  *  \param ReportData  Pointer to a buffer where the created report should be stored 
 157  *  \return Number of bytes written in the report (or zero if no report is to be sent 
 159 uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t
* HIDInterfaceInfo
, uint8_t* ReportID
, void* ReportData
) 
 161         uint8_t JoyStatus_LCL    
= Joystick_GetStatus(); 
 162         uint8_t ButtonStatus_LCL 
= Buttons_GetStatus(); 
 164         if (HIDInterfaceInfo 
== &Keyboard_HID_Interface
) 
 166                 USB_KeyboardReport_Data_t
* KeyboardReport 
= (USB_KeyboardReport_Data_t
*)ReportData
; 
 168                 /* If first board button not being held down, no keyboard report */ 
 169                 if (!(ButtonStatus_LCL 
& BUTTONS_BUTTON1
)) 
 172                 if (JoyStatus_LCL 
& JOY_UP
) 
 173                   KeyboardReport
->KeyCode
[0] = 0x04; // A 
 174                 else if (JoyStatus_LCL 
& JOY_DOWN
) 
 175                   KeyboardReport
->KeyCode
[0] = 0x05; // B 
 177                 if (JoyStatus_LCL 
& JOY_LEFT
) 
 178                   KeyboardReport
->KeyCode
[0] = 0x06; // C 
 179                 else if (JoyStatus_LCL 
& JOY_RIGHT
) 
 180                   KeyboardReport
->KeyCode
[0] = 0x07; // D 
 182                 if (JoyStatus_LCL 
& JOY_PRESS
) 
 183                   KeyboardReport
->KeyCode
[0] = 0x08; // E 
 185                 return sizeof(USB_KeyboardReport_Data_t
); 
 189                 USB_MouseReport_Data_t
* MouseReport 
= (USB_MouseReport_Data_t
*)ReportData
; 
 191                 /* If first board button being held down, no mouse report */ 
 192                 if (ButtonStatus_LCL 
& BUTTONS_BUTTON1
) 
 195                 if (JoyStatus_LCL 
& JOY_UP
) 
 197                 else if (JoyStatus_LCL 
& JOY_DOWN
) 
 200                 if (JoyStatus_LCL 
& JOY_RIGHT
) 
 202                 else if (JoyStatus_LCL 
& JOY_LEFT
) 
 205                 if (JoyStatus_LCL 
& JOY_PRESS
) 
 206                   MouseReport
->Button  
= (1 << 0); 
 208                 return sizeof(USB_MouseReport_Data_t
);           
 212 /** HID class driver callback function for the processing of HID reports from the host. 
 214  *  \param HIDInterfaceInfo  Pointer to the HID class interface configuration structure being referenced 
 215  *  \param ReportData  Pointer to a buffer where the created report has been stored 
 216  *  \param ReportSize  Size in bytes of the received HID report 
 218 void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t
* HIDInterfaceInfo
, uint8_t ReportID
, 
 219                                                void* ReportData
, uint16_t ReportSize
) 
 221         if (HIDInterfaceInfo 
== &Keyboard_HID_Interface
) 
 223                 uint8_t  LEDMask   
= LEDS_NO_LEDS
; 
 224                 uint8_t* LEDReport 
= (uint8_t*)ReportData
; 
 226                 if (*LEDReport 
& 0x01) // NUM Lock 
 227                   LEDMask 
|= LEDS_LED1
; 
 229                 if (*LEDReport 
& 0x02) // CAPS Lock 
 230                   LEDMask 
|= LEDS_LED3
; 
 232                 if (*LEDReport 
& 0x04) // SCROLL Lock 
 233                   LEDMask 
|= LEDS_LED4
; 
 235                 LEDs_SetAllLEDs(LEDMask
);