cdc_acm_protocol.h 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. /*
  2. * cdc_acm_protocol.h
  3. *
  4. * Greaseweazle protocol over CDC ACM streams.
  5. *
  6. * Written & released by Keir Fraser <keir.xen@gmail.com>
  7. *
  8. * This is free and unencumbered software released into the public domain.
  9. * See the file COPYING for more details, or visit <http://unlicense.org>.
  10. */
  11. /*
  12. * GREASEWEAZLE COMMAND SET
  13. */
  14. /* CMD_GET_INFO, length=3, 0. Returns 32 bytes after ACK. */
  15. #define CMD_GET_INFO 0
  16. /* [BOOTLOADER] CMD_UPDATE, length=6, <update_len>.
  17. * Host follows with <update_len> bytes.
  18. * Bootloader finally returns a status byte, 0 on success. */
  19. /* [MAIN FIRMWARE] CMD_UPDATE, length=10, <update_len>, 0xdeafbee3.
  20. * Host follows with <update_len> bytes.
  21. * Main firmware finally returns a status byte, 0 on success. */
  22. #define CMD_UPDATE 1
  23. /* CMD_SEEK, length=3, cyl#. Seek to cyl# on selected drive. */
  24. #define CMD_SEEK 2
  25. /* CMD_SIDE, length=3, side# (0=bottom) */
  26. #define CMD_SIDE 3
  27. /* CMD_SET_PARAMS, length=3+nr, idx, <nr bytes> */
  28. #define CMD_SET_PARAMS 4
  29. /* CMD_GET_PARAMS, length=4, idx, nr_bytes. Returns nr_bytes after ACK. */
  30. #define CMD_GET_PARAMS 5
  31. /* CMD_MOTOR, length=4, drive#, on/off. Turn on/off a drive motor. */
  32. #define CMD_MOTOR 6
  33. /* CMD_READ_FLUX, length=2-3. Optionally include all or part of gw_read_flux.
  34. * Returns flux readings until EOStream. */
  35. #define CMD_READ_FLUX 7
  36. /* CMD_WRITE_FLUX, length=2-3. Optionally include all or part of gw_write_flux.
  37. * Host follows with flux readings until EOStream. */
  38. #define CMD_WRITE_FLUX 8
  39. /* CMD_GET_FLUX_STATUS, length=2. Last read/write status returned in ACK. */
  40. #define CMD_GET_FLUX_STATUS 9
  41. /* CMD_SWITCH_FW_MODE, length=3, <mode> */
  42. #define CMD_SWITCH_FW_MODE 11
  43. /* CMD_SELECT, length=3, drive#. Select drive# as current unit. */
  44. #define CMD_SELECT 12
  45. /* CMD_DESELECT, length=2. Deselect current unit (if any). */
  46. #define CMD_DESELECT 13
  47. /* CMD_SET_BUS_TYPE, length=3, bus_type. Set the bus type. */
  48. #define CMD_SET_BUS_TYPE 14
  49. /* CMD_SET_PIN, length=4, pin#, level. */
  50. #define CMD_SET_PIN 15
  51. /* CMD_RESET, length=2. Reset all state to initial (power on) values. */
  52. #define CMD_RESET 16
  53. /* CMD_ERASE_FLUX, length=6. Argument is gw_erase_flux. */
  54. #define CMD_ERASE_FLUX 17
  55. /* CMD_SOURCE_BYTES, length=6. Argument is gw_sink_source_bytes. */
  56. #define CMD_SOURCE_BYTES 18
  57. /* CMD_SINK_BYTES, length=6. Argument is gw_sink_source_bytes. */
  58. #define CMD_SINK_BYTES 19
  59. #define CMD_MAX 19
  60. /*
  61. * CMD_SET_BUS CODES
  62. */
  63. #define BUS_NONE 0
  64. #define BUS_IBMPC 1
  65. #define BUS_SHUGART 2
  66. /*
  67. * ACK RETURN CODES
  68. */
  69. #define ACK_OKAY 0
  70. #define ACK_BAD_COMMAND 1
  71. #define ACK_NO_INDEX 2
  72. #define ACK_NO_TRK0 3
  73. #define ACK_FLUX_OVERFLOW 4
  74. #define ACK_FLUX_UNDERFLOW 5
  75. #define ACK_WRPROT 6
  76. #define ACK_NO_UNIT 7
  77. #define ACK_NO_BUS 8
  78. #define ACK_BAD_UNIT 9
  79. #define ACK_BAD_PIN 10
  80. /*
  81. * CONTROL-CHANNEL COMMAND SET:
  82. * We abuse SET_LINE_CODING requests over endpoint 0, stashing a command
  83. * in the baud-rate field.
  84. */
  85. #define BAUD_NORMAL 9600
  86. #define BAUD_CLEAR_COMMS 10000
  87. /*
  88. * Flux stream opcodes. Preceded by 0xFF byte.
  89. *
  90. * Argument types:
  91. * N28: 28-bit non-negative integer N, encoded as 4 bytes b0,b1,b2,b3:
  92. * b0 = (uint8_t)(1 | (N << 1))
  93. * b1 = (uint8_t)(1 | (N >> 6))
  94. * b2 = (uint8_t)(1 | (N >> 13))
  95. * b3 = (uint8_t)(1 | (N >> 20))
  96. */
  97. /* FLUXOP_INDEX [CMD_READ_FLUX]
  98. * Args:
  99. * +4 [N28]: ticks to index, relative to sample cursor.
  100. * Signals an index pulse in the read stream. Sample cursor is unaffected. */
  101. #define FLUXOP_INDEX 1
  102. /* FLUXOP_SPACE [CMD_READ_FLUX, CMD_WRITE_FLUX]
  103. * Args:
  104. * +4 [N28]: ticks to increment the sample cursor.
  105. * Increments the sample cursor with no intervening flux transitions. */
  106. #define FLUXOP_SPACE 2
  107. /* FLUXOP_ASTABLE [CMD_WRITE_FLUX]
  108. * Args:
  109. * +4 [N28]: astable period.
  110. * Generate regular flux transitions at specified astable period.
  111. * Duration is specified by immediately preceding FLUXOP_SPACE opcode(s). */
  112. #define FLUXOP_ASTABLE 3
  113. /*
  114. * COMMAND PACKETS
  115. */
  116. /* CMD_GET_INFO, index 0 */
  117. #define GETINFO_FIRMWARE 0
  118. struct packed gw_info {
  119. uint8_t fw_major;
  120. uint8_t fw_minor;
  121. uint8_t is_main_firmware; /* == 0 -> update bootloader */
  122. uint8_t max_cmd;
  123. uint32_t sample_freq;
  124. uint8_t hw_model, hw_submodel;
  125. uint8_t usb_speed;
  126. };
  127. extern struct gw_info gw_info;
  128. /* CMD_GET_INFO, index 1 */
  129. #define GETINFO_BW_STATS 1
  130. struct packed gw_bw_stats {
  131. struct packed {
  132. uint32_t bytes;
  133. uint32_t usecs;
  134. } min_bw, max_bw;
  135. };
  136. /* CMD_READ_FLUX */
  137. struct packed gw_read_flux {
  138. uint16_t nr_idx; /* default: 2 */
  139. };
  140. /* CMD_WRITE_FLUX */
  141. struct packed gw_write_flux {
  142. uint8_t terminate_at_index; /* default: 0 */
  143. };
  144. /* CMD_ERASE_FLUX */
  145. struct packed gw_erase_flux {
  146. uint32_t erase_ticks;
  147. };
  148. /* CMD_SINK_SOURCE_BYTES */
  149. struct packed gw_sink_source_bytes {
  150. uint32_t nr_bytes;
  151. };
  152. /* CMD_{GET,SET}_PARAMS, index 0 */
  153. #define PARAMS_DELAYS 0
  154. struct packed gw_delay {
  155. uint16_t select_delay; /* usec */
  156. uint16_t step_delay; /* usec */
  157. uint16_t seek_settle; /* msec */
  158. uint16_t motor_delay; /* msec */
  159. uint16_t auto_off; /* msec */
  160. };
  161. /* CMD_SWITCH_FW_MODE */
  162. #define FW_MODE_BOOTLOADER 0
  163. #define FW_MODE_NORMAL 1
  164. /*
  165. * Local variables:
  166. * mode: C
  167. * c-file-style: "Linux"
  168. * c-basic-offset: 4
  169. * tab-width: 4
  170. * indent-tabs-mode: nil
  171. * End:
  172. */