@@ -220,6 +220,34 @@ void board_kblight_init(void)
220220#define FN_PRESSED BIT(0)
221221#define FN_LOCKED BIT(1)
222222static uint8_t Fn_key ;
223+ static uint32_t fn_key_table_media ;
224+ static uint32_t fn_key_table ;
225+
226+ int fn_table_media_set (int8_t pressed , uint32_t fn_bit )
227+ {
228+ if (pressed ) {
229+ fn_key_table_media |= fn_bit ;
230+ return true;
231+ } else if (!pressed && (fn_key_table_media & fn_bit )) {
232+ fn_key_table_media &= ~fn_bit ;
233+ return true;
234+ }
235+
236+ return false;
237+ }
238+
239+ int fn_table_set (int8_t pressed , uint32_t fn_bit )
240+ {
241+ if (pressed && (Fn_key & FN_PRESSED )) {
242+ fn_key_table |= fn_bit ;
243+ return true;
244+ } else if (!pressed && (fn_key_table & fn_bit )) {
245+ fn_key_table &= ~fn_bit ;
246+ return true;
247+ }
248+
249+ return false;
250+ }
223251
224252void fnkey_shutdown (void ) {
225253 uint8_t current_kb = 0 ;
@@ -248,63 +276,74 @@ void fnkey_startup(void) {
248276}
249277DECLARE_HOOK (HOOK_CHIPSET_STARTUP , fnkey_startup , HOOK_PRIO_DEFAULT );
250278
251- int hotkey_F1_F12 (uint16_t * key_code , uint16_t lock , int8_t pressed )
279+ int hotkey_F1_F12 (uint16_t * key_code , uint16_t fn , int8_t pressed )
252280{
253281 const uint16_t prss_key = * key_code ;
254282
255- if (!(Fn_key & FN_LOCKED ) && lock & FN_PRESSED )
283+ if (!(Fn_key & FN_LOCKED ) &&
284+ (fn & FN_PRESSED ))
285+ return EC_SUCCESS ;
286+ else if (Fn_key & FN_LOCKED &&
287+ !(fn & FN_PRESSED ) &&
288+ !fn_key_table_media )
256289 return EC_SUCCESS ;
257- else if (Fn_key & FN_LOCKED && !( Fn_key & FN_PRESSED ) )
290+ else if (! fn_key_table_media && ! pressed )
258291 return EC_SUCCESS ;
259292
260293 switch (prss_key ) {
261294 case SCANCODE_F1 : /* SPEAKER_MUTE */
262- * key_code = SCANCODE_VOLUME_MUTE ;
295+ if (fn_table_media_set (pressed , KB_FN_F1 ))
296+ * key_code = SCANCODE_VOLUME_MUTE ;
263297 break ;
264298 case SCANCODE_F2 : /* VOLUME_DOWN */
265- * key_code = SCANCODE_VOLUME_DOWN ;
266-
299+ if ( fn_table_media_set ( pressed , KB_FN_F2 ))
300+ * key_code = SCANCODE_VOLUME_DOWN ;
267301 break ;
268302 case SCANCODE_F3 : /* VOLUME_UP */
269- * key_code = SCANCODE_VOLUME_UP ;
270-
303+ if ( fn_table_media_set ( pressed , KB_FN_F3 ))
304+ * key_code = SCANCODE_VOLUME_UP ;
271305 break ;
272306 case SCANCODE_F4 : /* PREVIOUS_TRACK */
273- * key_code = SCANCODE_PREV_TRACK ;
274-
307+ if ( fn_table_media_set ( pressed , KB_FN_F4 ))
308+ * key_code = SCANCODE_PREV_TRACK ;
275309 break ;
276310 case SCANCODE_F5 : /* PLAY_PAUSE */
277- * key_code = 0xe034 ;
278-
311+ if ( fn_table_media_set ( pressed , KB_FN_F5 ))
312+ * key_code = 0xe034 ;
279313 break ;
280314 case SCANCODE_F6 : /* NEXT_TRACK */
281- * key_code = SCANCODE_NEXT_TRACK ;
282-
315+ if ( fn_table_media_set ( pressed , KB_FN_F6 ))
316+ * key_code = SCANCODE_NEXT_TRACK ;
283317 break ;
284318 case SCANCODE_F7 : /* TODO: DIM_SCREEN */
285- update_hid_key (HID_KEY_DISPLAY_BRIGHTNESS_DN , pressed );
286- return EC_ERROR_UNIMPLEMENTED ;
287-
319+ if (fn_table_media_set (pressed , KB_FN_F7 )) {
320+ update_hid_key (HID_KEY_DISPLAY_BRIGHTNESS_DN , pressed );
321+ return EC_ERROR_UNIMPLEMENTED ;
322+ }
288323 break ;
289324 case SCANCODE_F8 : /* TODO: BRIGHTEN_SCREEN */
290- update_hid_key (HID_KEY_DISPLAY_BRIGHTNESS_UP , pressed );
291- return EC_ERROR_UNIMPLEMENTED ;
292-
325+ if (fn_table_media_set (pressed , KB_FN_F8 )) {
326+ update_hid_key (HID_KEY_DISPLAY_BRIGHTNESS_UP , pressed );
327+ return EC_ERROR_UNIMPLEMENTED ;
328+ }
293329 break ;
294330 case SCANCODE_F9 : /* EXTERNAL_DISPLAY */
295- if (pressed ) {
296- simulate_keyboard (SCANCODE_LEFT_WIN , 1 );
297- simulate_keyboard (SCANCODE_P , 1 );
298- } else {
299- simulate_keyboard (SCANCODE_P , 0 );
300- simulate_keyboard (SCANCODE_LEFT_WIN , 0 );
331+ if (fn_table_media_set (pressed , KB_FN_F9 )) {
332+ if (pressed ) {
333+ simulate_keyboard (SCANCODE_LEFT_WIN , 1 );
334+ simulate_keyboard (SCANCODE_P , 1 );
335+ } else {
336+ simulate_keyboard (SCANCODE_P , 0 );
337+ simulate_keyboard (SCANCODE_LEFT_WIN , 0 );
338+ }
339+ return EC_ERROR_UNIMPLEMENTED ;
301340 }
302- return EC_ERROR_UNIMPLEMENTED ;
303341 break ;
304342 case SCANCODE_F10 : /* FLIGHT_MODE */
305- update_hid_key (HID_KEY_AIRPLANE_MODE , pressed );
306- return EC_ERROR_UNIMPLEMENTED ;
307-
343+ if (fn_table_media_set (pressed , KB_FN_F10 )) {
344+ update_hid_key (HID_KEY_AIRPLANE_MODE , pressed );
345+ return EC_ERROR_UNIMPLEMENTED ;
346+ }
308347 break ;
309348 case SCANCODE_F11 :
310349 /*
@@ -313,99 +352,128 @@ int hotkey_F1_F12(uint16_t *key_code, uint16_t lock, int8_t pressed)
313352 * 0xE012 0xE07C to simulate
314353 * PRINT_SCREEN
315354 */
316- * key_code = 0xE07C ;
355+ if (fn_table_media_set (pressed , KB_FN_F11 ))
356+ * key_code = 0xE07C ;
317357 break ;
318358 case SCANCODE_F12 : /* TODO: FRAMEWORK */
319359 /* Media Select scan code */
320- * key_code = 0xE050 ;
321-
360+ if ( fn_table_media_set ( pressed , KB_FN_F12 ))
361+ * key_code = 0xE050 ;
322362 break ;
363+ default :
364+ return EC_SUCCESS ;
323365 }
324366 return EC_SUCCESS ;
325367}
326368
327369
328- int hotkey_special_key (uint16_t * key_code )
370+ int hotkey_special_key (uint16_t * key_code , int8_t pressed )
329371{
330372 const uint16_t prss_key = * key_code ;
331373
332374 switch (prss_key ) {
333375 case SCANCODE_DELETE : /* TODO: INSERT */
334- * key_code = 0xe070 ;
376+ if (fn_table_set (pressed , KB_FN_DELETE ))
377+ * key_code = 0xe070 ;
335378 break ;
336379 case SCANCODE_K : /* TODO: SCROLL_LOCK */
337- * key_code = SCANCODE_SCROLL_LOCK ;
380+ if (fn_table_set (pressed , KB_FN_K ))
381+ * key_code = SCANCODE_SCROLL_LOCK ;
338382 break ;
339383 case SCANCODE_S : /* TODO: SYSRQ */
384+ /*if (!fn_table_set(pressed, KB_FN_S))*/
340385
341386 break ;
342387 case SCANCODE_LEFT : /* HOME */
343- * key_code = 0xe06c ;
388+ if (fn_table_set (pressed , KB_FN_LEFT ))
389+ * key_code = 0xe06c ;
344390 break ;
345391 case SCANCODE_RIGHT : /* END */
346- * key_code = 0xe069 ;
392+ if (fn_table_set (pressed , KB_FN_RIGHT ))
393+ * key_code = 0xe069 ;
347394 break ;
348395 case SCANCODE_UP : /* PAGE_UP */
349- * key_code = 0xe07d ;
396+ if (fn_table_set (pressed , KB_FN_UP ))
397+ * key_code = 0xe07d ;
350398 break ;
351399 case SCANCODE_DOWN : /* PAGE_DOWN */
352- * key_code = 0xe07a ;
400+ if (fn_table_set (pressed , KB_FN_DOWN ))
401+ * key_code = 0xe07a ;
353402 break ;
403+ default :
404+ return EC_SUCCESS ;
354405 }
406+
355407 return EC_SUCCESS ;
356408}
357409
358- int functional_hotkey (uint16_t * key_code )
410+ int functional_hotkey (uint16_t * key_code , int8_t pressed )
359411{
360412 const uint16_t prss_key = * key_code ;
361413 uint8_t bl_brightness = 0 ;
362414
363415 switch (prss_key ) {
364416 case SCANCODE_ESC : /* TODO: FUNCTION_LOCK */
365- if (Fn_key & FN_LOCKED )
366- Fn_key &= ~FN_LOCKED ;
367- else
368- Fn_key |= FN_LOCKED ;
369- return EC_ERROR_UNIMPLEMENTED ;
417+ if (fn_table_set (pressed , KB_FN_ESC )) {
418+ if (pressed ) {
419+ if (Fn_key & FN_LOCKED )
420+ Fn_key &= ~FN_LOCKED ;
421+ else
422+ Fn_key |= FN_LOCKED ;
423+ }
424+ return EC_ERROR_UNIMPLEMENTED ;
425+ }
370426 break ;
371427 case SCANCODE_B :
372428 /* BREAK_KEY */
373- simulate_keyboard (0xe07e , 1 );
374- simulate_keyboard (0xe0 , 1 );
375- simulate_keyboard (0x7e , 0 );
376- return EC_ERROR_UNIMPLEMENTED ;
429+ if (fn_table_set (pressed , KB_FN_B )) {
430+ if (pressed ) {
431+ simulate_keyboard (0xe07e , 1 );
432+ simulate_keyboard (0xe0 , 1 );
433+ simulate_keyboard (0x7e , 0 );
434+ }
435+ return EC_ERROR_UNIMPLEMENTED ;
436+ }
377437 break ;
378438 case SCANCODE_P :
379439 /* PAUSE_KEY */
380- simulate_keyboard (0xe114 , 1 );
381- simulate_keyboard (0x77 , 1 );
382- simulate_keyboard (0xe1 , 1 );
383- simulate_keyboard (0x14 , 0 );
384- simulate_keyboard (0x77 , 0 );
385- return EC_ERROR_UNIMPLEMENTED ;
440+ if (fn_table_set (pressed , KB_FN_P )) {
441+ if (pressed ) {
442+ simulate_keyboard (0xe114 , 1 );
443+ simulate_keyboard (0x77 , 1 );
444+ simulate_keyboard (0xe1 , 1 );
445+ simulate_keyboard (0x14 , 0 );
446+ simulate_keyboard (0x77 , 0 );
447+ }
448+ return EC_ERROR_UNIMPLEMENTED ;
449+ }
386450 break ;
387451 case SCANCODE_SPACE : /* TODO: TOGGLE_KEYBOARD_BACKLIGHT */
388- bl_brightness = kblight_get ();
389- switch (bl_brightness ) {
390- case KEYBOARD_BL_BRIGHTNESS_LOW :
391- bl_brightness = KEYBOARD_BL_BRIGHTNESS_MED ;
392- break ;
393- case KEYBOARD_BL_BRIGHTNESS_MED :
394- bl_brightness = KEYBOARD_BL_BRIGHTNESS_HIGH ;
395- break ;
396- case KEYBOARD_BL_BRIGHTNESS_HIGH :
397- hx20_kblight_enable (0 );
398- bl_brightness = KEYBOARD_BL_BRIGHTNESS_OFF ;
399- break ;
400- default :
401- case KEYBOARD_BL_BRIGHTNESS_OFF :
402- hx20_kblight_enable (1 );
403- bl_brightness = KEYBOARD_BL_BRIGHTNESS_LOW ;
404- break ;
452+ if (fn_table_set (pressed , KB_FN_SPACE )) {
453+ if (pressed ) {
454+ bl_brightness = kblight_get ();
455+ switch (bl_brightness ) {
456+ case KEYBOARD_BL_BRIGHTNESS_LOW :
457+ bl_brightness = KEYBOARD_BL_BRIGHTNESS_MED ;
458+ break ;
459+ case KEYBOARD_BL_BRIGHTNESS_MED :
460+ bl_brightness = KEYBOARD_BL_BRIGHTNESS_HIGH ;
461+ break ;
462+ case KEYBOARD_BL_BRIGHTNESS_HIGH :
463+ hx20_kblight_enable (0 );
464+ bl_brightness = KEYBOARD_BL_BRIGHTNESS_OFF ;
465+ break ;
466+ default :
467+ case KEYBOARD_BL_BRIGHTNESS_OFF :
468+ hx20_kblight_enable (1 );
469+ bl_brightness = KEYBOARD_BL_BRIGHTNESS_LOW ;
470+ break ;
471+ }
472+ kblight_set (bl_brightness );
473+ }
474+ /* we dont want to pass the space key event to the OS */
475+ return EC_ERROR_UNIMPLEMENTED ;
405476 }
406- kblight_set (bl_brightness );
407- /* we dont want to pass the space key event to the OS */
408- return EC_ERROR_UNKNOWN ;
409477 break ;
410478 }
411479 return EC_SUCCESS ;
@@ -441,21 +509,16 @@ enum ec_error_list keyboard_scancode_callback(uint16_t *make_code,
441509 /*
442510 * If the function key is not held then
443511 * we pass through all events without modifying them
512+ * but if last time have press FN still need keep that
444513 */
445- if (!Fn_key )
446- return EC_SUCCESS ;
447-
448- if (Fn_key & FN_LOCKED && !(Fn_key & FN_PRESSED ))
514+ if (!(Fn_key & FN_PRESSED ) && !fn_key_table )
449515 return EC_SUCCESS ;
450516
451- r = hotkey_special_key (make_code );
517+ r = hotkey_special_key (make_code , pressed );
452518 if (r != EC_SUCCESS )
453519 return r ;
454520
455- if (!pressed || pressed_key != * make_code )
456- return EC_SUCCESS ;
457-
458- r = functional_hotkey (make_code );
521+ r = functional_hotkey (make_code , pressed );
459522 if (r != EC_SUCCESS )
460523 return r ;
461524
0 commit comments