updated flashing
diff --git a/objects/control_host_obj.c b/objects/control_host_obj.c
index ec62a37..9f6fb92 100644
--- a/objects/control_host_obj.c
+++ b/objects/control_host_obj.c
@@ -35,49 +35,57 @@
                 gpointer                user_data)

 {

 	// TODO: Add error checking

-	g_print("Boot\n");

+	g_print("Do Boot\n");

+	int rc = GPIO_OK;

+

 	Control* control = object_get_control((Object*)user_data);

 	control_host_complete_boot(host,invocation);

+	do {	

+		rc |= gpio_open(&fsi_clk);

+		rc |= gpio_open(&fsi_data);

+		rc |= gpio_open(&fsi_enable);

+		rc |= gpio_open(&cronus_sel);

+		if (rc!=GPIO_OK) { break; }

+		

+		rc = gpio_write(&cronus_sel,1);

+		//putcfam pu 281c 30000000 -p0

+		char a[] = "000011111111110101111000111001100111111111111111111111111111101111111111";

+		//putcfam pu 281c B0000000 -p0

+		char b[] = "000011111111110101111000111000100111111111111111111111111111101101111111";

+

+		gpio_write(&fsi_enable,1);

+		gpio_write(&fsi_clk,1);

+		gpio_write(&fsi_data,1);

+		gpio_clock_cycle(&fsi_clk,5000);

+		gpio_write(&fsi_data,0);

+		gpio_clock_cycle(&fsi_clk,256);

+		gpio_write(&fsi_data,1);

+		gpio_clock_cycle(&fsi_clk,50);

+		uint16_t i=0;

+		for(i=0;i<strlen(a);i++) {

+			gpio_writec(&fsi_data,a[i]);

+			gpio_clock_cycle(&fsi_clk,1);

+		}

+		gpio_write(&fsi_data,1); /* Data standby state */

+		gpio_clock_cycle(&fsi_clk,5000);

+

+		for(i=0;i<strlen(b);i++) {

+			gpio_writec(&fsi_data,b[i]);

+			gpio_clock_cycle(&fsi_clk,1);

+		}

+		gpio_write(&fsi_data,1); /* Data standby state */

+		gpio_clock_cycle(&fsi_clk,2);

+

+	        gpio_write(&fsi_clk,0); /* hold clk low for clock mux */

+	        gpio_write(&fsi_enable,0);

+	        gpio_clock_cycle(&fsi_clk,16);

+	        gpio_write(&fsi_clk,0); /* Data standby state */

 	

-	gpio_open(&fsi_clk);

-	gpio_open(&fsi_data);

-	gpio_open(&fsi_enable);

-	gpio_open(&cronus_sel);

-

-	gpio_write(&cronus_sel,1);

-	//putcfam pu 281c 30000000 -p0

-	char a[] = "000011111111110101111000111001100111111111111111111111111111101111111111";

-	//putcfam pu 281c B0000000 -p0

-	char b[] = "000011111111110101111000111000100111111111111111111111111111101101111111";

-

-	gpio_write(&fsi_enable,1);

-	gpio_write(&fsi_clk,1);

-	gpio_write(&fsi_data,1);

-	gpio_clock_cycle(&fsi_clk,5000);

-	gpio_write(&fsi_data,0);

-	gpio_clock_cycle(&fsi_clk,256);

-	gpio_write(&fsi_data,1);

-	gpio_clock_cycle(&fsi_clk,50);

-	uint16_t i=0;

-	for(i=0;i<strlen(a);i++) {

-		gpio_writec(&fsi_data,a[i]);

-		gpio_clock_cycle(&fsi_clk,1);

-	}

-	gpio_write(&fsi_data,1); /* Data standby state */

-	gpio_clock_cycle(&fsi_clk,5000);

-

-	for(i=0;i<strlen(b);i++) {

-		gpio_writec(&fsi_data,b[i]);

-		gpio_clock_cycle(&fsi_clk,1);

-	}

-	gpio_write(&fsi_data,1); /* Data standby state */

-	gpio_clock_cycle(&fsi_clk,2);

-

-        gpio_write(&fsi_clk,0); /* hold clk low for clock mux */

-        gpio_write(&fsi_enable,0);

-        gpio_clock_cycle(&fsi_clk,16);

-        gpio_write(&fsi_clk,0); /* Data standby state */

-	

+	} while(0);

+	if (rc != GPIO_OK)

+	{

+		printf("ERROR HostControl: GPIO sequence failed (rc=%d)\n",rc);

+	}	

 	gpio_close(&fsi_clk);

 	gpio_close(&fsi_data);

 	gpio_close(&fsi_enable);

diff --git a/objects/flash_bios_obj.c b/objects/flash_bios_obj.c
index 637f44a..928d11b 100644
--- a/objects/flash_bios_obj.c
+++ b/objects/flash_bios_obj.c
@@ -1,31 +1,33 @@
+#include <stdio.h>

+#include <stdbool.h>

+#include <string.h>

 #include "interfaces/openbmc_intf.h"

-#include "pflash/pflash.c"

 #include "openbmc.h"

 

 /* ---------------------------------------------------------------------------------------------------- */

 static const gchar* dbus_object_path = "/org/openbmc/flash";

 static const gchar* dbus_name        = "org.openbmc.flash.Bios";

+static const gchar* FLASHER_BIN      = "flasher.exe";

+static const gchar* DLOAD_BUS = "org.openbmc.managers.Download";

+static const gchar* DLOAD_OBJ = "/org/openbmc/managers/Download";

 

 static GDBusObjectManagerServer *manager = NULL;

 

-void update(Flash *flash, const gchar* write_file)

+int update(Flash* flash)

 {

-	printf("Flashing: %s\n",write_file);

-	// get size from file

-	struct stat stbuf;

-	uint32_t address = 0, read_size = 0, write_size = 0;

+	pid_t pid;

+	int status=-1;

+	pid = fork();

+	if (pid == 0)

+	{

+		const gchar* path = flash_get_flasher_path(flash);

+		const gchar* name = flash_get_flasher_name(flash);

+		const gchar* inst = flash_get_flasher_instance(flash);

+		const gchar* filename = flash_get_filename(flash);

 

-#ifdef __arm__

-	if (stat(write_file, &stbuf))

- 	{

- 		printf("ERROR:  Invalid flash file: %s\n",write_file);

+		status = execl(path, name, inst, filename, NULL);

 	}

-	write_size = stbuf.st_size;

-	// TODO: need to change pflash to return error instead of exit

-	erase_chip();

-	program_file(write_file, address, write_size);

-#endif

-  	flash_emit_updated(flash);

+	return status;

 }

 

 static gboolean

@@ -35,11 +37,49 @@
 {

 	flash_complete_init(f,invocation);

 

-	#ifdef __arm__

-		printf("Tuning BIOS Flash\n");

-		flash_access_setup_pnor(true, false, false);

-	#endif

+	//tune flash

+	flash_set_filename(f,"");

+	int rc = update(f);

+	if (rc==-1)

+	{

+		printf("ERROR FlashControl_0: Unable to init\n");

+	}

+	return TRUE;

+}

 

+static gboolean

+on_lock (SharedResource          *lock,

+                GDBusMethodInvocation  *invocation,

+		gchar*                  name,

+                gpointer                user_data)

+{

+	printf("Locking BIOS Flash: %s\n",name);

+	shared_resource_set_lock(lock,true);

+	shared_resource_set_name(lock,name);

+	shared_resource_complete_lock(lock,invocation);

+	return TRUE;

+}

+static gboolean

+on_is_locked (SharedResource          *lock,

+                GDBusMethodInvocation  *invocation,

+                gpointer                user_data)

+{

+	gboolean locked = shared_resource_get_lock(lock);

+	const gchar* name = shared_resource_get_name(lock);

+	shared_resource_complete_is_locked(lock,invocation,locked,name);

+	return TRUE;

+}

+

+

+static gboolean

+on_unlock (SharedResource          *lock,

+                GDBusMethodInvocation  *invocation,

+                gpointer                user_data)

+{

+	printf("Unlocking BIOS Flash\n");

+	shared_resource_set_lock(lock,false);

+	shared_resource_set_name(lock,"");

+	shared_resource_complete_unlock(lock,invocation);

 	return TRUE;

 }

 

@@ -50,9 +90,22 @@
                 gchar*                  write_file,

                 gpointer                user_data)

 {

-	printf("Flashing BIOS from TFTP: %s,%s\n",url,write_file);

-	flash_emit_download(flash,url,write_file);

+	SharedResource *lock = object_get_shared_resource((Object*)user_data);

+	gboolean locked = shared_resource_get_lock(lock);

 	flash_complete_update_via_tftp(flash,invocation);

+	if (locked)

+	{

+		const gchar* name = shared_resource_get_name(lock);

+		printf("BIOS Flash is locked: %s\n",name);

+	}

+	else

+	{	

+		printf("Flashing BIOS from TFTP: %s,%s\n",url,write_file);

+		shared_resource_set_lock(lock,true);

+		shared_resource_set_name(lock,dbus_object_path);

+		flash_set_filename(flash,write_file);

+		flash_emit_download(flash,url,write_file);

+	}

 	return TRUE;

 }

 

@@ -62,10 +115,28 @@
                 gchar*                  write_file,

                 gpointer                user_data)

 {

-	printf("Flashing BIOS from file\n");

+	int rc = 0;

+	SharedResource *lock = object_get_shared_resource((Object*)user_data);

+	gboolean locked = shared_resource_get_lock(lock);

 	flash_complete_update(flash,invocation);

-	update(flash,write_file);

-  	flash_emit_updated(flash);

+	if (locked)

+	{

+		const gchar* name = shared_resource_get_name(lock);

+		printf("BIOS Flash is locked: %s\n",name);

+	}

+	else

+	{	

+		printf("Flashing BIOS from: %s\n",write_file);

+		shared_resource_set_lock(lock,true);

+		shared_resource_set_name(lock,dbus_object_path);

+		flash_set_filename(flash,write_file);

+		rc = update(flash);

+		if (!rc)

+		{

+			shared_resource_set_lock(lock,false);

+			shared_resource_set_name(lock,"");

+		}

+	}

 	return TRUE;

 }

 

