1__NUXT_JSONP__("/posts/2012/12/31/logitech-k810-keyboard-configurator", (function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){return {data:[{lang:"en",page:{slug:"index.en",description:"Linux configuration tool for Logitech K810 keyboard",title:m,headline:"title",date:"2012\u002F12\u002F31 12:00",routes:{default:"\u002Fposts\u002F2012\u002F12\u002F31\u002Flogitech-k810-keyboard-configurator",canonical:"\u002Fcanonical\u002Furl\u002Falias",aliases:["\u002Fsome\u002Fother\u002Froute","\u002Fcan-be-any-valid-slug"]},taxonomy:{category:n,tag:[n,"logitech","k810"],author:"Mario Scholz"},toc:[],body:{type:"root",children:[{type:b,tag:d,props:{},children:[{type:a,value:"Recently I bought a Logitech K810 Keyboard. The small bluetooth keyboard can connect wireless to PCs or other devices e.g. phones. It is equipped with backlight and supports 3 paired connections to devices."}]},{type:a,value:c},{type:b,tag:d,props:{},children:[{type:b,tag:k,props:{alt:"Logitech K810",src:"k810.jpg"},children:[]}]},{type:a,value:c},{type:b,tag:d,props:{},children:[{type:a,value:"To use these extended functions and switch between profiles the function keys (F-keys) have a double meaning."}]},{type:a,value:c},{type:b,tag:d,props:{},children:[{type:b,tag:k,props:{alt:"Logitech K810 function keys",src:"k810_fkeys.jpg"},children:[]}]},{type:a,value:c},{type:b,tag:d,props:{},children:[{type:a,value:"After my purchase I found out that the default configuration uses the F-keys for the extended functionality on a direct key press. In order to use the regular F-keys the user has to hold down the FN-key in addition. As I want to use the keyboard mainly on a regular PC I could not live with it. Luckily Logitech offers a configuration tool for there range of mouses and ke
1yboards under the name \"SetPoint\" for Microsoft Windows."}]},{type:a,value:c},{type:b,tag:d,props:{},children:[{type:b,tag:k,props:{alt:"Logitech Setpoint software",src:"setpoint.png",title:"SetPoint (see 'Swap F key functions.'"},children:[]}]},{type:a,value:c},{type:b,tag:d,props:{},children:[{type:a,value:"However I was disappointed when I figured out that the configuration is not permanently stored in the keyboard and has to be sent everytime the keyboard is turned on. As I prefer Linux as operating system and do not use Microsoft Windows I could not use Logitech's software. I analyzed the communication to the HID device and created a small piece of software to sent the configuration message to the keyboard. In order to trace the bluetooth messages I executed SetPoint in a VirtualBox environment. The VM could connect trough an attached Bluetooth USB dongle to the keyboard. On the Linux host I loaded the usbmon kernel module in order to trace all messages on the USB layer to the CSR Bluetooth chip:"}]},{type:a,value:c},{type:b,tag:f,props:{className:[g]},children:[{type:b,tag:h,props:{className:[i,j]},children:[{type:b,tag:e,props:{},children:[{type:a,value:"$ mount -t debugfs none_debugs \u002Fsys\u002Fkernel\u002Fdebug\n$ modprobe usbmon\n"}]}]}]},{type:a,value:c},{type:b,tag:d,props:{},children:[{type:a,value:"As my Bluetooth dongle 0a12:0001 was attached to the 3rd bus I executed:"}]},{type:a,value:c},{type:b,tag:f,props:{className:[g]},children:[{type:b,tag:h,props:{className:[i,j]},children:[{type:b,tag:e,props:{},children:[{type:a,value:"$ cat \u002Fsys\u002Fkernel\u002Fdebug\u002Fusb\u002Fusbmon\u002F3u\n"}]}]}]},{type:a,value:c},{type:b,tag:d,props:{},children:[{type:b,tag:k,props:{alt:"Linux shell - usbmon",src:"usbmon.png"},children:[]}]},{type:a,value:c},{type:b,tag:d,props:{},children:[{type:a,value:"When I toggled in SetPoint the flag 'Swap F key functions.' I figured out that the message payload was changing at a fixed position -\u003E Found it!:"}]},{type:a,value:c},{type:b,tag:f,props:{className:[g]},children:[{type:b,tag:h,props:{className:[i,j]},children:[{type:b,tag:e,props:{},children:[{type:a,value:"# Disable - Swap F key functions. -\u003E use regular F key directly (OUT) \nffff8803ea0853c0 3469985170 S Bo:3:003:2 -115 16 = 47000c00 08004200 a210ff06 15000000\n# Response from Keyboard (IN)\nffff8803e6c36980 3470086675 C Bi:3:003:2 0 29 = 47201900 15004100 a111ff06 15000100 00000000 00000000 00000000 00\n\n# Enable - Swap F key functions. -\u003E use regular F key together with FN key (OUT)\nffff8803277b0480 3483623889 S Bo:3:003:2 -115 16 = 47000c00 08004200 a210ff06 15010000\n# Response from Keyboard (IN)\nffff8803e6c36980 3483991655 C Bi:3:003:2 0 29 = 47201900 15004100 a111ff06 15010100 00000000 00000000 00000000 00\n"}]}]}]},{type:a,value:c},{type:b,tag:d,props:{},children:[{type:a,value:"The next steps were easy. Whenever the keyboard connects to BlueZ stack in Linux a 'hidraw' device is created:"}]},{type:a,value:c},{type:b,tag:f,props:{className:[g]},children:[{type:b,tag:h,props:{className:[i,j]},children:[{type:b,tag:e,props:{},children:[{type:a,value:"[ 65.632036] input: Logitech K810 as \u002Fdevices\u002Fpci0000:00\u002F0000:00:1a.0\u002Fusb3\u002F3-1\u002F3-1.4\u002F3-1.4:1.0\u002Fbluetooth\u002Fhci0\u002Fhci0:11\u002Finput18\n[ 65.632268] generic-bluetooth 0005:046D:B319.0001: input,hidraw0: BLUETOOTH HID v12.01 Keyboard [Logitech K810] on XX:XX:XX:XX:XX:XX\n"}]}]}]},{type:a,value:c},{type:b,tag:d,props:{},children:[{type:a,value:"Therefore I wrote a small program "},{type:b,tag:e,props:{},children:[{type:a,value:l}]},{type:a,value:" to send the message sequence "},{type:b,tag:e,props:{},children:[{type:a,value:"0x10, 0xff, 0x06, 0x15, 0x00, 0x00, 0x00"}]},{type:a,value:" to the keyboard's 'hidraw' device. My system is configured to automatically execute "},{type:b,tag:e,props:{},children:[{type:a,value:l}]},{type:a,value:" whenever the keyboard connects."}]},{type:a,value:c},{type:b,tag:d,props:{},children:[{type:a,value:"The source of "},{type:b,tag:e,props:{},children:[{type:a,value:l}]},{type:a,value:" was tested on Debian GNU Linux (Wheezy) and can be found "},{type:b,tag:"a",props:{href:"k810_conf-v0.1.tar.bz2"},children:[{type:a,value:"here"}]},{type:a,value:"."}]},{type:a,value:c},{type:b,tag:d,props:{},children:[{type:a,value:"Update 2014-02-10:"}]},{type:a,value:c},{type:b,tag:d,props:{},children:[{type:a,value:"In order to automate running the configuration everytime the keyboard connects the following udev rule can be used:"}]},{type:a,value:c},{type:b,tag:f,props:{className:[g]},children:[{type:b,tag:h,props:{className:[i,j]},children:[{type:b,tag:e,props:{},children:[{type:a,value:"$ cat \u002Fetc\u002Fudev\u002Frules.d\u002F00-k810.rules\nKERNEL==\"hidraw*\", SUBSYSTEM==\"hidraw\", ATTRS{address}==\"00:1F:AA:BB:CC:DD\", \\\n RUN+=\"\u002Fpath\u002Fto\u002Fscript\u002Fk810.sh %p\"\n"}]}]}]},{type:a,value:c},{type:b,tag:d,props:{},children:[{type:a,value:"you need to exchange 00:1F:AA:BB:CC:DD with your bluetooth id of the keyboard."}]},{type:a,value:c},{type:b,tag:d,props:{},children:[{type:a,value:"The script k810.sh can look like this:"}]},{type:a,value:c},{type:b,tag:f,props:{className:[g]},children:[{type:b,tag:h,props:{className:[i,j]},children:[{type:b,tag:e,props:{},children:[{type:a,value:"#!\u002Fbin\u002Fsh\nif [ \"$ACTION\" == \"add\" ];\nthen\n # configure k810 ($DEVPATH) at $DEVNAME.\n \u002Fpath\u002Fto\u002Fbin\u002Fk810_conf -d $DEVNAME -f on\nfi\n"}]}]}]},{type:a,value:c},{type:b,tag:d,props:{},children:[{type:a,value:"$DEVNAME is automatically replaced by UDEV to the correct hidraw device path of the keyboard."}]}]},dir:"\u002Fposts\u002F20121231-logitech-k810-keyboard-configurator",path:"\u002Fposts\u002F20121231-logitech-k810-keyboard-configurator\u002Findex.en",extension:".md",createdAt:o,updatedAt:o},headline:m,_img:{}}],fetch:{},mutations:void 0}}("text","element","\n","p","code","div","nuxt-content-highlight","pre","language-text","line-numbers","content-img","k810_conf","Logitech K810 Keyboard Configurator","linux","2022-05-09T21:56:21.280Z")));
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.