diff options
-rwxr-xr-x[-rw-r--r--] | Makefile | 6 | ||||
-rwxr-xr-x | bin/chassis_control.py | 6 | ||||
-rwxr-xr-x | objects/button_reset_obj.c | 179 |
3 files changed, 190 insertions, 1 deletions
@@ -22,7 +22,7 @@ LIBS=$(shell pkg-config --libs gio-unix-2.0 glib-2.0) -Llib -lopenbmc_intf %.o: objects/pflash/libflash/%.c $(CC) -c -o obj/$@ $< $(CFLAGS) $(INCLUDES) -all: setup libopenbmc_intf power_control led_controller button_power control_host host_watchdog control_bmc board_vpd pcie_slot_present flash_bios flasher control_bmc_barreleye pflash hwmons_barreleye +all: setup libopenbmc_intf power_control led_controller button_power button_reset control_host host_watchdog control_bmc board_vpd pcie_slot_present flash_bios flasher control_bmc_barreleye pflash hwmons_barreleye setup: mkdir -p obj lib @@ -42,6 +42,10 @@ led_controller: led_controller.o gpio.o object_mapper.o libopenbmc_intf button_power: button_power_obj.o gpio.o object_mapper.o libopenbmc_intf $(CC) -o bin/$@.exe obj/button_power_obj.o obj/gpio.o obj/object_mapper.o $(LDFLAGS) $(LIBS) +button_reset: button_reset_obj.o gpio.o object_mapper.o libopenbmc_intf + $(CC) -o bin/$@.exe obj/button_reset_obj.o obj/gpio.o obj/object_mapper.o $(LDFLAGS) $(LIBS) + + control_host: control_host_obj.o gpio.o object_mapper.o libopenbmc_intf $(CC) -o bin/$@.exe obj/gpio.o obj/control_host_obj.o obj/object_mapper.o $(LDFLAGS) $(LIBS) diff --git a/bin/chassis_control.py b/bin/chassis_control.py index 1981a82..27e9152 100755 --- a/bin/chassis_control.py +++ b/bin/chassis_control.py @@ -60,6 +60,9 @@ class ChassisControlObject(Openbmc.DbusProperties,Openbmc.DbusObjectManager): bus.add_signal_receiver(self.reset_button_signal_handler, dbus_interface = "org.openbmc.Button", signal_name = "PressedLong", path="/org/openbmc/buttons/power0" ) + bus.add_signal_receiver(self.softreset_button_signal_handler, + dbus_interface = "org.openbmc.Button", signal_name = "Released", + path="/org/openbmc/buttons/reset0" ) bus.add_signal_receiver(self.host_watchdog_signal_handler, dbus_interface = "org.openbmc.Watchdog", signal_name = "WatchdogError") @@ -179,6 +182,9 @@ class ChassisControlObject(Openbmc.DbusProperties,Openbmc.DbusObjectManager): def reset_button_signal_handler(self): self.reboot(); + + def softreset_button_signal_handler(self): + self.softReboot(); def host_watchdog_signal_handler(self): print "Watchdog Error, Hard Rebooting" diff --git a/objects/button_reset_obj.c b/objects/button_reset_obj.c new file mode 100755 index 0000000..759e83a --- /dev/null +++ b/objects/button_reset_obj.c @@ -0,0 +1,179 @@ +#include <stdio.h> +#include "interfaces/openbmc_intf.h" +#include "gpio.h" +#include "openbmc.h" +#include "object_mapper.h" + +/* ---------------------------------------------------------------------------------------------------- */ +static const gchar* dbus_object_path = "/org/openbmc/buttons"; +static const gchar* instance_name = "reset0"; +static const gchar* dbus_name = "org.openbmc.buttons.reset"; +static const int LONG_PRESS_SECONDS = 3; +static GDBusObjectManagerServer *manager = NULL; + +//This object will use these GPIOs +GPIO gpio_button = (GPIO){ "RESET_BUTTON" }; + +static gboolean +on_is_on (Button *btn, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + gboolean btn_state=button_get_state(btn); + button_complete_is_on(btn,invocation,btn_state); + return TRUE; + +} + +static gboolean +on_button_press (Button *btn, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + button_emit_pressed(btn); + button_complete_sim_press(btn,invocation); + return TRUE; +} +static gboolean +on_button_interrupt( GIOChannel *channel, + GIOCondition condition, + gpointer user_data ) +{ + + GError *error = 0; + gsize bytes_read = 0; + gchar buf[2]; + buf[1] = '\0'; + g_io_channel_seek_position( channel, 0, G_SEEK_SET, 0 ); + GIOStatus rc = g_io_channel_read_chars( channel, + buf, 1, + &bytes_read, + &error ); + printf("%s\n",buf); + + time_t current_time = time(NULL); + if (gpio_button.irq_inited) + { + Button* button = object_get_button((Object*)user_data); + if (buf[0] == '0') + { + printf("reset Button pressed\n"); + button_emit_pressed(button); + button_set_timer(button,(long)current_time); + } + else + { + long press_time = current_time-button_get_timer(button); + printf("reset Button released, held for %ld seconds\n",press_time); + if (press_time > LONG_PRESS_SECONDS) + { + button_emit_pressed_long(button); + } else { + button_emit_released(button); + } + } + } + else { gpio_button.irq_inited = true; } + + return TRUE; +} +static void +on_bus_acquired (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + ObjectSkeleton *object; + //g_print ("Acquired a message bus connection: %s\n",name); + cmdline *cmd = user_data; + manager = g_dbus_object_manager_server_new (dbus_object_path); + int i=0; + gchar *s; + s = g_strdup_printf ("%s/%s",dbus_object_path,instance_name); + object = object_skeleton_new (s); + g_free (s); + + Button* button = button_skeleton_new (); + object_skeleton_set_button (object, button); + g_object_unref (button); + + ObjectMapper* mapper = object_mapper_skeleton_new (); + object_skeleton_set_object_mapper (object, mapper); + g_object_unref (mapper); + + //define method callbacks + g_signal_connect (button, + "handle-is-on", + G_CALLBACK (on_is_on), + NULL); /* user_data */ + g_signal_connect (button, + "handle-sim-press", + G_CALLBACK (on_button_press), + NULL); /* user_data */ + + + /* Export the object (@manager takes its own reference to @object) */ + g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object)); + g_object_unref (object); + + /* Export all objects */ + g_dbus_object_manager_server_set_connection (manager, connection); + + // get gpio device paths + int rc = GPIO_OK; + do { + rc = gpio_init(connection,&gpio_button); + if (rc != GPIO_OK) { break; } + rc = gpio_open_interrupt(&gpio_button,on_button_interrupt,object); + if (rc != GPIO_OK) { break; } + } while(0); + if (rc != GPIO_OK) + { + printf("ERROR PowerButton: GPIO setup (rc=%d)\n",rc); + } + emit_object_added((GDBusObjectManager*)manager); +} + +static void +on_name_acquired (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ +} + +static void +on_name_lost (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ +} + + +gint +main (gint argc, gchar *argv[]) +{ + GMainLoop *loop; + + cmdline cmd; + cmd.argc = argc; + cmd.argv = argv; + + guint id; + loop = g_main_loop_new (NULL, FALSE); + + id = g_bus_own_name (DBUS_TYPE, + dbus_name, + G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT | + G_BUS_NAME_OWNER_FLAGS_REPLACE, + on_bus_acquired, + on_name_acquired, + on_name_lost, + &cmd, + NULL); + + g_main_loop_run (loop); + + g_bus_unown_name (id); + g_main_loop_unref (loop); + return 0; +} + |