{"id":2144,"date":"2015-02-04T13:14:31","date_gmt":"2015-02-04T13:14:31","guid":{"rendered":"http:\/\/www.chalk-elec.com\/?p=2144"},"modified":"2015-05-15T16:41:19","modified_gmt":"2015-05-15T16:41:19","slug":"how-to-control-lcd-backlight-usb-hid","status":"publish","type":"post","link":"https:\/\/www.chalk-elec.com\/?p=2144","title":{"rendered":"How to control LCD backlight (USB HID)"},"content":{"rendered":"<p>Starting from version <strong>2.0<\/strong> all firmwares for our LCD and HDMI converters support LCD backlight control through standard USB HID protocol. <\/p>\n<p><strong>HID report descriptor<\/strong><\/p>\n<p>The following HID report descriptor is used:<\/p>\n<div class=\"codecolorer-container c railscasts\" style=\"overflow:auto;white-space:nowrap;width:630px;height:425px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/>16<br \/>17<br \/>18<br \/>19<br \/>20<br \/>21<br \/>22<br \/>23<br \/><\/div><\/td><td><div class=\"c codecolorer\">&nbsp; &nbsp; <span class=\"nu12\">0x05<\/span><span class=\"sy0\">,<\/span> <span class=\"nu12\">0x0C<\/span><span class=\"sy0\">,<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ &nbsp; &nbsp;Usage Page (Consumer)<\/span><br \/>\n&nbsp; &nbsp; <span class=\"nu12\">0x09<\/span><span class=\"sy0\">,<\/span> <span class=\"nu12\">0x01<\/span><span class=\"sy0\">,<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ &nbsp; &nbsp;Usage (Consumer Control)<\/span><br \/>\n&nbsp; &nbsp; <span class=\"nu12\">0xA1<\/span><span class=\"sy0\">,<\/span> <span class=\"nu12\">0x01<\/span><span class=\"sy0\">,<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ &nbsp; &nbsp;Collection (Application)<\/span><br \/>\n&nbsp; &nbsp; <span class=\"nu12\">0x15<\/span><span class=\"sy0\">,<\/span> <span class=\"nu12\">0x00<\/span><span class=\"sy0\">,<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ &nbsp; &nbsp; &nbsp; Logical Minimum (0)<\/span><br \/>\n&nbsp; &nbsp; <span class=\"nu12\">0x25<\/span><span class=\"sy0\">,<\/span> <span class=\"nu12\">0x01<\/span><span class=\"sy0\">,<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ &nbsp; &nbsp; &nbsp; Logical Maximum (1)<\/span><br \/>\n&nbsp; &nbsp; <span class=\"nu12\">0x75<\/span><span class=\"sy0\">,<\/span> <span class=\"nu12\">0x01<\/span><span class=\"sy0\">,<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ &nbsp; &nbsp; &nbsp; Report Size (1)<\/span><br \/>\n&nbsp; &nbsp; <span class=\"nu12\">0x95<\/span><span class=\"sy0\">,<\/span> <span class=\"nu12\">0x07<\/span><span class=\"sy0\">,<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ &nbsp; &nbsp; &nbsp; Report Count (7)<\/span><br \/>\n&nbsp; &nbsp; <span class=\"nu12\">0x19<\/span><span class=\"sy0\">,<\/span> <span class=\"nu12\">0x6F<\/span><span class=\"sy0\">,<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ &nbsp; &nbsp; &nbsp; Usage Minimim (0x6F)<\/span><br \/>\n&nbsp; &nbsp; <span class=\"nu12\">0x29<\/span><span class=\"sy0\">,<\/span> <span class=\"nu12\">0x75<\/span><span class=\"sy0\">,<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ &nbsp; &nbsp; &nbsp; Usage Maximum (0x75) &nbsp; &nbsp;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"nu12\">0x91<\/span><span class=\"sy0\">,<\/span> <span class=\"nu12\">0x02<\/span><span class=\"sy0\">,<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ &nbsp; &nbsp; &nbsp; * Output (Data, Var, Abs)<\/span><br \/>\n&nbsp; &nbsp; <span class=\"nu12\">0x95<\/span><span class=\"sy0\">,<\/span> <span class=\"nu12\">0x01<\/span><span class=\"sy0\">,<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ &nbsp; &nbsp; &nbsp; Report Count (1)<\/span><br \/>\n&nbsp; &nbsp; <span class=\"nu12\">0x91<\/span><span class=\"sy0\">,<\/span> <span class=\"nu12\">0x03<\/span><span class=\"sy0\">,<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ &nbsp; &nbsp; &nbsp; * Output (Const, Var, Abs)<\/span><br \/>\n&nbsp; &nbsp; <span class=\"nu12\">0x25<\/span><span class=\"sy0\">,<\/span> <span class=\"nu12\">0x23<\/span><span class=\"sy0\">,<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ &nbsp; &nbsp; &nbsp; Logical Maximum (35)<\/span><br \/>\n&nbsp; &nbsp; <span class=\"nu12\">0x75<\/span><span class=\"sy0\">,<\/span> <span class=\"nu12\">0x08<\/span><span class=\"sy0\">,<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ &nbsp; &nbsp; &nbsp; Report Size (8)<\/span><br \/>\n&nbsp; &nbsp; <span class=\"nu12\">0x09<\/span><span class=\"sy0\">,<\/span> <span class=\"nu12\">0x71<\/span><span class=\"sy0\">,<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ &nbsp; &nbsp; &nbsp; Usage (0x71 - &nbsp;Display Brightness)<\/span><br \/>\n&nbsp; &nbsp; <span class=\"nu12\">0x91<\/span><span class=\"sy0\">,<\/span> <span class=\"nu12\">0x02<\/span><span class=\"sy0\">,<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ &nbsp; &nbsp; &nbsp; * Output (Data, Var, Abs)<\/span><br \/>\n&nbsp; &nbsp; <span class=\"nu12\">0x09<\/span><span class=\"sy0\">,<\/span> <span class=\"nu12\">0x35<\/span><span class=\"sy0\">,<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ &nbsp; &nbsp; &nbsp; Usage (0x35 - Illumination)<\/span><br \/>\n&nbsp; &nbsp; <span class=\"nu12\">0x26<\/span><span class=\"sy0\">,<\/span> <span class=\"nu12\">0xFF<\/span><span class=\"sy0\">,<\/span> <span class=\"nu12\">0x00<\/span><span class=\"sy0\">,<\/span> &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ &nbsp; &nbsp; &nbsp; Logical Maximum (255)<\/span><br \/>\n&nbsp; &nbsp; <span class=\"nu12\">0x81<\/span><span class=\"sy0\">,<\/span> <span class=\"nu12\">0x02<\/span><span class=\"sy0\">,<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ &nbsp; &nbsp; &nbsp; ** Input (Data, Var, Abs)<\/span><br \/>\n&nbsp; &nbsp; <span class=\"nu12\">0x05<\/span><span class=\"sy0\">,<\/span> <span class=\"nu12\">0x20<\/span><span class=\"sy0\">,<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ &nbsp; &nbsp; &nbsp; Usage Page (Sensors)<\/span><br \/>\n&nbsp; &nbsp; <span class=\"nu12\">0x09<\/span><span class=\"sy0\">,<\/span> <span class=\"nu12\">0x41<\/span><span class=\"sy0\">,<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ &nbsp; &nbsp; &nbsp; Usage (0x41 - &nbsp;Ambient Light Sensor)<\/span><br \/>\n&nbsp; &nbsp; <span class=\"nu12\">0x81<\/span><span class=\"sy0\">,<\/span> <span class=\"nu12\">0x02<\/span><span class=\"sy0\">,<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ &nbsp; &nbsp; &nbsp; ** Input (Data, Var, Abs)<\/span><br \/>\n&nbsp; &nbsp; <span class=\"nu12\">0xC0<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"co1\">\/\/ &nbsp; &nbsp;End Collection<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p>\nReport usages follow recent changes in official USB HID specification proposed by Microsoft in change request <a href=\"http:\/\/www.usb.org\/developers\/hidpage\/HUTRR41.pdf\" target=\"_blank\">#HUTRR41<\/a>. <strong>Interface #<\/strong> is 0 for HDMI-dualLVDS converter and FullHD+ LCD bundle, <strong>Interface #<\/strong> is 1 for open frame\/black frame 7&#8243; LCD and for new 10&#8243; integrated LCD. Report ID is 0 for all cases.<\/p>\n<p><strong>Packet format<\/strong><\/p>\n<p>Firmware accepts 2-bytes packet request from host and reply with 2-bytes packet with information about current backlight mode and ambient light level:<br \/>\n<a href=\"http:\/\/www.chalk-elec.com\/wp-content\/uploads\/2015\/02\/04-04-54.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.chalk-elec.com\/wp-content\/uploads\/2015\/02\/04-04-54.jpg\" alt=\"Backlight HID format\" width=\"600\" height=\"649\" class=\"aligncenter size-full wp-image-2192\" srcset=\"https:\/\/www.chalk-elec.com\/wp-content\/uploads\/2015\/02\/04-04-54.jpg 600w, https:\/\/www.chalk-elec.com\/wp-content\/uploads\/2015\/02\/04-04-54-277x300.jpg 277w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a><br \/>\n<br \/>\nOnly one bit can be active in command byte of request packet. If bit 5 is active (Set Brightness command), then next byte contains desired brightness level. For others commands second byte is ignored. LCD will reply with current backlight status and ambient light sensor value to any received command. To get current status without performing command you can send request with command byte equal to 0. <strong>MAX_BL<\/strong> is 35 for HDMI-dualLVDS converter and FullHD+ LCD bundle, <strong>MAX_BL<\/strong> is 18 for open frame\/black frame 7&#8243; LCD and for new 10&#8243; integrated LCD.<\/p>\n<p><strong>How to send commands<\/strong><\/p>\n<p>The simplest way to communicate with HID devices is to to use cross-platform library <a href=\"https:\/\/github.com\/signal11\/hidapi\" target=\"_blank\">HIDAPI from Signal11<\/a>. With HIDAPI it is just several lines of code to control LCD brightness:<\/p>\n<div class=\"codecolorer-container c railscasts\" style=\"overflow:auto;white-space:nowrap;width:630px;height:425px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/>16<br \/>17<br \/>18<br \/>19<br \/>20<br \/>21<br \/>22<br \/>23<br \/>24<br \/>25<br \/>26<br \/>27<br \/>28<br \/>29<br \/>30<br \/>31<br \/>32<br \/>33<br \/>34<br \/>35<br \/>36<br \/>37<br \/>38<br \/>39<br \/>40<br \/>41<br \/>42<br \/>43<br \/>44<br \/>45<br \/>46<br \/>47<br \/>48<br \/>49<br \/>50<br \/>51<br \/>52<br \/>53<br \/>54<br \/>55<br \/>56<br \/>57<br \/>58<br \/>59<br \/>60<br \/>61<br \/>62<br \/>63<br \/>64<br \/>65<br \/>66<br \/>67<br \/>68<br \/>69<br \/>70<br \/>71<br \/>72<br \/>73<br \/>74<br \/><\/div><\/td><td><div class=\"c codecolorer\"><span class=\"co2\">#include &lt;stdio.h&gt;<\/span><br \/>\n<span class=\"co2\">#include &quot;hidapi.h&quot;<\/span><br \/>\n<br \/>\n<span class=\"co1\">\/\/ Try to open HID device and return pointer to opened device<\/span><br \/>\nhid_device<span class=\"sy0\">*<\/span> openHID<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw4\">struct<\/span> hid_device_info <span class=\"sy0\">*<\/span>devs<span class=\"sy0\">,<\/span> <span class=\"sy0\">*<\/span>cur_dev<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; hid_device<span class=\"sy0\">*<\/span> device <span class=\"sy0\">=<\/span> NULL<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw4\">int<\/span> iface <span class=\"sy0\">=<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">;<\/span> &nbsp;<span class=\"co1\">\/\/ We use interface# 1 for 7&quot; and 10&quot;, and interface# 0 for dualLVDS\/FullHD+<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"co1\">\/\/ VID=0x04D8, PID=0xF724 for 7&quot; and 10&quot; multi-touch firmware, interface# is 1<\/span><br \/>\n&nbsp; &nbsp; <span class=\"co1\">\/\/ VID=0x04D8, PID=0xF723 for 7&quot; and 10&quot; single-touch firmware, interface# is 1<\/span><br \/>\n&nbsp; &nbsp; <span class=\"co1\">\/\/ VID=0x04D8, PID=0x003F for dualLVDS\/FullHD+, interface# is 1<\/span><br \/>\n&nbsp; &nbsp; devs <span class=\"sy0\">=<\/span> hid_enumerate<span class=\"br0\">&#40;<\/span><span class=\"nu12\">0x04D8<\/span><span class=\"sy0\">,<\/span> <span class=\"nu12\">0xF724<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>devs <span class=\"sy0\">==<\/span> NULL<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; devs <span class=\"sy0\">=<\/span> hid_enumerate<span class=\"br0\">&#40;<\/span><span class=\"nu12\">0x04D8<\/span><span class=\"sy0\">,<\/span> <span class=\"nu12\">0xF723<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>devs <span class=\"sy0\">==<\/span> NULL<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; devs <span class=\"sy0\">=<\/span> hid_enumerate<span class=\"br0\">&#40;<\/span><span class=\"nu12\">0x04D8<\/span><span class=\"sy0\">,<\/span> <span class=\"nu12\">0x003F<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>devs <span class=\"sy0\">==<\/span> NULL<span class=\"br0\">&#41;<\/span> <span class=\"kw1\">return<\/span> NULL<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">else<\/span> iface <span class=\"sy0\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"co1\">\/\/ Walk through all enumerated devices to find one with correct interface number<\/span><br \/>\n&nbsp; &nbsp; cur_dev <span class=\"sy0\">=<\/span> devs<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">while<\/span> <span class=\"br0\">&#40;<\/span>cur_dev<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span>cur_dev<span class=\"sy0\">-&gt;<\/span>interface_number<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">==<\/span> iface<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; device <span class=\"sy0\">=<\/span> hid_open_path<span class=\"br0\">&#40;<\/span>cur_dev<span class=\"sy0\">-&gt;<\/span>path<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw3\">printf<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;Found Backlight interface at path: %s&quot;<\/span><span class=\"sy0\">,<\/span> cur_dev<span class=\"sy0\">-&gt;<\/span>path<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw2\">break<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; cur_dev <span class=\"sy0\">=<\/span> cur_dev<span class=\"sy0\">-&gt;<\/span>next<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; hid_free_enumeration<span class=\"br0\">&#40;<\/span>devs<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw1\">return<\/span> device<span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"kw4\">int<\/span> main<span class=\"br0\">&#40;<\/span><span class=\"kw4\">int<\/span> argc<span class=\"sy0\">,<\/span> <span class=\"kw4\">char<\/span> <span class=\"sy0\">*<\/span>argv<span class=\"br0\">&#91;<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; hid_device<span class=\"sy0\">*<\/span> device<span class=\"sy0\">=<\/span>NULL<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw4\">unsigned<\/span> <span class=\"kw4\">char<\/span> buf<span class=\"br0\">&#91;<\/span><span class=\"nu0\">3<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; buf<span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu12\">0x0<\/span><span class=\"sy0\">;<\/span> &nbsp; <span class=\"co1\">\/\/ Report ID (0)<\/span><br \/>\n&nbsp; &nbsp; buf<span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu12\">0x04<\/span><span class=\"sy0\">;<\/span> &nbsp;<span class=\"co1\">\/\/ Command (0x20 - Set Backlight)<\/span><br \/>\n&nbsp; &nbsp; buf<span class=\"br0\">&#91;<\/span><span class=\"nu0\">2<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">9<\/span><span class=\"sy0\">;<\/span> &nbsp; &nbsp; <span class=\"co1\">\/\/ Backlight value for command Set Backlight<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; hid_init<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; device <span class=\"sy0\">=<\/span> openHID<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>device <span class=\"sy0\">==<\/span> NULL<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw3\">puts<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;Can't find USB device with interface for backlight&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"sy0\">-<\/span><span class=\"nu0\">1<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; hid_set_nonblocking<span class=\"br0\">&#40;<\/span>device<span class=\"sy0\">,<\/span> <span class=\"kw2\">true<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw3\">printf<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;Writing bytes: %02X,%02X,%02X<span class=\"es1\">\\n<\/span>&quot;<\/span><span class=\"sy0\">,<\/span> buf<span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span> buf<span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span> buf<span class=\"br0\">&#91;<\/span><span class=\"nu0\">2<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>hid_write<span class=\"br0\">&#40;<\/span>device<span class=\"sy0\">,<\/span> buf<span class=\"sy0\">,<\/span> <span class=\"nu0\">3<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">==<\/span> <span class=\"sy0\">-<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw3\">puts<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;Error writing bytes to device!&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; hid_close<span class=\"br0\">&#40;<\/span>device<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"sy0\">-<\/span><span class=\"nu0\">1<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>hid_read_timeout<span class=\"br0\">&#40;<\/span>device<span class=\"sy0\">,<\/span> buf<span class=\"sy0\">,<\/span> <span class=\"nu0\">2<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">100<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">==<\/span> <span class=\"sy0\">-<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw3\">puts<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;Error reading bytes to device!&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; hid_close<span class=\"br0\">&#40;<\/span>device<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"sy0\">-<\/span><span class=\"nu0\">1<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw3\">printf<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;Received bytes: %02X,%02X<span class=\"es1\">\\n<\/span>&quot;<\/span><span class=\"sy0\">,<\/span> buf<span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span> buf<span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p>\nAbove example is universal and will work with all our products with USB backlight control feature.<\/p>\n<p><strong>GUI application for LCD control<\/strong><\/p>\n<p>Cross-platform GUI application to control different LCD settings including brightness is available here:<br \/>\n<a href=\"https:\/\/goo.gl\/PPHKQf\" title=\"LCD control GUI - Windows\" target=\"_blank\">LCD control GUI<\/a><br \/>\nYou will need <a href=\"http:\/\/www.qt.io\/download-open-source\/#section-3\" title=\"Qt framework\" target=\"_blank\">Qt framework<\/a> to build it from sources.<\/p>\n<p><strong>See in action<\/strong><\/p>\n<p>Video with backlight test using our dualLVDS converter FullHD+ LCD is available here: <a href=\"http:\/\/youtu.be\/Y6WslezxUqY\">Backlight test video<\/a><br \/>\n<\/p>\n<p><\/p>\n<p>Follow us on Twitter to get instant notification about updates: <a href=\"https:\/\/twitter.com\/ChalkElec\" class=\"twitter-follow-button\" data-show-count=\"false\">Follow @ChalkElec<\/a>h<br \/>\n<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=\/^http:\/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+':\/\/platform.twitter.com\/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Starting from version 2.0 all firmwares for our LCD and HDMI converters support LCD backlight control through standard USB HID protocol. HID report descriptor The following HID report descriptor is used: 1234567891011121314151617181920212223&nbsp; &nbsp; 0x05, 0x0C, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \/\/ &nbsp; &nbsp;Usage Page (Consumer) &nbsp; &nbsp; 0x09, 0x01, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,26],"tags":[],"class_list":["post-2144","post","type-post","status-publish","format-standard","hentry","category-blog","category-howto"],"_links":{"self":[{"href":"https:\/\/www.chalk-elec.com\/index.php?rest_route=\/wp\/v2\/posts\/2144","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.chalk-elec.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.chalk-elec.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.chalk-elec.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.chalk-elec.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2144"}],"version-history":[{"count":10,"href":"https:\/\/www.chalk-elec.com\/index.php?rest_route=\/wp\/v2\/posts\/2144\/revisions"}],"predecessor-version":[{"id":2209,"href":"https:\/\/www.chalk-elec.com\/index.php?rest_route=\/wp\/v2\/posts\/2144\/revisions\/2209"}],"wp:attachment":[{"href":"https:\/\/www.chalk-elec.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2144"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.chalk-elec.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2144"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.chalk-elec.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2144"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}