Клавиши регулировки подсветки на клавиатуре хромбука Acer C720 являются замаскированными клавишами F6 и F7. Соответственно при замене ChromeOS на DragoFly BSD регулировка подсветки не работает. Не удаётся также использовать xbacklight - он не находит видео-выходов с возможностью регулировки подсветки. xrandr может помочь, но это программное решение, что-то типа приглушения яркости выводимых точек. Ясно, что жизнь батарее это никак не продлит.
Изменим драйвер i915 таким образом, чтобы он создавал два sysctl’а:
Из плюсов:
Из минусов:
Драйвер i915 предоставляет механизм управления подсветкой, достаточно знать указатель на текущее drm-устройство: struct drm_device *dev
.
u32 intel_panel_get_max_backlight(dev)
;dev->dev_private->backlight_level
;intel_panel_set_backlight(dev, val)
;Для двух sysctl пишем две функции обработки чтения/записи:
/*
* Read max backlight level
*/
static int
sysctl_backlight_max(SYSCTL_HANDLER_ARGS)
{
int err, val;
val =intel_panel_get_max_backlight((struct drm_device *)arg1);
err = sysctl_handle_int(oidp, &val, 0, req);
return(err);
}
/*
* Read/write backlight level
*/
static int
sysctl_backlight_handler(SYSCTL_HANDLER_ARGS)
{
struct drm_i915_private *dev_priv;
int err, val;
dev_priv = ((struct drm_device *)arg1)->dev_private;
val = dev_priv->backlight_level;
err = sysctl_handle_int(oidp, &val, 0, req);
if (err != 0 || req->newptr == NULL) {
return(err);
}
if (val != dev_priv->backlight_level && val >= 0
&& val <= intel_panel_get_max_backlight((struct drm_device *)arg1)) {
intel_panel_set_backlight(arg1, val);
}
return(err);
}
dev
можно узнать только во время выполнения, так что используем динамическое управление sysctl с помощью макроса SYSCTL_ADD_PROC
.
SYSCTL_ADD_PROC(&connector->dev->sysctl->ctx, &sysctl__hw_children,
OID_AUTO, "backlight_max",
CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_ANYBODY,
connector->dev, sizeof(int),
sysctl_backlight_max,
"I", "Max backlight level");
SYSCTL_ADD_PROC(&connector->dev->sysctl->ctx, &sysctl__hw_children,
OID_AUTO, "backlight_level",
CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_ANYBODY,
connector->dev, sizeof(int),
sysctl_backlight_handler,
"I", "Backlight level");
В результате становится возможным использовать команды типа sysctl hw.backlight_level=370
чтобы установить приемлимый уровень подсветки. Фактически сейчас эта команда прописана у меня в .xinitrc, я не озадачиваюсь пока привязкой какого-нибудь скрипта к клавишам F6 и F7. Это не сложно, просто впереди ещё один способ, который только предстоит придумать:)
Полный текст заплатки накладываемой на DragonFly BSD от 19/12/2014.