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
00044
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
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
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
00108
00109
00110
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);
00125 Usb_write_byte(0);
00126 Usb_write_byte(usb_key);
00127 Usb_write_byte(0);
00128 Usb_write_byte(0);
00129 Usb_write_byte(0);
00130 Usb_write_byte(0);
00131 Usb_write_byte(0);
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