[PATCH skeleton 4/5] Add reset button

OpenBMC Patches openbmc-patches at stwcx.xyz
Sat Dec 19 11:00:39 AEDT 2015


From: Ken <ken.sk.lai at mail.foxconn.com>

---
 Makefile                   |   6 +-
 bin/chassis_control.py     |   6 ++
 objects/button_reset_obj.c | 179 +++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 190 insertions(+), 1 deletion(-)
 mode change 100644 => 100755 Makefile
 create mode 100755 objects/button_reset_obj.c

diff --git a/Makefile b/Makefile
old mode 100644
new mode 100755
index e3875ad..ea2dde2
--- a/Makefile
+++ b/Makefile
@@ -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;
+}
+
-- 
2.6.3




More information about the openbmc mailing list