AzulSCSI_log_trace.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. // SCSI trace logging
  2. #include "AzulSCSI_log_trace.h"
  3. #include "AzulSCSI_log.h"
  4. #include <scsi2sd.h>
  5. extern "C" {
  6. #include <scsi.h>
  7. #include <scsiPhy.h>
  8. }
  9. static bool g_LogData = false;
  10. static int g_InByteCount = 0;
  11. static int g_OutByteCount = 0;
  12. static const char *getCommandName(uint8_t cmd)
  13. {
  14. switch (cmd)
  15. {
  16. case 0x00: return "TestUnitReady";
  17. case 0x01: return "RezeroUnit";
  18. case 0x03: return "RequestSense";
  19. case 0x04: return "FormatUnit";
  20. case 0x08: return "Read6";
  21. case 0x0A: return "Write6";
  22. case 0x0B: return "Seek6";
  23. case 0x0F: return "WriteSectorBuffer";
  24. case 0x12: return "Inquiry";
  25. case 0x15: return "ModeSelect6";
  26. case 0x16: return "Reserve";
  27. case 0x17: return "Release";
  28. case 0x1A: return "ModeSense";
  29. case 0x1B: return "StartStopUnit";
  30. case 0x1C: return "ReceiveDiagnostic";
  31. case 0x1D: return "SendDiagnostic";
  32. case 0x1E: return "PreventAllowMediumRemoval";
  33. case 0x25: return "ReadCapacity";
  34. case 0x28: return "Read10";
  35. case 0x2A: return "Write10";
  36. case 0x2B: return "Seek10";
  37. case 0x2C: return "Erase10";
  38. case 0x2E: return "WriteVerify";
  39. case 0x2F: return "Verify";
  40. case 0x34: return "PreFetch";
  41. case 0x35: return "SynchronizeCache";
  42. case 0x36: return "LockUnlockCache";
  43. case 0x37: return "ReadDefectData";
  44. case 0x3B: return "WriteBuffer";
  45. case 0x3C: return "ReadBuffer";
  46. case 0x43: return "CDROM Read TOC";
  47. case 0x44: return "CDROM Read Header";
  48. case 0x4A: return "GetEventStatusNotification";
  49. case 0x55: return "ModeSelect10";
  50. case 0x5A: return "ModeSense10";
  51. case 0xAC: return "Erase12";
  52. case 0xC0: return "OMTI-5204 DefineFlexibleDiskFormat";
  53. case 0xC2: return "OMTI-5204 AssignDiskParameters";
  54. default: return "Unknown";
  55. }
  56. }
  57. static void printNewPhase(int phase)
  58. {
  59. g_LogData = false;
  60. if (!g_azlog_debug)
  61. {
  62. return;
  63. }
  64. switch(phase)
  65. {
  66. case BUS_FREE:
  67. azdbg("-- BUS_FREE");
  68. break;
  69. case BUS_BUSY:
  70. azdbg("-- BUS_BUSY");
  71. break;
  72. case ARBITRATION:
  73. azdbg("---- ARBITRATION");
  74. break;
  75. case SELECTION:
  76. azdbg("---- SELECTION: ", (int)(*SCSI_STS_SELECTED & 7));
  77. break;
  78. case RESELECTION:
  79. azdbg("---- RESELECTION");
  80. break;
  81. case STATUS:
  82. if (scsiDev.status == GOOD)
  83. {
  84. azdbg("---- STATUS: 0 GOOD");
  85. }
  86. else if (scsiDev.status == CHECK_CONDITION && scsiDev.target)
  87. {
  88. azdbg("---- STATUS: 2 CHECK_CONDITION, sense ", (uint32_t)scsiDev.target->sense.asc);
  89. }
  90. else
  91. {
  92. azdbg("---- STATUS: ", (int)scsiDev.status);
  93. }
  94. break;
  95. case COMMAND:
  96. g_LogData = true;
  97. break;
  98. case DATA_IN:
  99. if (scsiDev.target->syncOffset > 0)
  100. azdbg("---- DATA_IN, syncOffset ", (int)scsiDev.target->syncOffset,
  101. " syncPeriod ", (int)scsiDev.target->syncPeriod);
  102. else
  103. azdbg("---- DATA_IN");
  104. break;
  105. case DATA_OUT:
  106. if (scsiDev.target->syncOffset > 0)
  107. azdbg("---- DATA_OUT, syncOffset ", (int)scsiDev.target->syncOffset,
  108. " syncPeriod ", (int)scsiDev.target->syncPeriod);
  109. else
  110. azdbg("---- DATA_OUT");
  111. break;
  112. case MESSAGE_IN:
  113. azdbg("---- MESSAGE_IN");
  114. g_LogData = true;
  115. break;
  116. case MESSAGE_OUT:
  117. azdbg("---- MESSAGE_OUT");
  118. g_LogData = true;
  119. break;
  120. default:
  121. azdbg("---- PHASE: ", phase);
  122. break;
  123. }
  124. }
  125. void scsiLogPhaseChange(int new_phase)
  126. {
  127. static int old_phase = BUS_FREE;
  128. if (new_phase != old_phase)
  129. {
  130. if (old_phase == DATA_IN || old_phase == DATA_OUT)
  131. {
  132. azdbg("---- Total IN: ", g_InByteCount, " OUT: ", g_OutByteCount);
  133. }
  134. g_InByteCount = g_OutByteCount = 0;
  135. printNewPhase(new_phase);
  136. old_phase = new_phase;
  137. }
  138. }
  139. void scsiLogDataIn(const uint8_t *buf, uint32_t length)
  140. {
  141. if (g_LogData)
  142. {
  143. azdbg("------ IN: ", bytearray(buf, length));
  144. }
  145. g_InByteCount += length;
  146. }
  147. void scsiLogDataOut(const uint8_t *buf, uint32_t length)
  148. {
  149. if (buf == scsiDev.cdb)
  150. {
  151. azdbg("---- COMMAND: ", getCommandName(buf[0]));
  152. }
  153. if (g_LogData)
  154. {
  155. azdbg("------ OUT: ", bytearray(buf, length));
  156. }
  157. g_OutByteCount += length;
  158. }