@@ -79,14 +150,87 @@
                gpointer user_data) 

 {

 	Flash *flash = object_get_flash((Object*)user_data);

-	

+	SharedResource *lock = object_get_shared_resource((Object*)user_data);

+

 	GVariantIter *iter = g_variant_iter_new(parameters);

-	GVariant* value = g_variant_iter_next_value(iter);

-	const gchar* write_file;

+	GVariant* v_fullname = g_variant_iter_next_value(iter);

 	gsize size;

-	write_file = g_variant_get_string(value,&size);

-	update(flash,write_file);

+	const gchar* fullname = g_variant_get_string(v_fullname,&size);

+	int rc;

+	flash_set_filename(flash,fullname);

+	rc = update(flash);

+	if (!rc)

+	{

+		shared_resource_set_lock(lock,false);

+		shared_resource_set_name(lock,"");

+	}

+}

+

+static void

+on_flash_progress (GDBusConnection* connection,

+               const gchar* sender_name,

+               const gchar* object_path,

+               const gchar* interface_name,

+               const gchar* signal_name,

+               GVariant* parameters,

+               gpointer user_data) 

+{

+	Flash *flash = object_get_flash((Object*)user_data);

+	SharedResource *lock = object_get_shared_resource((Object*)user_data);

+	GVariantIter *iter = g_variant_iter_new(parameters);

+	GVariant* v_filename = g_variant_iter_next_value(iter);

+	GVariant* v_progress = g_variant_iter_next_value(iter);

 	

+	uint8_t progress = g_variant_get_byte(v_progress);

+	printf("Progress: %d\n",progress);

+}

