Skip to content

Commit 66fd5cf

Browse files
committed
[modify] make sure F1-12 key scancode is consistent
test step: Press Fn -> Press F2 -> release FN -> release F2 is normal FN + F2 scancode. Signed-off-by: Leo_Tsai <LeoCX_Tsai@compal.com>
1 parent edaca6c commit 66fd5cf

2 files changed

Lines changed: 174 additions & 85 deletions

File tree

board/hx30/keyboard_customization.c

Lines changed: 148 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,34 @@ void board_kblight_init(void)
220220
#define FN_PRESSED BIT(0)
221221
#define FN_LOCKED BIT(1)
222222
static 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

224252
void fnkey_shutdown(void) {
225253
uint8_t current_kb = 0;
@@ -248,63 +276,74 @@ void fnkey_startup(void) {
248276
}
249277
DECLARE_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

board/hx30/keyboard_customization.h

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,32 @@ extern uint8_t keyboard_cols;
7272
#define KEYBOARD_ROW_LEFT_SHIFT 5
7373
#define KEYBOARD_MASK_LEFT_SHIFT KEYBOARD_ROW_TO_MASK(KEYBOARD_ROW_LEFT_SHIFT)
7474

75+
enum kb_fn_table {
76+
KB_FN_F1 = BIT(0),
77+
KB_FN_F2 = BIT(1),
78+
KB_FN_F3 = BIT(2),
79+
KB_FN_F4 = BIT(3),
80+
KB_FN_F5 = BIT(4),
81+
KB_FN_F6 = BIT(5),
82+
KB_FN_F7 = BIT(6),
83+
KB_FN_F8 = BIT(7),
84+
KB_FN_F9 = BIT(8),
85+
KB_FN_F10 = BIT(9),
86+
KB_FN_F11 = BIT(10),
87+
KB_FN_F12 = BIT(11),
88+
KB_FN_DELETE = BIT(12),
89+
KB_FN_K = BIT(13),
90+
KB_FN_S = BIT(14),
91+
KB_FN_LEFT = BIT(15),
92+
KB_FN_RIGHT = BIT(16),
93+
KB_FN_UP = BIT(17),
94+
KB_FN_DOWN = BIT(18),
95+
KB_FN_ESC = BIT(19),
96+
KB_FN_B = BIT(20),
97+
KB_FN_P = BIT(21),
98+
KB_FN_SPACE = BIT(22),
99+
};
100+
75101
#ifdef CONFIG_KEYBOARD_BACKLIGHT
76102
int hx20_kblight_enable(int enable);
77103
#endif

0 commit comments

Comments
 (0)