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