hidpp10: implement 0x54 LED intensity

Untested, my devices don't handle this request

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
Peter Hutterer
2015-10-12 10:34:05 +10:00
parent 3c5443d203
commit bc7c48ecc0
2 changed files with 77 additions and 0 deletions

View File

@@ -668,6 +668,69 @@ hidpp10_set_led_status(struct hidpp10_device *dev,
return res;
}
/* -------------------------------------------------------------------------- */
/* 0x54: LED Intensity */
/* -------------------------------------------------------------------------- */
#define __CMD_LED_INTENSITY 0x54
#define CMD_LED_INTENSITY(idx, sub) { \
.msg = { \
.report_id = REPORT_ID_SHORT, \
.device_idx = idx, \
.sub_id = sub, \
.address = __CMD_LED_INTENSITY, \
.parameters = {0x00, 0x00, 0x00 }, \
} \
}
int
hidpp10_get_led_intensity(struct hidpp10_device *dev,
uint8_t led_intensity_in_percent[6])
{
unsigned idx = dev->index;
union hidpp10_message led_intensity = CMD_LED_INTENSITY(idx, GET_REGISTER_REQ);
uint8_t *intensity = led_intensity.msg.parameters;
int res;
log_raw(dev->ratbag_device->ratbag, "Fetching LED intensity\n");
res = hidpp10_request_command(dev, &led_intensity);
if (res)
return res;
led_intensity_in_percent[0] = 10 * ((intensity[0] ) & 0xF);
led_intensity_in_percent[1] = 10 * ((intensity[0] >> 4) & 0xF);
led_intensity_in_percent[2] = 10 * ((intensity[1] ) & 0xF);
led_intensity_in_percent[3] = 10 * ((intensity[1] >> 4) & 0xF);
led_intensity_in_percent[4] = 10 * ((intensity[2] ) & 0xF);
led_intensity_in_percent[5] = 10 * ((intensity[2] >> 4) & 0xF);
return 0;
}
int
hidpp10_set_led_intensity(struct hidpp10_device *dev,
const uint8_t led_intensity_in_percent[6])
{
unsigned idx = dev->index;
union hidpp10_message led_intensity = CMD_LED_INTENSITY(idx, SET_REGISTER_REQ);
uint8_t *intensity = led_intensity.msg.parameters;
int res;
log_raw(dev->ratbag_device->ratbag, "Setting LED intensity\n");
intensity[0] = led_intensity_in_percent[0]/10 & 0xF;
intensity[0] |= (led_intensity_in_percent[1]/10 & 0xF) << 4;
intensity[1] = led_intensity_in_percent[2]/10 & 0xF;
intensity[1] |= (led_intensity_in_percent[3]/10 & 0xF) << 4;
intensity[2] = led_intensity_in_percent[4]/10 & 0xF;
intensity[2] |= (led_intensity_in_percent[5]/10 & 0xF) << 4;
res = hidpp10_request_command(dev, &led_intensity);
return res;
}
/* -------------------------------------------------------------------------- */
/* 0x57: LED Color */
/* -------------------------------------------------------------------------- */

View File

@@ -215,6 +215,20 @@ int
hidpp10_set_led_status(struct hidpp10_device *dev,
const bool led[4]);
/* -------------------------------------------------------------------------- */
/* 0x54: LED Intensity */
/* -------------------------------------------------------------------------- */
int
hidpp10_get_led_intensity(struct hidpp10_device *dev,
uint8_t led_intensity_in_percent[6]);
/* Granularity for the led intensity is 10% increments. A value of 0 leaves
* the intensity unchanged */
int
hidpp10_set_led_intensity(struct hidpp10_device *dev,
const uint8_t led_intensity_in_percent[6]);
/* -------------------------------------------------------------------------- */
/* 0x57: LED Color */
/* -------------------------------------------------------------------------- */