+

+static void

+on_flash_done (GDBusConnection* connection,

+               const gchar* sender_name,

+               const gchar* object_path,

+               const gchar* interface_name,

+               const gchar* signal_name,

+               GVariant* parameters,

+               gpointer user_data) 

+{

+	Flash *flash = object_get_flash((Object*)user_data);

+	SharedResource *lock = object_get_shared_resource((Object*)user_data);

+	printf("Flash succeeded; unlocking flash\n");

+	shared_resource_set_lock(lock,false);

+	shared_resource_set_name(lock,"");

+}

+

+static void

+on_flash_error (GDBusConnection* connection,

+               const gchar* sender_name,

+               const gchar* object_path,

+               const gchar* interface_name,

+               const gchar* signal_name,

+               GVariant* parameters,

+               gpointer user_data) 

+{

+	Flash *flash = object_get_flash((Object*)user_data);

+	SharedResource *lock = object_get_shared_resource((Object*)user_data);

+	printf("Flash Error; unlocking flash\n");

+	shared_resource_set_lock(lock,false);

+	shared_resource_set_name(lock,"");

+}

+

+static void

+on_download_error (GDBusConnection* connection,

+               const gchar* sender_name,

+               const gchar* object_path,

+               const gchar* interface_name,

+               const gchar* signal_name,

+               GVariant* parameters,

+               gpointer user_data) 

