keyboard_task.c

Go to the documentation of this file.
00001 /*This file is prepared for Doxygen automatic documentation generation.*/
00013 
00014 /* Copyright (c) 2009 Atmel Corporation. All rights reserved.
00015  *
00016  * Redistribution and use in source and binary forms, with or without
00017  * modification, are permitted provided that the following conditions are met:
00018  *
00019  * 1. Redistributions of source code must retain the above copyright notice,
00020  * this list of conditions and the following disclaimer.
00021  *
00022  * 2. Redistributions in binary form must reproduce the above copyright notice,
00023  * this list of conditions and the following disclaimer in the documentation
00024  * and/or other materials provided with the distribution.
00025  *
00026  * 3. The name of Atmel may not be used to endorse or promote products derived
00027  * from this software without specific prior written permission.
00028  *
00029  * 4. This software may only be redistributed and used in connection with an Atmel
00030  * AVR product.
00031  *
00032  * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
00033  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
00034  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE EXPRESSLY AND
00035  * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT,
00036  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
00037  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
00038  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
00039  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00040  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
00041  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00042  */
00043 
00044 //_____  I N C L U D E S ___________________________________________________
00045 
00046 #include "config.h"
00047 #include "conf_usb.h"
00048 #include "keyboard_task.h"
00049 #include "lib_board/stk_525/stk_525.h"
00050 #include "lib_mcu/usb/usb_drv.h"
00051 #include "usb_descriptors.h"
00052 #include "modules/usb/device_chap9/usb_standard_request.h"
00053 #include "lib_mcu/power/power_drv.h"
00054 
00055 
00056 //_____ D E F I N I T I O N S ______________________________________________
00057 
00058 U8  code    usb_keys[]= {HID_ENTER, \
00059 HID_W, HID_E, HID_L, HID_C, HID_O, HID_M, HID_E, HID_SPACEBAR, HID_T, HID_O, HID_SPACEBAR, HID_H, HID_I, HID_D, HID_SPACEBAR, HID_K, HID_E, HID_Y, HID_B, HID_O, HID_A, HID_R, HID_D, HID_SPACEBAR, HID_D, HID_E, HID_M, HID_O, HID_SPACEBAR, HID_A, HID_N, HID_D, HID_SPACEBAR, HID_C, HID_O, HID_N, HID_G, HID_R, HID_A, HID_T, HID_U, HID_L, HID_A, HID_T, HID_I, HID_O, HID_N, HID_S, HID_SPACEBAR, HID_F, HID_O, HID_R, HID_SPACEBAR, HID_S, HID_E, HID_L, HID_E, HID_C, HID_T, HID_I, HID_N, HID_G, HID_SPACEBAR, HID_T, HID_H, HID_E, HID_SPACEBAR, HID_A, HID_T, HID_9, HID_0, HID_U, HID_S, HID_B, HID_X, HID_X, HID_X, HID_SPACEBAR, HID_M, HID_I, HID_C, HID_R, HID_O, HID_C, HID_O, HID_N, HID_T, HID_R, HID_O, HID_L, HID_L, HID_E, HID_R, HID_SPACEBAR, HID_F, HID_A, HID_M, HID_I, HID_L, HID_Y, HID_DOT,HID_ENTER,HID_ENTER\
00060 ,HID_T, HID_H, HID_E, HID_SPACEBAR, HID_A, HID_T, HID_9, HID_0, HID_U, HID_S, HID_B, HID_X, HID_X, HID_X, HID_SPACEBAR,HID_I, HID_S, HID_SPACEBAR, HID_B, HID_A, HID_S, HID_E, HID_D, HID_SPACEBAR,HID_O, HID_N, HID_SPACEBAR, HID_T, HID_H, HID_E, HID_SPACEBAR, HID_A, HID_V, HID_R, HID_SPACEBAR, HID_C, HID_O, HID_R, HID_E, HID_SPACEBAR, HID_W, HID_I, HID_T, HID_H, HID_SPACEBAR, HID_T, HID_H, HID_E, HID_SPACEBAR, HID_F, HID_O, HID_L, HID_L, HID_O, HID_W, HID_I, HID_N, HID_G, HID_SPACEBAR, HID_F, HID_E, HID_A, HID_T, HID_U, HID_R, HID_E, HID_S, HID_ENTER\
00061 ,HID_KEYPAD_MINUS,HID_SPACEBAR,HID_U,HID_S,HID_B,HID_SPACEBAR,HID_O,HID_T,HID_G,HID_SPACEBAR,HID_ENTER\
00062 ,HID_KEYPAD_MINUS,HID_SPACEBAR,HID_L,HID_O,HID_W,HID_SLASH,HID_F,HID_U,HID_L,HID_L,HID_SPACEBAR,HID_S,HID_P,HID_E,HID_E,HID_D,HID_SPACEBAR,HID_C,HID_O,HID_N,HID_T,HID_R,HID_O,HID_L,HID_L,HID_E,HID_R,HID_SPACEBAR,HID_W,HID_I,HID_T,HID_H,HID_SPACEBAR,HID_7,HID_SPACEBAR,HID_E,HID_N,HID_D,HID_P,HID_O,HID_I,HID_N,HID_T,HID_S,HID_ENTER\
00063 ,HID_KEYPAD_MINUS,HID_SPACEBAR,HID_U,HID_P,HID_SPACEBAR,HID_T,HID_O,HID_SPACEBAR,HID_1,HID_2,HID_8,HID_SPACEBAR,HID_K,HID_B,HID_Y,HID_T,HID_E,HID_S,HID_SPACEBAR,HID_O,HID_N,HID_KEYPAD_MINUS,HID_C,HID_H,HID_I,HID_P,HID_SPACEBAR,HID_F,HID_L,HID_A,HID_S,HID_H,HID_SPACEBAR,HID_M,HID_E,HID_M,HID_O,HID_R,HID_Y,HID_ENTER\
00064 ,HID_KEYPAD_MINUS,HID_SPACEBAR,HID_U,HID_S,HID_B,HID_SPACEBAR,HID_B,HID_O,HID_O,HID_T,HID_L,HID_O,HID_A,HID_D,HID_E,HID_R,HID_ENTER\
00065 ,HID_KEYPAD_MINUS,HID_SPACEBAR,HID_U,HID_A,HID_R,HID_T,HID_SLASH,HID_S,HID_P,HID_I,HID_SLASH,HID_SPACEBAR,HID_T,HID_W,HID_I,HID_ENTER\
00066 ,HID_SPACEBAR,HID_SPACEBAR,HID_A,HID_N,HID_D,HID_SPACEBAR,HID_M,HID_O,HID_R,HID_E,HID_DOT,HID_DOT,HID_DOT,HID_ENTER\
00067 ,HID_E,HID_N,HID_J,HID_O,HID_Y,HID_SPACEBAR,HID_Y,HID_O,HID_U,HID_R,HID_SPACEBAR,HID_T,HID_I,HID_M,HID_E,HID_SPACEBAR,HID_W,HID_I,HID_T,HID_H,HID_SPACEBAR,HID_A,HID_T,HID_M,HID_E,HID_L,HID_SPACEBAR,HID_P,HID_R,HID_O,HID_D,HID_U,HID_C,HID_T,HID_S,HID_DOT,HID_DOT,HID_DOT\
00068                            };
00069 
00070 #define SIZEOF_USB_KEYS     (Uint16)sizeof(usb_keys)
00071 
00072 
00073 //_____ D E C L A R A T I O N S ____________________________________________
00074 
00075 volatile U8    cpt_sof;
00076          U8    transmit_no_key;
00077 volatile bit   key_hit;
00078          U8    usb_key;
00079          U8    usb_kbd_state;
00080          U16   usb_data_to_send;
00081 #ifdef __GNUC__
00082 PGM_VOID_P     usb_key_pointer;
00083 #else
00084 U8   code *    usb_key_pointer;
00085 #endif
00086 
00087 
00090 void keyboard_task_init(void)
00091 {
00092    transmit_no_key   = FALSE;
00093    key_hit           = FALSE;
00094    usb_kbd_state     = 0;
00095    Joy_init();
00096    cpt_sof           = 0;
00097 }
00098 
00099 
00103 void keyboard_task(void)
00104 {
00105    if(Is_device_enumerated())
00106    {
00107       // if USB ready to transmit new data :
00108       //        - if last time = 0, nothing
00109       //        - if key pressed -> transmit key
00110       //        - if !key pressed -> transmit 0
00111       if (key_hit==FALSE)
00112       {
00113          kbd_test_hit();
00114       }
00115       
00116       else
00117       {
00118          Usb_select_endpoint(EP_KBD_IN);   
00119          if(Is_usb_write_enabled())
00120          {
00121             if ( transmit_no_key==FALSE)
00122             {
00123                transmit_no_key = TRUE;
00124                Usb_write_byte(HID_MODIFIER_NONE);  // Byte0: Modifier
00125                Usb_write_byte(0);                  // Byte1: Reserved
00126                Usb_write_byte(usb_key);            // Byte2: Keycode 0
00127                Usb_write_byte(0);                  // Byte2: Keycode 1
00128                Usb_write_byte(0);                  // Byte2: Keycode 2
00129                Usb_write_byte(0);                  // Byte2: Keycode 3
00130                Usb_write_byte(0);                  // Byte2: Keycode 4
00131                Usb_write_byte(0);                  // Byte2: Keycode 5
00132                Usb_send_in();
00133                return;
00134             }
00135             else
00136             {
00137                key_hit = FALSE;
00138                transmit_no_key = FALSE;
00139                Usb_write_byte(0);
00140                Usb_write_byte(0);
00141                Usb_write_byte(0);
00142                Usb_write_byte(0);
00143                Usb_write_byte(0);
00144                Usb_write_byte(0);
00145                Usb_write_byte(0);
00146                Usb_write_byte(0);
00147                Usb_send_in();
00148             }
00149          }
00150       }
00151    }
00152 }
00153 
00154 
00159 void kbd_test_hit(void)
00160 {
00161    switch (usb_kbd_state)
00162    {
00163       case 0:
00164       if (Is_btn_middle())
00165       {
00166          usb_kbd_state = 1;
00167          usb_key_pointer = usb_keys;
00168          usb_data_to_send = SIZEOF_USB_KEYS;
00169       }
00170       break;
00171 
00172       case 1:
00173       if (usb_data_to_send != 0)
00174       {
00175          if ((key_hit == FALSE) && (transmit_no_key == FALSE))
00176          {
00177 #ifndef __GNUC__
00178             usb_key = *usb_key_pointer++;
00179 #else
00180             usb_key = pgm_read_byte_near(usb_key_pointer++);
00181 #endif
00182             usb_data_to_send --;
00183             key_hit = TRUE;
00184          }
00185       }
00186       else
00187       {
00188          usb_kbd_state = 0;
00189       }
00190       break;
00191    }
00192 }
00193 
00194 
00200 void vbus_off_action(void)
00201 {
00202    Usb_detach();
00203 }
00204 
00205 
00206 void suspend_action(void)
00207 {
00208 #if (USB_REMOTE_WAKEUP_FEATURE == ENABLED)
00209    if (remote_wakeup_feature == ENABLED)
00210    {
00211       Switches_enable_it()
00212    }
00213 #endif 
00214    Enable_interrupt();  
00215    Enter_power_down_mode();
00216 }
00217 
00218 
00219 #ifdef __GNUC__
00220  ISR(PCINT0_vect)
00221 #else
00222 #pragma vector = PCINT0_vect
00223 __interrupt void mouse_disco_int()
00224 #endif
00225 {
00226    Switches_disable_it();
00227    usb_generate_remote_wakeup();
00228 }
00229 

Generated on Mon Sep 14 14:09:01 2009 for ATMEL by  doxygen 1.5.3