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_mcu/usb/usb_drv.h"
00050 #include "usb_descriptors.h"
00051 #include "modules/usb/device_chap9/usb_standard_request.h"
00052 #include "lib_mcu/power/power_drv.h"
00053
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
00071
00072 U8 code usb_keyup[]= {\
00073 HID_UP, \
00074 };
00075 U8 code usb_keydown[]= {\
00076 HID_DOWN, \
00077 };
00078 U8 code usb_keyright[]= {\
00079 HID_RIGHT, \
00080 };
00081 U8 code usb_keyleft[]= {\
00082 HID_LEFT, \
00083 };
00084
00085
00086
00087 #define SIZEOF_USB_KEYS (Uint16)sizeof(usb_keys)
00088
00089
00090
00091
00092 volatile U8 cpt_sof;
00093 U8 transmit_no_key;
00094 volatile bit key_hit;
00095 U8 usb_key;
00096 U8 usb_kbd_state;
00097 U16 usb_data_to_send;
00098 #ifdef __GNUC__
00099 PGM_VOID_P usb_key_pointer;
00100 #else
00101 U8 code * usb_key_pointer;
00102 #endif
00103
00104
00107 void keyboard_task_init(void)
00108 {
00109 transmit_no_key = FALSE;
00110 key_hit = FALSE;
00111 usb_kbd_state = 0;
00112 Joy_init();
00113 cpt_sof = 0;
00114 Usb_enable_sof_interrupt();
00115 }
00116
00117
00121 void keyboard_task(void)
00122 {
00123 if(Is_device_enumerated())
00124 {
00125
00126
00127
00128
00129 if (key_hit==FALSE )
00130 {
00131
00132 if (cpt_sof>= NB_IDLE_POLLING_SOF)
00133 {
00134 kbd_test_hit();
00135 cpt_sof = 0;
00136 }
00137 }
00138
00139 else
00140 {
00141 Usb_select_endpoint(EP_KBD_IN);
00142 if(Is_usb_write_enabled())
00143 {
00144 if ( transmit_no_key==FALSE)
00145 {
00146 transmit_no_key = TRUE;
00147 Usb_write_byte(HID_MODIFIER_NONE);
00148 Usb_write_byte(0);
00149 Usb_write_byte(usb_key);
00150 Usb_write_byte(0);
00151 Usb_write_byte(0);
00152 Usb_write_byte(0);
00153 Usb_write_byte(0);
00154 Usb_write_byte(0);
00155 Usb_send_in();
00156 return;
00157 }
00158 else
00159 {
00160 key_hit = FALSE;
00161 transmit_no_key = FALSE;
00162 Usb_write_byte(0);
00163 Usb_write_byte(0);
00164 Usb_write_byte(0);
00165 Usb_write_byte(0);
00166 Usb_write_byte(0);
00167 Usb_write_byte(0);
00168 Usb_write_byte(0);
00169 Usb_write_byte(0);
00170 Usb_send_in();
00171 }
00172 }
00173 }
00174 }
00175 }
00176
00177
00182 void kbd_test_hit(void)
00183 {
00184 switch (usb_kbd_state)
00185 {
00186 case 0:
00187 if (Is_btn_middle())
00188 {
00189 usb_kbd_state = 1;
00190 usb_key_pointer = usb_keys;
00191 usb_data_to_send = SIZEOF_USB_KEYS;
00192 }
00193 else if (Is_joy_up())
00194 {
00195 usb_kbd_state = 1;
00196 usb_key_pointer = usb_keyup;
00197 usb_data_to_send = (Uint16)sizeof(usb_keyup);
00198 }
00199 else if (Is_joy_down())
00200 {
00201 usb_kbd_state = 1;
00202 usb_key_pointer = usb_keydown;
00203 usb_data_to_send = (Uint16)sizeof(usb_keydown);
00204 }
00205 else if (Is_joy_right())
00206 {
00207 usb_kbd_state = 1;
00208 usb_key_pointer = usb_keyright;
00209 usb_data_to_send = (Uint16)sizeof(usb_keyright);
00210 }
00211 else if (Is_joy_left())
00212 {
00213 usb_kbd_state = 1;
00214 usb_key_pointer = usb_keyleft;
00215 usb_data_to_send = (Uint16)sizeof(usb_keyleft);
00216 }
00217
00218 break;
00219
00220 case 1:
00221 if (usb_data_to_send != 0)
00222 {
00223 if ((key_hit == FALSE) && (transmit_no_key == FALSE))
00224 {
00225 #ifndef __GNUC__
00226 usb_key = *usb_key_pointer++;
00227 #else
00228 usb_key = pgm_read_byte_near(usb_key_pointer++);
00229 #endif
00230 usb_data_to_send --;
00231 key_hit = TRUE;
00232 }
00233 }
00234 else
00235 {
00236 usb_kbd_state = 0;
00237 }
00238 break;
00239 }
00240 }
00241
00242
00248 void vbus_off_action(void)
00249 {
00250 Usb_detach();
00251 }
00252
00253
00254 void suspend_action(void)
00255 {
00256 #if (USB_REMOTE_WAKEUP_FEATURE == ENABLED)
00257 if (remote_wakeup_feature == ENABLED)
00258 {
00259 Switches_enable_it()
00260 }
00261 #endif
00262 Enable_interrupt();
00263 Enter_power_down_mode();
00264 }
00265
00266
00267 #ifdef __GNUC__
00268 ISR(PCINT0_vect)
00269 #else
00270 #pragma vector = PCINT0_vect
00271 __interrupt void mouse_disco_int()
00272 #endif
00273 {
00274 Switches_disable_it();
00275 usb_generate_remote_wakeup();
00276 }
00277
00278
00279 void sof_action(void)
00280 {
00281 cpt_sof++;
00282 }