F-Keys not working with Rii mini i8+ on Retropie 4.1
-
Hi all,
I have some problems with my mini keyboard rii i8+ on retropie. In several emulators (Stella, Vice) I am unable to start games or enter emulator menu, cause the keys F1 to F6 habe no effect. Rest of the keyboard keys seeems fine. I can connect my big keyboard (Logitech G105), press F3 on the logitech to start the games, and after that use my mini keyboard for gaming. But that is not comfortable ;)
I also tried the "Configure Input" Menu in emulation station. No reaction on F1 to F6.
In Raspi Config I tried choosing another keyboard layout. With only the Rii mini keyboard connected I'm unable to choose one, because I'm immideatly kicked back to main menu. Error message is too fast to read, if it's important I can try to grab log files. I switched keyboard layout to generic 105 Keys, German, by connecting my logitech keyboard.
I hope someone can help me.
-
@sasbob do you need to use the fn key with the f keys on that keyboard? Also why dont you just map different keys for those functions? Also, stella uses tab to get into the setup. Not sure why you need f keys if you can remap them in there. Same with remapping vice.
-
Ok, so there is only a workaround for this?
I managed to map f1 to 1 (and so on) in vice over the virtual keyboard and saved it into a keymap file, which is loaded on autostart.
There is one emulator missing, i cannot see those possibilities. I also use the atari 800 emulator in retropie. It haven't found the option to remap the f-keys in there. Also the menu is opened by f1, so to enter the menu I have to use another keyboard, too.
-
-
@sasbob you can use joymap to map the keys for atari 800/5200 emulator.
-
Necroing this thread for anyone else with this keyboard.
The issue persists to this day, which is irritating, because other than several keys not functioning in Raspbian this keyboard works flawlessly; it connects over BT rapidly after powering on without any hassle, it's small and easy to handle and has decent battery life.
Keys F1 to F6 have no effect at all in evtest. Keys F7-F12 return one or sometimes several keycodes that are used by other keys. Finally, it's not just the function keys, there are other keys that don't work too.
I'm guessing (and it really is a guess) that this is a problem at the driver level i.e. the scancodes are not being translated properly by the keyboard driver. I notice that the device name in the Bluetooth Setup menu is simply "Bluetooth 3.0 Macro Keyboard", which sounds pretty generic to me.
My feeling is it's a Raspbian driver issue, not specific to RetroPie. Maybe someone out there with more Linux knowledge than me (not a high bar to reach) knows how/if this can be remedied.
(The keyboard works fine in Windows, fwiw. I haven't tested with other Linux distros.)
-
@stoo Interesting. I have 2 of these little keyboards, not Bluetooth but the 2.4GHz wireless version and have no such issues. So, perhaps something peculiar to the Bluetooth drivers.
-
Reading this thread over, edmaul69 mentions using the Function keys to activate the F keys. I have a wireless Microsoft keyboard and can confirm that you must press the Function key to get the F# buttons working.
So it may be a symptom of the perticular keyboard setup. It’s rather annoying I will agree.
-
@chuckyp On the Rii i8+BT keyboard holding the blue Fn-shift key makes the F1-F12 keys behave like "special" keys - brightness, web browser, email, etc. - a couple of these appear to be mapped correctly according to evtest, others are mismapped.
Pressing the F1-F12 keys by themselves should just do F1-F12. It does in Windows, it doesn't in Raspbian.
-
This is the output from evtest when pressing various function keys with and without the Fn modifer key.
According to manual that came with the keyboard my revision is: Ver:08+BT/A/2.8
The manual describes absolutely none of the special functions that the Fn keys map to, so I've guessed them in the comments below.
Input driver version is 1.0.1 Input device ID: bus 0x5 vendor 0x5ac product 0x22c version 0x11b Input device name: "Bluetooth 3.0 Macro Keyboard" Supported events: Event type 0 (EV_SYN) Event type 1 (EV_KEY) Event code 1 (KEY_ESC) Event code 2 (KEY_1) Event code 3 (KEY_2) Event code 4 (KEY_3) Event code 5 (KEY_4) Event code 6 (KEY_5) Event code 7 (KEY_6) Event code 8 (KEY_7) Event code 9 (KEY_8) Event code 10 (KEY_9) Event code 11 (KEY_0) Event code 12 (KEY_MINUS) Event code 13 (KEY_EQUAL) Event code 14 (KEY_BACKSPACE) Event code 15 (KEY_TAB) Event code 16 (KEY_Q) Event code 17 (KEY_W) Event code 18 (KEY_E) Event code 19 (KEY_R) Event code 20 (KEY_T) Event code 21 (KEY_Y) Event code 22 (KEY_U) Event code 23 (KEY_I) Event code 24 (KEY_O) Event code 25 (KEY_P) Event code 26 (KEY_LEFTBRACE) Event code 27 (KEY_RIGHTBRACE) Event code 28 (KEY_ENTER) Event code 29 (KEY_LEFTCTRL) Event code 30 (KEY_A) Event code 31 (KEY_S) Event code 32 (KEY_D) Event code 33 (KEY_F) Event code 34 (KEY_G) Event code 35 (KEY_H) Event code 36 (KEY_J) Event code 37 (KEY_K) Event code 38 (KEY_L) Event code 39 (KEY_SEMICOLON) Event code 40 (KEY_APOSTROPHE) Event code 41 (KEY_GRAVE) Event code 42 (KEY_LEFTSHIFT) Event code 43 (KEY_BACKSLASH) Event code 44 (KEY_Z) Event code 45 (KEY_X) Event code 46 (KEY_C) Event code 47 (KEY_V) Event code 48 (KEY_B) Event code 49 (KEY_N) Event code 50 (KEY_M) Event code 51 (KEY_COMMA) Event code 52 (KEY_DOT) Event code 53 (KEY_SLASH) Event code 54 (KEY_RIGHTSHIFT) Event code 55 (KEY_KPASTERISK) Event code 56 (KEY_LEFTALT) Event code 57 (KEY_SPACE) Event code 58 (KEY_CAPSLOCK) Event code 59 (KEY_F1) Event code 60 (KEY_F2) Event code 61 (KEY_F3) Event code 62 (KEY_F4) Event code 63 (KEY_F5) Event code 64 (KEY_F6) Event code 65 (KEY_F7) Event code 66 (KEY_F8) Event code 67 (KEY_F9) Event code 68 (KEY_F10) Event code 69 (KEY_NUMLOCK) Event code 70 (KEY_SCROLLLOCK) Event code 71 (KEY_KP7) Event code 72 (KEY_KP8) Event code 73 (KEY_KP9) Event code 74 (KEY_KPMINUS) Event code 75 (KEY_KP4) Event code 76 (KEY_KP5) Event code 77 (KEY_KP6) Event code 78 (KEY_KPPLUS) Event code 79 (KEY_KP1) Event code 80 (KEY_KP2) Event code 81 (KEY_KP3) Event code 82 (KEY_KP0) Event code 83 (KEY_KPDOT) Event code 85 (KEY_ZENKAKUHANKAKU) Event code 86 (KEY_102ND) Event code 87 (KEY_F11) Event code 88 (KEY_F12) Event code 89 (KEY_RO) Event code 90 (KEY_KATAKANA) Event code 91 (KEY_HIRAGANA) Event code 92 (KEY_HENKAN) Event code 93 (KEY_KATAKANAHIRAGANA) Event code 94 (KEY_MUHENKAN) Event code 95 (KEY_KPJPCOMMA) Event code 96 (KEY_KPENTER) Event code 97 (KEY_RIGHTCTRL) Event code 98 (KEY_KPSLASH) Event code 99 (KEY_SYSRQ) Event code 100 (KEY_RIGHTALT) Event code 102 (KEY_HOME) Event code 103 (KEY_UP) Event code 104 (KEY_PAGEUP) Event code 105 (KEY_LEFT) Event code 106 (KEY_RIGHT) Event code 107 (KEY_END) Event code 108 (KEY_DOWN) Event code 109 (KEY_PAGEDOWN) Event code 110 (KEY_INSERT) Event code 111 (KEY_DELETE) Event code 113 (KEY_MUTE) Event code 114 (KEY_VOLUMEDOWN) Event code 115 (KEY_VOLUMEUP) Event code 116 (KEY_POWER) Event code 117 (KEY_KPEQUAL) Event code 119 (KEY_PAUSE) Event code 121 (KEY_KPCOMMA) Event code 122 (KEY_HANGUEL) Event code 123 (KEY_HANJA) Event code 124 (KEY_YEN) Event code 125 (KEY_LEFTMETA) Event code 126 (KEY_RIGHTMETA) Event code 127 (KEY_COMPOSE) Event code 128 (KEY_STOP) Event code 129 (KEY_AGAIN) Event code 130 (KEY_PROPS) Event code 131 (KEY_UNDO) Event code 132 (KEY_FRONT) Event code 133 (KEY_COPY) Event code 134 (KEY_OPEN) Event code 135 (KEY_PASTE) Event code 136 (KEY_FIND) Event code 137 (KEY_CUT) Event code 138 (KEY_HELP) Event code 139 (KEY_MENU) Event code 140 (KEY_CALC) Event code 142 (KEY_SLEEP) Event code 150 (KEY_WWW) Event code 152 (KEY_SCREENLOCK) Event code 155 (KEY_MAIL) Event code 158 (KEY_BACK) Event code 159 (KEY_FORWARD) Event code 161 (KEY_EJECTCD) Event code 163 (KEY_NEXTSONG) Event code 164 (KEY_PLAYPAUSE) Event code 165 (KEY_PREVIOUSSONG) Event code 166 (KEY_STOPCD) Event code 171 (KEY_CONFIG) Event code 172 (KEY_HOMEPAGE) Event code 173 (KEY_REFRESH) Event code 176 (KEY_EDIT) Event code 177 (KEY_SCROLLUP) Event code 178 (KEY_SCROLLDOWN) Event code 179 (KEY_KPLEFTPAREN) Event code 180 (KEY_KPRIGHTPAREN) Event code 183 (KEY_F13) Event code 184 (KEY_F14) Event code 185 (KEY_F15) Event code 186 (KEY_F16) Event code 187 (KEY_F17) Event code 188 (KEY_F18) Event code 189 (KEY_F19) Event code 190 (KEY_F20) Event code 191 (KEY_F21) Event code 192 (KEY_F22) Event code 193 (KEY_F23) Event code 194 (KEY_F24) Event code 217 (KEY_SEARCH) Event code 240 (KEY_UNKNOWN) Event code 272 (BTN_LEFT) Event code 273 (BTN_RIGHT) Event code 274 (BTN_MIDDLE) Event code 275 (BTN_SIDE) Event code 276 (BTN_EXTRA) Event code 374 (KEY_KEYBOARD) Event type 2 (EV_REL) Event code 0 (REL_X) Event code 1 (REL_Y) Event code 6 (REL_HWHEEL) Event code 8 (REL_WHEEL) Event type 3 (EV_ABS) Event code 40 (ABS_MISC) Value 0 Min 0 Max 255 Event code 41 (?) Value 0 Min -127 Max 127 Event code 42 (?) Value 0 Min -127 Max 127 Event code 43 (?) Value 0 Min -127 Max 127 Event type 4 (EV_MSC) Event code 4 (MSC_SCAN) Event type 17 (EV_LED) Event code 0 (LED_NUML) Event code 1 (LED_CAPSL) Event code 2 (LED_SCROLLL) Event code 3 (LED_COMPOSE) Event code 4 (LED_KANA) Key repeat handling: Repeat type 20 (EV_REP) Repeat code 0 (REP_DELAY) Value 250 Repeat code 1 (REP_PERIOD) Value 33 Properties: Testing ... (interrupt to exit) // // PRESSING F1-F6 HERE: NO EVENTS FIRED AT ALL. // // F7 should be KEY_F7 Event: time 1520611462.251254, -------------- EV_SYN ------------ Event: time 1520611467.692498, type 1 (EV_KEY), code 165 (KEY_PREVIOUSSONG), value 1 Event: time 1520611467.692498, -------------- EV_SYN ------------ Event: time 1520611467.799985, type 1 (EV_KEY), code 165 (KEY_PREVIOUSSONG), value 0 // F8 should be KEY_F8 Event: time 1520611467.799985, -------------- EV_SYN ------------ Event: time 1520611468.532505, type 1 (EV_KEY), code 164 (KEY_PLAYPAUSE), value 1 Event: time 1520611468.532505, -------------- EV_SYN ------------ Event: time 1520611468.689982, type 1 (EV_KEY), code 164 (KEY_PLAYPAUSE), value 0 // F9 should be KEY_F9 Event: time 1520611468.689982, -------------- EV_SYN ------------ Event: time 1520611469.097491, type 1 (EV_KEY), code 163 (KEY_NEXTSONG), value 1 Event: time 1520611469.097491, -------------- EV_SYN ------------ Event: time 1520611469.204977, type 1 (EV_KEY), code 163 (KEY_NEXTSONG), value 0 // F10 should be KEY_F10 Event: time 1520611469.204977, -------------- EV_SYN ------------ Event: time 1520611470.512498, type 1 (EV_KEY), code 113 (KEY_MUTE), value 1 Event: time 1520611470.512498, -------------- EV_SYN ------------ Event: time 1520611470.619979, type 1 (EV_KEY), code 113 (KEY_MUTE), value 0 // PRESSING Fn+F1 Fn+F2 HERE: NO EVENTS FIRED. // Fn+F3 should be KEY_WWW or KEY_HOMEPAGE I guess? Event: time 1520611480.048701, -------------- EV_SYN ------------ Event: time 1520611483.673707, type 4 (EV_MSC), code 4 (MSC_SCAN), value 700e0 Event: time 1520611483.673707, type 1 (EV_KEY), code 29 (KEY_LEFTCTRL), value 1 Event: time 1520611483.673707, type 4 (EV_MSC), code 4 (MSC_SCAN), value 7002c Event: time 1520611483.673707, type 1 (EV_KEY), code 57 (KEY_SPACE), value 1 Event: time 1520611483.673707, -------------- EV_SYN ------------ Event: time 1520611483.781201, type 4 (EV_MSC), code 4 (MSC_SCAN), value 700e0 Event: time 1520611483.781201, type 1 (EV_KEY), code 29 (KEY_LEFTCTRL), value 0 Event: time 1520611483.781201, type 4 (EV_MSC), code 4 (MSC_SCAN), value 7002c Event: time 1520611483.781201, type 1 (EV_KEY), code 57 (KEY_SPACE), value 0 // Fn+F4 icon is a keyboard? maybe KEY_KEYBOARD? displays/hides onscreen keyboard on android? Event: time 1520611483.781201, -------------- EV_SYN ------------ Event: time 1520611484.513672, type 4 (EV_MSC), code 4 (MSC_SCAN), value c01ae Event: time 1520611484.513672, type 1 (EV_KEY), code 374 (KEY_KEYBOARD), value 1 Event: time 1520611484.513672, -------------- EV_SYN ------------ Event: time 1520611484.596143, type 4 (EV_MSC), code 4 (MSC_SCAN), value c01ae Event: time 1520611484.596143, type 1 (EV_KEY), code 374 (KEY_KEYBOARD), value 0 // Fn+F5 should be.. no idea.. icon looks like a pair of scissors and a phone? // maybe screenshot on android? // definitely shouldn't be homepage and power anyway! Event: time 1520611484.596143, -------------- EV_SYN ------------ Event: time 1520611485.378680, type 4 (EV_MSC), code 4 (MSC_SCAN), value c0223 Event: time 1520611485.378680, type 1 (EV_KEY), code 172 (KEY_HOMEPAGE), value 1 Event: time 1520611485.378680, type 4 (EV_MSC), code 4 (MSC_SCAN), value c0030 Event: time 1520611485.378680, type 1 (EV_KEY), code 116 (KEY_POWER), value 1 Event: time 1520611485.378680, -------------- EV_SYN ------------ Event: time 1520611485.461146, type 4 (EV_MSC), code 4 (MSC_SCAN), value c0223 Event: time 1520611485.461146, type 1 (EV_KEY), code 172 (KEY_HOMEPAGE), value 0 Event: time 1520611485.461146, type 4 (EV_MSC), code 4 (MSC_SCAN), value c0030 Event: time 1520611485.461146, type 1 (EV_KEY), code 116 (KEY_POWER), value 0 // Fn+F6 should be KEY_MAIL. A wild correct mapping appears! Event: time 1520611485.461146, -------------- EV_SYN ------------ Event: time 1520611486.118665, type 4 (EV_MSC), code 4 (MSC_SCAN), value c018a Event: time 1520611486.118665, type 1 (EV_KEY), code 155 (KEY_MAIL), value 1 Event: time 1520611486.118665, -------------- EV_SYN ------------ Event: time 1520611486.226136, type 4 (EV_MSC), code 4 (MSC_SCAN), value c018a Event: time 1520611486.226136, type 1 (EV_KEY), code 155 (KEY_MAIL), value 0 // Fn+F7 should be KEY_SYSRQ which is PrtSc. Correct! Event: time 1520611486.226136, -------------- EV_SYN ------------ Event: time 1520611486.783691, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70046 Event: time 1520611486.783691, type 1 (EV_KEY), code 99 (KEY_SYSRQ), value 1 Event: time 1520611486.783691, -------------- EV_SYN ------------ Event: time 1520611486.891183, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70046 Event: time 1520611486.891183, type 1 (EV_KEY), code 99 (KEY_SYSRQ), value 0 // Fn+F8 disables/enables the touchpad - works because it is internal to the keyboard // Fn+F9 should be KEY_F11 Event: time 1520611486.891183, -------------- EV_SYN ------------ Event: time 1520611488.226198, type 1 (EV_KEY), code 114 (KEY_VOLUMEDOWN), value 1 Event: time 1520611488.226198, -------------- EV_SYN ------------ Event: time 1520611488.308674, type 1 (EV_KEY), code 114 (KEY_VOLUMEDOWN), value 0 // Fn+F10 should be KEY_F12 Event: time 1520611488.308674, -------------- EV_SYN ------------ Event: time 1520611489.574938, type 1 (EV_KEY), code 115 (KEY_VOLUMEUP), value 1 Event: time 1520611489.574938, -------------- EV_SYN ------------ Event: time 1520611489.657443, type 1 (EV_KEY), code 115 (KEY_VOLUMEUP), value 0
At this point I'm guessing that to fix it I'd need to modify an existing Linux keyboard driver and rebuild. :(
-
From the top of the evtest output above:
Input device ID: bus 0x5 vendor 0x5ac product 0x22c version 0x11b
and from the kernel source /linux-rpi-4.9.y/drivers/hid/hid-ids.h
#define USB_VENDOR_ID_APPLE 0x05ac #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI 0x022c
So the Rii i8+BT uses the IDs for the Apple Aluminium Wireless ANSI keyboard, probably to work around some stupid Apple bluetooth compatibility issue.
Looking at that keyboard, we can see why F7-F12 are being assigned to media keys.
Let's look at /linux-rpi-4.9.y/drivers/hid/hid-apple.c
static const struct apple_key_translation apple_fn_keys[] = { { KEY_BACKSPACE, KEY_DELETE }, { KEY_ENTER, KEY_INSERT }, { KEY_F1, KEY_BRIGHTNESSDOWN, APPLE_FLAG_FKEY }, { KEY_F2, KEY_BRIGHTNESSUP, APPLE_FLAG_FKEY }, { KEY_F3, KEY_SCALE, APPLE_FLAG_FKEY }, { KEY_F4, KEY_DASHBOARD, APPLE_FLAG_FKEY }, { KEY_F5, KEY_KBDILLUMDOWN, APPLE_FLAG_FKEY }, { KEY_F6, KEY_KBDILLUMUP, APPLE_FLAG_FKEY }, { KEY_F7, KEY_PREVIOUSSONG, APPLE_FLAG_FKEY }, { KEY_F8, KEY_PLAYPAUSE, APPLE_FLAG_FKEY }, { KEY_F9, KEY_NEXTSONG, APPLE_FLAG_FKEY }, { KEY_F10, KEY_MUTE, APPLE_FLAG_FKEY }, { KEY_F11, KEY_VOLUMEDOWN, APPLE_FLAG_FKEY }, { KEY_F12, KEY_VOLUMEUP, APPLE_FLAG_FKEY }, { KEY_UP, KEY_PAGEUP }, { KEY_DOWN, KEY_PAGEDOWN }, { KEY_LEFT, KEY_HOME }, { KEY_RIGHT, KEY_END }, { } };
and
if ((asc->quirks & APPLE_HAS_FN) && hidinput_apple_event(hdev, field->hidinput->input, usage, value)) return 1;
and
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI), .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
Sigh.
So, looks like my options are:
- Hacking the Apple HID driver to disable the Fn key quirks for the model the i8 claims to be and rebuilding the kernel (not attractive, and probably won't solve all the issues anyway).
- Raising the issue with the HID kernel devs who would be well within their rights to say "the Rii i8+BT shouldn't identify itself as something it's not".
- Buying a different wireless keyboard.
Number 3 please, Carol.
(Windows probably gets around this by identifying the keyboard using something other than its vendor and device ID and having a better driver for it.)
-
@stoo There are a few number of parameters for the Apple keyboard driver, see if you can get lucky trying them out: https://wiki.archlinux.org/index.php/Apple_Keyboard#Function_keys_do_not_work
-
Lol, ffs. Yep, that has fixed it.
Thank you very much, @mitu :D
If I'd known from the start that this thing pretended it was an Apple keyboard this would have taken a lot less time.
I guess the Fn key on the i8 works differently than on a real Apple wireless kbd, hence why holding the Fn key and pressing the F1-F10 doesn't generate the correct keycodes, but reversing the Fn switch with the driver parameter does.
I can now F4 out of ES and F12 to bring up Amiberry config, etc. Yay.
(I just now realised that taking a screenshot on an iPhone is the power button and home buttons together, which explains Fn+F5).
Contributions to the project are always appreciated, so if you would like to support us with a donation you can do so here.
Hosting provided by Mythic-Beasts. See the Hosting Information page for more information.