+{

+	Flash *flash = object_get_flash((Object*)user_data);

+	SharedResource *lock = object_get_shared_resource((Object*)user_data);

+	printf("ERROR: FlashBios:  Download error; clearing flash lock\n");

+	shared_resource_set_lock(lock,false);

+	shared_resource_set_name(lock,"");

 }

 

 static void 

@@ -95,7 +239,6 @@
                  gpointer         user_data)

 {

 	ObjectSkeleton *object;

-//	g_print ("Acquired a message bus connection: %s\n",name);

  	cmdline *cmd = user_data;

 	if (cmd->argc < 2)

 	{

@@ -115,15 +258,64 @@
 		object_skeleton_set_flash (object, flash);

  		g_object_unref (flash);

 

+		SharedResource* lock = shared_resource_skeleton_new ();

+		object_skeleton_set_shared_resource (object, lock);

+ 		g_object_unref (lock);

+

+		shared_resource_set_lock(lock,false);

+		shared_resource_set_name(lock,"");

+

+		int c = strlen(cmd->argv[0]);

+

+		//TODO: don't use fixed buffer

+		char buf[512];

+		memset(buf, '\0', sizeof(buf));

+		bool found = false;

+		while(c>0)

+		{

+			if (cmd->argv[0][c] == '/')

+			{

+				strncpy(buf,cmd->argv[0],c);

+				s = g_strdup_printf ("%s/%s",buf,FLASHER_BIN);

+				break;

+			}

+			c--;

+		}

+		if (c==0)

+		{

+			printf("ERROR FlashBios: Invalid Path = %s\n",cmd->argv[0]);

+		}

+		else

+		{

+			flash_set_flasher_path(flash,s);

+			flash_set_flasher_name(flash,FLASHER_BIN);

+			flash_set_flasher_instance(flash,cmd->argv[i]);

+		}

+		g_free (s);

+

+

 		//define method callbacks here

+		g_signal_connect (lock,

+                    "handle-lock",

+                    G_CALLBACK (on_lock),

+                    NULL); /* user_data */

+		g_signal_connect (lock,

+                    "handle-unlock",

+                    G_CALLBACK (on_unlock),

+                    NULL); /* user_data */

+		g_signal_connect (lock,

+                    "handle-is-locked",

+                    G_CALLBACK (on_is_locked),

+                    NULL); /* user_data */

+

 		g_signal_connect (flash,

                     "handle-update",

                     G_CALLBACK (on_update),

-                    NULL); /* user_data */

+                    object); /* user_data */

 		g_signal_connect (flash,

                     "handle-update-via-tftp",

                     G_CALLBACK (on_update_via_tftp),

-                    NULL); /* user_data */

+                    object); /* user_data */

 

 		g_signal_connect (flash,

                     "handle-init",

@@ -131,17 +323,59 @@
                     NULL); /* user_data */

 

 		g_dbus_connection_signal_subscribe(connection,

-                                   "org.openbmc.managers.Download",

-                                   "org.openbmc.managers.Download",

-                                   "DownloadComplete",

-                                   "/org/openbmc/managers/Download",

-                                   NULL,

-                                   G_DBUS_SIGNAL_FLAGS_NONE,

+				   DLOAD_BUS, DLOAD_BUS, "DownloadComplete",

+                                   DLOAD_OBJ,NULL,G_DBUS_SIGNAL_FLAGS_NONE,

                                    (GDBusSignalCallback) on_download_complete,

                                    object,

                                    NULL );

