# Updated but not checked in: # (will commit) # # new file: fdi/policy/10osvendor/10-bluetooth-button.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-sonypi.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/fdi/policy/10osvendor/10-bluetooth-button.fdi b/fdi/policy/10osvendor/10-bluetooth-button.fdi new file mode 100644 index 0000000..2d38173 --- /dev/null +++ b/fdi/policy/10osvendor/10-bluetooth-button.fdi @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + bluetooth_switch + bluetooth_switch + Sony Bluetooth Switch + bluetooth + sonypi + + + + + + + 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..8c09059 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-button.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..ad887a8 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-sonypi hal-policy-is-privileged hal-storage-mount hal-storage-cleanup-all-mountpoints diff --git a/tools/Makefile.am b/tools/Makefile.am index d820cc8..8de52b5 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-sonypi 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_sonypi_SOURCES = hal-system-sonypi.c +hal_system_sonypi_LDADD = @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..fc8f219 --- /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_BLUETOOTH_SWITCH_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..2b52ab7 --- /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_BLUETOOTH_SWITCH_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-sonypi.c b/tools/hal-system-sonypi.c new file mode 100644 index 0000000..26d588b --- /dev/null +++ b/tools/hal-system-sonypi.c @@ -0,0 +1,243 @@ +/*! @file hal-system-sony.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 +#ifdef __linux__ +#include +#endif +#include + +#define SONYPI_DEV "/dev/sonypi" +#define __u8 u_int8_t + +/** + * @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 the builtin Bluetooth adapter's power + * + * @param val The returned power + * @return Success, TRUE or FALSE + */ +static int +sonypi_get_bluetooth_power (int *val) +{ +#ifdef __FreeBSD__ + return FALSE; /* FIXME implement */ +#elif sun + return FALSE; /* FIXME implement */ +#else + //FIXME look through the HAL tree to find a bluetooth adapter matching + //ours + return FALSE; +#endif /* ! __FreeBSD__ */ +} + +/** 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; + /* we subtract 1 as 0 is backlight disable */ + printf ("%i", brightness - 1); + return EXIT_SUCCESS; + } + if (strcmp (argv[1], "getbluetooth") == 0) { + ret = sonypi_get_bluetooth_power (&power); + if (ret == FALSE) + return EXIT_FAILURE; + printf ("%i", power); + return EXIT_SUCCESS; + } + } else if (argc == 3) { + if (strcmp (argv[1], "setlcd") == 0) { + 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..d1efb3f --- /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_BLUETOOTH_SWITCH_ACCESS_METHOD" = "sonypi" ]; then + value="`hal-system-sonypi getpower`" + 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..2bd5379 --- /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_BLUETOOTH_BUTTON_SWITCH_METHOD" = "sonypi" ]; then + hal-system-sonypi setpower $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..70829b2 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-sonypi 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..fcd2204 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-sonypi 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