Add IOCTL command names to driver library logging

Currently the driver library will log IOCTL commands as hexadecimal
values, which makes it hard to know what command is being logged unless
you know the command values. To make this easier, the driver library
will now translate the command values into their respective names when
logging.

Change-Id: I7ef2f411b0261ea7819c1a7a6825422859031a25
Signed-off-by: Mikael Olsson <mikael.olsson@arm.com>
diff --git a/driver_library/src/ethosu.cpp b/driver_library/src/ethosu.cpp
index c00f69f..01666d2 100644
--- a/driver_library/src/ethosu.cpp
+++ b/driver_library/src/ethosu.cpp
@@ -42,6 +42,34 @@
     return std::to_string(version.major) + "." + std::to_string(version.minor) + "." + std::to_string(version.patch);
 }
 
+std::string cmdToString(unsigned long cmd) {
+    // Needed for the struct types in the macro expansions
+    using namespace EthosU;
+
+    switch (cmd) {
+    case ETHOSU_IOCTL_PING:
+        return "PING";
+    case ETHOSU_IOCTL_CAPABILITIES_REQ:
+        return "CAPABILITIES_REQ";
+    case ETHOSU_IOCTL_DRIVER_VERSION_GET:
+        return "DRIVER_VERSION_GET";
+    case ETHOSU_IOCTL_BUFFER_CREATE:
+        return "BUFFER_CREATE";
+    case ETHOSU_IOCTL_NETWORK_CREATE:
+        return "NETWORK_CREATE";
+    case ETHOSU_IOCTL_NETWORK_INFO:
+        return "NETWORK_INFO";
+    case ETHOSU_IOCTL_INFERENCE_CREATE:
+        return "INFERENCE_CREATE";
+    case ETHOSU_IOCTL_INFERENCE_STATUS:
+        return "INFERENCE_STATUS";
+    case ETHOSU_IOCTL_INFERENCE_CANCEL:
+        return "INFERENCE_CANCEL";
+    default:
+        return std::string("Unknown command: ").append(to_string(cmd));
+    }
+}
+
 enum class Severity { Error, Warning, Info, Debug };
 
 class Log {
@@ -105,11 +133,10 @@
 __attribute__((weak)) int eioctl(int fd, unsigned long cmd, void *data = nullptr) {
     int ret = ::ioctl(fd, cmd, data);
     if (ret < 0) {
-        throw EthosU::Exception(string("IOCTL cmd=").append(to_string(cmd) + " failed: " + strerror(errno)).c_str());
+        throw EthosU::Exception(string("IOCTL cmd=").append(cmdToString(cmd) + " failed: " + strerror(errno)).c_str());
     }
 
-    Log(Severity::Debug) << "ioctl. fd=" << fd << ", cmd=" << setw(8) << setfill('0') << hex << cmd << ", ret=" << ret
-                         << endl;
+    Log(Severity::Debug) << "ioctl. fd=" << fd << ", cmd=" << cmdToString(cmd) << ", ret=" << ret << endl;
 
     return ret;
 }
diff --git a/tests/run_inference_test.cpp b/tests/run_inference_test.cpp
index 88fc691..5e529e6 100644
--- a/tests/run_inference_test.cpp
+++ b/tests/run_inference_test.cpp
@@ -130,8 +130,7 @@
 }
 
 void testNetworkInvalidType(const Device &device) {
-    const std::string expected_error =
-        std::string("IOCTL cmd=") + std::to_string(ETHOSU_IOCTL_NETWORK_CREATE) + " failed: " + std::strerror(EINVAL);
+    const std::string expected_error = std::string("IOCTL cmd=NETWORK_CREATE") + " failed: " + std::strerror(EINVAL);
     struct ethosu_uapi_network_create net_req = {};
     net_req.type                              = ETHOSU_UAPI_NETWORK_INDEX + 1;
     try {
@@ -144,8 +143,7 @@
 }
 
 void testNetworkInvalidDataPtr(const Device &device) {
-    const std::string expected_error =
-        std::string("IOCTL cmd=") + std::to_string(ETHOSU_IOCTL_NETWORK_CREATE) + " failed: " + std::strerror(EINVAL);
+    const std::string expected_error = std::string("IOCTL cmd=NETWORK_CREATE") + " failed: " + std::strerror(EINVAL);
     struct ethosu_uapi_network_create net_req = {};
     net_req.type                              = ETHOSU_UAPI_NETWORK_USER_BUFFER;
     net_req.network.data_ptr                  = 0U;
@@ -160,8 +158,7 @@
 }
 
 void testNetworkInvalidDataSize(const Device &device) {
-    const std::string expected_error =
-        std::string("IOCTL cmd=") + std::to_string(ETHOSU_IOCTL_NETWORK_CREATE) + " failed: " + std::strerror(EINVAL);
+    const std::string expected_error = std::string("IOCTL cmd=NETWORK_CREATE") + " failed: " + std::strerror(EINVAL);
     struct ethosu_uapi_network_create net_req = {};
     net_req.type                              = ETHOSU_UAPI_NETWORK_USER_BUFFER;
     net_req.network.data_ptr                  = reinterpret_cast<uintptr_t>(networkModelData);