hf_protocol_be.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. //
  2. // Copyright 2013, 2014 HashFast Technologies LLC
  3. //
  4. // This program is free software; you can redistribute it and/or modify it
  5. // under the terms of the GNU General Public License as published by the Free
  6. // Software Foundation; either version 3 of the License, or (at your option)
  7. // any later version. See COPYING for more details.
  8. //
  9. // Big endian versions of packed structures
  10. //
  11. // Version 1.0
  12. //
  13. #ifndef _HF_PROTOCOL_BE_H_
  14. #define _HF_PROTOCOL_BE_H_
  15. // Generic header
  16. struct hf_header {
  17. uint8_t preamble; // Always 0xaa
  18. uint8_t operation_code;
  19. uint8_t chip_address;
  20. uint8_t core_address;
  21. uint16_t hdata; // Header specific data
  22. uint8_t data_length; // .. of data frame to follow, in 4 byte blocks, 0=no data
  23. uint8_t crc8; // Computed across bytes 1-6 inclusive
  24. } __attribute__((packed,aligned(4))); // 8 bytes total
  25. // Header specific to OP_PLL_CONFIG
  26. struct hf_pll_config {
  27. uint8_t preamble;
  28. uint8_t operation_code;
  29. uint8_t chip_address;
  30. uint8_t pll_reset:1;
  31. uint8_t pll_bypass:1;
  32. uint8_t pll_divr:6;
  33. uint8_t pll_divf;
  34. uint8_t pll_fse:1; // Must always be 1
  35. uint8_t pll_range:3;
  36. uint8_t pll_divq:3;
  37. uint8_t spare1:1; // Must always be 0
  38. uint8_t data_length; // Always 0
  39. uint8_t crc8; // Computed across bytes 1-6 inclusive
  40. } __attribute__((packed,aligned(4))); // 8 bytes total
  41. // OP_HASH serial data
  42. struct hf_hash_serial {
  43. uint8_t midstate[32]; // Computed from first half of block header
  44. uint8_t merkle_residual[4]; // From block header
  45. uint32_t timestamp; // From block header
  46. uint32_t bits; // Actual difficulty target for block header
  47. uint32_t starting_nonce; // Usually set to 0
  48. uint32_t nonce_loops; // How many nonces to search, or 0 for 2^32
  49. uint16_t ntime_loops; // How many times to roll timestamp, or 0
  50. uint8_t search_difficulty; // Search difficulty to use, # of '0' digits required
  51. uint8_t option;
  52. uint8_t group;
  53. uint8_t spare3[3];
  54. } __attribute__((packed,aligned(4)));
  55. // OP_HASH usb data - header+data = 64 bytes
  56. struct hf_hash_usb {
  57. uint8_t midstate[32]; // Computed from first half of block header
  58. uint8_t merkle_residual[4]; // From block header
  59. uint32_t timestamp; // From block header
  60. uint32_t bits; // Actual difficulty target for block header
  61. uint32_t starting_nonce; // Usually set to 0
  62. uint32_t nonce_loops; // How many nonces to search, or 0 for 2^32
  63. uint16_t ntime_loops; // How many times to roll timestamp, or 0
  64. uint8_t search_difficulty; // Search difficulty to use, # of '0' digits required
  65. uint8_t group; // Non-zero for valid group
  66. } __attribute__((packed,aligned(4)));
  67. // OP_NONCE data
  68. struct hf_candidate_nonce {
  69. uint32_t nonce; // Candidate nonce
  70. uint16_t sequence; // Sequence number from corresponding OP_HASH
  71. uint16_t ntime; // ntime offset, if ntime roll occurred, in LS 12 bits
  72. // If b12 set, search forward next 128 nonces to find solution(s)
  73. } __attribute__((packed,aligned(4)));
  74. // OP_CONFIG data
  75. // This is usually internal data only, for serial drivers only
  76. // Users shouldn't normally need to interpret this, but in the event a Big Endian
  77. // user requires access to this data, the following structure will get all
  78. // the fields in the right place, but byte swaps will be required for the
  79. // uint16_t's and the uint32_t.
  80. struct hf_config_data {
  81. uint16_t forward_all_privileged_packets:1; // Forward priv pkts -- diagnostic
  82. uint16_t pwm_active_level:1; // Active level of PWM outputs, if used
  83. uint16_t send_status_on_pending_empty:1; // Schedule status whenever core pending goes idle
  84. uint16_t send_status_on_core_idle:1; // Schedule status whenever core goes idle
  85. uint16_t enable_periodic_status:1; // Send periodic status
  86. uint16_t status_period:11; // Periodic status time, msec
  87. uint8_t status_batch_delay; // Batching delay, time to wait before sending status
  88. uint8_t disable_sensors:1; // Diagnostic
  89. uint8_t watchdog:7; // Watchdog timeout, seconds
  90. uint8_t rx_ignore_header_crc:1; // Ignore rx header crc's (diagnostic)
  91. uint8_t rx_header_timeout:7; // Header timeout in char times
  92. uint8_t rx_ignore_data_crc:1; // Ignore rx data crc's (diagnostic)
  93. uint8_t rx_data_timeout:7; // Data timeout in char times / 16
  94. uint8_t stat_diagnostic:1; // Never set this
  95. uint8_t stats_interval:7; // Minimum interval to report statistics (seconds)
  96. uint8_t measure_interval; // Die temperature measurement interval (msec)
  97. uint32_t forward_all_packets:1; // Forward everything - diagnostic.
  98. uint32_t clock_diagnostic:1; // Never set this
  99. uint32_t trim:4; // Trim value for temperature measurements
  100. uint32_t pwm_phases:2; // phases - 1
  101. uint32_t voltage_sample_points:8; // Bit mask for sample points (up to 5 bits set)
  102. uint32_t max_nonces_per_frame:4; // Maximum # of nonces to combine in a single frame
  103. uint32_t one_usec:12; // How many LF clocks per usec.
  104. uint16_t pwm_period; // Period of PWM outputs, in reference clock cycles
  105. uint16_t pwm_pulse_period; // Initial count, phase 0
  106. } __attribute__((packed,aligned(4)));
  107. // OP_GROUP data
  108. struct hf_group_data {
  109. uint16_t nonce_msoffset; // This value << 16 added to starting nonce
  110. uint16_t ntime_offset; // This value added to timestamp
  111. } __attribute__((packed,aligned(4)));
  112. // Structure of the monitor fields for G-1, returned in OP_STATUS, core bitmap follows this
  113. struct hf_g1_monitor {
  114. uint16_t die_temperature; // Die temperature ADC count
  115. uint8_t core_voltage[6]; // Core voltage
  116. // [0] = main sensor
  117. // [1]-[5] = other positions
  118. } __attribute__((packed,aligned(4)));
  119. // What comes back in the body of an OP_STATISTICS frame (On die statistics)
  120. struct hf_statistics {
  121. uint8_t rx_header_crc; // Header CRC error's
  122. uint8_t rx_body_crc; // Data CRC error's
  123. uint8_t rx_header_timeouts; // Header timeouts
  124. uint8_t rx_body_timeouts; // Data timeouts
  125. uint8_t core_nonce_fifo_full; // Core nonce Q overrun events
  126. uint8_t array_nonce_fifo_full; // System nonce Q overrun events
  127. uint8_t stats_overrun; // Overrun in statistics reporting
  128. uint8_t spare;
  129. } __attribute__((packed,aligned(4)));
  130. ////////////////////////////////////////////////////////////////////////////////
  131. // USB protocol data structures
  132. ////////////////////////////////////////////////////////////////////////////////
  133. // Convenience header specific to OP_USB_INIT
  134. struct hf_usb_init_header {
  135. uint8_t preamble; // Always 0xaa
  136. uint8_t operation_code;
  137. uint8_t spare1;
  138. uint8_t shed_supported:1; // Host supports gwq status shed_count
  139. uint8_t do_atspeed_core_tests:1; // Do core tests at speed, return second bitmap
  140. uint8_t no_asic_initialization:1; // Do not perform automatic ASIC initialization
  141. uint8_t pll_bypass:1; // Force PLL bypass, hash clock = ref clock
  142. uint8_t user_configuration:1; // Use the following configuration data
  143. uint8_t protocol:3; // Which protocol to use
  144. uint16_t hash_clock; // Requested hash clock frequency
  145. uint8_t data_length; // .. of data frame to follow, in 4 byte blocks
  146. uint8_t crc8; // Computed across bytes 1-6 inclusive
  147. } __attribute__((packed,aligned(4))); // 8 bytes total
  148. // Options (only if present) that may be appended to the above header
  149. // Each option involving a numerical value will only be in effect if the value is non-zero
  150. // This allows the user to select only those options desired for modification. Do not
  151. // use this facility unless you are an expert - loading inconsistent settings will not work.
  152. struct hf_usb_init_options {
  153. uint16_t group_ntime_roll; // Total ntime roll amount per group
  154. uint16_t core_ntime_roll; // Total core ntime roll amount
  155. uint8_t low_operating_temp_limit; // Lowest normal operating limit
  156. uint8_t high_operating_temp_limit; // Highest normal operating limit
  157. uint16_t spare;
  158. } __attribute__((packed,aligned(4)));
  159. // Base item returned from device for OP_USB_INIT
  160. struct hf_usb_init_base {
  161. uint16_t firmware_rev; // Firmware revision #
  162. uint16_t hardware_rev; // Hardware revision #
  163. uint32_t serial_number; // Board serial number
  164. uint8_t operation_status; // Reply status for OP_USB_INIT (0 = success)
  165. uint8_t extra_status_1; // Extra reply status information, code specific
  166. uint16_t sequence_modulus; // Sequence numbers are to be modulo this
  167. uint16_t hash_clockrate; // Actual hash clock rate used (nearest Mhz)
  168. uint16_t inflight_target; // Target inflight amount for GWQ protocol
  169. } __attribute__((packed,aligned(4)));
  170. // The above base item (16 bytes) is followed by the struct hf_config_data (16 bytes) actually
  171. // used internally (so users may modify non-critical fields by doing subsequent
  172. // OP_CONFIG operations). This is followed by a device specific "core good" bitmap (unless the
  173. // user disabled initialization), and optionally by an at-speed "core good" bitmap.
  174. // Information in an OP_DIE_STATUS frame. This is for one die - there are four per ASIC.
  175. // Board level phase current and voltage sensors are likely to disappear in later production models.
  176. struct hf_g1_die_data {
  177. struct hf_g1_monitor die; // Die sensors - 8 bytes
  178. uint16_t phase_currents[4]; // Phase currents (0 if unavailable)
  179. uint16_t voltage; // Voltage at device boundary (0 if unavailable)
  180. uint16_t temperature; // Regulator temp sensor
  181. uint16_t tacho; // See documentation
  182. uint16_t spare;
  183. } __attribute__((packed,aligned(4))); // 24 bytes total
  184. // Information for an OP_GWQ_STATUS frame
  185. // If sequence_head == sequence_tail, then there is no active work and sequence_head is invalid
  186. struct hf_gwq_data {
  187. uint64_t hash_count; // Add this to host's cumulative hash count
  188. uint16_t sequence_head; // The latest, internal, active sequence #
  189. uint16_t sequence_tail; // The latest, internal, inactive sequence #
  190. uint16_t shed_count; // # of cores have been shedded for thermal control
  191. uint16_t spare;
  192. } __attribute__((packed,aligned(4)));
  193. // Information for an OP_USB_STATS1 frame - Communication statistics
  194. struct hf_usb_stats1 {
  195. // USB incoming
  196. uint16_t usb_rx_preambles;
  197. uint16_t usb_rx_receive_byte_errors;
  198. uint16_t usb_rx_bad_hcrc;
  199. // USB outgoing
  200. uint16_t usb_tx_attempts;
  201. uint16_t usb_tx_packets;
  202. uint16_t usb_tx_timeouts;
  203. uint16_t usb_tx_incompletes;
  204. uint16_t usb_tx_endpointstalled;
  205. uint16_t usb_tx_disconnected;
  206. uint16_t usb_tx_suspended;
  207. // Internal UART transmit
  208. uint16_t uart_tx_queue_dma;
  209. uint16_t uart_tx_interrupts;
  210. // Internal UART receive
  211. uint16_t uart_rx_preamble_ints;
  212. uint16_t uart_rx_missed_preamble_ints;
  213. uint16_t uart_rx_header_done;
  214. uint16_t uart_rx_data_done;
  215. uint16_t uart_rx_bad_hcrc;
  216. //uint16_t uart_rx_bad_crc32;
  217. uint16_t uart_rx_bad_dma;
  218. uint16_t uart_rx_short_dma;
  219. uint16_t uart_rx_buffers_full;
  220. uint8_t max_tx_buffers; // Maximum # of send buffers ever used
  221. uint8_t max_rx_buffers; // Maximum # of receive buffers ever used
  222. } __attribute__((packed,aligned(4)));
  223. // Information for an OP_USB_NOTICE frame
  224. struct hf_usb_notice_data {
  225. uint32_t extra_data; // Depends on notification code
  226. char message[]; // NULL terminated, little endian byte order
  227. };
  228. #endif