3      Copyright (C) Dean Camera, 2009. 
   5   dean [at] fourwalledcubicle [dot] com 
   6       www.fourwalledcubicle.com 
  10   Copyright 2009  Denver Gingerich (denver [at] ossguy [dot] com) 
  11       Based on code by Dean Camera (dean [at] fourwalledcubicle [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 Keyboard demo. This file contains the main tasks of 
  35  *  the demo and is responsible for the initial application hardware configuration. 
  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. 
  44 USB_ClassInfo_HID_t Keyboard_HID_Interface 
= 
  48         .ReportINEndpointNumber  
= KEYBOARD_EPNUM
, 
  49         .ReportINEndpointSize    
= KEYBOARD_EPSIZE
, 
  51                 .ReportINBufferSize      
= sizeof(USB_KeyboardReport_Data_t
), 
  56 /** Main program entry point. This routine contains the overall program flow, including initial 
  57  *  setup of all components and the main program loop. 
  63     LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY
); 
  67         USB_HID_USBTask(&Keyboard_HID_Interface
); 
  72 /** Configures the board hardware and chip peripherals for the demo's functionality. */ 
  75     /* Disable watchdog if enabled by bootloader/fuses */ 
  76     MCUSR 
&= ~(1 << WDRF
); 
  79     /* Disable clock division */ 
  80     clock_prescale_set(clock_div_1
); 
  82     /* Hardware Initialization */ 
  88         /* Millisecond timer initialization, with output compare interrupt enabled for the idle timing */ 
  89         OCR0A  
= ((F_CPU 
/ 64) / 1000); 
  90         TCCR0A 
= (1 << WGM01
); 
  91         TCCR0B 
= ((1 << CS01
) | (1 << CS00
)); 
  92         TIMSK0 
= (1 << OCIE0A
); 
  95 /** Event handler for the library USB Connection event. */ 
  96 void EVENT_USB_Connect(void) 
  98     LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING
); 
 101 /** Event handler for the library USB Disconnection event. */ 
 102 void EVENT_USB_Disconnect(void) 
 104     LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY
); 
 107 /** Event handler for the library USB Configuration Changed event. */ 
 108 void EVENT_USB_ConfigurationChanged(void) 
 110     LEDs_SetAllLEDs(LEDMASK_USB_READY
); 
 112     if (!(USB_HID_ConfigureEndpoints(&Keyboard_HID_Interface
))) 
 113       LEDs_SetAllLEDs(LEDMASK_USB_ERROR
); 
 116 /** Event handler for the library USB Unhandled Control Packet event. */ 
 117 void EVENT_USB_UnhandledControlPacket(void) 
 119     USB_HID_ProcessControlPacket(&Keyboard_HID_Interface
); 
 122 /** ISR to keep track of each millisecond interrupt, for determining the HID class idle period remaining when set. */ 
 123 ISR(TIMER0_COMPA_vect
, ISR_BLOCK
) 
 125         if (Keyboard_HID_Interface
.IdleMSRemaining
) 
 126           Keyboard_HID_Interface
.IdleMSRemaining
--; 
 129 /** HID class driver callback function for the creation of HID reports to the host. 
 131  *  \param HIDInterfaceInfo  Pointer to the HID class interface configuration structure being referenced 
 132  *  \param ReportData  Pointer to a buffer where the created report should be stored 
 134  *  \return Number of bytes written in the report (or zero if no report is to be sent 
 136 uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t
* HIDInterfaceInfo
, uint8_t* ReportID
, void* ReportData
) 
 138     USB_KeyboardReport_Data_t
* KeyboardReport 
= (USB_KeyboardReport_Data_t
*)ReportData
; 
 140     uint8_t JoyStatus_LCL    
= Joystick_GetStatus(); 
 141     uint8_t ButtonStatus_LCL 
= Buttons_GetStatus(); 
 143     if (JoyStatus_LCL 
& JOY_UP
) 
 144       KeyboardReport
->KeyCode
[0] = 0x04; // A 
 145     else if (JoyStatus_LCL 
& JOY_DOWN
) 
 146       KeyboardReport
->KeyCode
[0] = 0x05; // B 
 148     if (JoyStatus_LCL 
& JOY_LEFT
) 
 149       KeyboardReport
->KeyCode
[0] = 0x06; // C 
 150     else if (JoyStatus_LCL 
& JOY_RIGHT
) 
 151       KeyboardReport
->KeyCode
[0] = 0x07; // D 
 153     if (JoyStatus_LCL 
& JOY_PRESS
) 
 154       KeyboardReport
->KeyCode
[0] = 0x08; // E 
 156     if (ButtonStatus_LCL 
& BUTTONS_BUTTON1
) 
 157       KeyboardReport
->KeyCode
[0] = 0x09; // F 
 159     return sizeof(USB_KeyboardReport_Data_t
); 
 162 /** HID class driver callback function for the processing of HID reports from the host. 
 164  *  \param HIDInterfaceInfo  Pointer to the HID class interface configuration structure being referenced 
 165  *  \param ReportData  Pointer to a buffer where the created report has been stored 
 166  *  \param ReportSize  Size in bytes of the received HID report 
 168 void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t
* HIDInterfaceInfo
, uint8_t ReportID
, 
 169                                                void* ReportData
, uint16_t ReportSize
) 
 171     uint8_t  LEDMask   
= LEDS_NO_LEDS
; 
 172     uint8_t* LEDReport 
= (uint8_t*)ReportData
; 
 174     if (*LEDReport 
& 0x01) // NUM Lock 
 175       LEDMask 
|= LEDS_LED1
; 
 177     if (*LEDReport 
& 0x02) // CAPS Lock 
 178       LEDMask 
|= LEDS_LED3
; 
 180     if (*LEDReport 
& 0x04) // SCROLL Lock 
 181       LEDMask 
|= LEDS_LED4
; 
 183     LEDs_SetAllLEDs(LEDMask
);