--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tool/CommandPhyRead.cpp Wed Aug 13 13:23:52 2008 +0000
@@ -0,0 +1,114 @@
+/*****************************************************************************
+ *
+ * $Id$
+ *
+ ****************************************************************************/
+
+#include <iostream>
+#include <iomanip>
+using namespace std;
+
+#include "CommandPhyRead.h"
+
+/*****************************************************************************/
+
+CommandPhyRead::CommandPhyRead():
+ Command("phy_read", "Output a slave's physical memory contents.")
+{
+}
+
+/*****************************************************************************/
+
+string CommandPhyRead::helpString() const
+{
+ stringstream str;
+
+ str << getName() << " [OPTIONS] <OFFSET> <LENGTH>" << endl
+ << endl
+ << getBriefDescription() << endl
+ << endl
+ << "This command requires a single slave to be selected." << endl
+ << endl
+ << "Arguments:" << endl
+ << " OFFSET is the physical memory address. Must" << endl
+ << " be an unsigned 16 bit number." << endl
+ << " LENGTH is the number of bytes to read and must also be" << endl
+ << " an unsigned 16 bit number. OFFSET plus LENGTH" << endl
+ << " may not exceed 64k." << endl
+ << endl
+ << "Command-specific options:" << endl
+ << " --alias -a <alias>" << endl
+ << " --position -p <pos> Slave selection. See the help of" << endl
+ << " the 'slaves' command." << endl
+ << endl
+ << numericInfo();
+
+ return str.str();
+}
+
+/****************************************************************************/
+
+void CommandPhyRead::execute(MasterDevice &m, const StringVector &args)
+{
+ SlaveList slaves;
+ ec_ioctl_slave_phy_t data;
+ stringstream strOffset, strLength, err;
+ uint16_t i;
+
+ if (args.size() != 2) {
+ err << "'" << getName() << "' takes two arguments!";
+ throwInvalidUsageException(err);
+ }
+
+ strOffset << args[0];
+ strOffset
+ >> resetiosflags(ios::basefield) // guess base from prefix
+ >> data.offset;
+ if (strOffset.fail()) {
+ err << "Invalid offset '" << args[0] << "'!";
+ throwInvalidUsageException(err);
+ }
+
+ strLength << args[1];
+ strLength
+ >> resetiosflags(ios::basefield) // guess base from prefix
+ >> data.length;
+ if (strLength.fail()) {
+ err << "Invalid length '" << args[1] << "'!";
+ throwInvalidUsageException(err);
+ }
+
+ if (!data.length) {
+ return;
+ }
+
+ if ((uint32_t) data.offset + data.length > 0xffff) {
+ err << "Offset and length exceeding 64k!";
+ throwInvalidUsageException(err);
+ }
+
+ m.open(MasterDevice::Read);
+ slaves = selectedSlaves(m);
+
+ if (slaves.size() != 1) {
+ throwSingleSlaveRequired(slaves.size());
+ }
+ data.slave_position = slaves.front().position;
+
+ data.data = new uint8_t[data.length];
+
+ try {
+ m.readPhy(&data);
+ } catch (MasterDeviceException &e) {
+ delete [] data.data;
+ throw e;
+ }
+
+ for (i = 0; i < data.length; i++) {
+ cout << data.data[i];
+ }
+
+ delete [] data.data;
+}
+
+/*****************************************************************************/