# Updated but not checked in: # (will commit) # # modified: configure.in # new file: fdi/policy/10osvendor/10-bluetooth-switch.fdi # modified: fdi/policy/10osvendor/Makefile.am # modified: tools/.gitignore # modified: tools/Makefile.am # new file: tools/hal-system-bluetooth-get-power # new file: tools/hal-system-bluetooth-set-power # new file: tools/hal-system-sonypic.c # modified: tools/linux/Makefile.am # new file: tools/linux/hal-system-bluetooth-get-power-linux # new file: tools/linux/hal-system-bluetooth-set-power-linux # modified: tools/linux/hal-system-lcd-get-brightness-linux # modified: tools/linux/hal-system-lcd-set-brightness-linux # diff --git a/configure.in b/configure.in index 7b0eb23..6a04bd3 100644 --- a/configure.in +++ b/configure.in @@ -393,12 +393,19 @@ if test "x$enable_pmu" != "xno"; then AC_DEFINE(HAVE_PMU, [], [Set if we have PMU support]) fi AM_CONDITIONAL(HAVE_PMU, test x$msg_pmu = xyes, [Compiling PMU]) +AC_ARG_ENABLE(have_sonypic, [ --disable-sonypic Build without Sony PIC support]) +msg_sonypic=no +if test "x$enable_sonypic" != "xno"; then + msg_sonypic=yes + AC_DEFINE(HAVE_SONYPIC, [], [Set if we have Sony PIC support]) +fi +AM_CONDITIONAL(HAVE_SONYPIC, test x$msg_sonypic = xyes, [Compiling Sony PIC]) AC_ARG_ENABLE(have_pci, [ --disable-pci Build without PCI support]) msg_pci=no if test "x$enable_pci" != "xno"; then msg_pci=yes - AC_DEFINE(HAVE_PCI, [], [Set if we have ACPI support]) + AC_DEFINE(HAVE_PCI, [], [Set if we have PCI support]) fi # D-Bus libs @@ -765,6 +772,7 @@ echo " use ACPI: ${msg_acpi} use PMU: ${msg_pmu} use APM: ${msg_apm} + use Sony PIC: ${msg_sonypic} Macbook Pro utils: ${BUILD_MACBOOKPRO} (Linux only, x86 only, requires libpci) CPU frequency scaling: ${BUILD_CPUFREQ} (Linux only) diff --git a/fdi/policy/10osvendor/10-bluetooth-switch.fdi b/fdi/policy/10osvendor/10-bluetooth-switch.fdi new file mode 100644 index 0000000..b4da195 --- /dev/null +++ b/fdi/policy/10osvendor/10-bluetooth-switch.fdi @@ -0,0 +1,21 @@ + + + + + + + org.freedesktop.Hal.Device.BluetoothKillSwitch + + SetPower + b + power + hal-system-bluetooth-set-power + + GetPower + + + hal-system-bluetooth-get-power + + + + diff --git a/fdi/policy/10osvendor/Makefile.am b/fdi/policy/10osvendor/Makefile.am index 734eead..468cb1a 100644 --- a/fdi/policy/10osvendor/Makefile.am +++ b/fdi/policy/10osvendor/Makefile.am @@ -5,6 +5,7 @@ dist_fdi_DATA = \ 10-keyboard-policy.fdi \ 10-power-mgmt-policy.fdi \ 10-toshiba-buttons.fdi \ + 10-bluetooth-switch.fdi \ 10-laptop-panel-mgmt-policy.fdi \ 15-storage-luks.fdi \ 20-storage-methods.fdi diff --git a/tools/.gitignore b/tools/.gitignore index 94316c8..664b6f3 100644 --- a/tools/.gitignore +++ b/tools/.gitignore @@ -13,6 +13,7 @@ hal-device hal-luks-remove hal-luks-setup hal-system-power-pmu +hal-system-sonypic hal-policy-is-privileged hal-storage-mount hal-storage-cleanup-all-mountpoints diff --git a/tools/Makefile.am b/tools/Makefile.am index d820cc8..d4b16ae 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -56,7 +56,8 @@ libexec_PROGRAMS = \ hal-storage-closetray \ hal-storage-cleanup-mountpoint \ hal-storage-cleanup-all-mountpoints \ - hal-system-power-pmu + hal-system-power-pmu \ + hal-system-sonypic hal_storage_mount_SOURCES = hal-storage-mount.c hal-storage-shared.c hal-storage-shared.h hal_storage_mount_LDADD = @GLIB_LIBS@ @POLKIT_LIBS@ @DBUS_LIBS@ $(top_builddir)/libhal/libhal.la $(top_builddir)/libhal-storage/libhal-storage.la @@ -79,6 +80,9 @@ hal_storage_cleanup_all_mountpoints_LDADD = @GLIB_LIBS@ @POLKIT_LIBS@ @DBUS_LIBS hal_system_power_pmu_SOURCES = hal-system-power-pmu.c hal_system_power_pmu_LDADD = @DBUS_LIBS@ $(top_builddir)/libhal/libhal.la +hal_system_sonypic_SOURCES = hal-system-sonypic.c +hal_system_sonypic_LDADD = @GLIB_LIBS@ @DBUS_LIBS@ $(top_builddir)/libhal/libhal.la + scriptdir = $(libdir)/hal/scripts script_SCRIPTS = \ @@ -91,7 +95,9 @@ script_SCRIPTS = \ hal-system-power-reboot \ hal-system-lcd-get-brightness \ hal-system-lcd-set-brightness \ - hal-system-power-set-power-save + hal-system-power-set-power-save \ + hal-system-bluetooth-get-power \ + hal-system-bluetooth-set-power EXTRA_DIST=$(man_MANS) $(MAN_IN_FILES) gen-libgphoto-hal-fdi $(script_SCRIPTS) diff --git a/tools/hal-system-bluetooth-get-power b/tools/hal-system-bluetooth-get-power new file mode 100755 index 0000000..4de48bd --- /dev/null +++ b/tools/hal-system-bluetooth-get-power @@ -0,0 +1,26 @@ +#!/bin/sh +# +# Copyright (C) 2007 Bastien Nocera +# +# 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. + +# Check for environment variables +if [ -z "$HAL_PROP_KILLSWITCH_ACCESS_METHOD" ]; then + echo "org.freedesktop.Hal.Device.UnknownError" >&2 + echo "Missing or empty environment variable(s)." >&2 + echo "This script should be started by hald." >&2 + exit 1 +fi + +# TODO: check privilege + +if [ -n "$HALD_UNAME_S" -a -x ./$HALD_UNAME_S/hal-system-bluetooth-get-power-$HALD_UNAME_S ]; then + exec ./$HALD_UNAME_S/hal-system-bluetooth-get-power-$HALD_UNAME_S $@ +else + echo "org.freedesktop.Hal.Device.UnknownError" >&2 + echo "No back-end for your operating system" >&2 + exit 1 +fi diff --git a/tools/hal-system-bluetooth-set-power b/tools/hal-system-bluetooth-set-power new file mode 100755 index 0000000..7c80a26 --- /dev/null +++ b/tools/hal-system-bluetooth-set-power @@ -0,0 +1,30 @@ +#!/bin/sh +# +# Copyright (C) 2007 Bastien Nocera +# +# 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. + +# Check for environment variables +if [ -z "$HAL_PROP_KILLSWITCH_ACCESS_METHOD" ] ; then + echo "org.freedesktop.Hal.Device.UnknownError" >&2 + echo "Missing or empty environment variable(s)." >&2 + echo "This script should be started by hald." >&2 + exit 1 +fi + +# TODO: check privilege + +# read value for set bluetooth power +read value +export value + +if [ -n "$HALD_UNAME_S" -a -x ./$HALD_UNAME_S/hal-system-bluetooth-set-power-$HALD_UNAME_S ]; then + exec ./$HALD_UNAME_S/hal-system-bluetooth-set-power-$HALD_UNAME_S $@ +else + echo "org.freedesktop.Hal.Device.UnknownError" >&2 + echo "No back-end for your operating system" >&2 + exit 1 +fi diff --git a/tools/hal-system-sonypic.c b/tools/hal-system-sonypic.c new file mode 100644 index 0000000..9344c2b --- /dev/null +++ b/tools/hal-system-sonypic.c @@ -0,0 +1,308 @@ +/*! @file hal-system-sonypic.c + * @brief Issue ioctl's from methods invoked by HAL. + * @author Bastien Nocera + * @author Richard Hughes + * @date Thursday 08 February 2007 + */ +/* + * Licensed under the GNU General Public License Version 2 + * + * 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 Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#ifdef __linux__ +#include +#define SONYPI_DEV "/dev/sonypi" +#define __u8 u_int8_t +#endif /* __linux__ */ + +#include + +/** + * @defgroup HalSystemSonypi Use sonypi specific ioctls + * @ingroup HalMisc + * + * @brief A commandline tool for running sonypi specific ioctl's. Uses libhal + * + * @{ + */ + +/** Gets the LCD brightness + * + * @param val The returned brightness value, 0..255 + * @return Success, TRUE or FALSE + */ +static int +sonypi_get_lcd_brightness (__u8 *val) +{ +#ifdef __FreeBSD__ + return FALSE; /* FIXME implement */ +#elif sun + return FALSE; /* FIXME implement */ +#else + int fd; + int ret; + + fd = open (SONYPI_DEV, O_RDONLY); + if (fd < 0) { + fprintf (stderr, "sonyi : Failed to open " SONYPI_DEV "\n"); + return FALSE; + } + ret = ioctl (fd, SONYPI_IOCGBRT, val); + close (fd); + + if (ret < 0) { + fprintf (stderr, "sonypi : SONYPI_IOCGBRT failed\n"); + return FALSE; + } + return TRUE; +#endif /* ! __FreeBSD__ */ +} + +/** Gets whether the builtin Bluetooth adapter is turned on + * + * @param val The returned power status + * @return Success, TRUE or FALSE + */ +static int +sonypi_get_bluetooth_power (int *found, int usb_vendor_id, int usb_product_id) +{ + LibHalContext *ctx; + DBusError err; + char **devices; + int num_devices, i; + + *found = FALSE; + + dbus_error_init (&err); + ctx = libhal_ctx_init_direct (&err); + if (ctx == NULL) { + fprintf (stderr, "Cannot contact HAL: %s\n", dbus_error_is_set (&err) ? + err.message : "No reason"); + if (dbus_error_is_set (&err)) + LIBHAL_FREE_DBUS_ERROR (&err); + return FALSE; + } + devices = libhal_get_all_devices (ctx, &num_devices, &err); + if (dbus_error_is_set (&err)) + goto error_set; + + for(i = 0; i < num_devices; i++) { + int device_vid, device_pid; + if (libhal_device_property_exists (ctx, devices[i], "usb.vendor_id", &err) == FALSE) { + if (dbus_error_is_set (&err)) + goto error_set; + continue; + } + device_vid = libhal_device_get_property_int (ctx, devices[i], "usb.vendor_id", &err); + if (dbus_error_is_set (&err)) + goto error_set; + if (device_vid != usb_vendor_id) + continue; + + if (libhal_device_property_exists (ctx, devices[i], "usb.product_id", &err) == FALSE) { + if (dbus_error_is_set (&err)) + goto error_set; + continue; + } + device_pid = libhal_device_get_property_int (ctx, devices[i], "usb.product_id", &err); + if (dbus_error_is_set (&err)) + goto error_set; + if (device_pid != usb_product_id) + continue; + + /* Yay! Found the device */ + *found = TRUE; + break; + } + + libhal_ctx_shutdown (ctx, NULL); + return TRUE; + +error_set: + fprintf (stderr, "Error looking for the Bluetooth device: %s\n", err.message); + LIBHAL_FREE_DBUS_ERROR (&err); + libhal_ctx_shutdown (ctx, &err); + + return FALSE; +} + +/** Sets the LCD brightness + * + * @param val The brightness value we want to set, 0..255 + * @return Success, TRUE or FALSE + */ +static int +sonypi_set_lcd_brightness (__u8 val) +{ +#ifdef __FreeBSD__ + return FALSE; /* FIXME implement */ +#elif sun + return FALSE; /* FIXME implement */ +#else + int ret; + int fd; + + fd = open (SONYPI_DEV, O_RDWR); + if (fd < 0) { + fprintf (stderr, "sonypi : Failed to open " SONYPI_DEV "\n"); + return FALSE; + } + ret = ioctl (fd, SONYPI_IOCSBRT, &val); + close (fd); + + if (ret < 0) { + fprintf (stderr, "sonypi : SONYPI_IOCSBRT failed\n"); + return FALSE; + } + return TRUE; +#endif /* ! __FreeBSD__ */ +} + +/** Sets the builtin Bluetooth adapter's power + * + * @param val The power value we want to set + * @return Success, TRUE or FALSE + */ +static int +sonypi_set_bluetooth_power (int val) +{ +#ifdef __FreeBSD__ + return FALSE; /* FIXME implement */ +#elif sun + return FALSE; /* FIXME implement */ +#else + int ret; + int fd; + + fd = open (SONYPI_DEV, O_RDWR); + if (fd < 0) { + fprintf (stderr, "sonypi : Failed to open " SONYPI_DEV "\n"); + return FALSE; + } + ret = ioctl (fd, SONYPI_IOCSBLUE, &val); + close (fd); + + if (ret < 0) { + fprintf (stderr, "sonypi : SONYPI_IOCSBLUE failed\n"); + return FALSE; + } + return TRUE; +#endif /* ! __FreeBSD__ */ +} + +/** Print out program usage. + * + * @param argc Number of arguments given to program + * @param argv Arguments given to program + */ +static void +usage (int argc, char *argv[]) +{ + fprintf (stderr, "\nusage : hal-system-sonypi " + "[setlcd x] [getlcd] [setbluetooth x] [getbluetooth]\n"); + fprintf (stderr, + "\n" + " setlcd x Sets the LCD to a range 0..14 (0 is off)\n" + " getlcd Gets the current LCD brightness value\n" + " setbluetooth x Sets the Bluetooth power\n" + " getbluetooth Gets the Bluetooth power\n" + " help Show this information and exit\n" + "\n" + "This program calls sonypi specific ioctls from within scripts run by HAL.\n"); +} + +/** Entry point + * + * @param argc Number of arguments given to program + * @param argv Arguments given to program + * @return Return code + */ +int +main (int argc, char *argv[]) +{ + __u8 brightness; + int power; + int ret; + + if (argc == 2) { + if (strcmp (argv[1], "getlcd") == 0) { + ret = sonypi_get_lcd_brightness (&brightness); + if (ret == FALSE) + return EXIT_FAILURE; + printf ("%i", brightness); + return EXIT_SUCCESS; + } + if (strcmp (argv[1], "getbluetooth") == 0) { + const char *usb_vendor_id, *usb_product_id; + int vid, pid; + + power = 0; + if ((usb_vendor_id = g_getenv ("HAL_PROP_INFO_EXPECTED_USB_VENDOR_ID")) == NULL + || (usb_product_id = g_getenv ("HAL_PROP_INFO_EXPECTED_USB_PRODUCT_ID")) == NULL) { + fprintf (stderr, "sonypi : no expected USB IDs supplied\n"); + return EXIT_FAILURE; + } + + vid = (int) g_ascii_strtoll (usb_vendor_id, NULL, 0); + pid = (int) g_ascii_strtoll (usb_product_id, NULL, 0); + ret = sonypi_get_bluetooth_power (&power, vid, pid); + + if (ret == FALSE) + return EXIT_FAILURE; + printf ("%i", power); + return EXIT_SUCCESS; + } + } else if (argc == 3) { + if (strcmp (argv[1], "setlcd") == 0) { + /* This will clip the brightness to a number + * between 0 and 255 */ + brightness = atoi (argv[2]); + ret = sonypi_set_lcd_brightness (brightness); + if (ret == FALSE) + return EXIT_FAILURE; + return EXIT_SUCCESS; + } + if (strcmp (argv[1], "setbluetooth") == 0) { + power = atoi (argv[2]); + ret = sonypi_set_bluetooth_power (power); + if (ret == FALSE) + return EXIT_FAILURE; + return EXIT_SUCCESS; + } + } + usage (argc, argv); + return EXIT_SUCCESS; +} + +/** + * @} + */ diff --git a/tools/linux/Makefile.am b/tools/linux/Makefile.am index 2e8b4cb..d3bd975 100644 --- a/tools/linux/Makefile.am +++ b/tools/linux/Makefile.am @@ -15,7 +15,9 @@ script_SCRIPTS = \ hal-system-power-reboot-linux \ hal-system-lcd-get-brightness-linux \ hal-system-lcd-set-brightness-linux \ - hal-system-power-set-power-save-linux + hal-system-power-set-power-save-linux \ + hal-system-bluetooth-get-power-linux \ + hal-system-bluetooth-set-power-linux EXTRA_DIST = 90-hal.rules $(script_SCRIPTS) diff --git a/tools/linux/hal-system-bluetooth-get-power-linux b/tools/linux/hal-system-bluetooth-get-power-linux new file mode 100755 index 0000000..6dd8c77 --- /dev/null +++ b/tools/linux/hal-system-bluetooth-get-power-linux @@ -0,0 +1,22 @@ +#!/bin/sh +# +# Copyright (C) 2007 Bastien Nocera +# +# 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. + +if [ "$HAL_PROP_KILLSWITCH_ACCESS_METHOD" = "sonypic" ]; then + value="`hal-system-sonypic getbluetooth`" + if [ $? -ne 0 ]; then + echo "org.freedesktop.Hal.Device.BluetoothButton.NotSupported" >&2 + exit 1 + fi + exit ${value} +else + echo "org.freedesktop.Hal.Device.BluetoothButton.NotSupported" >&2 + echo "Access type not supported" >&2 + exit 1 +fi + diff --git a/tools/linux/hal-system-bluetooth-set-power-linux b/tools/linux/hal-system-bluetooth-set-power-linux new file mode 100755 index 0000000..f3c80ad --- /dev/null +++ b/tools/linux/hal-system-bluetooth-set-power-linux @@ -0,0 +1,22 @@ +#!/bin/sh +# +# Copyright (C) 2007 Bastien Nocera +# +# 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. + +if [ "$HAL_PROP_KILLSWITCH_ACCESS_METHOD" = "sonypic" ]; then + hal-system-sonypic setbluetooth $value + if [ $? -ne 0 ]; then + echo "org.freedesktop.Hal.Device.BluetoothButton.NotSupported" >&2 + exit 1 + fi + exit 0 +else + echo "org.freedesktop.Hal.Device.BluetoothButton.NotSupported" >&2 + echo "Access type not supported" >&2 + exit 1 +fi + diff --git a/tools/linux/hal-system-lcd-get-brightness-linux b/tools/linux/hal-system-lcd-get-brightness-linux index 673a41e..5128c4b 100755 --- a/tools/linux/hal-system-lcd-get-brightness-linux +++ b/tools/linux/hal-system-lcd-get-brightness-linux @@ -20,6 +20,13 @@ if [ "$HAL_PROP_LAPTOP_PANEL_ACCESS_METHOD" = "pmu" ]; then exit 1 fi exit ${value} +elif [ "$HAL_PROP_LAPTOP_PANEL_ACCESS_METHOD" = "sonypi" ]; then + value="`hal-system-sonypic getlcd`" + if [ $? -ne 0 ]; then + echo "org.freedesktop.Hal.Device.LaptopPanel.NotSupported" >&2 + exit 1 + fi + exit ${value} fi # Check for file existance and that it's readable @@ -57,17 +64,6 @@ elif [ "$HAL_PROP_LAPTOP_PANEL_ACCESS_METHOD" = "omnibook" ]; then # cat /proc/omnibook/lcd # LCD brightness: 7 value="`cat $HAL_PROP_LINUX_ACPI_PATH | awk '{print $3;}'`" -elif [ "$HAL_PROP_LAPTOP_PANEL_ACCESS_METHOD" = "sonypi" ]; then - # spicctrl -B - # 70 - # 0..255 - value="`/usr/sbin/spicctrl -B`" - RETVAL=$? - if [ $RETVAL != 0 ]; then - echo "org.freedesktop.Hal.Device.LaptopPanel.NotSupported" >&2 - exit 1; - fi - exit ${value} else echo "org.freedesktop.Hal.Device.LaptopPanel.NotSupported" >&2 echo "No ACPI method found" >&2 diff --git a/tools/linux/hal-system-lcd-set-brightness-linux b/tools/linux/hal-system-lcd-set-brightness-linux index 38e5730..a00eb01 100755 --- a/tools/linux/hal-system-lcd-set-brightness-linux +++ b/tools/linux/hal-system-lcd-set-brightness-linux @@ -20,6 +20,13 @@ if [ "$HAL_PROP_LAPTOP_PANEL_ACCESS_METHOD" = "pmu" ]; then exit 1 fi exit 0 +elif [ "$HAL_PROP_LAPTOP_PANEL_ACCESS_METHOD" = "sonypi" ]; then + hal-system-sonypic setlcd $value + if [ $? -ne 0 ]; then + echo "org.freedesktop.Hal.Device.LaptopPanel.NotSupported" >&2 + exit 1 + fi + exit 0 fi # Check for file existance and that it's writable @@ -52,17 +59,6 @@ elif [ "$HAL_PROP_LAPTOP_PANEL_ACCESS_METHOD" = "omnibook" ]; then # echo "{0..7}" > /proc/omnibook/lcd # http://bugzilla.gnome.org/show_bug.cgi?id=331458 echo "$value" > $HAL_PROP_LINUX_ACPI_PATH -elif [ "$HAL_PROP_LAPTOP_PANEL_ACCESS_METHOD" = "sonypi" ]; then - # spicctrl -B - # 70 - # 0..255 - value="`/usr/sbin/spicctrl -B`" - RETVAL=$? - if [ $RETVAL != 0 ]; then - echo "org.freedesktop.Hal.Device.LaptopPanel.NotSupported" >&2 - exit 1; - fi - exit ${value} else echo "org.freedesktop.Hal.Device.LaptopPanel.NotSupported" >&2 echo "No ACPI method found" >&2