00001
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 #include "config.h"
00044 #include "conf_usb.h"
00045 #include "keyboard_task.h"
00046 #include "lib_board/stk_525/stk_525.h"
00047 #include "lib_mcu/usb/usb_drv.h"
00048 #include "usb_descriptors.h"
00049 #include "modules/usb/device_chap9/usb_standard_request.h"
00050 #include "lib_mcu/power/power_drv.h"
00051
00052
00053
00054
00055 U8 code usb_keys[]= {HID_ENTER, \
00056 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\
00057 ,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\
00058 ,HID_KEYPAD_MINUS,HID_SPACEBAR,HID_U,HID_S,HID_B,HID_SPACEBAR,HID_O,HID_T,HID_G,HID_SPACEBAR,HID_ENTER\
00059 ,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\
00060 ,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\
00061 ,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\
00062 ,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\
00063 ,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\
00064 ,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\
00065 };
00066
00067 #define SIZEOF_USB_KEYS (Uint16)sizeof(usb_keys)
00068
00069
00070
00071
00072 volatile U8 cpt_sof;
00073 U8 transmit_no_key;
00074 volatile bit key_hit;
00075 U8 usb_key;
00076 U8 usb_kbd_state;
00077 U16 usb_data_to_send;
00078 #ifdef __GNUC__
00079 PGM_VOID_P usb_key_pointer;
00080 #else
00081 U8 code * usb_key_pointer;
00082 #endif
00083
00084
00087 void keyboard_task_init(void)
00088 {
00089 transmit_no_key = FALSE;
00090 key_hit = FALSE;
00091 usb_kbd_state = 0;
00092 Joy_init();
00093 cpt_sof = 0;
00094 }
00095
00096
00100 void keyboard_task(void)
00101 {
00102 if(Is_device_enumerated())
00103 {
00104
00105
00106
00107
00108 if (key_hit==FALSE)
00109 {
00110 kbd_test_hit();
00111 }
00112
00113 else
00114 {
00115 Usb_select_endpoint(EP_KBD_IN);
00116 if(Is_usb_write_enabled())
00117 {
00118 if ( transmit_no_key==FALSE)
00119 {
00120 transmit_no_key = TRUE;
00121 Usb_write_byte(HID_MODIFIER_NONE);
00122 Usb_write_byte(0);
00123 Usb_write_byte(usb_key);
00124 Usb_write_byte(0);
00125 Usb_write_byte(0);
00126 Usb_write_byte(0);
00127 Usb_write_byte(0);
00128 Usb_write_byte(0);
00129 Usb_send_in();
00130 return;
00131 }
00132 else
00133 {
00134 key_hit = FALSE;
00135 transmit_no_key = FALSE;
00136 Usb_write_byte(0);
00137 Usb_write_byte(0);
00138 Usb_write_byte(0);
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_send_in();
00145 }
00146 }
00147 }
00148 }
00149 }
00150
00151
00156 void kbd_test_hit(void)
00157 {
00158 switch (usb_kbd_state)
00159 {
00160 case 0:
00161 if (Is_btn_middle())
00162 {
00163 usb_kbd_state = 1;
00164 usb_key_pointer = usb_keys;
00165 usb_data_to_send = SIZEOF_USB_KEYS;
00166 }
00167 break;
00168
00169 case 1:
00170 if (usb_data_to_send != 0)
00171 {
00172 if ((key_hit == FALSE) && (transmit_no_key == FALSE))
00173 {
00174 #ifndef __GNUC__
00175 usb_key = *usb_key_pointer++;
00176 #else
00177 usb_key = pgm_read_byte_near(usb_key_pointer++);
00178 #endif
00179 usb_data_to_send --;
00180 key_hit = TRUE;
00181 }
00182 }
00183 else
00184 {
00185 usb_kbd_state = 0;
00186 }
00187 break;
00188 }
00189 }
00190
00191
00197 void vbus_off_action(void)
00198 {
00199 Usb_detach();
00200 }
00201
00202
00203 void suspend_action(void)
00204 {
00205 #if (USB_REMOTE_WAKEUP_FEATURE == ENABLED)
00206 if (remote_wakeup_feature == ENABLED)
00207 {
00208 Switches_enable_it()
00209 }
00210 #endif
00211 Enable_interrupt();
00212 Enter_power_down_mode();
00213 }
00214
00215
00216 #ifdef __GNUC__
00217 ISR(PCINT0_vect)
00218 #else
00219 #pragma vector = PCINT0_vect
00220 __interrupt void mouse_disco_int()
00221 #endif
00222 {
00223 Switches_disable_it();
00224 usb_generate_remote_wakeup();
00225 }
00226