+		g_dbus_connection_signal_subscribe(connection,

+				   DLOAD_BUS, DLOAD_BUS, "DownloadError",

+                                   DLOAD_OBJ,NULL,G_DBUS_SIGNAL_FLAGS_NONE,

+                                   (GDBusSignalCallback) on_download_error,

+                                   object,

+                                   NULL );

+

+		s = g_strdup_printf ("/org/openbmc/control/%s",cmd->argv[i]);

+		g_dbus_connection_signal_subscribe(connection,

+                                   NULL,

+                                   "org.openbmc.FlashControl",

+                                   "Done",

+                                   s,

+                                   NULL,

+                                   G_DBUS_SIGNAL_FLAGS_NONE,

+                                   (GDBusSignalCallback) on_flash_done,

+                                   object,

+                                   NULL );

+		g_free(s);

+		s = g_strdup_printf ("/org/openbmc/control/%s\0",cmd->argv[i]);

+		g_dbus_connection_signal_subscribe(connection,

+                                   NULL,

+                                   "org.openbmc.FlashControl",

+                                   "Error",

+                                   s,

+                                   NULL,

+                                   G_DBUS_SIGNAL_FLAGS_NONE,

+                                   (GDBusSignalCallback) on_flash_error,

+                                   object,

+                                   NULL );

+

+		g_free(s);

+		s = g_strdup_printf ("/org/openbmc/control/%s",cmd->argv[i]);

+		g_dbus_connection_signal_subscribe(connection,

+                                   NULL,

+                                   "org.openbmc.FlashControl",

+                                   "Progress",

+                                   s,

+                                   NULL,

+                                   G_DBUS_SIGNAL_FLAGS_NONE,

+                                   (GDBusSignalCallback) on_flash_progress,

+                                   object,

+                                   NULL );

+

+		g_free (s);

 

  

+		flash_set_filename(flash,"");

 		/* 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);

@@ -174,7 +408,6 @@
   cmdline cmd;

   cmd.argc = argc;

   cmd.argv = argv;

-

   guint id;

   loop = g_main_loop_new (NULL, FALSE);

 

diff --git a/objects/power_control_obj.c b/objects/power_control_obj.c
index ca11b2b..a943b5e 100644
--- a/objects/power_control_obj.c
+++ b/objects/power_control_obj.c
@@ -174,7 +174,6 @@
   	manager = g_dbus_object_manager_server_new (dbus_object_path);

 	gchar *s;

   	s = g_strdup_printf ("%s/%s",dbus_object_path,cmd->argv[1]);

-	g_print("%s\n",s);

   	object = object_skeleton_new (s);

   	g_free (s);