Yellow Rabbit

Механизм регулировки яркости экрана

Яркость экрана ноутбука - ноутбук Acer C720, BSD

Клавиши регулировки подсветки на клавиатуре хромбука Acer C720 являются замаскированными клавишами F6 и F7. Соответственно при замене ChromeOS на DragoFly BSD регулировка подсветки не работает. Не удаётся также использовать xbacklight - он не находит видео-выходов с возможностью регулировки подсветки. xrandr может помочь, но это программное решение, что-то типа приглушения яркости выводимых точек. Ясно, что жизнь батарее это никак не продлит.

Первый способ

Изменим драйвер i915 таким образом, чтобы он создавал два sysctl’а:

Из плюсов:

Из минусов:

Драйвер i915 предоставляет механизм управления подсветкой, достаточно знать указатель на текущее drm-устройство: struct drm_device *dev.

Для двух 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.