diff -Nur hal.orig/configure.in hal/configure.in
--- hal.orig/configure.in 2007-01-03 09:19:29.000000000 +0100
+++ hal/configure.in 2007-01-03 09:13:40.000000000 +0100
@@ -245,6 +245,9 @@
AM_CONDITIONAL(HAVE_LIBUSB,false)
fi
+dnl Check for libsmbios
+AC_CHECK_LIB(smbios, SMBIOSFreeMemory, [AM_CONDITIONAL(HAVE_SMBIOS, true)], [AM_CONDITIONAL(HAVE_SMBIOS, false)])
+
dnl Check for libpci
AC_CHECK_HEADERS(pci/pci.h, [
AC_CHECK_LIB(pci, pci_init, [
@@ -569,6 +572,29 @@
fi
AM_CONDITIONAL(BUILD_USBCSR, test x$BUILD_USBCSR = xyes)
+dnl Dell backlight
+AC_ARG_WITH(dell-backlight, [ --with-dell-backlight Whether to build Dell backlight support (auto)])
+BUILD_DELL=no
+if test "x$with_dell_backlight" = "xyes" ; then
+ BUILD_DELL=yes
+elif test "x$with_dell_backlight" = "x" ; then
+ if test "$HAVE_SMBIOS" != "false" ; then
+ case "${HALD_BACKEND}" in
+ linux)
+ case "${host}" in
+ i[[3456]]86-*-*)
+ BUILD_DELL=yes
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ *)
+ ;;
+ esac
+ fi
+fi
+AM_CONDITIONAL(BUILD_DELL, test x$BUILD_DELL = xyes)
dnl
dnl SUBSETTING END
@@ -663,6 +689,7 @@
Macbook Pro utils: ${BUILD_MACBOOKPRO} (Linux only, x86 only, requires libpci)
CPU frequency scaling: ${BUILD_CPUFREQ} (Linux only)
USB wireless mouse power: ${BUILD_USBCSR} (Linux only, requires libusb)
+ Dell Backlight ${BUILD_DELL} (Linux only, requires libsmbios)
Maintainer mode: ${USE_MAINTAINER_MODE}
Building verbose mode: ${enable_verbose_mode}
diff -Nur hal.orig/fdi/policy/10osvendor/10-dell-laptop-brightness.fdi hal/fdi/policy/10osvendor/10-dell-laptop-brightness.fdi
--- hal.orig/fdi/policy/10osvendor/10-dell-laptop-brightness.fdi 1970-01-01 01:00:00.000000000 +0100
+++ hal/fdi/policy/10osvendor/10-dell-laptop-brightness.fdi 2007-01-03 09:14:19.000000000 +0100
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ laptop_panel
+ laptop_panel
+ Dell Laptop Panel
+ custom
+ 8
+ false
+ hald-addon-dell-backlight
+
+
+
+
\ No newline at end of file
diff -Nur hal.orig/fdi/policy/10osvendor/Makefile.am hal/fdi/policy/10osvendor/Makefile.am
--- hal.orig/fdi/policy/10osvendor/Makefile.am 2007-01-03 09:19:29.000000000 +0100
+++ hal/fdi/policy/10osvendor/Makefile.am 2007-01-03 09:14:46.000000000 +0100
@@ -21,6 +21,10 @@
dist_fdi_DATA += 10-usbcsr-mice.fdi
endif
+if BUILD_DELL
+dist_fdi_DATA += 10-dell-laptop-brightness.fdi
+endif
+
check:
for f in $(dist_fdi_DATA); do \
echo -n "Validate XML in $$f : "; \
Binary files hal.orig/.git/index and hal/.git/index differ
diff -Nur hal.orig/hald/linux/addons/addon-dell-backlight.cpp hal/hald/linux/addons/addon-dell-backlight.cpp
--- hal.orig/hald/linux/addons/addon-dell-backlight.cpp 1970-01-01 01:00:00.000000000 +0100
+++ hal/hald/linux/addons/addon-dell-backlight.cpp 2007-01-03 09:26:20.000000000 +0100
@@ -0,0 +1,252 @@
+/***************************************************************************
+ *
+ *
+ * addon-dell-backlight.cpp : Sets the backlight for Dell laptops using the libsmbios interface
+ *
+ * Copyright (C) 2007 Erik Andrén
+ * Heavily based on the macbook addon and the dellLcdBrightness code in libsmbios.
+ * This program needs the dcdbas module to be loaded and libsmbios >= 0.12.1 installed
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ **************************************************************************/
+
+#include
+#include
+#include
+
+#include "libhal/libhal.h"
+#include "../../logger.h"
+
+#include "smbios/ISmi.h"
+#include "smbios/IToken.h"
+
+static LibHalContext *halctx = NULL;
+static GMainLoop *main_loop;
+static char *udi;
+static DBusConnection *conn;
+static const int DELL_LCD_BRIGHTNESS_TOKEN = 0x007d;
+
+using namespace std;
+using namespace smi;
+
+typedef u32 (*readfn)(u32 location, u32 *minValue, u32 *maxValue);
+typedef u32 (*writefn)(const std::string &password, u32 location, u32 value, u32 *minValue, u32 *maxValue);
+
+static u32
+read_backlight(dbus_bool_t ACon)
+{
+ u8 location = 0;
+ u32 minValue = 0;
+ u32 maxValue = 0;
+ u32 curValue;
+ readfn readFunction;
+
+ if (ACon)
+ readFunction = &smi::readACModeSetting;
+ else
+ readFunction = &smi::readBatteryModeSetting;
+
+ smbios::TokenTableFactory *ttFactory = smbios::TokenTableFactory::getFactory() ;
+ smbios::ITokenTable *tokenTable = ttFactory->getSingleton();
+ smbios::IToken *token = &(*((*tokenTable)[ DELL_LCD_BRIGHTNESS_TOKEN ]));
+ dynamic_cast< smbios::ISmiToken * >(token)->getSmiDetails( static_cast(0), static_cast(0), &location );
+
+ try
+ {
+ curValue = readFunction(location, &minValue, &maxValue);
+ }
+ catch( const exception &e )
+ {
+ HAL_ERROR(("Could not access the dcdbas kernel module. Please make sure it is loaded"));
+ return 7;
+ }
+
+ if(ACon)
+ HAL_DEBUG(("Reading %d from the AC backlight register", curValue));
+ else
+ HAL_DEBUG(("Reading %d from the BAT backlight register", curValue));
+
+ return curValue;
+}
+
+static void
+write_backlight (u32 newBacklightValue, dbus_bool_t ACon)
+{
+ u8 location = 0;
+ u32 minValue = 0;
+ u32 maxValue = 0;
+ u32 curValue;
+ writefn writeFunction;
+ string password(""); //FIXME: Implement password support
+
+ if (ACon)
+ writeFunction = &smi::writeACModeSetting;
+ else
+ writeFunction = &smi::writeBatteryModeSetting;
+
+ smbios::TokenTableFactory *ttFactory = smbios::TokenTableFactory::getFactory();
+ smbios::ITokenTable *tokenTable = ttFactory->getSingleton();
+ smbios::IToken *token = &(*((*tokenTable)[ DELL_LCD_BRIGHTNESS_TOKEN ]));
+ dynamic_cast< smbios::ISmiToken * >(token)->getSmiDetails( static_cast(0), static_cast(0), &location );
+
+ try
+ {
+ curValue = writeFunction(password, location, newBacklightValue, &minValue, &maxValue);
+ }
+ catch( const exception &e )
+ {
+ HAL_ERROR(("Could not access the dcdbas kernel module. Please make sure it is loaded"));
+ return;
+ }
+ if(ACon)
+ HAL_DEBUG(("Wrote %d to the AC backlight", curValue));
+ else
+ HAL_DEBUG(("Wrote %d to the BAT backlight", curValue));
+}
+
+static DBusHandlerResult
+filter_function (DBusConnection *connection, DBusMessage *message, void *userdata)
+{
+ DBusError err;
+ DBusMessage *reply = NULL;
+ dbus_bool_t AC;
+ dbus_error_init (&err);
+
+ /* Mechanism to ensure that we always set the AC brightness when we are on AC-power etc. */
+ AC = libhal_device_get_property_bool (halctx,
+ "/org/freedesktop/Hal/devices/acpi_AC",
+ "ac_adapter.present",
+ &err);
+
+ if (dbus_message_is_method_call (message,
+ "org.freedesktop.Hal.Device.LaptopPanel",
+ "SetBrightness")) {
+ int brightness;
+
+ HAL_DEBUG(("Received SetBrightness DBus call"));
+
+ if (dbus_message_get_args (message,
+ &err,
+ DBUS_TYPE_INT32, &brightness,
+ DBUS_TYPE_INVALID)) {
+ if (brightness < 0 || brightness > 7) {
+ reply = dbus_message_new_error (message,
+ "org.freedesktop.Hal.Device.LaptopPanel.Invalid",
+ "Brightness has to be between 0 and 7!");
+
+ } else {
+ int return_code;
+
+ write_backlight (brightness, AC);
+
+ reply = dbus_message_new_method_return (message);
+ if (reply == NULL)
+ goto error;
+
+ return_code = 0;
+
+ dbus_message_append_args (reply,
+ DBUS_TYPE_INT32, &return_code,
+ DBUS_TYPE_INVALID);
+ }
+
+ dbus_connection_send (connection, reply, NULL);
+ }
+
+ } else if (dbus_message_is_method_call (message,
+ "org.freedesktop.Hal.Device.LaptopPanel",
+ "GetBrightness")) {
+ HAL_DEBUG(("Received GetBrightness DBUS call"));
+
+ if (dbus_message_get_args (message,
+ &err,
+ DBUS_TYPE_INVALID)) {
+ int brightness = read_backlight(AC);
+ if (brightness < 0)
+ brightness = 0;
+ else if (brightness > 7)
+ brightness = 7;
+
+ reply = dbus_message_new_method_return (message);
+ if (reply == NULL)
+ goto error;
+
+ dbus_message_append_args (reply,
+ DBUS_TYPE_INT32, &brightness,
+ DBUS_TYPE_INVALID);
+ dbus_connection_send (connection, reply, NULL);
+ }
+ }
+error:
+ if (reply != NULL)
+ dbus_message_unref (reply);
+
+ return DBUS_HANDLER_RESULT_HANDLED;
+}
+
+int
+main (int argc, char *argv[])
+{
+ DBusError err;
+
+ setup_logger ();
+
+ udi = getenv ("UDI");
+
+ HAL_DEBUG (("udi=%s", udi));
+ if (udi == NULL) {
+ HAL_ERROR (("No device specified"));
+ return -2;
+ }
+
+ dbus_error_init (&err);
+ if ((halctx = libhal_ctx_init_direct (&err)) == NULL) {
+ HAL_ERROR (("Cannot connect to hald"));
+ return -3;
+ }
+
+ dbus_error_init (&err);
+ if (!libhal_device_addon_is_ready (halctx, udi, &err)) {
+ return -4;
+ }
+
+ conn = libhal_ctx_get_dbus_connection (halctx);
+ dbus_connection_setup_with_g_main (conn, NULL);
+
+ dbus_connection_add_filter (conn, filter_function, NULL, NULL);
+
+ /* this works because we hardcoded the udi's in the in the fdi files */
+ if (!libhal_device_claim_interface (halctx,
+ "/org/freedesktop/Hal/devices/dell_lcd_panel",
+ "org.freedesktop.Hal.Device.LaptopPanel",
+ " \n"
+ " \n"
+ " \n"
+ " \n"
+ " \n"
+ " \n"
+ " \n",
+ &err)) {
+ HAL_ERROR (("Cannot claim interface 'org.freedesktop.Hal.Device.LaptopPanel'"));
+ return -4;
+ }
+
+ main_loop = g_main_loop_new (NULL, FALSE);
+ g_main_loop_run (main_loop);
+ return 0;
+}
+
+
diff -Nur hal.orig/hald/linux/addons/Makefile.am hal/hald/linux/addons/Makefile.am
--- hal.orig/hald/linux/addons/Makefile.am 2007-01-03 09:19:29.000000000 +0100
+++ hal/hald/linux/addons/Makefile.am 2007-01-03 09:10:45.000000000 +0100
@@ -43,6 +43,12 @@
hald_addon_usb_csr_SOURCES = addon-usb-csr.c ../../logger.c ../../util_helper.c
hald_addon_usb_csr_LDADD = $(top_builddir)/libhal/libhal.la -lusb @GLIB_LIBS@
endif
+
+if BUILD_DELL
+libexec_PROGRAMS += hald-addon-dell-backlight
+hald_addon_dell_backlight_SOURCES = addon-dell-backlight.cpp ../../logger.c
+hald_addon_dell_backlight_LDADD = $(top_builddir)/libhal/libhal.la -lsmbios @GLIB_LIBS@
+endif
endif
hald_addon_acpi_SOURCES = addon-acpi.c ../../logger.c ../../util_helper.c
diff -Nur hal.orig/hald/logger.h hal/hald/logger.h
--- hal.orig/hald/logger.h 2007-01-03 09:19:29.000000000 +0100
+++ hal/hald/logger.h 2007-01-03 09:11:45.000000000 +0100
@@ -23,6 +23,10 @@
*
**************************************************************************/
+#ifdef __cplusplus
+extern "C" {
+#endif
+
#ifndef LOGGER_H
#define LOGGER_H
@@ -85,3 +89,8 @@
/** @} */
#endif /* LOGGER_H */
+
+#ifdef __cplusplus
+}
+#endif
+