Ubuntu – Samsung new series 9, not all function keys working

12.04samsung

i bought the samsung new series 9 ultrabook ( NP900X3C ). i installed ubuntu 12.04 and the mainline 3.5 kernel. almost everything works perfectly, except some important function keys don't work.

the keys for the screen brightness and the keyboard backlit don't work which is very annoying. i added manually a new keymap required for this notebook model ( guide: http://jablonskis.org/2012/linux-and-samsung-series-laptop-9-fn-keys/ ) but the system doesn't load them.

i added the following lines to the udev rules:

# /lib/udev/rules.d/95-keymap.rules
ENV{DMI_VENDOR}=="[sS][aA][mM][sS][uU][nN][gG]*", ATTR{[dmi/id]product_name}=="*900X3*", RUN+="keymap $name samsung-900x3c"

# /lib/udev/rules.d/95-keyboard-force-release.rules
ENV{DMI_VENDOR}=="[sS][aA][mM][sS][uU][nN][gG]*", ATTR{[dmi/id]product_name}=="*900X3*", RUN+="keyboard-force-release.sh $devpath samsung-900x3c"

the system is unable to load the dmi info which is required ( is it? ) to select the correct keymap. the tool dmidecode returns the folling info:

# dmidecode 2.11
# SMBIOS entry point at 0xdac66000
SMBIOS 2.7 present.
64 structures occupying 2917 bytes.
Table at 0x000E0840.

Invalid entry length (0). DMI table is broken! Stop.

does anyone know how i can fix the dmi problem ( if this is a problem ) or how i can force udev to load my custom keymaps?

Best Answer

In order to get the fn keys working i first had to update the BIOS ( install windows, update bios, install ubuntu again -> a lot of fun! ) because ubuntu couldn't read the dmi data it requires to load vendor specific configurations and modules. You may check if the dmi data is accessible using the "dmidecode" tool which should return a lot of data ( see other answer ):

$ sudo dmidecode

I updated the kernel to version 3.5.3 since it has some required samsung modules compiled in to it.

I also created two keymap files and added two udev rules as described on the blog Linux And Samsung Series 9 Laptop Fn Keys. You have to replace some module specific strings ( 90X3A > 900X3C*, 90x3a > 900x3c ) as described below.

# /lib/udev/keymaps/samsung-900x3c

0x96 kbdillumup         # Fn+F8 keyboard backlit up
0x97 kbdillumdown       # Fn+F7 keyboard backlit down
0xD5 wlan               # Fn+F12 wifi on/off
0xCE prog1              # Fn+F1 performance mode (?)
0x8D prog2              # Fn+F6 battery life extender

#/lib/udev/keymaps/force-release/samsung-900x3c

# forces key release
0xCE # Fn+F8 keyboard backlit up
0x8D # Fn+F7 keyboard backlit down
0x97 # Fn+F12 wifi on/off
0x96 # Fn+F1 performance mode (?)
0xD5 # Fn+F6 battery life extender

add this line below the other samsung related lines

# /lib/udev/rules.d/95-keymap.rules
ENV{DMI_VENDOR}=="[sS][aA][mM][sS][uU][nN][gG]*", ATTR{[dmi/id]product_name}=="900X3C*", RUN+="keymap $name samsung-900x3c"

add this line below the other samsung related lines

# /lib/udev/rules.d/95-keyboard-force-release.rules
ENV{DMI_VENDOR}=="[sS][aA][mM][sS][uU][nN][gG]*", ATTR{[dmi/id]product_name}=="900X3C*", RUN+="keyboard-force-release.sh $devpath samsung-900x3c"

The fn keys for the keyboard backlit and the screen brightness work now. The wifi and performance mode keys still don't work. You have probably to follow the instructions in the blog mentioned above.